OTRSAppointmentCalendar
5.0.13
OTRS AG
https://otrs.com/
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
- Fixed variable output in JS templates.
- Fixed: Merged cells are not fit to agenda overview table (bug#14436).
- Added more logging information when CalendarCreate() fails.
- Unit tests stabilization.
- Updated framework files to OTRS 5.0.34.
- Updated copyright.
- Updated minimum framework version to 5.0.33.
- Tidied.
- Updated minimum framework version to 5.0.31.
- Setting AppointmentCalendar::CalendarLimitOverview not working correctly (bug#14054).
- Selenium stabilization FF Marionette - AgentAppointmentNotification.t.
- Selenium stabilization FF Marionette - AgentAppointmentCreate.t.
- Selenium stabilization FF Marionette - AgentAppointmentCalendarOverview.t.
- Selenium stabilization FF Marionette - AgentAppointmentCalendarManage.t.
- Selenium stabilization FF Marionette - AdminAppointmentNotificationEvent.t.
- Updated license information.
Fixed: Notification looses text for 'Additional recipient email addresses' when sizelimit 200 characters is exceeded (bug#13936).
Fixed: Use of marking strings as translatable.
Fixed: Wrong UserID argument in AdminAppointmentNotificationEvent (bug#13820).
Fixed: Missleading label that customer can be recipient of notifications as group recipient (bug#13794).
Fixed: Wrong Sysconfig descriptions for public interface (bug#13739).
Fixed: Deletion of tickets not possible if automatically created appointments exist for it (bug#13642).
Fixed: Selenium unit test.
Fixed and stabilized selenium tests.
Fixed: Translation is not applied in AgentAppointmentList (bug#13059).
Fixed: Error in calendar if UserLogin contain Unicode character (bug#12493).
Fixed: restore default settings button missing when view changed in ResourceOverview.
Fixed: iCal copied URL from OTRS Calendar does not update in iCloud (bug#12667).
Fixed: Assigned appointments notification is not translated (bug#12945).
Fixed: OTRSAppointmentCalendar Module sends an update notification when an event is deleted (bug#12958).
Fixed: Useless "Description" widget in sidebar (bug#12943).
Fixed: OTRS notification option for OTRS Business Solution™ Feature are shown in the free (bug#13035).
Fixed: Repeating appointments not linked to origin ticket (bug#12592).
Fixes and improvements for unit tests / selenium tests.
Translated location hover title.
Improved link object module for calendar appointments.
Updated package description.
Updated translations.
Build for OTRSAppointmentCalendar 5 patch level 2.
Build for OTRSAppointmentCalendar 5.
The Appointment Calendar package.
Das Terminkalender-Paket.
A 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!<br/>
<br/>
<br/>
<strong>REQUIRED PERL MODULES</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<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!<br/>
<br/>
<br/>
<strong>BENÖTIGTEN PERLMODULE</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az OTRSAppointmentCalendar OTRS csomag telepítésére készül.<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
A legkisebb keretrendszer-verzió ehhez a csomaghoz az <strong><u>5.0.14</u></strong>. Győződjön meg arról, hogy frissítette-e a keretrendszert ezen csomag telepítése előtt!<br/>
<br/>
<br/>
<strong>SZÜKSÉGES PERL MODUL</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<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>. Проверите да ли сте освежили ваш систем пре инсталације пакета!<br/>
<br/>
<br/>
<strong>ОБАВЕЗНИ ПЕРЛ МОДУЛИ</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<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!<br/>
<br/>
<br/>
<strong>OBAVEZNI PERL MODULI</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<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();
2019-04-09 09:10:45
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUHVibGljQ2FsZW5kYXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QdWJsaWMgY2FsZW5kYXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPlB1YmxpYyBDYWxlbmRhcjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT48L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPk92ZXJ2aWV3PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNhbGVuZGFyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkNhbGVuZGFyPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjc1PC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkNhbGVuZGFyIE92ZXJ2aWV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NjAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoik8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+UmVzb3VyY2UgT3ZlcnZpZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPmNsYXNzPSJPVFJTQnVzaW5lc3NSZXF1aXJlZCI8L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NzAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgbmV3IGFwcG9pbnRtZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5OZXcgQXBwb2ludG1lbnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O1N1YmFjdGlvbj1BcHBvaW50bWVudENyZWF0ZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+ODAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLTMuMC4xL2Z1bGxjYWxlbmRhci5taW4uY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPENTUz50aGlyZHBhcnR5L2Z1bGxjYWxlbmRhci1zY2hlZHVsZXItMS40LjAvc2NoZWR1bGVyLm1pbi5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8Q1NTPkNvcmUuQXBwb2ludG1lbnRDYWxlbmRhci5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L21vbWVudGpzLTIuMTMuMC9tb21lbnQubWluLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLTMuMC4xL2Z1bGxjYWxlbmRhci5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItc2NoZWR1bGVyLTEuNC4wL3NjaGVkdWxlci5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvY2xpcGJvYXJkLmpzLTEuNS4xMi9jbGlwYm9hcmQubWluLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRFZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5FZGl0IGFwcG9pbnRtZW50PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudExpc3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgbGlzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgbGlzdDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT48L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRQbHVnaW5TZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+UGx1Z2luIHNlYXJjaDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT48L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgQ2FsZW5kYXJzPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNhbGVuZGFyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+TWFuYWdlIENhbGVuZGFyczwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+Q29yZS5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZS5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvc3BlY3RydW0tMS44LjAvc3BlY3RydW0uY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9jbGlwYm9hcmQuanMtMS41LjEyL2NsaXBib2FyZC5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9zcGVjdHJ1bS0xLjguMC9zcGVjdHJ1bS5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXBwb2ludG1lbnRJbXBvcnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkltcG9ydCBBcHBvaW50bWVudHM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q2FsZW5kYXI8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6Q2FsZW5kYXJMaW1pdE92ZXJ2aWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IlxkKyI+MTA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckNvbG9ycyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDAwMDAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzFFMUUxRTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMzQTNBM0E8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNTQ1NDUzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzZFNkU2RTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4Nzg2ODc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODg4Nzg3PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0EwOUZBMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNCOEI4Qjg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRDBEMEQwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0U4RThFODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRkZGRkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODkxMTAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg5NDgwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4ODg1MDE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNDU4NDAxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAyODQwMTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMTg0NDg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDA4Njg4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAwNEE4ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMDE4ODg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNDkxQTg4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg5MUU4ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4OTE2NDg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkYyMTAxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGODgwMjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRkZBMDM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODNGOTAyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzA1RjgwMjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwM0Y5ODc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDBGREZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAwOENGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMDJFRkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODkzMUZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGMzlGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRjI5ODc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkY3MjZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGQ0U2RTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRkZCNkQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jQ0VGQTZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzY4Rjk2RTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM2OEZERkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNjhGQkQwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzZBQ0ZGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM2RTc2RkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRDI3OEZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGN0FGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRjdGRDM8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6UGx1Z2luIyMjMDEwMC1UaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6UGx1Z2luPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVSTCI+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0lczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzEyMDAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPkFwcG9pbnRtZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZTo6U2V0dGluZ3NWaXNpYmlsaXR5IyMjQXBwb2ludG1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+QWdlbnRUaWNrZXRab29tPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZSMjI0FwcG9pbnRtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudC5wbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdENvbHVtbnMiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhbGVuZGFyTmFtZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGFydFRpbWUiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW5kVGltZSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMb2NhdGlvbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RpZmljYXRpb25UaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYWxlbmRhck5hbWUiPjEwMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+MTEwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlN0YXJ0VGltZSI+MTIwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVuZFRpbWUiPjEzMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMb2NhdGlvbiI+MTQwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGlmaWNhdGlvblRpbWUiPjE1MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VkIj4xNjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlZCI+MTcwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OkltcG9ydDo6UmVjdXJyaW5nTW9udGhzTGltaXQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+T1RSUyBkb2Vzbid0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXGQrIj4xMjA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUjIyMwMTAwLUZpcnN0UmVzcG9uc2VUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+Rmlyc3RSZXNwb25zZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+Rmlyc3QgcmVzcG9uc2UgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFNMQVVwZGF0ZXxUaWNrZXRRdWV1ZVVwZGF0ZXxUaWNrZXRTdGF0ZVVwZGF0ZXxUaWNrZXRDcmVhdGV8QXJ0aWNsZUNyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFyayI+RTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZSMjIzAyMDAtVXBkYXRlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPlVwZGF0ZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+VXBkYXRlIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTTEFVcGRhdGV8VGlja2V0UXVldWVVcGRhdGV8VGlja2V0U3RhdGVVcGRhdGV8VGlja2V0Q3JlYXRlfEFydGljbGVDcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcmsiPkU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUjIyMwMzAwLVNvbHV0aW9uVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPlNvbHV0aW9uVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5Tb2x1dGlvbiB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0U0xBVXBkYXRlfFRpY2tldFF1ZXVlVXBkYXRlfFRpY2tldFN0YXRlVXBkYXRlfFRpY2tldENyZWF0ZXxBcnRpY2xlQ3JlYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXJrIj5FPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRUeXBlIyMjMDQwMC1QZW5kaW5nVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OlBlbmRpbmdUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPlBlbmRpbmdUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlBlbmRpbmcgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFBlbmRpbmdUaW1lVXBkYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXJrIj5QPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRUeXBlIyMjMDUwMC1EeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij5EeW5hbWljRmllbGRfJXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pY0ZpZWxkXyVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlXy4qPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXJrIj5EPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5UaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZXMiIFRyYW5zbGF0YWJsZT0iMSI+VHlwZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3RhdGVzIiBUcmFuc2xhdGFibGU9IjEiPlN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGF0ZVR5cGUiIFRyYW5zbGF0YWJsZT0iMSI+U3RhdGUgdHlwZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdGllcyIgVHJhbnNsYXRhYmxlPSIxIj5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZXMiIFRyYW5zbGF0YWJsZT0iMSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU0xBcyIgVHJhbnNsYXRhYmxlPSIxIj5TTEE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxvY2tzIiBUcmFuc2xhdGFibGU9IjEiPkxvY2sgc3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik93bmVySURzIiBUcmFuc2xhdGFibGU9IjEiPk93bmVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXNwb25zaWJsZUlEcyIgVHJhbnNsYXRhYmxlPSIxIj5SZXNwb25zaWJsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VzdG9tZXJJRCIgVHJhbnNsYXRhYmxlPSIxIj5DdXN0b21lcklEPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lclVzZXJMb2dpbiIgVHJhbnNsYXRhYmxlPSIxIj5DdXN0b21lciB1c2VyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcm9tIiBUcmFuc2xhdGFibGU9IjEiPkZyb208L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRvIiBUcmFuc2xhdGFibGU9IjEiPlRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYyIgVHJhbnNsYXRhYmxlPSIxIj5DYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3ViamVjdCIgVHJhbnNsYXRhYmxlPSIxIj5TdWJqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCb2R5IiBUcmFuc2xhdGFibGU9IjEiPkJvZHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkF0dGFjaG1lbnROYW1lIiBUcmFuc2xhdGFibGU9IjEiPkF0dGFjaG1lbnQgTmFtZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8IS0tIG5vdGlmaWNhdGlvbnMgLS0+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+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjOTYwLVRpY2tldEFwcG9pbnRtZW50RGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRyaWdnZXJzIGRlbGV0aW5nIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCBJRC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudERlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldERlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
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==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdCZW5hY2hyaWNodGlndW5nIMO8YmVyIEVycmVpY2hlbiBkZXIgRXJpbm5lcnVuZ3N6ZWl0IHZvbiBUZXJtaW5lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnU2llIGVyaGFsdGVuIGltbWVyIGRhbm4gZWluZSBCZW5hY2hyaWNodGlndW5nLCB3ZW5uIGRlciBCZW5hY2hyaWNodGlndW5nc3plaXRwdW5rdCBmw7xyIGVpbmVuIElocmVyIFRlcm1pbmUgZXJyZWljaHQgd3VyZGUuJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnVmVyd2FsdHVuZyB2b24gVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBlaW5lIEtvbmZpZ3VyYXRpb25zZGF0ZWkgaG9jaGxhZGVuLCBtaXQgZGVyIFRlcm1pbmJlbmFjaHJpY2h0aWd1bmdlbiBpbSBTeXN0ZW0gaW1wb3J0aWVydCB3ZXJkZW4ga8O2bm5lbi4gRGllIERhdGVpIG11c3MgaW0gLnltbC1Gb3JtYXQgdm9ybGllZ2VuLCBzbyB3aWUgc2llIGF1Y2ggdm9tIFRlcm1pbmJlbmFjaHJpY2h0aWd1bmdzbW9kdWwgZXhwb3J0aWVydCB3aXJkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0hpZXIga8O2bm5lbiBTaWUgYXVzd8OkaGxlbiwgd2VsY2hlIEVyZWlnbmlzc2UgZGllc2UgQmVuYWNocmljaHRpZ3VuZyBhdXNsw7ZzZW4uIEVpbiB6dXPDpHR6bGljaGVyIFRlcm1pbmZpbHRlciBrYW5uIHdlaXRlciB1bnRlbiBlaW5nZXN0ZWxsdCB3ZXJkZW4sIHVtIGRpZSBCZW5hY2hyaWNodGlndW5nZW4gbnVyIGbDvHIgVGVybWluZSBtaXQgYmVzdGltbXRlbiBNZXJrbWFsZW4genUgdmVyc2VuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdUZXJtaW5maWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ1RlYW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdSZXNvdXJjZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ051ciBlaW5tYWwgYW0gVGFnIHBybyBUZXJtaW4gdW5kIEJlbmFjaHJpY2h0aWd1bmdzLVRyYW5zcG9ydG1ldGhvZGUgdmVyc2VuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ0JlbmFjaHJpY2h0aWd1bmdlbiB3dXJkZW4gYW4gZWluZW4gQWdlbnRlbiB2ZXJzZW5kZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdEaWUgZXJzdGVuIDIwIFplaWNoZW4gZGVzIFRlcm1pbmJldHJlZmZzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ0RpZSBUZXJtaW4tQXR0cmlidXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnRGllIEthbGVuZGVyLUF0dHJpYnV0ZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdBZ2VuZGHDvGJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdLYWxlbmRlciB2ZXJ3YWx0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnVGVybWluIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnRmFyYmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdFbmR6ZWl0cHVua3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnV2llZGVyaG9sdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ0tlaW5lIEthbGVuZGVyIGdlZnVuZGVuLiBCaXR0ZSBsZWdlbiBTaWUgenVlcnN0IGVpbmVuIEthbGVuZGVyIMO8YmVyIGRpZSBLYWxlbmRlcnZlcndhbHR1bmcgYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdEaWVzZXIgVGVybWluIHdpZWRlcmhvbHQgc2ljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ03DtmNodGVuIFNpZSBudXIgZGllc2VuIFRlcm1pbiBvZGVyIGFsbGUgVm9ya29tbW5pc3NlIGJlYXJiZWl0ZW4/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ0FsbGUgVm9ya29tbW5pc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnTnVyIGRpZXNlbiBUZXJtaW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ0thbGVuZGVydmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ0thbGVuZGVyw7xiZXJzaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAnRWluZW4gbmV1ZW4gS2FsZW5kZXIgYW5sZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdOZXVlbiBLYWxlbmRlciBhbmxlZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdUZXJtaW5lIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0thbGVuZGVyIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBlaW5lIEtvbmZpZ3VyYXRpb25zZGF0ZWkgaG9jaGxhZGVuLCB1bSBlaW5lbiBLYWxlbmRlciBpbiBJaHIgU3lzdGVtIHp1IGltcG9ydGllcmVuLiBEaWUgRGF0ZWkgbXVzcyBpbSAueW1sIEZvcm1hdCB2b3JsaWVnZW4sIHNvIHdpZSBzaWUgaW4gZGVyIEthbGVuZGVydmVyd2FsdHVuZyBleHBvcnRpZXJ0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ0thbGVuZGVyLUtvbmZpZ3VyYXRpb24gaG9jaGxhZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ0thbGVuZGVyIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdGVyIGbDvHIgS2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnQWJow6RuZ2lnIHZvbiBkZXIgR3J1cHBlbnp1Z2Vow7ZyaWdrZWl0IHdpcmQgZGFzIFN5c3RlbSBCZW51dHplcm4gZGVuIFp1Z3JpZmYgYW5oYW5kIGlocmVyIEJlcmVjaHRpZ3VuZ2VuIGVybGF1YmVuIGJ6dy4gdmVyd2VpZ2Vybi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdSTzogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIHNlaGVuIHVuZCBLYWxlbmRlciBleHBvcnRpZXJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICdWZXJzY2hpZWJlbiBpbjogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIGlubmVyaGFsYiBlaW5lcyBLYWxlbmRlcnMgYmVhcmJlaXRlbiwgZGllc2UgamVkb2NoIG5pY2h0IGluIGFuZGVyZSBLYWxlbmRlciB2ZXJzY2hpZWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0Vyc3RlbGxlbjogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIGltIEthbGVuZGVyIGVyc3RlbGxlbiB1bmQgbMO2c2NoZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdydzogQmVudXR6ZXIga8O2bm5lbiBkaWUgS2FsZW5kZXIgYW4gc2ljaCB2ZXJ3YWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdLYWxlbmRlciBleHBvcnRpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ0thbGVuZGVyIGhlcnVudGVybGFkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnw5ZmZmVudGxpY2hlIEthbGVuZGVyIFVSTCBrb3BpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAnS2FsZW5kZXJuYW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ0VpbiBLYWxlbmRlciBtaXQgZ2xlaWNoZW0gTmFtZW4gZXhpc3RpZXJ0IGJlcmVpdHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICdCZXJlY2h0aWd1bmdzZ3J1cHBlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdUaWNrZXQgVGVybWluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVmVyd2VuZGVuIFNpZSBkaWUgZm9sZ2VuZGVuIE9wdGlvbmVuLCAgdW0gZWluenVncmVuemVuIHdlbGNoZSBUaWNrZXQtVGVybWluZSBhdXRvbWF0aXNjaCBlcnN0ZWxsdCB3ZXJkZW4gc29sbGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnQml0dGUgd8OkaGxlbiBTaWUgZWluZSBnw7xsdGlnZSBRdWV1ZSBhdXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnU3VjaGF0dHJpYnV0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ0RlZmluaXRpb24gdm9uIFJlZ2VsbiwgdW0gYXV0b21hdGlzY2ggVGVybWluZSBpbiBkaWVzZW0gS2FsZW5kZXIgenUgZXJzdGVsbGVuLCB3ZWxjaGUgYXVmIFRpY2tldGRhdGVuIGJhc2llcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ1JlZ2VsIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICdNZWhyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdXZW5pZ2VyJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0VpbmVuIG5ldWVuIFRlcm1pbiBhbmxlZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdadXZpZWxlIGFrdGl2ZSBLYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdCaXR0ZSBkZWFrdGl2aWVyZW4gU2llIHp1ZXJzdCBlaW5pZ2Ugb2RlciBlcmjDtmhlbiBTaWUgZGFzIExpbWl0IGluIGRlciBLb25maWd1cmF0aW9uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnV29jaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdaZWl0c3RyYWhsIE1vbmF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdaZWl0c3RyYWhsIFdvY2hlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ1plaXRzdHJhaGwgVGFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdTcHJpbmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnVmVyd2VyZmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdBbnplaWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ0dydW5kbGVnZW5kZSBJbmZvcm1hdGlvbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJ0RhdHVtL1plaXQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ0JpdHRlIHNldHplbiBTaWUgZWluZW4gV2VydCB2b3IgZGVtIEVuZGRhdHVtLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICdCaXR0ZSBzZXR6ZW4gU2llIGVpbmVuIFdlcnQgbmFjaCBkZW0gU3RhcnRkYXR1bS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ0RpZXMgaXN0IGVpbiBWb3Jrb21tbmlzIGVpbmVzIHNpY2ggd2llZGVyaG9sZW5kZW4gVGVybWlucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLbGlja2VuIFNpZSBoaWVyLCB1bSBkZW4gRWx0ZXJuLVRlcm1pbiBhbnp1emVpZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLbGlja2VuIFNpZSBoaWVyLCB1bSBkZW4gRWx0ZXJuLVRlcm1pbiB6dSBiZWFyYmVpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVxdWVueic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ0FsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ1JlbGF0aXZlciBaZWl0cHVua3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnTcO2Y2h0ZW4gU2llIGRpZXNlbiBUZXJtaW4gd2lya2xpY2ggbMO2c2NoZW4/IERpZXNlIMOEbmRlcnVuZyBrYW5uIG5pY2h0IHLDvGNrZ8OkbmdpZyBnZW1hY2h0IHdlcmRlbi4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ1Rlcm1pbmUgaW1wb3J0aWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICdEaWUgaG9jaGdlbGFkZW5lIERhdGVpIG11c3MgaW4gZWluZW0gZ8O8bHRpZ2VuIGlDYWwtRm9ybWF0ICguaWNzKSB2b3JsaWVnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1NvbGx0ZSBlaW4gZ2V3w7xuc2NodGVyIEthbGVuZGVyIGhpZXIgbmljaHQgYXVmZ2VsaXN0ZXQgc2Vpbiwgc3RlbGxlbiBTaWUgYml0dGUgc2ljaGVyLCBkYXNzIFNpZSBtaW5kZXN0ZW5zIGRpZSBCZXJlY2h0aWd1bmcgenVtIEVyc3RlbGxlbiB2b24gS2FsZW5kZXJuIGJlc2l0emVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ0V4aXN0aWVyZW5kZSBUZXJtaW5lIMO8YmVyc2NocmVpYmVuPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ0FsbGUgZXhpc3RpZXJlbmRlbiBUZXJtaW5lIG1pdCBkZXIgc2VsYmVuICJVbmlxdWVJRCIgaW0gZW50c3ByZWNoZW5kZW4gS2FsZW5kZXIgd2VyZGVuIMO8YmVyc2NocmllYmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdLYWxlbmRlciBob2NobGFkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ1Rlcm1pbmUgaW1wb3J0aWVyZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTmV1ZXIgVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdEZW1uw6RjaHN0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgVGFnZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICdCZW5hY2hyaWNodGlndW5nc25hbWUgZXhpc3RpZXJ0IGJlcmVpdHMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VudGVuIChSZXNvdXJjZW4pLCB3ZWxjaGUgaW5uZXJoYWxiIGRlcyBUZXJtaW5zIGF1c2dld8OkaGx0IHd1cmRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBbGxlIEFnZW50ZW4gbWl0IChtaW5kZXN0ZW5zKSBMZXNlYmVyZWNodGlndW5nIGbDvHIgZGVuIFRlcm1pbihrYWxlbmRlciknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBbGxlIEFnZW50ZW4gbWl0IFNjaHJlaWJiZXJlY2h0aWd1bmcgZsO8ciBkZW4gVGVybWluKGthbGVuZGVyKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnRGFzIFN5c3RlbSBrb25udGVuIGRlbiBLYWxlbmRlciBuaWNodCBlcnN0ZWxsZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnS2VpbmUgQ2FsZW5kZXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAnU2llIGhhYmVuIGtlaW5lIFp1Z3JpZmZzYmVyZWNodGlndW5nIGF1ZiBkaWVzZW4gS2FsZW5kZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdLYWxlbmRlciBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdGZWhsZXIgYmVpbSBBa3R1YWxpc2llcmVuIGRlcyBLYWxlbmRlcnMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdLYWxlbmRlciBLb25maWd1cmF0aW9uc2RhdGVpIGtvbm50ZSBuaWNodCBnZWxlc2VuIHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnQml0dGUgc3RlbGxlbiBTaWUgc2ljaGVyLCBkYXNzIGRpZSBEYXRlaSBnw7xsdGlnIGlzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnS2FsZW5kZXIga29ubnRlIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdLYWxlbmRlciB3dXJkZSBpbXBvcnRpZXJ0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnQ2FsZW5kYXJJRCB3aXJkIGJlbsO2dGlndCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdEYXRlbiBrb25udGVuIG5pY2h0IGFiZ2VydWZlbiB3ZXJkZW4gZsO8ciBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdFcyB3dXJkZShuKSAlcyBUZXJtaW4oZSkgZXJmb2xncmVpY2ggaW4gS2FsZW5kZXIgJXMgaW1wb3J0aWVydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IE1pbnV0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgTWludXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBTdHVuZGUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnQWxsZSBUZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ01pciB6dWdld2llc2VuZSBUZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdFcyB3ZXJkZW4gbnVyIFRlcm1pbmUgYW5nZXplaWd0LCBkaWUgSWhuZW4genVnZXdpZXNlbiBzaW5kISBFaW5zdGVsbHVuZ2VuIMOkbmRlcm4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnVGVybWluIHd1cmRlIG5pY2h0IGdlZnVuZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ05pZW1hbHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnSmVkZW4gVGFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdKZWRlIFdvY2hlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnSmVkZW4gTW9uYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0plZGVzIEphaHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnQmVudXR6ZXJkZWZpbmllcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICd0w6RnbGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICd3w7ZjaGVudGxpY2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ21vbmF0bGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICdqw6RocmxpY2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdhbGxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAnZsO8ciAlcyBXaWVkZXJob2x1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdiaXMgLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJ2bDvHIgLi4uIFdpZWRlcmhvbHVuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnYmlzICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0tlaW5lIEJlbmFjaHJpY2h0aWd1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIE1pbnV0ZShuKSB2b3JoZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBTdHVuZGUobikgdm9yaGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBUYWcoZSkgdm9yaGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgV29jaGUobikgdm9yaGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnYmV2b3IgZGVyIFRlcm1pbiBiZWdpbm50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnbmFjaGRlbSBkZXIgVGVybWluIGJlZ29ubmVuIGhhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdiZXZvciBkZXIgVGVybWluIGVuZGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ25hY2hkZW0gZGVyIFRlcm1pbiBnZWVuZGV0IGhhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ0tlaW5lIEJlcmVjaHRpZ3VuZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnVGlja2V0LVRlcm1pbiBrb25udGUgbmljaHQgZ2Vsw7ZzY2h0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnS2VpbmUgQmVyZWNodGlndW5nISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICdLZWluZSBCZXJlY2h0aWd1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnRGFzIFN5c3RlbSBrb25udGUgZGllIERhdGVpIG5pY2h0IGltcG9ydGllcmVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdCaXR0ZSBwcsO8ZmVuIFNpZSBkYXMgU3lzdGVtcHJvdG9rb2xsIGbDvHIgd2VpdGVyZSBJbmZvcm1hdGlvbmVuLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIG1laHInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdLZWluICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnS2VpbiBCZW51dHplciBnZWZ1bmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdVbmfDvGx0aWdlciBLYWxlbmRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnVW5nw7xsdGlnZSBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0VzIGlzdCBlaW4gRmVobGVyIGJlaW0gRXhwb3J0aWVyZW4gZGVzIEthbGVuZGVycyBhdWZnZXRyZXRlbiEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdBa3R1YWxpc2llcnVuZyAoTWludXRlbiknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1Rlcm1pbmthbGVuZGVyIMOcYmVyc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ1Rlcm1pbmJlbmFjaHJpY2h0aWd1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnVGVybWlua2FsZW5kZXIgRXZlbnQtTW9kdWwsIHdlbGNoZXMgQmVuYWNocmljaHRpZ3VuZ3NlaW50csOkZ2UgZsO8ciBUZXJtaW5lIHZvcmJlcmVpdGV0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnVGVybWluLUthbGVuZGVyIEV2ZW50bW9kdWwsIHdlbGNoZXMgVGlja2V0cyBtaXQgRGF0ZW4gYXVzIFRpY2tldC1UZXJtaW5lbiBha3R1YWxpc2llcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1Rlcm1pbmJlYXJiZWl0dW5nc2Fuc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ1Rlcm1pbmxpc3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnVGVybWlubGlzdGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdUZXJtaW5iZW5hY2hyaWNodGlndW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnVGVybWluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ0thbGVuZGVydmVyd2FsdHVuZ3NhbnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0bDvHIgd2VsY2hlIFZlcsOkbmRlcnVuZ2VuIGFuIFRlcm1pbmVuIG3DtmNodGVuIFNpZSBCZW5hY2hyaWNodGlndW5nZW4gZXJoYWx0ZW4/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdFcnN0ZWxsdCBlaW5lbiBuZXVlbiBUZXJtaW4gaW4gZWluZW0gS2FsZW5kZXIsIHdlbGNoZXIgZGlyZWt0IG1pdCBkaWVzZW0gVGlja2V0IHZlcmtuw7xwZnQgaXN0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuIGVyc3RlbGxlbiB1bmQgdmVyd2FsdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0VpbmVuIG5ldWVuIFRlcm1pbiBlcnN0ZWxsZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdMZWd0IGZlc3Qgd2VsY2hlIFNwYWx0ZW4gaW0gVGVybWludmVya27DvHBmdW5ncy1XaWRnZXQgYW5nZXplaWd0IHdlcmRlbiAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBNw7ZnbGljaGUgRWluc3RlbGx1bmdlbjogMCA9IERlYWt0aXZpZXJ0LCAxID0gVmVyZsO8Z2JhciwgMiA9IFN0YW5kYXJkbcOkw59pZyBha3RpdmllcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0Jlc2NocmVpYnQgZWluIFN5bWJvbCBtaXQgVmVya27DvHBmdW5nIHp1ciBHb29nbGUgTWFwcyBXZWJzZWl0ZSBtaXQgZGVtIGFrdHVlbGxlbiBTdGFuZG9ydCBhbHMgZW50c3ByZWNoZW5kZXMgWmllbCBpbiBkZXIgVGVybWluYmVhcmJlaXR1bmdzLU9iZXJmbMOkY2hlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0xlZ3QgZGllIEV2ZW50LU9iamVrdHR5cGVuIGZlc3QsIHdlbGNoZSB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50IHZlcmFyYmVpdGV0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdMZWd0IGRpZSBMaXN0ZSBkZXIgUGFyYW1ldGVyIGZlc3QsIHdlbGNoZSBtaXQgZGVyIFRpY2tldHN1Y2hmdW5rdGlvbiB2ZXJ3ZW5kZXQgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ0Jlc2NocmVpYnQgZGVuIFRpY2tldC1UZXJtaW4tQmFja2VuZCBUeXAgZsO8ciBEYXR1bS9VaHJ6ZWl0IGR1cmNoIGR5bmFtaXNjaGUgRmVsZGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnQmVzY2hyZWlidCBkZW4gVGlja2V0LVRlcm1pbi1CYWNrZW5kIFR5cCBmw7xyIFRpY2tldGVza2FsYXRpb25lbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ0Jlc2NocmVpYnQgZGVuIFRpY2tldC1UZXJtaW4tQmFja2VuZCBUeXAgZsO8ciBUaWNrZXRwZW5kaW5nemVpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnTGVndCBkYXMgVGlja2V0LVBsdWdpbiBmw7xyIFRlcm1pbmUgZmVzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdUZXJtaW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnWmVpdCBmw7xyIGVyc3RlIFJlYWt0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ1Rlcm1pbi1JbXBvcnQgT2JlcmZsw6RjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnVmVya27DvHBmdCBUZXJtaW5lIHVuZCBUaWNrZXRzIG1pdCBlaW5lbSBMaW5rIHZvbSBUeXAgIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0ZSBhbGxlciBUZXJtaW4tRXZlbnRzLCB3ZWxjaGUgaW4gZGVyIEdVSSBhbmdlemVpZ3Qgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGUgYWxsZXIgS2FsZW5kZXJlcmVpZ25pc3NlLCB3ZWxjaGUgaW4gZGVyIGdyYWZpc2NoZW4gQmVudXR6ZXJvYmVyZmzDpGNoZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGxlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0ZSBhbiBGYXJiZW4gaW4gSGV4YWRlemltYWwgUkdCLCB3ZWxjaGUgdmVyc2NoaWVkZW5lbiBCZW51dHplcmthbGVuZGVybiB6dWdld2llc2VuIHdlcmRlbi4gU3RlbGxlbiBTaWUgc2ljaGVyLCBkYXNzIGRpZSBGYXJiZW4gZHVua2VsIGdlbnVnIHNpbmQsIHVtIHdlacOfZW4gVGV4dCBkYXJhdWYgZGFyenVzdGVsbGVuLiBTb2Zlcm4gZGllIEFuemFobCBkZXIgS2FsZW5kZXIgZGllIEFuemFobCBkZXIgdmVyZsO8Z2JhcmVuIEZhcmJlbiDDvGJlcnNjaHJlaXRldCwgd2lyZCBkaWVzZSBMaXN0ZSBlcm5ldXQgdm9uIEFuZmFuZyBhbiBnZW51dHp0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdWZXJzY2hpZWRlbmUgS2FsZW5kZXIgdmVyd2FsdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTWF4aW1hbGUgQW56YWhsIGFuIGFrdGl2ZW4gS2FsZW5kZXJuIGluIGRlciBLYWxlbmRlcsO8YmVyc2ljaHQgb2RlciBSZXNvdXJjZW7DvGJlcnNpY2h0LiBCaXR0ZSBiZWFjaHRlbiBTaWUsIGRhc3Mgc2ljaCB6dXZpZWxlIGdsZWljaHplaXRpZyBha3RpdmUgS2FsZW5kZXIgYXVmZ3J1bmQgdmllbGVyIGdsZWljaHplaXRpZ2VyIEFuZnJhZ2VuIGF1ZiBkaWUgUGVyZm9ybWFuY2UgZGVzIFN5c3RlbXMgYXVzd2lya2VuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgdW50ZXJzdMO8dHp0IGtlaW5lIHdpZWRlcmhvbGVuZGVuIFRlcm1pbmUgb2huZSBFbmRkYXR1bSBvZGVyIEFuemFobCBkZXIgRHVyY2hsw6R1ZmUuIFfDpGhyZW5kIGRlcyBJbXBvcnRpZXJ1bmdzcHJvemVzc2VzIGthbm4gZXMgdm9ya29tbWVuLCBkYXNzIGRpZSBlbnRzcHJlY2hlbmRlIElDUy1EYXRlaSBzb2xjaGUgVGVybWluIGVudGjDpGx0LiBTdGF0dGRlc3NlbiB3aXJkIGRhcyBTeXN0ZW0gYWxsZSB2ZXJnYW5nZW5lbiBUZXJtaW5lIGVyc3RlbGxlbiwgc293aWUgenVzw6R0emxpY2ggVGVybWluZSBmw7xyIGRpZSBrb21tZW5kZW4gbiBNb25hdGUgKDEyMCBNb25hdGUgLyAxMCBKYWhyZSBzdGFuZGFyZG3DpMOfaWcpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ8OcYmVyc2ljaHQgYWxsZXIgVGVybWluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdXYXJ0ZW4gYmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICdQbHVnaW5zdWNoZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ01vZHVsZSB6dXIgUGx1Z2luc3VjaGUgZsO8ciBkaWUgQXV0b3ZlcnZvbGxzdMOkbmRpZ3VuZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnw5ZmZmVudGxpY2hlciBLYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnw5ZmZmVudGxpY2hlciBLYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc291cmNlbsO8YmVyc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzb3VyY2Vuw7xiZXJzaWNodCAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnWmVpZ3QgZWluZW4gTGluayBpbSBNZW7DvCBkZXIgVGlja2V0Wm9vbS1BbnNpY2h0IGltIEFnZW50ZW4tSW50ZXJmYWNlIGFuLCB1bSBUZXJtaW5lIHp1IGVyc3RlbGxlbiwgd2VsY2hlIGRpcmVrdCBtaXQgZGVtIGVudHNwcmVjaGVuZGVuIFRpY2tldCB2ZXJrbsO8cGZ0IHNpbmQuIFp1c8OkdHpsaWNoZSBadWdyaWZmc2tvbnRyb2xsZSwgb2IgZGVyIE1lbsO8cHVua3QgYW5nZXplaWd0IHdpcmQgb2RlciBuaWNodCwga2FubiBtaXQgZGVtIFNjaGzDvHNzZWwgIkdydXBwZSIgdW5kICJJbmhhbHQiIHdpZSB6LkIuICgicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiKSBlcnJlaWNodCB3ZXJkZW4uIFVtIE1lbsO8ZWludHLDpGdlIHp1IGdydXBwaWVyZW4sIHZlcndlbmRlbiBTaWUgZGVuIFNjaGzDvHNzZWwgIkNsdXN0ZXJOYW1lIiB1bmQgaW0gSW5oYWx0IGRlbiBOYW1lbiwgd2VsY2hlbiBTaWUgaW4gZGVyIEFuc2ljaHQgdmVyd2VuZGVuIG3DtmNodGVuLiBWZXJ3ZW5kZW4gU2llICJDbHVzdGVyUHJpb3JpdHkiIHVtIGRpZSBSZWloZW5mb2xnZSBpbiBkZXIgamV3ZWlsaWdlbiBHcnVwcGllcnVuZyB6dSBiZWVpbmZsdXNzZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdMw7ZzdW5nc3plaXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdUcmFuc3BvcnRhdXN3YWhsIGbDvHIgVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ1N0w7bDn3QgZGFzIEhpbnp1ZsO8Z2VuIG9kZXIgQWt0dWFsaXNpZXJlbiB2b24gYXV0b21hdGlzY2hlbiBUZXJtaW5lbiBhbiwgYmFzaWVyZW5kIGF1ZiBUaWNrZXR6ZWl0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnQWt0dWFsaXNpZXJ1bmdzemVpdCc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0NPX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIE5vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIGxhcyBub3RpZmljYWNpb25lcyBkZSBsYXMgY2l0YXMgYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBjb21vIGxvcyBleHBvcnRhZG9zIHBvciBlbCBtw7NkdWxvIGRlIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0FxdcOtIGVzIHBvc2libGUgZWxlZ2lyIGxvcyBldmVudG9zIHF1ZSBpbmljaWFyw6FuIGVzdGEgbm90aWZpY2FjacOzbi4gVW4gZmlsdHJvIGFkaWNpb25hbCBkZSBsYSBjaXRhIHNlIHB1ZWRlIGFwbGljYXIgYSBjb250aW51YWNpw7NuIHBhcmEgZW52aWFyIHPDs2xvIHBhcmEgY2l0YXMgY29uIGNpZXJ0b3MgY3JpdGVyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0cm8gZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0VxdWlwbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1JlY3Vyc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdOb3RpZmljYXIgYWwgdXN1YXJpbyBzb2xvIHVuYSB2ZXogYWwgZMOtYSBhY2VyY2EgZGUgdW5hIHNvbGEgY2l0YSB1c2FuZG8gZWwgdHJhbnNwb3J0ZSBzZWxlY2Npb25hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnTGFzIG5vdGlmaWNhY2lvbmVzIHNlIGVudsOtYW4gYSB1biBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdQYXJhIG9idGVuZXIgbG9zIHByaW1lcm9zIDIwIGNhcmFjdGVyZXMgZGVsIHTDrXR1bG8gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZW5lciBlbCBhdHJpYnV0byBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlbCBjYWxlbmRhcmlvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgbGEgQWdlbmRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdHZXN0aW9uYXIgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQ29sb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdGZWNoYSBkZSB0w6lybWlubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdSZXBldGljacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdObyBzZSBlbmNvbnRyYXJvbiBjYWxlbmRhcmlvLiBQb3IgZmF2b3IgcHJpbWVybyBhw7FhZGEgdW4gY2FsZW5kYXJpbyB1dGlsaXphZG8gbGEgcGFnaW5hIGRlIEdlc3Rpb25hciBDYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFc3RhIGVzIHVuYSBjaXRhIHJlcGV0aXRpdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdEZXNlYSBlZGl0YXIgc29sbyBlc3RhIG8gdG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1RvZGFzIGxhcyBvY3VycmVuY2lhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1NvbG8gZXN0YSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIHVuIENhbGVuZGFyaW8gbnVldm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnQcOxYWRpciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIHVuIGNhbGVuZGFyaW8gYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBwYXJhIHBvZGVyIHNlciBleHBvcnRhZG8gcG9yIGVsIG3Ds2R1bG8gZGUgZ2VzdGnDs24gZGUgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnQ2FyZ2FyIGNvbmZpZ3VyYWNpw7NuIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnSW1wb3J0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRybyBwYXJhIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0RlcGVuZGllbmRvIGRlbCBjYW1wbyBkZSBncnVwbywgZWwgc2lzdGVtYSBwZXJtaXRlIGVsIGFjY2VzbyBhIHVzdWFyaW9zIGFsIGNhbGVuZGFyaW8gZGUgYWN1ZXJkbyBhIHN1cyBuaXZlbGVzIGRlIHBlcm1pc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1JPOiB1c3VhcmlvcyBxdWUgcHVlZGVuIHZlciB5IGV4cG9ydGFyIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ01vdmVyX0E6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gbW9kaWZpY2FyIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8sIHBlcm8gc2luIGNhbWJpYXIgbGEgc2VsZWNjacOzbiBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JlYXI6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gY3JlYXIgeSBib3JyYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ1JXOiB1c3VhcmlvIHF1ZSBwdWVkZW4gZ2VzdGlvbmFyIGVsIGNhbGVuZGFyaW8gZW4gc8OtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnRGVzY2FyZ2FyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnQ29waWFyIFVSTCBww7pibGljYSBkZSBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOb21icmUgZGVsIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnWWEgZXhpc3RlIHVuIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIG5vbWJyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdDaXRhcyBkZSBUaWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2xhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ1VzZSBsYXMgb3BjaW9uZXMgbW9zdHJhZGFzIGFiYWpvIHBhcmEgYWNvcnRhciBsYXMgY2l0YXMgZGUgdGlja2V0cyBzZXLDoW4gY3JlYWRhcyBhdXRvbcOhdGljYW1lbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUG9vciBmYXZvciBzZWxlY2Npb25lIHVuYSBmaWxhIHbDoWxpZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdBdHJpYnV0b3MgZGUgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5lIHJlZ2xhcyBwYXJhIGNyZWFjacOzbiBkZSBjaXRhcyBhdXRvbcOhdGljYXMgZW4gZXN0ZSBjYWxlbmRhcmlvIGJhc2FkYXMgZW4gbG9zIGRhdG9zIGRlIGxvcyB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ0HDsWFkaXIgcmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ03DoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01lbm9zJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0HDsWFkaXIgbnVldmEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICdDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnRGVtYXNpYWRvcyBjYWxlbmRhcmlvcyBhY3Rpdm9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ1BvciBmYXZvciBkZXNhY3RpdmUgYWxndW5vcyBwcmltZXJvIG8gaW5jcmVtZW50ZSBlbCBsw61taXRlIGVuIGxhIGNvbmZpZ3VyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdTZW1hbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdMw61uZWEgZGUgdGllbXBvIE1lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gU2VtYW5hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdMw61uZWEgZGUgdGllbXBvIERpYXJpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAnU2FsdGFyIGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ0Rlc2NhcnRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnTW9zdHJhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFjacOzbiBiw6FzaWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJ0ZlY2hhL0hvcmEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ1BvciBmYXZvciBmaWplIGVzdGUgdmFsb3IgYW50ZXMgZGUgbGEgZmVjaGEgZGUgdMOpcm1pbm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ1BvciBmYXZvciBmaWplIGVzdGUgdmFsb3IgZGVzcHXDqXMgZGUgbGEgZmVjaGEgZGUgaW5pY2lvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdFc3RhIGVzIHVuYSBvY3VycmVuY2lhIGRlIHVuYSBjaXRhIHJlcGV0aXRpdmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnUHJlY2lvbmUgYXF1w60gIHBhcmEgdmVyIGxhIGNpdGEgcGFkcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ1ByZWNpb25lIGFxdcOtICBwYXJhIGVkaXRhciBsYSBjaXRhIHBhZHJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVjdWVuY2lhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnQ2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUHVudG8gZGUgdGllbXBvIHJlbGF0aXZvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfCv0VzdMOhIHNlZ3VybyBkZSBxdWUgZGVzZWEgZWxpbWluYXIgZXN0YSBjaXRhPyBFc3RhIG9wZXJhY2nDs24gbm8gc2UgcHVlZGUgZGVzaGFjZXIuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdJbXBvcnRhciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnRWwgYXJjaGl2byBjYXJnYWRvIHRpZW5lIHF1ZSBlc3RhciBlbiB1biBmb3JtYXRvIGlDYWwgdsOhbGlkbyAoLmljcyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnU2kgZWwgQ2FsZW5kYXJpbyBkZXNlYWRvIG5vIGFwYXJlY2UgZW4gbGEgbGlzdGEsIHBvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSB0ZW5nYSBhbCBtZW5vcyBlbCBwZXJtaXNvIGRlICJjcmVhciInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfCv0FjdHVhbGl6YXIgbGFzIGNpdGFzIGV4aXN0ZW50ZXM/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnVG9kYXMgbGFzIGNpdGFzIGV4aXN0ZW50ZXMgZW4gZWwgY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gVW5pcXVlSUQgc2Ugc29icmVzY3JpYmlyw6FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0NhcmdhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBjaXRhcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOdWV2YSBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdQcm9udG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkw61hcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICdFbCBub21icmUgZGUgbGEgbm90aWZpY2FjacOzbiB5YSBleGlzdGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VudGVzIChyZWN1cnNvcyksIHF1ZSBwdWVkZW4gc2VyIHNlbGVjY2lvbmFkb3MgZGVudHJvIGRlIHVuYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FnZW50ZXMgY29uIChhbCBtZW5vcykgcGVybWlzb3MgZGUgbGVjdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3MgbG9zIGFnZW50ZXMgY29uIHBlcm1pc29zIGRlIGVzY3JpdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdFbCBzaXN0ZW1hIG5vIHB1ZG8gY3JlYXIgZWwgQ2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdObyBzZSB0aWVuZSBlbCBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdObyB0aWVuZSBhY2Nlc28gYSBlc3RlIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZGl0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXJyb3IgYWwgYWN0dWFsaXplciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnTm8gc2UgcHVlZGUgbGVlciBlbCBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIGRlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdQb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgZWwgYXJjaGl2byBlcyB2w6FsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdObyBzZSBwdWVkZSBpbXBvcnRhciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdDYWxlbmRhcmlvIGltcG9ydGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ1NlIG5lY2VzaXRhIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnTm90IHNlIHB1ZWRlbiBvYnRlbmVyIGxvcyBkYXRvcyBwYXJhIGVsIENhbGVuZGFySUQgZXNwZWNpZmljYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdTZSBoYW4gaW1wb3J0YWRvICVzIGNpdGEocykgYWwgY2FsZW5kYXJpbyAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgbWludXRvcyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgaG9yYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdUb2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnQ2l0YXMgYXNpZ25hZGFzIGEgbcOtICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnTW9zdHJhbmRvIHNvbG8gY2l0YXMgYXNpZ25hZGFzIGEgdMOtISBDYW1iaWFyIGNvbmZpZ3VyYWNpw7NuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ0xhIGNpdGEgbm8gZnVlIGVuY29udHJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTnVuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnQ2FkYSBEw61hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdDYWRhIFNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ0NhZGEgTWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdDYWRhIEHDsW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnUGVyc29uYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RpYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0FudWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnY2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ3BvciAlcyB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdoYXN0YSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAncG9yIC4uLiB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2hhc3RhICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ1NpbiBub3RpZmljYWNpb25lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXRvKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgaG9yYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZMOtYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHNlbWFuYXMgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdhbnRlcyBkZSBxdWUgbGEgY2l0YSBpbmljaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdkZXNwdcOpcyBkZSBxdWUgbGEgY2l0YSBoYWxsYSBpbmljaWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdhbnRlcyBkZSBxdWUgdGVybWluZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGZpbmFsaXphZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTGEgY2l0YSBubyBwdWVkZSBzZXIgYm9ycmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnTm8gdGllbmUgcGVybWlzb3MhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ05vIHRpZW5lIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBpbXBvcnRhciBlbCBhcmNoaXZvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCBtw6FzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnTm8gc2UgdGllbmUgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdObyBleGlzdGUgZWwgdXN1YXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdDYWxlbmRhcmlvIGludsOhbGlkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdVUkwgaW52w6FsaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdTZSBwcm9kdWpvIHVuIGVycm9yIGFsIGV4cG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnQWN0dWFsaXphdGlvbiAobWludXRvcyknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1DDoWdpbmEgZGUgcmVzdW1lbiBkZWwgQ2FsZW5kYXJpbyBkZSBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvcyBkZWwgY2FsZW5kYXJpbyBkZSBjaXRhcyBxdWUgcHJlcGFyYSBlbnRyYWRhcyBwYXJhIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG9zIGRlIGNhbGVuZGFyaW8gcXVlIGFjdHVhbGl6YSBsb3MgZGF0b3MgZGVsIHRpY2tldCBkZXNkZSB1bmEgY2l0YSBkZSB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnTGlzdGEgZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhY2lvbmVzIGRlIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ0NpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgZ2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnRWxpamEgZWwgdGlwbyBkZSBjYW1iaW9zIGVuIGxhcyBjaXRhcyBwYXIgbGFzIGN1YWxlcyBkZXNlYSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnQ3JlYXIgdW5hIG51ZXZhIGNpdGEgZGUgY2FsZW5kYXJpbyB2aW5jdWxhZGEgYSBlc3RlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0NyZWFyIHkgZ2VzdGlvbmFyIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0NyZWFyIG51ZXZhIGNpdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnRGVmaW5lIGN1YWxlcyBjb2x1bW5hcyBzZXLDoW4gbW9zdHJhZGFzIGVuIHdpZGdldCBkZSBjaXRhcyB2aW5jdWxhZGFzIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGVqYSIpLiBQb3NpYmxlcyBhanVzdGVzOiAwID0gRGVzaGFiaXRhZGEsIDEgPSBIYWJpbGl0YWRhLCAyID0gSGFiaWxpdGFkYSBwb3Igb21pc2nDs24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSB1biBpY29ubyBkZSB2w61uY3VsbyBhIGxhIHBhZ2luYSBkZSBnb29nbGUgbWFwIGRlIGxhIHViaWNhY2nDs24gYWN0dWFsIGVuIGxhIHBhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0RlZmluZSBsb3MgdGlwb3MgZGUgb2JqZXRvIGRlIGV2ZW50byBxdWUgc2UgbWFuZWphbiBhIHRyYXbDqXMgZGVsIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdEZWZpbmUgbGEgbGlzdGEgZGUgcGFyw6FtZXRyb3MgcXVlIHB1ZWRlbiBzZXIgZW52aWFkb3MgYSBsYSBmdW5jacOzbiBkZSBiw7pzcXVlZGEgZGUgdGlja2V0cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBjYW1wb3MgZGluw6FtaWNvcyBkZSB0aWNrZXQgZGUgdGlwbyBmZWNoYSB5IGhvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc2NhbGFtaWVudG8gZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNwZXJhIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnRGVmaW5lIGVsIHBsdWdpbiBkZSB0aWNrZXQgcGFyYSBsYXMgY2l0YXMgZGUgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnQ2FtcG9EaW7DoW1pY29fJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkaXRhciBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdUaWVtcG8gZGUgcHJpbWVyYSByZXNwdWVzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgaW1wb3J0YWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdWaW5jdWxhciBjaXRhcyB5IHRpY2tldHMgY29uIGVsIHRpcG8gZGUgdsOtbmN1bG8gIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjaXRhcyBxdWUgc29uIGRlc3BsZWdhb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgc29uIGRlc3BsZWdhZG9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0YSBkZSBjb2xvcmVzIGVuIGhleGFkZWNpbWFsIFJHQiBxdWUgZXN0YXLDoW4gZGlzcG9uaWJsZXMgcGFyYSBzdSBzZWxlY2Npw7NuIGR1cmFudGUgbGEgY3JlYWNpw7NuIGRlIGNhbGVuZGFyaW9zLiBBc2Vnw7pyZXNlIHF1ZSBsb3MgY29sb3JlcyBzZWFuIHN1ZmljaWVudGVtZW50ZSBvYnNjdXJvcyBwYXJhIHF1ZSBlbCB0ZXh0byBiYW5jbyBzZSB2ZWEgY29ycmVjdGFtZW50ZSBzb2JyZSBlbGxvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnR2VzdGlvbmFyIGRpZmVyZW50ZXMgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTnVtZXJvIG3DoXhpbW8gZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBlbiBsYXMgcGFudGFsbGFzIGRlIHJlc3VtZW4uIFBvciBmYXZvciBub3RlIHF1ZSB1biBudW1lcm8gZ3JhbmRlIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgcHVlZGUgdGVuZXIgdW4gaW1wYWN0byBuZWdhdGl2byBlbiBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWRvciBkZWJpZG8gYSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBsbGFtYWRhcyBzaW11bHTDoW5lYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgbm8gYWRtaXRlIGNpdGFzIHJlY3VycmVudGVzIHNpbiBmZWNoYSBkZSBmaW5hbGl6YWNpw7NuIG8gc2luIG7Dum1lcm8gZGUgaXRlcmFjaW9uZXMuIER1cmFudGUgZWwgcHJvY2VzbyBkZSBpbXBvcnRhY2nDs24sIHB1ZWRlIG9jdXJyaXIgcXVlIGVsIGFyY2hpdm8gSUNTIGNvbnRlbmdhIGRpY2hhcyBjaXRhcy4gRW4gc3UgbHVnYXIsIGVsIHNpc3RlbWEgY3JlYSB0b2RhcyBsYXMgY2l0YXMgZW4gZWwgcGFzYWRvLCBhZGVtw6FzIGRlIGNpdGFzIHBhcmEgbG9zIHByw7N4aW1vcyBuIG1lc2VzICgxMjAgbWVzZXMgLyAxMCBhw7FvcyBwb3IgZGVmZWN0bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUmVzdW1lbiBkZSB0b2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVGllbXBvIGRlIGVzcGVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnQsO6c3F1ZWRhIGRlIHBsdWctaW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTcOzZHVsbyBQbHVnLWluIGRlIGLDunNxdWVkYSBwYXJhIGF1dG8tY29tcGxldGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdDYWxlbmRhcmlvIFDDunBsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdDYWxlbmRhcmlvIHDDumJsaWNvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnTXVlc3RyYSB1biB2w61uY3VsbyBlbiBlbCBtZW7DuiBwYXJhIGNyZWFyIHVuYSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGFsIHRpY2tldCBkaXJlY3RvIGRlc2RlICBsYSB2aXN0YSBkZSBkZXRhbGxlIGRlIHRpY2tldCBkZSBsYSBpbnRlcmZhY2UgZGVsIGFnZW50ZS4gQWRpY2lvbmFsbWVudGUgc2UgcHVlZGUgaGFjZXIgaW4gY29udHJvbCBkZSBhY2Nlc28gcGFyYSBtb3N0cmFyIG8gbm8gZXN0ZSB2w61uY3VsbyB1c2FuZG8gbGEgQ2xhdmUgIkdyb3VwIiB5IGVsIENvbnRlbmlkbyBjb21vICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFBhcmEgYWdydXBhciBlbGVtZW50byBkZWwgbWVuw7ogdXNlIGxhIENsYXZlICJDbHVzdGVyTmFtZSIgcGFyYSBlbCBDb250ZW5pZG8gY3VhbHF1aWVyIG5vbWJyZSBxdWUgZGVzZWUgdmVyIGVuIGxhIGludGVyZmFjZSBkZWwgdXN1YXJpby4gVXRpbGl6ZSAiQ2x1c3RlclByaW9yaXR5IiBwYXJhIGNvbmZpZ3VyYXIgZWwgb3JkZW4gZGUgdW4gY2llcnRvIGdydXBvIGRlbnRybyBkZSBsYSBiYXJyYSBkZSBoZXJyYW1pZW50YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdUaWVtcG8gZGUgU29sdWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnU2VsZWN0aW9uIGRlIHRyYW5zcG9ydGUgcGFyYSBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnRGlzcGFyYSBsYSBhY2Npw7NuIGRlIGHDsWFkaXIgbyBhY3R1YWxpemFyIGNpdGFzIGF1dG9tw6F0aWNhcyBkZSBjYWxlbmRhcmlvcyBiYXNhZGFzIGVuIGNpZXJ0b3MgdGllbXBvcyBkZSB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ1RpZW1wbyBkZSBBY3R1YWxpemFjacOzbic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX01YX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIE5vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIGxhcyBub3RpZmljYWNpb25lcyBkZSBsYXMgY2l0YXMgYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBjb21vIGxvcyBleHBvcnRhZG9zIHBvciBlbCBtw7NkdWxvIGRlIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0FxdcOtIGVzIHBvc2libGUgZWxlZ2lyIGxvcyBldmVudG9zIHF1ZSBpbmljaWFyw6FuIGVzdGEgbm90aWZpY2FjacOzbi4gVW4gZmlsdHJvIGFkaWNpb25hbCBkZSBsYSBjaXRhIHNlIHB1ZWRlIGFwbGljYXIgYSBjb250aW51YWNpw7NuIHBhcmEgZW52aWFyIHPDs2xvIHBhcmEgY2l0YXMgY29uIGNpZXJ0b3MgY3JpdGVyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0cm8gZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0VxdWlwbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1JlY3Vyc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdOb3RpZmljYXIgYWwgdXN1YXJpbyBzb2xvIHVuYSB2ZXogYWwgZMOtYSBhY2VyY2EgZGUgdW5hIHNvbGEgY2l0YSB1c2FuZG8gZWwgdHJhbnNwb3J0ZSBzZWxlY2Npb25hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnTGFzIG5vdGlmaWNhY2lvbmVzIHNlIGVudsOtYW4gYSB1biBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdQYXJhIG9idGVuZXIgbG9zIHByaW1lcm9zIDIwIGNhcmFjdGVyZXMgZGVsIHTDrXR1bG8gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZW5lciBlbCBhdHJpYnV0byBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlbCBjYWxlbmRhcmlvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgbGEgQWdlbmRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdHZXN0aW9uYXIgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQ29sb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdGZWNoYSBkZSB0w6lybWlubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdSZXBldGljacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdObyBzZSBlbmNvbnRyYXJvbiBjYWxlbmRhcmlvLiBQb3IgZmF2b3IgcHJpbWVybyBhw7FhZGEgdW4gY2FsZW5kYXJpbyB1dGlsaXphZG8gbGEgcGFnaW5hIGRlIEdlc3Rpb25hciBDYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFc3RhIGVzIHVuYSBjaXRhIHJlcGV0aXRpdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdEZXNlYSBlZGl0YXIgc29sbyBlc3RhIG8gdG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1RvZGFzIGxhcyBvY3VycmVuY2lhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1NvbG8gZXN0YSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIHVuIENhbGVuZGFyaW8gbnVldm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnQcOxYWRpciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIHVuIGNhbGVuZGFyaW8gYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBwYXJhIHBvZGVyIHNlciBleHBvcnRhZG8gcG9yIGVsIG3Ds2R1bG8gZGUgZ2VzdGnDs24gZGUgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnQ2FyZ2FyIGNvbmZpZ3VyYWNpw7NuIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnSW1wb3J0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRybyBwYXJhIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0RlcGVuZGllbmRvIGRlbCBjYW1wbyBkZSBncnVwbywgZWwgc2lzdGVtYSBwZXJtaXRlIGVsIGFjY2VzbyBhIHVzdWFyaW9zIGFsIGNhbGVuZGFyaW8gZGUgYWN1ZXJkbyBhIHN1cyBuaXZlbGVzIGRlIHBlcm1pc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1JPOiB1c3VhcmlvcyBxdWUgcHVlZGVuIHZlciB5IGV4cG9ydGFyIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ01vdmVyX0E6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gbW9kaWZpY2FyIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8sIHBlcm8gc2luIGNhbWJpYXIgbGEgc2VsZWNjacOzbiBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JlYXI6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gY3JlYXIgeSBib3JyYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ1JXOiB1c3VhcmlvIHF1ZSBwdWVkZW4gZ2VzdGlvbmFyIGVsIGNhbGVuZGFyaW8gZW4gc8OtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnRGVzY2FyZ2FyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnQ29waWFyIFVSTCBww7pibGljYSBkZSBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOb21icmUgZGVsIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnWWEgZXhpc3RlIHVuIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIG5vbWJyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdDaXRhcyBkZSBUaWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2xhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ1VzZSBsYXMgb3BjaW9uZXMgbW9zdHJhZGFzIGFiYWpvIHBhcmEgYWNvcnRhciBsYXMgY2l0YXMgZGUgdGlja2V0cyBzZXLDoW4gY3JlYWRhcyBhdXRvbcOhdGljYW1lbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUG9vciBmYXZvciBzZWxlY2Npb25lIHVuYSBmaWxhIHbDoWxpZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdBdHJpYnV0b3MgZGUgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5lIHJlZ2xhcyBwYXJhIGNyZWFjacOzbiBkZSBjaXRhcyBhdXRvbcOhdGljYXMgZW4gZXN0ZSBjYWxlbmRhcmlvIGJhc2FkYXMgZW4gbG9zIGRhdG9zIGRlIGxvcyB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ0HDsWFkaXIgcmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ03DoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01lbm9zJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0HDsWFkaXIgbnVldmEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICdDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnRGVtYXNpYWRvcyBjYWxlbmRhcmlvcyBhY3Rpdm9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ1BvciBmYXZvciBkZXNhY3RpdmUgYWxndW5vcyBwcmltZXJvIG8gaW5jcmVtZW50ZSBlbCBsw61taXRlIGVuIGxhIGNvbmZpZ3VyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdTZW1hbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdMw61uZWEgZGUgdGllbXBvIE1lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gU2VtYW5hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdMw61uZWEgZGUgdGllbXBvIERpYXJpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAnU2FsdGFyIGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ0Rlc2NhcnRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnTW9zdHJhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFjacOzbiBiw6FzaWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJ0ZlY2hhL0hvcmEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ1BvciBmYXZvciBmaWplIGVzdGUgdmFsb3IgYW50ZXMgZGUgbGEgZmVjaGEgZGUgdMOpcm1pbm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ1BvciBmYXZvciBmaWplIGVzdGUgdmFsb3IgZGVzcHXDqXMgZGUgbGEgZmVjaGEgZGUgaW5pY2lvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdFc3RhIGVzIHVuYSBvY3VycmVuY2lhIGRlIHVuYSBjaXRhIHJlcGV0aXRpdmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnUHJlY2lvbmUgYXF1w60gIHBhcmEgdmVyIGxhIGNpdGEgcGFkcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ1ByZWNpb25lIGFxdcOtICBwYXJhIGVkaXRhciBsYSBjaXRhIHBhZHJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVjdWVuY2lhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnQ2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUHVudG8gZGUgdGllbXBvIHJlbGF0aXZvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfCv0VzdMOhIHNlZ3VybyBkZSBxdWUgZGVzZWEgZWxpbWluYXIgZXN0YSBjaXRhPyBFc3RhIG9wZXJhY2nDs24gbm8gc2UgcHVlZGUgZGVzaGFjZXIuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdJbXBvcnRhciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnRWwgYXJjaGl2byBjYXJnYWRvIHRpZW5lIHF1ZSBlc3RhciBlbiB1biBmb3JtYXRvIGlDYWwgdsOhbGlkbyAoLmljcyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnU2kgZWwgQ2FsZW5kYXJpbyBkZXNlYWRvIG5vIGFwYXJlY2UgZW4gbGEgbGlzdGEsIHBvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSB0ZW5nYSBhbCBtZW5vcyBlbCBwZXJtaXNvIGRlICJjcmVhciInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfCv0FjdHVhbGl6YXIgbGFzIGNpdGFzIGV4aXN0ZW50ZXM/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnVG9kYXMgbGFzIGNpdGFzIGV4aXN0ZW50ZXMgZW4gZWwgY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gVW5pcXVlSUQgc2Ugc29icmVzY3JpYmlyw6FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0NhcmdhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBjaXRhcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOdWV2YSBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdQcm9udG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkw61hcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICdFbCBub21icmUgZGUgbGEgbm90aWZpY2FjacOzbiB5YSBleGlzdGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VudGVzIChyZWN1cnNvcyksIHF1ZSBwdWVkZW4gc2VyIHNlbGVjY2lvbmFkb3MgZGVudHJvIGRlIHVuYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FnZW50ZXMgY29uIChhbCBtZW5vcykgcGVybWlzb3MgZGUgbGVjdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3MgbG9zIGFnZW50ZXMgY29uIHBlcm1pc29zIGRlIGVzY3JpdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdFbCBzaXN0ZW1hIG5vIHB1ZG8gY3JlYXIgZWwgQ2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdObyBzZSB0aWVuZSBlbCBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdObyB0aWVuZSBhY2Nlc28gYSBlc3RlIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZGl0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXJyb3IgYWwgYWN0dWFsaXplciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnTm8gc2UgcHVlZGUgbGVlciBlbCBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIGRlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdQb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgZWwgYXJjaGl2byBlcyB2w6FsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdObyBzZSBwdWVkZSBpbXBvcnRhciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdDYWxlbmRhcmlvIGltcG9ydGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ1NlIG5lY2VzaXRhIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnTm90IHNlIHB1ZWRlbiBvYnRlbmVyIGxvcyBkYXRvcyBwYXJhIGVsIENhbGVuZGFySUQgZXNwZWNpZmljYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdTZSBoYW4gaW1wb3J0YWRvICVzIGNpdGEocykgYWwgY2FsZW5kYXJpbyAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgbWludXRvcyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgaG9yYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdUb2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnQ2l0YXMgYXNpZ25hZGFzIGEgbcOtICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnTW9zdHJhbmRvIHNvbG8gY2l0YXMgYXNpZ25hZGFzIGEgdMOtISBDYW1iaWFyIGNvbmZpZ3VyYWNpw7NuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ0xhIGNpdGEgbm8gZnVlIGVuY29udHJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTnVuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnQ2FkYSBEw61hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdDYWRhIFNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ0NhZGEgTWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdDYWRhIEHDsW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnUGVyc29uYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RpYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0FudWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnY2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ3BvciAlcyB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdoYXN0YSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAncG9yIC4uLiB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2hhc3RhICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ1NpbiBub3RpZmljYWNpb25lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXRvKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgaG9yYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZMOtYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHNlbWFuYXMgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdhbnRlcyBkZSBxdWUgbGEgY2l0YSBpbmljaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdkZXNwdcOpcyBkZSBxdWUgbGEgY2l0YSBoYWxsYSBpbmljaWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdhbnRlcyBkZSBxdWUgdGVybWluZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGZpbmFsaXphZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTGEgY2l0YSBubyBwdWVkZSBzZXIgYm9ycmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnTm8gdGllbmUgcGVybWlzb3MhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ05vIHRpZW5lIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBpbXBvcnRhciBlbCBhcmNoaXZvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCBtw6FzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnTm8gc2UgdGllbmUgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdObyBleGlzdGUgZWwgdXN1YXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdDYWxlbmRhcmlvIGludsOhbGlkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdVUkwgaW52w6FsaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdTZSBwcm9kdWpvIHVuIGVycm9yIGFsIGV4cG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnQWN0dWFsaXphdGlvbiAobWludXRvcyknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1DDoWdpbmEgZGUgcmVzdW1lbiBkZWwgQ2FsZW5kYXJpbyBkZSBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvcyBkZWwgY2FsZW5kYXJpbyBkZSBjaXRhcyBxdWUgcHJlcGFyYSBlbnRyYWRhcyBwYXJhIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG9zIGRlIGNhbGVuZGFyaW8gcXVlIGFjdHVhbGl6YSBsb3MgZGF0b3MgZGVsIHRpY2tldCBkZXNkZSB1bmEgY2l0YSBkZSB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnTGlzdGEgZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhY2lvbmVzIGRlIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ0NpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgZ2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnRWxpamEgZWwgdGlwbyBkZSBjYW1iaW9zIGVuIGxhcyBjaXRhcyBwYXIgbGFzIGN1YWxlcyBkZXNlYSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnQ3JlYXIgdW5hIG51ZXZhIGNpdGEgZGUgY2FsZW5kYXJpbyB2aW5jdWxhZGEgYSBlc3RlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0NyZWFyIHkgZ2VzdGlvbmFyIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0NyZWFyIG51ZXZhIGNpdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnRGVmaW5lIGN1YWxlcyBjb2x1bW5hcyBzZXLDoW4gbW9zdHJhZGFzIGVuIHdpZGdldCBkZSBjaXRhcyB2aW5jdWxhZGFzIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGVqYSIpLiBQb3NpYmxlcyBhanVzdGVzOiAwID0gRGVzaGFiaXRhZGEsIDEgPSBIYWJpbGl0YWRhLCAyID0gSGFiaWxpdGFkYSBwb3Igb21pc2nDs24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSB1biBpY29ubyBkZSB2w61uY3VsbyBhIGxhIHBhZ2luYSBkZSBnb29nbGUgbWFwIGRlIGxhIHViaWNhY2nDs24gYWN0dWFsIGVuIGxhIHBhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0RlZmluZSBsb3MgdGlwb3MgZGUgb2JqZXRvIGRlIGV2ZW50byBxdWUgc2UgbWFuZWphbiBhIHRyYXbDqXMgZGVsIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdEZWZpbmUgbGEgbGlzdGEgZGUgcGFyw6FtZXRyb3MgcXVlIHB1ZWRlbiBzZXIgZW52aWFkb3MgYSBsYSBmdW5jacOzbiBkZSBiw7pzcXVlZGEgZGUgdGlja2V0cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBjYW1wb3MgZGluw6FtaWNvcyBkZSB0aWNrZXQgZGUgdGlwbyBmZWNoYSB5IGhvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc2NhbGFtaWVudG8gZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNwZXJhIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnRGVmaW5lIGVsIHBsdWdpbiBkZSB0aWNrZXQgcGFyYSBsYXMgY2l0YXMgZGUgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnQ2FtcG9EaW7DoW1pY29fJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkaXRhciBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdUaWVtcG8gZGUgcHJpbWVyYSByZXNwdWVzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgaW1wb3J0YWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdWaW5jdWxhciBjaXRhcyB5IHRpY2tldHMgY29uIGVsIHRpcG8gZGUgdsOtbmN1bG8gIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjaXRhcyBxdWUgc29uIGRlc3BsZWdhb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgc29uIGRlc3BsZWdhZG9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0YSBkZSBjb2xvcmVzIGVuIGhleGFkZWNpbWFsIFJHQiBxdWUgZXN0YXLDoW4gZGlzcG9uaWJsZXMgcGFyYSBzdSBzZWxlY2Npw7NuIGR1cmFudGUgbGEgY3JlYWNpw7NuIGRlIGNhbGVuZGFyaW9zLiBBc2Vnw7pyZXNlIHF1ZSBsb3MgY29sb3JlcyBzZWFuIHN1ZmljaWVudGVtZW50ZSBvYnNjdXJvcyBwYXJhIHF1ZSBlbCB0ZXh0byBiYW5jbyBzZSB2ZWEgY29ycmVjdGFtZW50ZSBzb2JyZSBlbGxvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnR2VzdGlvbmFyIGRpZmVyZW50ZXMgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTnVtZXJvIG3DoXhpbW8gZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBlbiBsYXMgcGFudGFsbGFzIGRlIHJlc3VtZW4uIFBvciBmYXZvciBub3RlIHF1ZSB1biBudW1lcm8gZ3JhbmRlIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgcHVlZGUgdGVuZXIgdW4gaW1wYWN0byBuZWdhdGl2byBlbiBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWRvciBkZWJpZG8gYSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBsbGFtYWRhcyBzaW11bHTDoW5lYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgbm8gYWRtaXRlIGNpdGFzIHJlY3VycmVudGVzIHNpbiBmZWNoYSBkZSBmaW5hbGl6YWNpw7NuIG8gc2luIG7Dum1lcm8gZGUgaXRlcmFjaW9uZXMuIER1cmFudGUgZWwgcHJvY2VzbyBkZSBpbXBvcnRhY2nDs24sIHB1ZWRlIG9jdXJyaXIgcXVlIGVsIGFyY2hpdm8gSUNTIGNvbnRlbmdhIGRpY2hhcyBjaXRhcy4gRW4gc3UgbHVnYXIsIGVsIHNpc3RlbWEgY3JlYSB0b2RhcyBsYXMgY2l0YXMgZW4gZWwgcGFzYWRvLCBhZGVtw6FzIGRlIGNpdGFzIHBhcmEgbG9zIHByw7N4aW1vcyBuIG1lc2VzICgxMjAgbWVzZXMgLyAxMCBhw7FvcyBwb3IgZGVmZWN0bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUmVzdW1lbiBkZSB0b2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVGllbXBvIGRlIGVzcGVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnQsO6c3F1ZWRhIGRlIHBsdWctaW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTcOzZHVsbyBQbHVnLWluIGRlIGLDunNxdWVkYSBwYXJhIGF1dG8tY29tcGxldGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdDYWxlbmRhcmlvIFDDunBsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdDYWxlbmRhcmlvIHDDumJsaWNvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnTXVlc3RyYSB1biB2w61uY3VsbyBlbiBlbCBtZW7DuiBwYXJhIGNyZWFyIHVuYSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGFsIHRpY2tldCBkaXJlY3RvIGRlc2RlICBsYSB2aXN0YSBkZSBkZXRhbGxlIGRlIHRpY2tldCBkZSBsYSBpbnRlcmZhY2UgZGVsIGFnZW50ZS4gQWRpY2lvbmFsbWVudGUgc2UgcHVlZGUgaGFjZXIgaW4gY29udHJvbCBkZSBhY2Nlc28gcGFyYSBtb3N0cmFyIG8gbm8gZXN0ZSB2w61uY3VsbyB1c2FuZG8gbGEgQ2xhdmUgIkdyb3VwIiB5IGVsIENvbnRlbmlkbyBjb21vICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFBhcmEgYWdydXBhciBlbGVtZW50byBkZWwgbWVuw7ogdXNlIGxhIENsYXZlICJDbHVzdGVyTmFtZSIgcGFyYSBlbCBDb250ZW5pZG8gY3VhbHF1aWVyIG5vbWJyZSBxdWUgZGVzZWUgdmVyIGVuIGxhIGludGVyZmFjZSBkZWwgdXN1YXJpby4gVXRpbGl6ZSAiQ2x1c3RlclByaW9yaXR5IiBwYXJhIGNvbmZpZ3VyYXIgZWwgb3JkZW4gZGUgdW4gY2llcnRvIGdydXBvIGRlbnRybyBkZSBsYSBiYXJyYSBkZSBoZXJyYW1pZW50YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdUaWVtcG8gZGUgU29sdWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnU2VsZWN0aW9uIGRlIHRyYW5zcG9ydGUgcGFyYSBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnRGlzcGFyYSBsYSBhY2Npw7NuIGRlIGHDsWFkaXIgbyBhY3R1YWxpemFyIGNpdGFzIGF1dG9tw6F0aWNhcyBkZSBjYWxlbmRhcmlvcyBiYXNhZGFzIGVuIGNpZXJ0b3MgdGllbXBvcyBkZSB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ1RpZW1wbyBkZSBBY3R1YWxpemFjacOzbic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdOb3RpZmljYWNpw7NuIGRlIHJlY29yZGF0b3JpbyBkZSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdSZWNpYmlyw6EgdW5hIG5vdGlmaWNhY2nDs24gY2FkYSB2ZXogcXVlIHNlIGFsY2FuY2UgbGEgaG9yYSBkZSB1biByZWNvcmRhdG9yaW8gcGFyYSB1bmEgZGUgc3VzIGNpdGFzLic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIE5vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIGxhcyBub3RpZmljYWNpb25lcyBkZSBsYXMgY2l0YXMgYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBjb21vIGxvcyBleHBvcnRhZG9zIHBvciBlbCBtw7NkdWxvIGRlIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0FxdcOtIGVzIHBvc2libGUgZWxlZ2lyIGxvcyBldmVudG9zIHF1ZSBpbmljaWFyw6FuIGVzdGEgbm90aWZpY2FjacOzbi4gVW4gZmlsdHJvIGFkaWNpb25hbCBkZSBsYSBjaXRhIHNlIHB1ZWRlIGFwbGljYXIgYSBjb250aW51YWNpw7NuIHBhcmEgZW52aWFyIHPDs2xvIHBhcmEgY2l0YXMgY29uIGNpZXJ0b3MgY3JpdGVyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0cm8gZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0VxdWlwbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1JlY3Vyc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdOb3RpZmljYXIgYWwgdXN1YXJpbyBzb2xvIHVuYSB2ZXogYWwgZMOtYSBhY2VyY2EgZGUgdW5hIHNvbGEgY2l0YSB1c2FuZG8gZWwgdHJhbnNwb3J0ZSBzZWxlY2Npb25hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnTGFzIG5vdGlmaWNhY2lvbmVzIHNlIGVudsOtYW4gYSB1biBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdQYXJhIG9idGVuZXIgbG9zIHByaW1lcm9zIDIwIGNhcmFjdGVyZXMgZGVsIHTDrXR1bG8gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZW5lciBlbCBhdHJpYnV0byBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlbCBjYWxlbmRhcmlvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgbGEgQWdlbmRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdHZXN0aW9uYXIgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQ29sb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdGZWNoYSBkZSB0w6lybWlubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdSZXBldGljacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdObyBzZSBlbmNvbnRyYXJvbiBjYWxlbmRhcmlvLiBQb3IgZmF2b3IgcHJpbWVybyBhw7FhZGEgdW4gY2FsZW5kYXJpbyB1dGlsaXphZG8gbGEgcGFnaW5hIGRlIEdlc3Rpb25hciBDYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFc3RhIGVzIHVuYSBjaXRhIHJlcGV0aXRpdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdEZXNlYSBlZGl0YXIgc29sbyBlc3RhIG8gdG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1RvZGFzIGxhcyBvY3VycmVuY2lhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1NvbG8gZXN0YSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIHVuIENhbGVuZGFyaW8gbnVldm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnQcOxYWRpciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBjYXJnYXIgdW4gYXJjaGl2byBkZSBjb25maWd1cmFjacOzbiBwYXJhIGltcG9ydGFyIHVuIGNhbGVuZGFyaW8gYSBzdSBzaXN0ZW1hLiBFbCBhcmNoaXZvIG5lY2VzaXRhIGVzdGFyIGVuIGVsIGZvcm1hdG8gLnltbCBwYXJhIHBvZGVyIHNlciBleHBvcnRhZG8gcG9yIGVsIG3Ds2R1bG8gZGUgZ2VzdGnDs24gZGUgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnQ2FyZ2FyIGNvbmZpZ3VyYWNpw7NuIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnSW1wb3J0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRybyBwYXJhIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0RlcGVuZGllbmRvIGRlbCBjYW1wbyBkZSBncnVwbywgZWwgc2lzdGVtYSBwZXJtaXRlIGVsIGFjY2VzbyBhIHVzdWFyaW9zIGFsIGNhbGVuZGFyaW8gZGUgYWN1ZXJkbyBhIHN1cyBuaXZlbGVzIGRlIHBlcm1pc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1JPOiB1c3VhcmlvcyBxdWUgcHVlZGVuIHZlciB5IGV4cG9ydGFyIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ01vdmVyX0E6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gbW9kaWZpY2FyIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8sIHBlcm8gc2luIGNhbWJpYXIgbGEgc2VsZWNjacOzbiBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JlYXI6IHVzdWFyaW9zIHF1ZSBwdWVkZW4gY3JlYXIgeSBib3JyYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ1JXOiB1c3VhcmlvIHF1ZSBwdWVkZW4gZ2VzdGlvbmFyIGVsIGNhbGVuZGFyaW8gZW4gc8OtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnRGVzY2FyZ2FyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnQ29waWFyIGxhIFVSTCBww7pibGljYSBkZSBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOb21icmUgZGVsIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnWWEgZXhpc3RlIHVuIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIG5vbWJyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdDaXRhcyBkZSBUaWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2xhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ1VzZSBsYXMgb3BjaW9uZXMgbW9zdHJhZGFzIGFiYWpvIHBhcmEgYWNvcnRhciBsYXMgY2l0YXMgZGUgdGlja2V0cyBxdWUgc2Vyw6FuIGNyZWFkYXMgYXV0b23DoXRpY2FtZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ1BvciBmYXZvciBzZWxlY2Npb25lIHVuYSBjb2xhIHbDoWxpZGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnQXRyaWJ1dG9zIGRlIGLDunNxdWVkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ0RlZmluZSByZWdsYXMgcGFyYSBjcmVhY2nDs24gZGUgbGFzIGNpdGFzIGF1dG9tw6F0aWNhcyBlbiBlc3RlIGNhbGVuZGFyaW8gYmFzYWRhcyBlbiBsb3MgZGF0b3MgZGUgbG9zIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnQcOxYWRpciByZWdsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTcOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWVub3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBudWV2YSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdEZW1hc2lhZG9zIGNhbGVuZGFyaW9zIGFjdGl2b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUG9yIGZhdm9yIGRlc2FjdGl2ZSBhbGd1bm9zIHByaW1lcm8gbyBpbmNyZW1lbnRlIGVsIGzDrW1pdGUgZW4gbGEgY29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1NlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gTWVuc3VhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnTMOtbmVhIGRlIHRpZW1wbyBTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gRGlhcmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdTYWx0YXIgYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnRGVzY2FydGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdNb3N0cmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYWNpw7NuIGLDoXNpY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRmVjaGEvSG9yYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnUG9yIGZhdm9yIGZpamUgZXN0ZSB2YWxvciBhbnRlcyBkZSBsYSBmZWNoYSBkZSB0w6lybWluby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnUG9yIGZhdm9yIGZpamUgZXN0ZSB2YWxvciBkZXNwdcOpcyBkZSBsYSBmZWNoYSBkZSBpbmljaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ0VzdGEgZXMgdW5hIG9jdXJyZW5jaWEgZGUgdW5hIGNpdGEgcmVwZXRpdGl2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdQcmVjaW9uZSBhcXXDrSAgcGFyYSB2ZXIgbGEgY2l0YSBwYWRyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnUHJlY2lvbmUgYXF1w60gIHBhcmEgZWRpdGFyIGxhIGNpdGEgcGFkcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0ZyZWN1ZW5jaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdDYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICdQdW50byBkZSB0aWVtcG8gcmVsYXRpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGEgY2l0YT8gRXN0YSBvcGVyYWNpw7NuIG5vIHNlIHB1ZWRlIGRlc2hhY2VyLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0YXIgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0VsIGFyY2hpdm8gY2FyZ2FkbyB0aWVuZSBxdWUgZXN0YXIgZW4gdW4gZm9ybWF0byBpQ2FsIHbDoWxpZG8gKC5pY3MpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1NpIGVsIENhbGVuZGFyaW8gZGVzZWFkbyBubyBhcGFyZWNlIGVuIGxhIGxpc3RhLCBwb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgdGVuZ2EgYWwgbWVub3MgZWwgcGVybWlzbyBkZSAiY3JlYXIiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnwr9BY3R1YWxpemFyIGxhcyBjaXRhcyBleGlzdGVudGVzPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ1RvZGFzIGxhcyBjaXRhcyBleGlzdGVudGVzIGVuIGVsIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIFVuaXF1ZUlEIHNlIHNvYnJlc2NyaWJpcsOhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdDYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0YXIgY2l0YXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnVldmEgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnUHJvbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZMOtYXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnwqFFbCBub21icmUgZGUgbGEgbm90aWZpY2FjacOzbiB5YSBleGlzdGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VudGVzIChyZWN1cnNvcyksIHF1ZSBwdWVkZW4gc2VyIHNlbGVjY2lvbmFkb3MgZGVudHJvIGRlIHVuYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FnZW50ZXMgY29uIChhbCBtZW5vcykgcGVybWlzb3MgZGUgbGVjdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3MgbG9zIGFnZW50ZXMgY29uIHBlcm1pc29zIGRlIGVzY3JpdHVyYSBwYXJhIGxhIGNpdGEgKGNhbGVuZGFyaW8pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdFbCBzaXN0ZW1hIG5vIHB1ZG8gY3JlYXIgZWwgQ2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdObyBzZSB0aWVuZSBlbCBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdObyB0aWVuZSBhY2Nlc28gYSBlc3RlIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZGl0YXIgQ2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXJyb3IgYWwgYWN0dWFsaXplciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnTm8gc2UgcHVlZGUgbGVlciBlbCBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIGRlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdQb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgZWwgYXJjaGl2byBlcyB2w6FsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdObyBzZSBwdWVkZSBpbXBvcnRhciBlbCBjYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICfCoUNhbGVuZGFyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnU2UgbmVjZXNpdGEgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOb3Qgc2UgcHVlZGVuIG9idGVuZXIgbG9zIGRhdG9zIHBhcmEgZWwgQ2FsZW5kYXJJRCBlc3BlY2lmaWNhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1NlIGhhbiBpbXBvcnRhZG8gJXMgY2l0YShzKSBhbCBjYWxlbmRhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBob3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1RvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdDaXRhcyBhc2lnbmFkYXMgYSBtw60gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdNb3N0cmFuZG8gc29sbyBjaXRhcyBhc2lnbmFkYXMgYSB0w60hIENhbWJpYXIgY29uZmlndXJhY2nDs24nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnwqFDaXRhIG5vIGVuY29udHJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTnVuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnQ2FkYSBEw61hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdDYWRhIFNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ0NhZGEgTWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdDYWRhIEHDsW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnUGVyc29uYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RpYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0FudWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnY2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ3BvciAlcyB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdoYXN0YSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAncG9yIC4uLiB2ZXooY2VzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2hhc3RhICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ1NpbiBub3RpZmljYWNpb25lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXRvKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgaG9yYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZMOtYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHNlbWFuYXMgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdhbnRlcyBkZWwgaW5pY2lvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdkZXNwdcOpcyBkZWwgaW5pY2lvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAnYW50ZXMgZGVsIGZpbiBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2Rlc3B1w6lzIGRlbCBmaW4gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ8KhTm8gdGllbmUgcGVybWlzb3MhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ0xhIGNpdGEgbm8gcHVlZGUgc2VyIGJvcnJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ8KhTm8gdGllbmUgcGVybWlzb3MhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ05vIHRpZW5lIHBlcm1pc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBpbXBvcnRhciBlbCBhcmNoaXZvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdQb3IgZmF2b3IsIHJldmlzZSBlbCByZWdpc3RybyBwYXJhIG1hcyBpbmZvcm1hY2nDs24uJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgbcOhcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ8KhTm8gc2UgdGllbmUgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICfCoU5vIGV4aXN0ZSBlbCB1c3VhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ8KhQ2FsZW5kYXJpbyBubyB2YWxpZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ8KhVVJMIG5vIHbDoWxpZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ8KhU2UgcHJvZHVqbyB1biBlcnJvciBhbCBleHBvcnRhciBlbCBjYWxlbmRhcmlvISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0FjdHVhbGl6YWNpw7NuIChtaW51dG9zKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnUMOhZ2luYSBkZSByZXN1bWVuIGRlbCBDYWxlbmRhcmlvIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYWNpb25lcyBkZSBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG9zIGRlbCBjYWxlbmRhcmlvIGRlIGNpdGFzIHF1ZSBwcmVwYXJhIGVudHJhZGFzIHBhcmEgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgYWN0dWFsaXphIGxvcyBkYXRvcyBkZWwgdGlja2V0IGRlc2RlIHVuYSBjaXRhIGRlIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgZWRpY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdMaXN0YSBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0xpc3RhIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2FjaW9uZXMgZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBnZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdFbGlqYSBlbCB0aXBvIGRlIGNhbWJpb3MgZW4gbGFzIGNpdGFzIHBhciBsYXMgY3VhbGVzIGRlc2VhIHJlY2liaXIgbm90aWZpY2FjaW9uZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdDcmVhciB1bmEgbnVldmEgY2l0YSBkZSBjYWxlbmRhcmlvIHZpbmN1bGFkYSBhIGVzdGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnQ3JlYSB5IGdlc3Rpb25hIGxhcyBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdDcmVhciBudWV2YSBjaXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0RlZmluZSBjdWFsZXMgY29sdW1uYXMgc2Vyw6FuIG1vc3RyYWRhcyBlbiB3aWRnZXQgZGUgY2l0YXMgdmluY3VsYWRhcyAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBBanVzdGVzIHBvc2libGVzOiAwID0gRGVzYWN0aXZhZG8sIDEgPSBEaXNwb25pYmxlLCAyID0gQWN0aXZhZG8gZGUgZm9ybWEgcHJlZGV0ZXJtaW5hZGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSB1biBpY29ubyBkZSB2w61uY3VsbyBhIGxhIHBhZ2luYSBkZSBnb29nbGUgbWFwIGRlIGxhIHViaWNhY2nDs24gYWN0dWFsIGVuIGxhIHBhbnRhbGxhIGRlIGVkaWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0RlZmluZSBsb3MgdGlwb3MgZGUgb2JqZXRvIGRlIGV2ZW50byBxdWUgc2UgbWFuZWphbiBhIHRyYXbDqXMgZGVsIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdEZWZpbmUgbGEgbGlzdGEgZGUgcGFyw6FtZXRyb3MgcXVlIHB1ZWRlbiBzZXIgZW52aWFkb3MgYSBsYSBmdW5jacOzbiBkZSBiw7pzcXVlZGEgZGUgdGlja2V0cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBjYW1wb3MgZGluw6FtaWNvcyBkZSB0aWNrZXQgZGUgdGlwbyBmZWNoYSB5IGhvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc2NhbGFtaWVudG8gZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNwZXJhIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnRGVmaW5lIGVsIHBsdWdpbiBkZSB0aWNrZXQgcGFyYSBsYXMgY2l0YXMgZGUgY2FsZW5kYXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnQ2FtcG9EaW7DoW1pY29fJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkaXRhciBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdUaWVtcG8gZGUgcHJpbWVyYSByZXNwdWVzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgaW1wb3J0YWNpw7NuIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdWaW5jdWxhciBjaXRhcyB5IHRpY2tldHMgY29uIGVsIHRpcG8gZGUgdsOtbmN1bG8gIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjaXRhcyBxdWUgc29uIGRlc3BsZWdhb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgc29uIGRlc3BsZWdhZG9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0YSBkZSBjb2xvcmVzIGVuIGhleGFkZWNpbWFsIFJHQiBxdWUgZXN0YXLDoW4gZGlzcG9uaWJsZXMgcGFyYSBzdSBzZWxlY2Npw7NuIGR1cmFudGUgbGEgY3JlYWNpw7NuIGRlIGNhbGVuZGFyaW9zLiBBc2Vnw7pyZXNlIHF1ZSBsb3MgY29sb3JlcyBzZWFuIHN1ZmljaWVudGVtZW50ZSBvYnNjdXJvcyBwYXJhIHF1ZSBlbCB0ZXh0byBiYW5jbyBzZSB2ZWEgY29ycmVjdGFtZW50ZSBzb2JyZSBlbGxvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnR2VzdGlvbmFyIGRpZmVyZW50ZXMgY2FsZW5kYXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTnVtZXJvIG3DoXhpbW8gZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBlbiBsYXMgcGFudGFsbGFzIGRlIHJlc3VtZW4uIFBvciBmYXZvciBub3RlIHF1ZSB1biBudW1lcm8gZ3JhbmRlIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgcHVlZGUgdGVuZXIgdW4gaW1wYWN0byBuZWdhdGl2byBlbiBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWRvciBkZWJpZG8gYSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBsbGFtYWRhcyBzaW11bHTDoW5lYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgbm8gYWRtaXRlIGNpdGFzIHJlY3VycmVudGVzIHNpbiBmZWNoYSBkZSBmaW5hbGl6YWNpw7NuIG8gc2luIG7Dum1lcm8gZGUgaXRlcmFjaW9uZXMuIER1cmFudGUgZWwgcHJvY2VzbyBkZSBpbXBvcnRhY2nDs24sIHB1ZWRlIG9jdXJyaXIgcXVlIGVsIGFyY2hpdm8gSUNTIGNvbnRlbmdhIGRpY2hhcyBjaXRhcy4gRW4gc3UgbHVnYXIsIGVsIHNpc3RlbWEgY3JlYSB0b2RhcyBsYXMgY2l0YXMgZW4gZWwgcGFzYWRvLCBhZGVtw6FzIGRlIGNpdGFzIHBhcmEgbG9zIHByw7N4aW1vcyBuIG1lc2VzICgxMjAgbWVzZXMgLyAxMCBhw7FvcyBwb3IgZGVmZWN0bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUmVzdW1lbiBkZSB0b2RhcyBsYXMgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVGllbXBvIGRlIGVzcGVyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnQsO6c3F1ZWRhIGRlIHBsdWctaW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTcOzZHVsbyBQbHVnLWluIGRlIGLDunNxdWVkYSBwYXJhIGF1dG8tY29tcGxldGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdDYWxlbmRhcmlvIFDDunBsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdDYWxlbmRhcmlvIHDDumJsaWNvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnTXVlc3RyYSB1biB2w61uY3VsbyBlbiBlbCBtZW7DuiBwYXJhIGNyZWFyIHVuYSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGFsIHRpY2tldCBkaXJlY3RvIGRlc2RlICBsYSB2aXN0YSBkZSBkZXRhbGxlIGRlIHRpY2tldCBkZSBsYSBpbnRlcmZhY2UgZGVsIGFnZW50ZS4gQWRpY2lvbmFsbWVudGUgc2UgcHVlZGUgaGFjZXIgaW4gY29udHJvbCBkZSBhY2Nlc28gcGFyYSBtb3N0cmFyIG8gbm8gZXN0ZSB2w61uY3VsbyB1c2FuZG8gbGEgQ2xhdmUgIkdyb3VwIiB5IGVsIENvbnRlbmlkbyBjb21vICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFBhcmEgYWdydXBhciBlbGVtZW50byBkZWwgbWVuw7ogdXNlIGxhIENsYXZlICJDbHVzdGVyTmFtZSIgcGFyYSBlbCBDb250ZW5pZG8gY3VhbHF1aWVyIG5vbWJyZSBxdWUgZGVzZWUgdmVyIGVuIGxhIGludGVyZmFjZSBkZWwgdXN1YXJpby4gVXRpbGl6ZSAiQ2x1c3RlclByaW9yaXR5IiBwYXJhIGNvbmZpZ3VyYXIgZWwgb3JkZW4gZGUgdW4gY2llcnRvIGdydXBvIGRlbnRybyBkZSBsYSBiYXJyYSBkZSBoZXJyYW1pZW50YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdUaWVtcG8gZGUgc29sdWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnU2VsZWN0aW9uIGRlIHRyYW5zcG9ydGUgcGFyYSBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnRGlzcGFyYSBsYSBhY2Npw7NuIGRlIGHDsWFkaXIgbyBhY3R1YWxpemFyIGNpdGFzIGF1dG9tw6F0aWNhcyBkZSBjYWxlbmRhcmlvcyBiYXNhZGFzIGVuIGNpZXJ0b3MgdGllbXBvcyBkZSB0aWNrZXRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ1RpZW1wbyBkZSBhY3R1YWxpemFjacOzbic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Omh1X09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdJZMWRcG9udCBlbWzDqWtlenRldMWRIMOpcnRlc8OtdMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnRWd5IMOpcnRlc8OtdMOpc3QgZm9nIGthcG5pIG1pbmRlbiBhbGthbG9tbWFsLCBhbWlrb3IgZWd5IGVtbMOpa2V6dGV0xZEgaWTFkSBlbMOpcsOpc3JlIGtlcsO8bCBheiBpZMWRcG9udGphaSBlZ3lpa8OpbsOpbC4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdJZMWRcG9udC3DqXJ0ZXPDrXTDqXMga2V6ZWzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdJdHQgdHVkIGVneSBiZcOhbGzDrXTDs2bDoWpsdCBmZWx0w7ZsdGVuaSBheiBpZMWRcG9udC3DqXJ0ZXPDrXTDqXNlayBpbXBvcnTDoWzDoXPDoWhveiBhIHJlbmRzemVycmUuIEEgZsOhamxuYWsgLnltbCBmb3Jtw6F0dW1iYW4ga2VsbCBsZW5uaWUsIGFob2d5IGF6IGlkxZFwb250LcOpcnRlc8OtdMOpcyBtb2R1bCBleHBvcnTDoWx0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICdJdHQgdsOhbGFzenRoYXRqYSBraSwgaG9neSBtZWx5IGVzZW3DqW55ZWsgZm9nasOhayBha3RpdsOhbG5pIGV6dCBheiDDqXJ0ZXPDrXTDqXN0LiBFZ3kgdG92w6FiYmkgaWTFkXBvbnRzesWxcsWRIGFsa2FsbWF6aGF0w7MgbGVudCBhIGNzYWsgZWd5IGJpem9ueW9zIGZlbHTDqXRlbGxlbCByZW5kZWxrZXrFkSBpZMWRcG9udG9rbsOhbCB0w7ZydMOpbsWRIGvDvGxkw6lzaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdJZMWRcG9udCBzesWxcsWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICdDc2FwYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdFcsWRZm9ycsOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ0EgZmVsaGFzem7DoWzDsyDDqXJ0ZXPDrXTDqXNlIGNzYWsgZWd5c3plciBlZ3kgbmFwIGVneSBlZ3llZMO8bGkgaWTFkXBvbnRyw7NsIGVneSBraXbDoWxhc3p0b3R0IMOhdHZpdGVsIGhhc3puw6FsYXTDoXZhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdBeiDDqXJ0ZXPDrXTDqXNlayBlZ3kgw7xneWludMOpesWRbmVrIGtlcsO8bG5layBlbGvDvGxkw6lzcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdBeiBpZMWRcG9udGPDrW0gZWxzxZEgMjAga2FyYWt0ZXLDqW5layBsZWvDqXLDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICdBeiBpZMWRcG9udCBqZWxsZW16xZFqw6luZWsgbGVrw6lyw6lzw6loZXonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdBIG5hcHTDoXIgamVsbGVtesWRasOpbmVrIGxla8OpcsOpc8OpaGV6JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ05hcGlyZW5kIMOhdHRla2ludMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdOYXB0w6FyYWsga2V6ZWzDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ0lkxZFwb250IGhvenrDoWFkw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ1N6w61uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAnQmVmZWplesOpc2kgZMOhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ0lzbcOpdGzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnTmVtIHRhbMOhbGhhdMOzayBuYXB0w6FyYWsuIEVsxZFzesO2ciBhZGpvbiBob3p6w6EgZWd5IG5hcHTDoXJhdCBhIG5hcHTDoXJhayBrZXplbMOpc2Ugb2xkYWwgaGFzem7DoWxhdMOhdmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0lkxZFwb250JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFeiBlZ3kgaXNtw6l0bMWRZMWRIGlkxZFwb250JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnQ3NhayBlenQgYXogZWzFkWZvcmR1bMOhc3Qgc3plcmV0bsOpIHN6ZXJrZXN6dGVuaSB2YWd5IGF6IMO2c3N6ZXNldD8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnw5Zzc3plcyBlbMWRZm9yZHVsw6FzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnQ3NhayBleiBheiBlbMWRZm9yZHVsw6FzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdOYXB0w6Fya2V6ZWzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdOYXB0w6FyIMOhdHRla2ludMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICfDmmogbmFwdMOhciBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnTmFwdMOhciBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0lkxZFwb250b2sgaW1wb3J0w6Fsw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdOYXB0w6FyIGltcG9ydMOhbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdJdHQgdMO2bHRoZXQgZmVsIGVneSBiZcOhbGzDrXTDs2bDoWpsdCBlZ3kgbmFwdMOhciBpbXBvcnTDoWzDoXPDoWhveiBhIHJlbmRzemVycmUuIEEgZsOhamxuYWsgLnltbCBmb3Jtw6F0dW1iYW4ga2VsbCBsZW5uaWUsIGFob2d5IGEgbmFwdMOhcmtlemVsxZEgbW9kdWwgZXhwb3J0w6FsdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnTmFwdMOhcmJlw6FsbMOtdMOhcyBmZWx0w7ZsdMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnTmFwdMOhciBpbXBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnU3rFsXLFkSBhIG5hcHTDoXJha2hveic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICdBIGNzb3BvcnRtZXrFkXTFkWwgZsO8Z2fFkWVuIGEgcmVuZHN6ZXIgYSBmZWxoYXN6bsOhbMOza2F0IGEgam9nb3N1bHRzw6FnaSBzemludGrDvGsgYWxhcGrDoW4gZm9namEgZW5nZWRuaSBob3p6w6Fmw6lybmkgYSBuYXB0w6FyaG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0NzYWsgb2x2YXPDoXM6IGEgZmVsaGFzem7DoWzDs2sgbMOhdGhhdGrDoWsgw6lzIGV4cG9ydMOhbGhhdGrDoWsgYSBuYXB0w6FyYmFuIGzDqXbFkSDDtnNzemVzIGlkxZFwb250b3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnw4F0bW96Z2F0w6FzOiBhIGZlbGhhc3puw6Fsw7NrIG3Ds2Rvc8OtdGhhdGrDoWsgYXogaWTFkXBvbnRva2F0IGEgbmFwdMOhcmJhbiwgZGUgYSBuYXB0w6FydsOhbGFzenTDoXMgbWVndsOhbHRvenRhdMOhc2EgbsOpbGvDvGwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdMw6l0cmVob3rDoXM6IGEgZmVsaGFzem7DoWzDs2sgbMOpdHJlaG96aGF0bmFrIMOpcyB0w7Zyw7ZsaGV0bmVrIGlkxZFwb250b2thdCBhIG5hcHTDoXJiYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfDjXLDoXMsIG9sdmFzw6FzOiBhIGZlbGhhc3puw6Fsw7NrIG1hZ8OhdCBhIG5hcHTDoXJhdCBrZXplbGhldGlrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICdVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAnTmFwdMOhciBleHBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnTmFwdMOhciBsZXTDtmx0w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdOeWlsdsOhbm9zIG5hcHTDoXIgVVJMIG3DoXNvbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05hcHTDoXIgbmV2ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdNw6FyIGzDqXRlemlrIGVneSBpbHllbiBuZXbFsSBuYXB0w6FyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnSm9nb3N1bHRzw6FnaSBjc29wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdKZWd5aWTFkXBvbnRvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnU3phYsOhbHknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnSGFzem7DoWxqYSBhIGxlbnRpIGxlaGV0xZFzw6lnZWtldCBhbm5hayBsZXN6xbFrw610w6lzw6loZXosIGhvZ3kgbWVseSBqZWd5ZWsgaWTFkXBvbnRqYWkgbGVneWVuZWsgYXV0b21hdGlrdXNhbiBsw6l0cmVob3p2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ1bDoWxhc3N6b24gZWd5IMOpcnbDqW55ZXMgdsOhcsOzbGlzdMOhdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdLZXJlc8Opc2kgYXR0cmliw7p0dW1vayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ1N6YWLDoWx5b2sgbWVnaGF0w6Fyb3rDoXNhIGF1dG9tYXRpa3VzIGlkxZFwb250b2sgbMOpdHJlaG96w6Fzw6Fob3ogZWJiZW4gYSBuYXB0w6FyYmFuIGEgamVneWFkYXRvayBhbGFwasOhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdTemFiw6FseSBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ1TDtmJiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdLZXZlc2ViYic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICfDmmogaWTFkXBvbnQgaG96esOhYWTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ05hcHTDoXJhayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnVMO6bCBzb2sgYWt0w612IG5hcHTDoXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnVmFneSBrYXBjc29sam9uIGtpIG7DqWjDoW55YXQgZWzFkXN6w7ZyLCB2YWd5IG7DtnZlbGplIGEga29ybMOhdG90IGEgYmXDoWxsw610w6Fzb2tiYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdIw6l0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnSGF2aSBpZMWRdm9uYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0hldGkgaWTFkXZvbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ05hcGkgaWTFkXZvbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdVZ3LDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ0VsdMO8bnRldMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnTWVnamVsZW7DrXTDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdBbGFwIGluZm9ybcOhY2nDs2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRMOhdHVtL2lkxZEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ8OBbGzDrXRzYSBlenQgZWd5IGJlZmVqZXrDqXNpIGTDoXR1bSBlbMWRdHRpIMOpcnTDqWtyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnw4FsbMOtdHNhIGV6dCBlZ3kga2V6ZMOpc2kgZMOhdHVtIHV0w6FuaSDDqXJ0w6lrcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdFeiBlZ3kgaXNtw6l0bMWRZMWRIGlkxZFwb250IGVsxZFmb3JkdWzDoXNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0thdHRpbnRzb24gaWRlIGEgc3rDvGzFkWlkxZFwb250IG1lZ3Rla2ludMOpc8OpaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLYXR0aW50c29uIGlkZSBhIHN6w7xsxZFpZMWRcG9udCBzemVya2VzenTDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAnR3lha29yaXPDoWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdNaW5kZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ1JlbGF0w612IGlkxZFwb250JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ0JpenRvc2FuIHTDtnLDtmxuaSBzemVyZXRuw6kgZXp0IGF6IGlkxZFwb250b3Q/IEV6dCBhIG3FsXZlbGV0ZXQgbmVtIGxlaGV0IHZpc3N6YXZvbm5pLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSWTFkXBvbnQgaW1wb3J0w6Fsw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0EgZmVsdMO2bHTDtnR0IGbDoWpsbmFrIMOpcnbDqW55ZXMgaUNhbCBmb3Jtw6F0dW1iYW4gKC5pY3MpIGtlbGwgbGVubmllLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdIYSBhIGvDrXbDoW50IG5hcHTDoXIgbmluY3MgaXR0IGZlbHNvcm9sdmEsIGFra29yIGd5xZF6xZFkasO2biBtZWcgYXJyw7NsLCBob2d5IHZhbi1lIGxlZ2Fsw6FiYiDigJ5sw6l0cmVob3rDoXPigJ0gam9nb3N1bHRzw6FnYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICdGcmlzc8OtdGkgYSBtZWdsw6l2xZEgaWTFkXBvbnRva2F0Pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ0EgbmFwdMOhcmJhbiBsw6l2xZEgaWx5ZW4gZWd5ZWRpIGF6b25vc8OtdMOzdmFsIHJlbmRlbGtlesWRIMO2c3N6ZXMgbWVnbMOpdsWRIGlkxZFwb250IGZlbMO8bCBsZXN6IMOtcnZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdOYXB0w6FyIGZlbHTDtmx0w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSWTFkXBvbnRvayBpbXBvcnTDoWzDoXNhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ8OaaiBpZMWRcG9udCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnSGFtYXJvc2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgbmFwJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ0F6IMOpcnRlc8OtdMOpcyBuZXZlIG3DoXIgbMOpdGV6aWshJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICfDnGd5aW50w6l6xZEgKGVyxZFmb3Jyw6Fzb2spLCBha2kgYXogaWTFkXBvbnRvbiBiZWzDvGwga2kgbGV0dCBqZWzDtmx2ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBeiDDtnNzemVzIMO8Z3lpbnTDqXrFkSwgYWtpa25layAobGVnYWzDoWJiKSBvbHZhc8Ohc2kgam9nb3N1bHRzw6FndWsgdmFuIGF6IGlkxZFwb250b2tob3ogKG5hcHTDoXJob3opJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQXogw7Zzc3plcyDDvGd5aW50w6l6xZEsIGFraWtuZWsgw61yw6FzaSBqb2dvc3VsdHPDoWd1ayB2YW4gYXogaWTFkXBvbnRob3ogKG5hcHTDoXJob3opJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdBIHJlbmRzemVyIG5lbSB0dWR0YSBsw6l0cmVob3puaSBhIG5hcHTDoXJhdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdOaW5jcyBuYXB0w6FyLWF6b25vc8OtdMOzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdOaW5jcyBob3p6w6Fmw6lyw6lzZSBlaGhleiBhIG5hcHTDoXJob3ohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdOYXB0w6FyIHN6ZXJrZXN6dMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0hpYmEgYSBuYXB0w6FyIGZyaXNzw610w6lzZWtvciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ05lbSBzaWtlcsO8bHQgYmVvbHZhc25pIGEgbmFwdMOhcmJlw6FsbMOtdMOzIGbDoWpsdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnR3nFkXrFkWRqw7ZuIG1lZyBhcnLDs2wsIGhvZ3kgYSBmw6FqbCDDqXJ2w6lueWVzLWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05lbSBzaWtlcsO8bHQgaW1wb3J0w6FsbmkgYSBuYXB0w6FyYXQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ05hcHTDoXIgaW1wb3J0w6FsdmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdOYXB0w6FyLWF6b25vc8OtdMOzIHN6w7xrc8OpZ2VzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ05lbSBzaWtlcsO8bHQgbGVrw6lybmkgYXogYWRhdG9rYXQgYSBtZWdhZG90dCBuYXB0w6FyLWF6b25vc8OtdMOzaG96JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICclcyBpZMWRcG9udCBzaWtlcmVzZW4gaW1wb3J0w6FsdmEgYSh6KSAlcyBuYXB0w6FyYmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSBwZXJjJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IHBlcmMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgcGVyYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgw7NyYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdNaW5kZW4gaWTFkXBvbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnSG96esOhbSByZW5kZWx0IGlkxZFwb250b2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ0NzYWsgYXogw7ZuaMO2eiByZW5kZWx0IGlkxZFwb250b2sgdmFubmFrIG1lZ2plbGVuw610dmUhIEJlw6FsbMOtdMOhc29rIG1lZ3bDoWx0b3p0YXTDoXNhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ0F6IGlkxZFwb250IG5lbSB0YWzDoWxoYXTDsyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdTb2hhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ01pbmRlbiBuYXAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ01pbmRlbiBow6l0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdNaW5kZW4gaMOzbmFwYmFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdNaW5kZW4gw6l2YmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ0VnecOpbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICdOYXBpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ0hldGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ0hhdmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnw4l2ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdtaW5kZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICclcyBhbGthbG9tbWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2VkZGlnOiDigKYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAn4oCmIGFsa2Fsb21tYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdlZGRpZzogJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnTmluY3Mgw6lydGVzw610w6lzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBwZXJjY2VsIGVsxZF0dGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyDDs3LDoXZhbCBlbMWRdHRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBuYXBwYWwgZWzFkXR0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIGjDqXR0ZWwgZWzFkXR0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2F6IGlkxZFwb250IGtlemRldGUgZWzFkXR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnbWl1dMOhbiBheiBpZMWRcG9udCBlbGtlemTFkWTDtnR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2F6IGlkxZFwb250IHbDqWdlIGVsxZF0dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICdtaXV0w6FuIGF6IGlkxZFwb250IHbDqWdldCDDqXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnTmluY3Mgam9nb3N1bHRzw6FnISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdOZW0gbGVoZXQgdMO2csO2bG5pIGEgamVneWlkxZFwb250b3QhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ05pbmNzZW5layBqb2dvc3VsdHPDoWdvayEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTmluY3NlbmVrIGpvZ29zdWx0c8OhZ29rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0EgcmVuZHN6ZXIgbmVtIHR1ZHRhIGltcG9ydMOhbG5pIGEgZsOhamx0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdUb3bDoWJiaSBpbmZvcm3DoWNpw7Nrw6lydCBuw6l6emUgbWVnIGEgbmFwbMOzdC4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJ3RvdsOhYmJpICslZCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ05pbmNzICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnTmluY3MgaWx5ZW4gZmVsaGFzem7DoWzDsyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICfDiXJ2w6lueXRlbGVuIG5hcHTDoXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ8OJcnbDqW55dGVsZW4gVVJMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdIaWJhIHTDtnJ0w6ludCBhIG5hcHTDoXIgZXhwb3J0w6Fsw6FzYWtvciEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdGcmlzc8OtdMOpcyAocGVyYyknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ0lkxZFwb250bmFwdMOhciDDoXR0ZWtpbnTFkSBvbGRhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ0lkxZFwb250LcOpcnRlc8OtdMOpc2VrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdJZMWRcG9udG5hcHTDoXIgZXNlbcOpbnkgbW9kdWwsIGFtZWx5IGVsxZFrw6lzesOtdGkgYXogw6lydGVzw610w6lzaSBiZWplZ3l6w6lzZWtldCBheiBpZMWRcG9udG9raG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnSWTFkXBvbnRuYXB0w6FyIGVzZW3DqW55IG1vZHVsLCBhbWVseSBmcmlzc8OtdGkgYSBqZWd5aWTFkXBvbnRiw7NsIHN6w6FybWF6w7MgYWRhdG9ra2FsIHJlbmRlbGtlesWRIGplZ3lldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnSWTFkXBvbnRzemVya2VzenTDqXMga8OpcGVybnnFkS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0lkxZFwb250bGlzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdJZMWRcG9udGxpc3RhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnSWTFkXBvbnQtw6lydGVzw610w6lzZWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnSWTFkXBvbnRvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ05hcHTDoXJrZXplbMOpcyBrw6lwZXJuecWRLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdWw6FsYXNzemEga2ksIGhvZ3kgbWlseWVuIHTDrXB1c8O6IGlkxZFwb250LXbDoWx0b3p0YXTDoXNyw7NsIHN6ZXJldG5lIMOpcnRlc8OtdMOpc2VrZXQga2FwbmkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdFenplbCBhIGplZ2d5ZWwgw7Zzc3pla2FwY3NvbHQgw7pqIG5hcHTDoXJpZMWRcG9udCBsw6l0cmVob3rDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnSWTFkXBvbnQtw6lydGVzw610w6lzZWsgbMOpdHJlaG96w6FzYSDDqXMga2V6ZWzDqXNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ8OaaiBpZMWRcG9udCBsw6l0cmVob3rDoXNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0FubmFrIG1lZ2hhdMOhcm96w6FzYSwgaG9neSBtZWx5IG9zemxvcG9rIGxlZ3llbmVrIGzDoXRoYXTDs2sgYSBrYXBjc29sdCBpZMWRcG9udCBmZWzDvGxldGkgZWxlbWVuIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9IOKAnsO2c3N6ZXRldHTigJ0pLiBMZWhldHPDqWdlcyBiZcOhbGzDrXTDoXNvazogMCA9IGxldGlsdHZhLCAxID0gZWzDqXJoZXTFkSwgMiA9IGFsYXDDqXJ0ZWxtZXpldHRlbiBlbmdlZMOpbHllemV0dC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3ogZWd5IGlrb250IGEgamVsZW5sZWdpIGhlbHkgR29vZ2xlIFTDqXJrw6lwIG9sZGFsw6FyYSBtdXRhdMOzIGhpdmF0a296w6Fzc2FsIGF6IGlkxZFwb250c3plcmtlc3p0w6lzIGvDqXBlcm55xZFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYXpva2F0IGF6IGVzZW3DqW55b2JqZWt0dW0gdMOtcHVzb2thdCwgYW1lbHllayBheiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQgbW9kdWxvbiBrZXJlc3p0w7xsIGxlc3puZWsga2V6ZWx2ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGF6b2tuYWsgYSBwYXJhbcOpdGVyZWtuZWsgYSBsaXN0w6Fqw6F0LCBhbWVseWVrIMOhdGFkaGF0w7NrIGEgamVneWtlcmVzw6lzIGZ1bmtjacOzbmFrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgamVneWlkxZFwb250IHTDrXB1c8OhbmFrIGjDoXR0w6lycHJvZ3JhbWrDoXQgYSBqZWd5IGTDoXR1bSDDqXMgaWTFkSBkaW5hbWlrdXMgbWV6xZFqw6loZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgamVneWlkxZFwb250IHTDrXB1c8OhbmFrIGjDoXR0w6lycHJvZ3JhbWrDoXQgYSBqZWd5IGVzemthbMOhY2nDs3MgaWRlasOpaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIGplZ3lpZMWRcG9udCB0w61wdXPDoW5hayBow6F0dMOpcnByb2dyYW1qw6F0IGEgamVneSBmw7xnZ8WRYmVuIGzDqXbFkSBpZGVqw6loZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdNZWdoYXTDoXJvenphIGEgamVneWLFkXbDrXRtw6lueXQgYSBuYXB0w6FyaWTFkXBvbnRva2hvei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdJZMWRcG9udCBzemVya2VzenTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdFbHPFkSB2w6FsYXN6aWTFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdJZMWRcG9udG9rIGltcG9ydMOhbMOhc2Ega8OpcGVybnnFkS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnw5Zzc3pla2FwY3NvbGphIGF6IGlkxZFwb250b2thdCDDqXMgamVneWVrZXQgZWd5IOKAnk5vcm3DoWzigJ0gdMOtcHVzw7ogaGl2YXRrb3rDoXNzYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdBeiDDtnNzemVzIGlkxZFwb250ZXNlbcOpbnkgbGlzdMOhamEsIGFtZWx5ZWsgbWVnamVsZW5uZWsgYSBncmFmaWt1cyBmZWzDvGxldGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnQXogw7Zzc3plcyBuYXB0w6FyZXNlbcOpbnkgbGlzdMOhamEsIGFtZWx5ZWsgbWVnamVsZW5uZWsgYSBncmFmaWt1cyBmZWzDvGxldGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ1N6w61uZWsgbGlzdMOhamEgaGV4YWRlY2ltw6FsaXMgUkdCIGZvcm3DoWJhbiwgYW1lbHllayBlbMOpcmhldMWRayBsZXN6bmVrIGEga2l2w6FsYXN6dMOhc2hveiBhIG5hcHTDoXIgbMOpdHJlaG96w6FzYSBrw7Z6YmVuLiBHecWResWRZGrDtm4gbWVnIGFycsOzbCwgaG9neSBhIHN6w61uZWsgZWzDqWcgc8O2dMOpdGVrLWUgYWhob3osIGhvZ3kgYSB2aWzDoWdvcyBzesO2dmVnIG1lZ2plbGVuw610aGV0xZEgbGVneWVuIHJhanR1ay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnS8O8bMO2bmLDtnrFkSBuYXB0w6FyYWsga2V6ZWzDqXNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ0F6IGFrdMOtdiBuYXB0w6FyYWsgbGVnbmFneW9iYiBzesOhbWEgYXogw6F0dGVraW50xZEga8OpcGVybnnFkWvDtm4uIE5lIGZlbGVkamUsIGhvZ3kgYXogYWt0w612IG5hcHTDoXJhayBuYWd5IHN6w6FtYSB0ZWxqZXPDrXRtw6lueWJlbGkgaGF0w6Fzc2FsIGxlaGV0IGEga2lzem9sZ8OhbMOzasOhcmEgYSB0w7psIHNvayBlZ3lpZGVqxbEgaMOtdsOhcyBpbmTDrXTDoXPDoXZhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnQXogT1RSUyBuZW0gdMOhbW9nYXRqYSBhIGJlZmVqZXrDqXNpIGTDoXR1bSB2YWd5IGF6IGlzbcOpdGzDqXNlayBzesOhbWEgbsOpbGvDvGxpIGlzbcOpdGzFkWTFkSBpZMWRcG9udG9rYXQuIEF6IGltcG9ydMOhbMOhc2kgZm9seWFtYXQgc29yw6FuIGVsxZFmb3JkdWxoYXQsIGhvZ3kgYXogSUNTLWbDoWpsIGlseWVuIGlkxZFwb250b2thdCB0YXJ0YWxtYXouIEVoZWx5ZXR0IGEgcmVuZHN6ZXIgYXogw7Zzc3plcyBpZMWRcG9udG90IGEgbcO6bHRiYW4gaG96emEgbMOpdHJlLCB2YWxhbWludCBhIGvDtnZldGtlesWRIG4gaMOzbmFwYmFuICgxMjAgaMOzbmFwLzEwIMOpdiBhbGFww6lydGVsbWV6ZXR0ZW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ0F6IMO2c3N6ZXMgaWTFkXBvbnQgw6F0dGVraW50xZFqZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVsOhcmFrb3rDoXNpIGlkxZEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ0LFkXbDrXRtw6lueSBrZXJlc8Opcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ0LFkXbDrXRtw6lueSBrZXJlc8Opc2kgbW9kdWwgYXogYXV0b21hdGlrdXMga2llZ8Opc3rDrXTDqXNoZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ055aWx2w6Fub3MgbmFwdMOhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnTnlpbHbDoW5vcyBuYXB0w6FyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ0VyxZFmb3Jyw6FzIMOhdHRla2ludMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ0VyxZFmb3Jyw6FzIMOhdHRla2ludMWRIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGEgamVnZ3llbCDDtnNzemVrYXBjc29sdCBuYXB0w6FyaWTFkXBvbnQgbMOpdHJlaG96w6Fzw6Fob3oga8O2enZldGxlbsO8bCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGplZ3luYWd5w610w6FzIG7DqXpldMOpYsWRbC4gRXplbiBoaXZhdGtvesOhcyBtZWdqZWxlbsOtdMOpc8OpaGV6IHZhZ3kgbWVnIG5lbSBqZWxlbsOtdMOpc8OpaGV6IHRvdsOhYmJpIGhvenrDoWbDqXLDqXNpIHZlesOpcmzFkXQgbGVoZXQga8Opc3rDrXRlbmkgYSDigJ5Hcm91cOKAnSBrdWxjcyDDqXMgYXog4oCecnc6Y3NvcG9ydDE7bW92ZV9pbnRvOmNzb3BvcnQy4oCdIHRhcnRhbG9taG96IGhhc29ubMOzIGhhc3puw6FsYXTDoXZhbC4gQSBtZW7DvHBvbnRvayBjc29wb3J0b2tiYSByZW5kZXrDqXPDqWhleiBoYXN6bsOhbGphIGEg4oCeQ2x1c3Rlck5hbWXigJ0ga3VsY3NvdCBiw6FybWlseWVuIG9seWFuIHRhcnRhbG9tbWFsLCBhbWVseWV0IGEgZmVsaGFzem7DoWzDs2kgZmVsw7xsZXRlbiBsw6F0bmkgc3plcmV0bmUuIEhhc3puw6FsamEgYSDigJ5DbHVzdGVyUHJpb3JpdHnigJ0ga3VsY3NvdCBlZ3kgYml6b255b3MgZsO8cnQgc29ycmVuZGrDqW5layBiZcOhbGzDrXTDoXPDoWhveiBheiBlc3prw7Z6dMOhcm9uIGJlbMO8bC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ01lZ29sZMOhc2kgaWTFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ8OBdHZpdGVsa2l2w6FsYXN6dMOhcyBheiBpZMWRcG9udC3DqXJ0ZXPDrXTDqXNla2hlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnQWt0aXbDoWxqYSBheiBhdXRvbWF0aWt1cyBuYXB0w6FyaWTFkXBvbnRvayBob3p6w6FhZMOhc8OhdCB2YWd5IGZyaXNzw610w6lzw6l0IGJpem9ueW9zIGplZ3lpZMWRayBhbGFwasOhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdGcmlzc8OtdMOpc2kgaWTFkSc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICfkuojntITjg6rjg57jgqTjg7Pjg4Djg7zjga7pgJrnn6UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ+S6iOe0hOmAmuefpeOBrueuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICfkuojntITjga7jg5XjgqPjg6vjgr/jg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ+ODgeODvOODoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ+ODquOCveODvOOCuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ+mAmuefpeOBr+aLheW9k+iAheOBuOmAgeS/oeOBleOCjOOBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAn5LqI5a6a44Gu5bGe5oCn44KS5Y+W5b6X44GZ44KL44GT44GoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAn44Kr44Os44Oz44OA44O844Gu5bGe5oCn44KS5Y+W5b6X44GZ44KL44GT44GoJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ+OCouOCuOOCp+ODs+ODgOihqOekuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAn44Kr44Os44Oz44OA44O8566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ+S6iOe0hOOBrueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ+iJsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ+e1guS6huaXpeaZgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfnubDjgorov5TjgZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn5LqI57SEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICfjgZPjgozjga/nubDjgorov5TjgZfjga7kuojlrprjgafjgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICfjgZPjga7nmbrnlJ/jgb7jgZ/jga/jgZnjgbnjgabnmbrnlJ/jgaDjgZHjgpLnt6jpm4bjgZfjgb7jgZnjgYvvvJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAn5YWo44Gm44Gu55m655SfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAn44GT44Gu55m655Sf5pmC54K5JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICfjgqvjg6zjg7Pjg4Djg7znrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfjgqvjg6zjg7Pjg4Djg7zooajnpLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOBrueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICfjgqvjg6zjg7Pjg4Djg7zjga7nmbvpjLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ+S6iOe0hOOBruOCpOODs+ODneODvOODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLjgqTjg7Pjg53jg7zjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfjgZPjgZPjgafjgqvjg6zjg7Pjg4Djg7zjga7oqK3lrprjg5XjgqHjgqTjg6vjgpLjgqLjg4Pjg5fjg63jg7zjg4njgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgILjg5XjgqHjgqTjg6vjga/jgqvjg6zjg7Pjg4Djg7znrqHnkIbjg6Ljgrjjg6Xjg7zjg6vjgYzjgqjjgq/jgrnjg53jg7zjg4jjgZfjgZ8iLnltbCLjg5Xjgqnjg7zjg57jg4Pjg4jjgafjgYLjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICfjgqvjg6zjg7Pjg4Djg7zoqK3lrprjgpLjgqLjg4Pjg5fjg63jg7zjg4njgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAn44Kr44Os44Oz44OA44O844KS44Kk44Oz44Od44O844OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAn44Kr44Os44Oz44OA44O844Gn44OV44Kj44Or44K/44O8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOBruOCqOOCr+OCueODneODvOODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOBruODgOOCpuODs+ODreODvOODiSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICflhazplovjgqvjg6zjg7Pjg4Djg7zjga5VUkzjgpLjgrPjg5Tjg7zjgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ+OCq+ODrOODs+ODgOODvOWQjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICflkIzjgZjlkI3liY3jga7jgqvjg6zjg7Pjg4Djg7zjga/ml6LjgavlrZjlnKjjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ+aoqemZkOOCsOODq+ODvOODlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAn44OB44Kx44OD44OI44Gu5LqI57SEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfjg6vjg7zjg6snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICfmnInlirnjgarjgq3jg6Xjg7zjgpLpgbjmip7jgZfjgabkuIvjgZXjgYTjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICfmpJzntKLlsZ7mgKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICfjg4HjgrHjg4Pjg4jjg4fjg7zjgr/jgavln7rjgaXjgYTjgabjgZPjga7jgqvjg6zjg7Pjg4Djg7zjgafoh6rli5XkuojlrprjgpLkvZzmiJDjgZnjgovjgZ/jgoHjga7jg6vjg7zjg6vjgpLlrprnvqnjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICfjg6vjg7zjg6vjgpLov73liqAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ+OCguOBo+OBqOWkmuOBjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAn44KC44Gj44Go5bCR44Gq44GPJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ+S6iOe0hOOBrueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICfjgqvjg6zjg7Pjg4Djg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ+acieWKueWMluOBleOCjOOBn+OCq+ODrOODs+ODgOODvOOBjOWkmuOBmeOBjuOBvuOBmSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ+mAsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ+aciOmWk+OCv+OCpOODoOODqeOCpOODsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAn6YCx6ZaT44K/44Kk44Og44Op44Kk44OzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ+aXpeS4reOCv+OCpOODoOODqeOCpOODsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAn44Kr44Os44Oz44OA44O8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICfliYrpmaQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ+ihqOekuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ+WfuuacrOaDheWgsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICfml6XjgavjgaEv5pmC6ZaTJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ+mgu+W6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAn5LqI57SE44Gu44Kk44Oz44Od44O844OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLjgqLjg4Pjg5fjg63jg7zjg4knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ+S6iOe0hOOBruOCpOODs+ODneODvOODiCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICfkuojntITjga7nmbvpjLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc15pelJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnQ2FsZW5kYXJJROOBjOOBquOBhCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAn44GC44Gq44Gf44Gv44GT44Gu44Kr44Os44Oz44OA44O844Gr44Ki44Kv44K744K544Gn44GN44G+44Gb44KT77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLnt6jpm4YnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ+OCq+ODrOODs+ODgOODvOOBruabtOaWsOS4reOBq+OCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBnyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ+OCq+ODrOODs+ODgOODvOioreWumuODleOCoeOCpOODq+OCkuiqreOBv+i+vOOCgeOBvuOBm+OCk+OBp+OBl+OBn+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICfjgYLjgarjgZ/jga7jg5XjgqHjgqTjg6vjgYzmnInlirnjgafjgYLjgovjgZPjgajjgpLnorroqo3jgZfjgabkuIvjgZXjgYTjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAn44Kr44Os44Oz44OA44O844KS44Kk44Oz44Od44O844OI44Gn44GN44G+44Gb44KT44Gn44GX44GfISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLjgqTjg7Pjg53jg7zjg4ghJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdDYWxlbmRhcklE44GM5b+F6KaBISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNeWIhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNeWIhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMOWIhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzHmmYLplpMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAn5YWo44Gm44Gu5LqI57SEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ+engeOBq+WJsuOCiuW9k+OBpuOCieOCjOOBn+S6iOWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAn44GC44Gq44Gf44Gr5Ymy44KK5b2T44Gm44KJ44KM44Gf5LqI57SE44Gg44GR44KS6KGo56S644GZ44KL77yBIOioreWumuOCkuWkieabtOOBl+OBpuS4i+OBleOBhOOAgic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICfkuojntITjgYzopovjgaTjgYvjgorjgb7jgZvjgpPvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICfjgarjgZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAn5q+O5pelJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfmr47pgLEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICfmr47mnIgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ+avjuW5tCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICfjgqvjgrnjgr/jg6AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfmr47ml6UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAn5q+O6YCxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICfmr47mnIgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAn5q+O5bm0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAnZm9yICVzIHRpbWUocyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJyVzIOOBvuOBpyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICfpgJrnn6XjgarjgZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIOWIhuWJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIOaZgumWk+WJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMg5pel5YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMg6YCx6ZaT5YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICfmqKnpmZDjgYzjgarjgYQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ+ODgeOCseODg+ODiOS6iOe0hOOCkuWJiumZpOOBp+OBjeOBvuOBm+OCk++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfmqKnpmZDjgYzjgarjgYQhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ+aoqemZkOOBjOOBquOBhCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnJXPjgYzjgYLjgorjgb7jgZvjgpPvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ+OBneOBruOCiOOBhuOBquODpuODvOOCtuODvOOBr+OBguOCiuOBvuOBm+OCk++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ+eEoeWKueOBquOCq+ODrOODs+ODgOODvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICfnhKHlirnjgapVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAn5pu05pawICjliIYpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICfkuojntITjgqvjg6zjg7Pjg4Djg7zjga7ooajnpLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ+S6iOe0hOOBrumAmuefpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICfkuojntITjg6rjgrnjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICfkuojntITjg6rjgrnjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ+S6iOe0hOmAmuefpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICfkuojntIQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICfjgqvjg6zjg7Pjg4Djg7znrqHnkIbjga7nlLvpnaInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfkuojntITjgpLnmbvpjLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ+S6iOe0hOOBrue3qOmbhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAn5Yid5Zue5b+c562U5pyf6ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ+S6iOe0hOeUu+mdouOCkuOCpOODs+ODneODvOODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ+anmOOAheOBquOCq+ODrOODs+ODgOODvOOCkueuoeeQhuOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICflhajjgabjga7kuojntITjga7kuIDopqcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAn5L+d55WZ5pyf6ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfjg5fjg6njgrDjgqTjg7PmpJzntKInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICfjgqrjg7zjg4jjgrPjg7Pjg5fjg6rjg7zjg4jnlKjjga7jg5fjg6njgrDjgqTjg7PmpJzntKLjg6Ljgrjjg6Xjg7zjg6snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAn5YWs6ZaL44GZ44KL44Kr44Os44Oz44OA44O8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICflhazplovjgZnjgovjgqvjg6zjg7Pjg4Djg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICfjg6rjgr3jg7zjgrnooajnpLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAn44Oq44K944O844K56KGo56S6IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ+ino+axuuacn+mZkCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICfmm7TmlrDml6XmmYInOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdWYXJzZWwgbWVkIHDDpW1pbm5lbHNlIG9tIGF2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnRHUgdmlsIG1vdHRhIGVuIHZhcnNlbCBodmVyIGdhbmcgcMOlbWlubmVsc2VzdGlkc3B1bmt0ZXQgbsOlZXMgZm9yIGVuIGF2IGRpbmUgYXZ0YWxlci4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdBZG1pbmlzdHJlciB2YXJzbGVyIG9tIGF2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdBdnRhbGVmaWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0dydXBwZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1Jlc3N1cnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdWYXJzbGluZ2VyIHNlbmRlcyB0aWwgZW4gc2Frc2JlaGFuZGxlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ0ZvciDDpSBoZW50ZSBkZSBmw7hyc3RlIDIwIHRlZ25lbmUgaSBhdnRhbGVvdmVyc2tyaWZ0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnRm9yIMOlIGhlbnRlIGF2dGFsZWF0dHJpYnV0dGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnRm9yIMOlIGhlbnRlIGthbGVuZGVyYXR0cmlidXR0ZXQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnQWdlbmRhb3ZlcnNpa3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0thbGVuZGVyYWRtaW5pc3RyYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnTGVnZyB0aWwgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnRmFyZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdTbHV0dGRhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnR2plbnRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ0luZ2VuIGthbGVuZGVyZSBmdW5uZXQuIFbDpnIgdmVubmxpZyDDpSBsZWdnZSB0aWwgZW4ga2FsZW5kZXIgZsO4cnN0IHZlZCDDpSBiZW55dHRlIHNpZGVuIGZvciBrYWxlbmRlcmFkbWluaXN0cmFzam9uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0F2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAnRGV0dGUgZXIgZW4gZ2plbnRhZ2VuZGUgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnw5huc2tlciBkdSBrdW4gw6UgcmVkaWdlcmUgZGVubmUgYXZ0YWxlbiBlbGxlciBhbGxlIGZvcmVrb21zdGVuZT8gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ0FsbGUgZm9yZWtvbXN0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICdCYXJlIGRlbm5lIGF2dGFsZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ0thbGVuZGVyYWRtaW5pc3RyYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdLYWxlbmRlcm92ZXJzaWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdMZWdnIHRpbCBueSBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdMZWdnIHRpbCBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0ZXIgYXZ0YWxlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdLYWxlbmRlcmltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ0xhc3Qgb3BwIGthbGVuZGVya29uZmlndXJhc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRlciBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRlciBmb3Iga2FsZW5kZXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1Nrcml2ZWJlc2t5dHRldDogYnJ1a2VyZSBrYW4gc2Ugb2cgZWtzcG9ydGVyZSBhbGxlIGF2dGFsZXIgaSBrYWxlbmRlcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnT3BwcmV0dDogYnJ1a2VyZSBrYW4gb3BwcmV0dGUgb2cgc2xldHRlIGF2dGFsZXIgaSBrYWxlbmRlcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnTGVzL3Nrcml2OiBicnVrZXJlIGthbiBzZWx2IGFkbWluaXN0cmVyZSBrYWxlbmRlcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICdVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAnRWtzcG9ydGVyIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnTGFzdCBuZWQga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnS29waWVyIG9mZmVudGxpZyBrYWxlbmRlciBVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ0thbGVuZGVybmF2bic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdLYWxlbmRlciBtZWQgc2FtbWUgbmF2biBla3Npc3RlcmVyIGFsbGVyZWRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnUmV0dGlnaGV0ZXJzZ3J1cHBlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdBdnRhbGVyIHRpbGtueXR0ZXQgc2FrZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2VsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnU8O4a2VhdHJpYnV0dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnTGVnZyB0aWwgcmVnZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ0ZsZXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdGw6ZycmUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnTGVnZyB0aWwgbnkgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGVyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnRm9yIG1hbmdlIGFrdGl2ZSBrYWxlbmRlcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdVa2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ0hvcHAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnVmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVrdmVucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ0h2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ0F2dGFsZWltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnTGFzdCBvcHAga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGVyIGF2dGFsZXInOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnkgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdTbmFydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1IGRhZ2VyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdBbGRyaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdIdmVyIGRhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBXZWVrJ30gPSAnSHZlciB1a2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdIdmVyIG3DpW5lZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAnSHZlcnQgw6VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ1RpbHBhc3NldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RhZ2xpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdVa2VudGxpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTcOlbmVkbGlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ8OFcmxpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ2h2ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICclcyBnYW5nKGVyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICd0aWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnLi4uIGdhbmcoZXIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAndGlsICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0luZ2VuIHZhcnNsaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dHQoZXIpIGbDuHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyB0aW1lKHIpIGbDuHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIGRhZyhlcikgZsO4cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHVrZShyKSBmw7hyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnZsO4ciBhdnRhbGVuIGJlZ3lubmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnZXR0ZXIgYXQgYXZ0YWxlbiBoYXIgYmVneW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2bDuHIgYXZ0YWxlbiBzbHV0dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2V0dGVyIGF0IGF2dGFsZW4gZXIgc2x1dHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICdJbmdlbiByZXR0aWdoZXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdPdmVyc2lrdHNzaWRlIGZvciBhdnRhbGVrYWxlbmRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ1ZhcnNsZXIgb20gYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdTaWRlIGZvciBhdnRhbGVyZWdpc3RyZXJpbmcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdBdnRhbGVsaXN0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0F2dGFsZWxpc3RlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnVmFyc2xlciBvbSBhdnRhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnQXZ0YWxlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ1NpZGUgZm9yIGthbGVuZGVyYWRtaW5pc3RyYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnVmVsZyBodmlsa2UgdHlwZXIgYXZ0YWxlciBzb20gZHUgdmlsIG1vdHRhIHZhcnNsZXIgb20uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdPcHByZXR0IGVuIGF2dGFsZSBzb21lciBrb2JsZXQgdGlsIGRlbm5lIHNha2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnQWRtaW5pc3RyYXNqb24gYXYgYXZ0YWxldmFyc2xpbmdlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdPcHByZXR0IGVuIG55IGF2dGFsZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VuZHJlIGF2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnRsO4cnN0ZSByZXNwb25zdGlkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ1NpZGUgZm9yIGF2dGFsZWltcG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnS29ibGUgYXZ0YWxlciBvZyBzYWtlciBtZWQgZW4gIm5vcm1hbCIgbGVua2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdBZG1pbmlzdHJlcmUgdWxpa2Uga2FsZW5kZXJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdPdmVyc2lrdCBvdmVyIGFsbGUgYXZ0YWxlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVmVudGV0aWRzcHVua3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdPZmZlbnRsaWcga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ09mZmVudGxpZyBrYWxlbmRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdSZXNzdXJzb3ZlcnNpa3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUmVzc3Vyc292ZXJzaWt0IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ0zDuHNuaW5nc3RpZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdPcHBkYXRlcmluZ3N0aWQnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ1phcnrEhWR6YW5pZSBQb3dpYWRvbWllbmlhbWkgV3lkYXJ6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRyIHd5ZGFyemXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnWmVzcMOzxYInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdaYXNvYnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdQb3dpYWRhbWlhaiB1xbx5dGtvd25pa2EgbyBwb2plZHluY3p5bSB3eWRhcnplbml1LCBwcnp5IHXFvHljaXUgd3licmFuZWdvIHRyYW5zcG9ydHUsIHR5bGtvIHJheiBkemllbm5pZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdQb3dpYWRvbWllbmlhIHPEhSB3eXN5xYJhbmUgZG8gYWdlbnRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnQnkgcG9icmHEhyBwaWVyd3N6ZSAyMCB6bmFrw7N3IHR5dHXFgnUgd3lkYXJ6ZW5pYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICdCeSBwb2JyYcSHIGF0cnlidXQgd3lkYXJ6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJ0J5IHBvYnJhxIcgYXRyeWJ1dCBrYWxlbmRhcnphJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1ByemVnbMSFZCB0ZXJtaW5hcnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdaYXJ6xIVkemFqIGthbGVuZGFyemFtaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdEb2RhaiB3eWRhcnplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnS29sb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdEYXRhIHpha2/FhGN6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdQb3d0YXJ6YWonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnTmllIHpuYWxlemlvbm8ga2FsZW5kYXJ6eS4gUHJvc3rEmSBkb2RhxIcgbmFqcGllcncga2FsZW5kYXJ6IHXFvHl3YWrEhWMgc3Ryb255IFphcnrEhWR6YW5pZSBLYWxlbmRhcnphbWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnV3lkYXJ6ZW5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAnVG8gcG93dGFyemFqxIVjZSB3eWRhcnplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnQ3p5IGNoY2lhxYJiecWbIGVkeXRvd2HEhyB0eWxrbyB0byB3eXN0xIVwaWVuaWUgY3p5IHdzenlzdGtpZT8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnV3N6eXN0a2llIHd5c3TEhXBpZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1R5bGtvIHRvIHd5c3TEhXBpZW5pZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnWmFyesSFZHphbmllIEthbGVuZGFyemFtaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1ByemVnbMSFZCBLYWxlbmRhcnp5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdEb2RhaiBub3d5IEthbGVuZGFyeic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdEb2RhaiBLYWxlbmRhcnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ1phaW1wb3J0dWogV3lkYXJ6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnQgS2FsZW5kYXJ6YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ1cgdHltIG1pZWpzY3UgbW/FvGVzeiB6YcWCYWRvd2HEhyBwbGlrIGtvbmZpZ3VyYWN5am55IGJ5IHphaW1wb3J0b3dhxIcga2FsZW5kYXJ6IHRvIHN5c3RlbXUuIFBsaWsgbXVzaSBiecSHIHcgZm9ybWFjaWUgLnltbCwgcG9kb2JuaWUgamFrIHd5ZWtzcG9ydG93YW55IG1vZHXFgiB6YXJ6xIVkemFuaWEga2FsZW5kYXJ6ZW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnV2N6eXRhaiBrb25maWd1cmFjasSZIGthbGVuZGFyemEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnWmFpbXBvcnR1aiBLYWxlbmRhcnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdGaWx0ciBkbGEga2FsZW5kcnpheSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICdXIHphbGXFvG5vxZtjaSBvZCBwb2xhIGdydXB5LCBzeXN0ZW0gdWRvc3TEmXBuaSB1xbx5dGtvd25pa29tIGRvc3TEmXAgZG8ga2FsZW5kYXJ6YSB6Z29kbmllIHogaWNoIHVwcmF3bmllbmlhbWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnVHlsa28gZG8gb2Rjenl0dTogdcW8eXRrb3duaWN5IG1vZ8SFIHdpZHppZcSHIGkgZWtzcG9ydG93YcSHIHdzenlzdGtpZSB3eWRhcnplbmlhIHcga2FsZW5kYXJ6dS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICdQcnplbmllxZsgbmE6IHXFvHl0a293bmljeSBtb2fEhSBtb2R5Zmlrb3dhxIcgd3lkYXJ6ZW5pYSB3IGthbGVuZGFyenUsIGplZG5hayBiZXogbW/FvGxpd2/Fm2NpIHptaWFueSB3eWJyYW5lZ28ga2FsZW5kYXJ6YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1V0d8Ozcno6IHXFvHl0a293bmljeSBtb2fEhSB0d29yennEhyBpIHVzdXdhxIcgd3lkYXJ6ZW5pYSB3IGthbGVuZGFyenUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdDenl0YWovWmFwaXN6OiB1xbx5dGtvd25pY3kgbW9nxIUgemFyesSFZHphxIcgc2FteW0ga2FsZW5kYXJ6ZW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdXeWVrc3BvcnR1aiBrYWxlbmRhcnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfFmmNpxIVnbmlqIGthbGVuZGFyeic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdTa29waXVqIFVSTCBwdWJsaWN6bmVnbyBrYWxlbmRhcnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOYXp3YSBrYWxlbmRhcnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ0thbGVuZGFyeiB6IHTEhSBuYXp3xIUganXFvCBpc3RuaWVqZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBhIHVwcmF3bmllxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ1d5ZGFyemVuaWEgWmfFgm9zemXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVndcWCYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICdVxbx5aiBvcGNqaSBwb25pxbxlaiBieSB6YXfEmXppxIcgZGxhIGpha2ljaCB6Z8WCb3N6ZcWEIGLEmWTEhSB0d29yem9uZSBhdXRvbWF0eWN6bmUgd3lkYXJ6ZW5haS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ1Byb3N6xJkgd3licmHEhyB3YcW8bsSFIGtvbGVqa8SZLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cnlidXR5IHd5c3p1a2l3YW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ0RlZmluaXVqZSByZWd1xYJ5IGRsYSBhdXRvbWF0eWN6bmVnbyB0d29yemVuaWEgd3lkYXJ6ZcWEIHcgdHltIGthbGVuZGFyenUsIHcgemFsZcW8bm/Fm2NpIG9kIGRhbnljaCB6Z8WCb3N6ZW5pYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdEb2RhaiByZWd1xYLEmSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnV2nEmWNlaic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTW5pZWonOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnRG9kYWogbm93ZSB3eWRhcnplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGFyemUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ1pieXQgZHXFvG8gYWt0eXdueWNoIGthbGVuZGFyenknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUHJvc3rEmSB3ecWCxIVjennEhyBraWxrYSBsdWIgendpxJlrc3p5xIcgbGltaXQgdyBrb25maWd1cmFjamkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdUeWR6aWXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ1dpZG9rIE1pZXNpxJljem55JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdXaWRvayBUeWdvZG5pb3d5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ1dpZG9rIER6aWVubnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1ByemVqZMW6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdad29sbmlqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdQb2thxbwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdQb2RzdGF3b3dlIGluZm9ybWFjamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0YS9DemFzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQcm9zesSZIHVzdGF3acSHIHTEmSB3YXJ0b8WbxIcgcHJ6ZWQgZGF0xIUgemFrb8WEY3plbmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICdQcm9zesSZIHVzdGF3acSHIHTEmSB3YXJ0b8WbxIcgcG8gZGFjaWUgcm96cG9jesSZY2lhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnVG8gamVzdCB3eXN0xIVwaWVuaWUgcG93dGFyemFsbmVnbyB3eWRhcnplbmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWtuaWogdHV0YWogYnkgc3ByYXdkemnEhyB3eWRhcnplbmllIGfFgsOzd25lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLbGlrbmlqIHR1dGFqIGJ5IGVkeXRvd2HEhyB3eWRhcnplbmllIGfFgsOzd25lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdDesSZc3RvdGxpd2/Fm8SHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnS2HFvGR5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnQ3p5IGplc3RlxZsgcGV3aWVuLCDFvGUgY2hjZXN6IHVzdW7EhcSHIHRvIHd5ZGFyemVuaWU/IFRlaiBvcGVyYWNqaSBuaWUgbW/FvG5hIGNvZm7EhcSHLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0IFd5ZGFyemXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ1djenl0YW55IHBsaWsgbXVzaSBwb3NpYWRhxIcgcHJhd2lkxYJvd3kgZm9ybWF0IGlDQUwgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdKZcWbbGkgc3p1a2FueSBLYWxlbmRhcnogbmllIGplc3QgdHV0YWogd3nFm3dpZXRsb255LCBwcm9zesSZIHVwZXduacSHIHNpxJksIMW8ZSBwb3NpYWRhc3ogcHJ6eSBuYWptbmllaiB1cHJhd25pZW5pZSBcJ1V0d8OzcnpcJy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICdaYWt0dWFsaXpvd2HEhyBpc3RuaWVqxIVjZSB3eWRhcnplbmlhPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ1dzenlzdGtpZSBpc3RuaWVqxIVjZSB3eWRhcnplbmlhIHcga2FsZW5kYXJ6dSB6IHR5bSBzYW15bSBVbmlxdWVJRCB6b3N0YW7EhSBuYWRwaXNhbmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ1djenl0YWoga2FsZW5kYXJ6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0IHd5ZGFyemXFhCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOb3dlIHd5ZGFyemVuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ05pZWJhd2VtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZG5pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ1Bvd2lhZG9taWVuaWUgbyB0ZWogc2FtZWogbmF6d2llIGp1xbwgaXN0bmllamUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBZ2VuY2kgKHphc29ieSksIHd5YnJhbmkgdyByYW1hY2ggd3lkYXJ6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdXc3p5c2N5IGFnZW5jaSBwb3NpYWRhasSFY3kgKHByenluYWptbmllaikgcHJhd28gb2Rjenl0dSB6ZGFyemVuaWEgKGthbGVuZGFyemEpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnV3N6eXNjeSBhZ2VuY2kgeiBwcmF3ZW0gemFwaXN1IHd5ZGFyemVuaWEgKGthbGVuZGFyemEpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdTeXN0ZW0gbmllIGJ5xYIgdyBzdGFuaWUgc3R3b3J6ecSHIEthbGVuZGFyemEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnQnJhayBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdOaWUgbWFzeiBkb3N0xJlwdSBkbyB0ZWdvIGthbGVuZGFyemEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZHl0dWogS2FsZW5kYXJ6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdCxYLEhWQgYWt0dWFsaXphY2ppIGthbGVuZGFyemEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdOaWUgbW/FvG5hIG9kY3p5dGHEhyBwbGlrdSBrb25maWd1cmFjeWpuZWdvIGthbGVuZGFyemEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1Byb3N6xJkgdXBld25pxIcgc2nEmSwgxbxlIHBsaWsgamVzdCB3xYJhxZtjaXd5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdOaWUgbW/FvG5hIHphaW1wb3J0b3dhxIcga2FsZW5kYXJ6YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAnS2FsZW5kYXJ6IFphaW1wb3J0b3dhbnkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdQb3RyemVibmUgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOaWUgbW/FvG5hIG9kY3p5dGHEhyBpbmZvcm1hY2ppIGRsYSBwb2RhbmVnbyBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdQb3ByYXduaWUgemFpbXBvcnRvd2FubyAlcyB3eWRhcnplxYQgZG8ga2FsZW5kYXJ6YSAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IG1pbnV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IG1pbnV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBnb2R6aW5hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1dzenlzdGtpZSB3eWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ1d5ZGFyemVuaWEgcHJ6eXBpc2FuZSBkbyBtbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdXecWbd2lldGxhbmllIHd5ZGFyemXFhCBwcnp5cGlzYW55Y2ggZG8gQ2llYmllISBabWllxYQgdXN0YXdpZW5pYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICdXeWRhcnplbmllIG5pZSBvZG5hbGV6aW9uZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOaWdkeSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdDb2R6aWVubmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdDbyB0eWR6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnQ28gbWllc2nEhWMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0NvIHJvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdXxYJhc25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRHppZW5uaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAnVHlnb2RuaW93byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTWllc2nEmWN6bmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ1JvY3puaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdrYcW8ZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAnZG9ww7NraSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnYcW8IGRvICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0JyYWsgcG93aWFkb21pZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dCh5KSBwcnplZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIGdvZHppbih5KSBwcnplZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZG5pKGR6aWXFhCkgcHJ6ZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyB0eWdvZG5pZSBwcnplZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ3phbmltIHd5ZGFyemVuaWUgcm96cG9jem5pZSBzacSZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAncG8gcm96cG9jesSZY2l1IHd5ZGFyemVuaXUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAncHJ6ZWQgemFrb8WEY3plbmllbSB3eWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ3BvIHpha2/FhGN6ZW5pdSB3eWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnQnJhayB1cHJhd25pZcWEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdOaWUgbW/FvG5hIHVzdW7EhcSHIHd5ZGFyemVuaWEgZGxhIHpnxYJvc3plbmlhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdCcmFrIHVwcmF3bmllxYQhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ0JyYWsgdXByYXduaWXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICdTeXN0ZW0gbmllIGJ5xYIgdyBzdGFuaWUgemFpbXBvcnRvd2HEhyBwbGlrdSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAnUHJvc3rEmSBzcHJhd2R6acSHIGxvZ2kgZGxhIGRva8WCYWRuaWVqc3p5Y2ggaW5mb3JtYWNqaS4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCB3acSZY2VqJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnQnJhayAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ05pZSBtYSB0YWtpZWdvIHXFvHl0a293bmlrYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdOaWV3xYJhxZtjaXd5IGthbGVuZGFyeiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnTmlld8WCYcWbY2l3eSBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0LFgsSFZCBwb2RjemFzIGVrc3BvcnRvd2FuaWEga2FsZW5kYXJ6YSEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdPZMWbd2llxbxhaiAobWludXR5KSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnU3Ryb25hIHBvZHN1bW93dWrEhWNhIEthbGVuZGFyeiBXeWRhcnplxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ1Bvd2lhZG9taWVuaWEgV3lkYXJ6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdFa3JhbiBlZHljamkgd3lkYXJ6ZcWELic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnTGlzdGEgd3lkYXJ6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnTGlzdGEgd3lkYXJ6ZcWELic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnUG93aWFkb21pZW5pYSB3eWRhcnplxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnV3lkYXJ6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ0VrcmFuIHphcnrEhWR6YW5pYSBLYWxlbmRhcnplbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdXeWJpZXJ6LCBkbGEgamFraWVnbyByb2R6YWp1IHptaWFuIHcgd3lkYXJ6ZW5pYWNoLCBjaGNlc3ogb3RyenlteXdhxIcgcG93aWFkb21pZW5pYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ1V0d8Ozcnogbm93eSBrYWxlbmRhcnogd3lkYXJ6ZcWEIHBvxYLEhWN6b255IHogdHltIHpnxYJvc3plbmllbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1V0d8OzcnogaSB6YXJ6xIVkemFqIHBvd2lhZG9taWVuaWFtaSB3eWRhcnplxYQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnVXR3w7NyeiBub3dlIHd5ZGFyemVuaWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdFZHl0dWogd3lkYXJ6ZW5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnQ3phcyBwaWVyd3N6ZWogb2Rwb3dpZWR6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdFa3JhbiBpbXBvcnR1IHd5ZGFyemXFhC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUHJ6ZWdsxIVkIHdzenlzdGtpY2ggd3lkYXJ6ZcWELic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdDemFzIG9jemVraXdhbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnS2FsZW5kYXJ6IFB1YmxpY3pueSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnS2FsZW5kYXJ6IHB1YmxpY3pueS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdQcnplZ2zEhWQgemFzb2LDs3cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUHJ6ZWdsxIVkIHphc29iw7N3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ0N6YXMgcm96d2nEhXphbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnV3liw7NyIHJvZHphanUgdHJhbnNwb3J0dSBkbGEgcG93aWFkb21pZcWEIG8gd3lkYXJ6ZW5pYWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdDemFzIGFrdHVhbGl6YWNqaSc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdOb3RpZmljYcOnw6NvIGRlIGxlbWJyZXRlIGRvIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdWb2PDqiByZWNlYmVyw6EgdW1hIG5vdGlmaWNhw6fDo28gdG9kYSB2ZXogcXVlIG8gdGVtcG8gZGUgbGVtYnJldGUgcGFyYSB1bSBkZSBzZXVzIGNvbXByb21pc3NvcyBmb3IgYXRpbmdpZG8gLic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZGUgbm90aWZpY2HDp8OjbyBkbyBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ0FxdWkgdm9jw6ogcG9kZSBmYXplciB1cGxvYWQgZGUgdW0gYXJxdWl2byBkZSBjb25maWd1cmHDp8OjbyBwYXJhIGltcG9ydGFyIG5vdGlmaWNhw6fDtWVzIGRlIGNvbXByb21pc3NvIHBhcmEgbyBzZXUgc2lzdGVtYS4gTyBhcnF1aXZvIGRldmUgZXN0YXIgbm8gZm9ybWF0byAueW1sIGNvbW8gZXhwb3J0YWRvIHBlbG8gbcOzZHVsbyBkZSBub3RpZmljYcOnw6NvIGRlIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0FxdWkgdm9jw6ogcG9kZSBlc2NvbGhlciBxdWFpcyBldmVudG9zIGlyw6NvIGFjaW9uYXIgZXNzYSBub3RpZmljYcOnw6NvLiBVbSBmaWx0cm8gZGUgY29tcHJvbWlzc28gYWRpY2lvbmFsIHBvZGUgc2VyIGFwbGljYWRvIGFiYWl4byBwYXJhIGVudmlhciBhcGVuYXMgY29tcHJvbWlzc29zIGNvbSBkZXRlcm1pbmFkb3MgY3JpdMOpcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAnRmlsdHJhciBDb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnVGltZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1JlY3Vyc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdOb3RpZmljYXIgbyB1c3XDoXJpbyBhcGVuYXMgdW1hIHZleiBwb3IgZGlhIHNvYnJlIHVtIMO6bmljbyBjb21wcm9taXNzbyB1c2FuZG8gdW0gdHJhbnNwb3J0ZSBzZWxlY2lvbmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdBcyBub3RpZmljYcOnw7VlcyBzw6NvIGVudmlhZGFzIGEgdW0gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnUGFyYSBvYnRlciBvcyAyMCBwcmltZWlyb3MgY2FyYWN0ZXJlcyBkbyB0w610dWxvIGRvIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZXIgbyBhdHJpYnV0byBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJ1BhcmEgb2J0ZXIgbyBhdHJpYnV0byBjYWxlbmTDoXJpbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdWaXPDo28gZ2VyYWwgZGEgQWdlbmRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdHZXJlbmNpYXIgQ2FsZW5kw6FyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ0FkaWNpb25hciBDb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ0Nvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0RhdGEgZmluYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnUmVwZXRpcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdOZW5odW0gY2FsZW5kw6FyaW8gZW5jb250cmFkby4gUG9yIGZhdm9yLCBwcmltZWlybyBhZGljaW9uZSB1bSBjYWxlbmTDoXJpbyB1c2FuZG8gYSBww6FnaW5hIGRlIEdlcmVuY2lhbWVudG8gZGUgQ2FsZW5kw6FyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0NvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFc3RlIMOpIHVtIGNvbXByb21pc3NvIHJlcGV0aWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnVm9jw6ogZGVzZWphIGVkaXRhciBhcGVuYXMgZXNzYSBvY29ycsOqbmNpYSBvdSB0b2RhcyBhcyBvY29ycsOqbmNpYXM/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1RvZGFzIGFzIG9jb3Jyw6puY2lhcyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICdBcGVuYXMgZXNzYSBvY29ycsOqbmNpYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnR2VyZW5jaWFtZW50byBkZSBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1Zpc8OjbyBnZXJhbCBkZSBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAnQWRpY2lvbmFyIG5vdm8gQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnQWRpY2lvbmFyIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBDb21wcm9taXNzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAnSW1wb3J0YXIgQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdBcXVpIHZvY8OqIHBvZGUgY2FycmVnYXIgdW0gYXJxdWl2byBkZSBjb25maWd1cmHDp8OjbyBwYXJhIGltcG9ydGFyIHVtIGNhbGVuZMOhcmlvIHBhcmEgc2V1IHNpc3RlbWEuIE8gYXJxdWl2byBwcmVjaXNhIHNlciBlbSAueW1sICBjb21vIG8gZXhwb3J0YWRvIHBlbG8gbcOzZHVsbyBkZSBnZXJlbmNpYW1lbnRvIGRlIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ0NhcnJlZ2FyIGNvbmZpZ3VyYcOnw6NvIGRvIGNhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ0ltcG9ydGFyIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdHJvIHBhcmEgY2FsZW5kw6FyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0RlcGVuZGVuZG8gZG8gY2FtcG8gZ3J1cG8sIG8gc2lzdGVtYSBsaWJlcmFyw6EgdXN1w6FyaW9zIHBhcmEgYWNlc3NhciBvIGNhbGVuZMOhcmlvIGRlIGFjb3JkbyBjb20gbyBuw612ZWwgZGUgcGVybWlzc8OjbyBkZWxlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdBcGVuYXMgbGVpdHVyYTogdXN1w6FyaW9zIHBvZGVtIHZlciBlIGV4cG9ydGFyIHRvZG9zIG9zIGNvbXByb21pc3NvcyBuZXNzZSBjYWxlbmTDoXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICdNb3ZlciBwYXJhOiB1c3XDoXJpb3MgcG9kZXLDo28gbW9kaWZpY2FyIGNvbXByb21pc3NvcyBubyBjYWxlbmTDoXJpbywgbWFzIHNlbSBhbHRlcmFyIGEgc2VsZcOnw6NvIGRvIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JpYXI6IHVzdcOhcmlvcyBwb2RlbSBjcmlhciBlIGV4Y2x1aXIgY29tcHJvbWlzc29zIG5vIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnTGVpdHVyYS9lc2NyaXRhOiBvcyB1c3XDoXJpb3MgcG9kZW0gZ2VyZW5jaWFyIG8gcHLDs3ByaW8gY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ0JhaXhhciBjYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgVVJMIHB1YmxpY2EgZG8gY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWUgZG8gY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnQ2FsZW5kw6FyaW8gY29tIG1lc21vIG5vbWUgasOhIGV4aXN0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc3PDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NvbXByb21pc3NvcyBkZSBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICdSZWdyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICdVc2UgYXMgb3DDp8O1ZXMgYWJhaXhvIHBhcmEgZGltaW51aXIgcXVhaXMgY29tcHJvbWlzc29zIGRlIGNoYW1hZG8gc2Vyw6NvIGNyaWFkb3MgYXV0b21hdGljYW1lbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUG9yIGZhdm9yLCBzZWxlY2lvbmUgdW1hIGZpbGEgdsOhbGlkYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdBdHJpYnV0b3MgZGEgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmlyIHJlZ3JhcyBwYXJhIGNyaWHDp8OjbyBhdXRvbcOhdGljYSBkZSBjb21wcm9taXNzb3MgbmVzdGUgY2FsZW5kw6FyaW8gYmFzZWFkbyBlbSBkYWRvcyBkZSBjaGFtYWRvLiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdBZGljaW9uYXIgcmVncmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ01haXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01lbm9zJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0FkaWNpb25hciBub3ZvIENvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZMOhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnTXVpdG9zIGNhbGVuZMOhcmlvcyBhdGl2b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUG9yIGZhdm9yLCBkZXNsaWd1ZSBhbGd1bnMgcHJpbWVpcm8gb3UgYXVtZW50ZSBvIGxpbWl0ZSBuYSBjb25maWd1cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1NlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ0xpbmhhIGRlIHRlbXBvIGRvIG3DqnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0xpbmhhIGRlIHRlbXBvIGRhIHNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdMaW5oYSBkZSB0ZW1wbyBkbyBkaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1B1bGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdSZWN1c2FyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdNb3N0cmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYcOnw6NvIGLDoXNpY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0YS9Ib3JhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IsIGNvbmZpZ3VyZSBvIHZhbG9yIGFudGVzIGRhIGRhdGEgZmluYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ1BvciBmYXZvciwgY29uZmlndXJlIG8gdmFsb3IgYW50ZXMgZGEgZGF0YSBpbmljaWFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRXN0YSB1bWEgb2NvcnLDqm5jaWEgZGUgdW0gY29tcHJvbWlzc28gZGUgcmVwZXRpw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnQ2xpcXVlIGFxdWkgcGFyYSB2ZXIgbyBjb21wcm9taXNzbyBwYWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgZWRpdGFyIG8gY29tcHJvbWlzc28gcGFpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVxdcOqbmNpYSAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdUb2Rvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUG9udG8gZGUgdGVtcG8gcmVsYXRpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnVGVtIGNlcnRlemEgcXVlIGRlc2VqYSByZW1vdmVyIGVzc2UgY29tcHJvbWlzc28/IEVzc2Egb3BlcmHDp8OjbyBuw6NvIHBvZGUgc2VyIGRlc2ZlaXRhLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0YcOnw6NvIGRlIGNvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ08gYXJxdWl2byBlbnZpYWRvIGRldmUgZXN0YXIgbm8gZm9ybWF0byB2w6FsaWRvIGlDYWwgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdTZSBvIENhbGVuZMOhcmlvIGRlc2VqYWRvIG7Do28gZXN0aXZlciBsaXN0YWRvIGFxdWksIHBvciBmYXZvciBjZXJ0aWZpcXVlLXNlIHF1ZSB2b2PDqiB0ZW5oYSwgcGVsbyBtZW5vcyBwZXJtaXNzw7VlcyAiQ3JpYXIiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ0F0dWFsaXphciBjb21wcm9taXNzb3MgZXhpc3RlbnRlcz8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICdUb2RvcyBvcyBjb21wcm9taXNzb3Mgbm8gY2FsZW5kw6FyaW8gY29tIG8gbWVzbW8gVW5pcXVlSUQgc2Vyw6NvIHNvYnJlc2NyaXRvLiAgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0NhcnJlZ2FyIGNhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBjb21wcm9taXNzb3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTm92byBDb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnRW0gYnJldmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkaWFzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ05vbWUgZGEgbm90aWZpY2HDp8OjbyBqw6EgZXhpc3RlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnQXRlbmRlbnRlIChyZWN1cnNvcyksIHF1ZSBzw6NvIHNlbGVjaW9uYWRvcyBkZW50cm8gZG8gY29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3Mgb3MgYWdlbnRlcyBjb20gKG5vIG3DrW5pbW8pIHBlcm1pc3PDo28gZGUgbGVpdHVyYSBkbyBjb21wcm9taXNzbyAoY2FsZW5kw6FyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3Mgb3MgYXRlbmRlbnRlcyBjb20gcGVybWlzc8OjbyBkZSBlc2NyaXRhIG5vIGNvbXByb21pc3NvIChjYWxlbmTDoXJpbyknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ1Npc3RlbWEgbsOjbyBmb2kgY2FwYXogZGUgY3JpYXIgbyBDYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdOZW5odW0gQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAnVm9jw6ogbsOjbyB0ZW0gYWNlc3NvIGEgZXN0ZSBjYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkaXRhciBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXJybyBhbyBhdHVhbGl6YXIgbyBjYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ07Do28gZm9pIHBvc3PDrXZlbCBsZXIgYXJxdWl2byBkZSBjb25maWd1cmHDp8OjbyBkbyBjYWxlbmTDoXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnUG9yIGZhdm9yLCB2ZXJpZmlxdWUgc2UgbyBzZXUgYXJxdWl2byDDqSB2w6FsaWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdOw6NvIGZvaSBwb3Nzw612ZWwgaW1wb3J0YXIgbyBjYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAnQ2FsZW5kw6FyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnTmVjZXNzw6FyaW8gQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOw6NvIGZvaSBwb3Nzw612ZWwgb2J0ZXIgZGFkb3MgcGFyYSBkZXRlcm1pbmFkbyBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdJbXBvcnRhZG8gY29tIHN1Y2Vzc28gJXMgY29tcHJvbWlzc28ocykgcGFyYSBvIGNhbGVuZMOhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIGhvcmEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnVG9kb3Mgb3MgY29tcHJvbWlzc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ0NvbXByb21pc3NvcyBhdHJpYnXDrWRvcyBhIG1pbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnTW9zdHJhciBhcGVuYXMgY29tcHJvbWlzc29zIGFzc2luYWRvcyBhIHZvY8OqISBBbHRlcmFyIGNvbmZpZ3VyYcOnw7Vlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICdDb21wcm9taXNzbyBuw6NvIGVuY29udHJhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTnVuY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnVG9kbyBkaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ1RvZG8gc2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnVG9kbyBNw6pzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdUb2RvIEFubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdDdXN0b21pemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0Rpw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAnU2VtYW5hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTWVuc2FsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0FudWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAndG9kb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICdkZSAlcyB0ZW1wbyhzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdhdMOpIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICdkZSAuLi4gdGVtcG8ocyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdhdMOpICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ05lbmh1bWEgbm90aWZpY2HDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXRvKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgaG9yYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZGlhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgc2VtYW5hIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnYW50ZXMgZG8gY29tcHJvbWlzc28gaW5pY2lhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ2RlcG9pcyBxdWUgbyBjb21wcm9taXNzbyBmb2kgaW5pY2lhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAnYW50ZXMgZG8gY29tcHJvbWlzc28gZW5jZXJyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZGVwb2lzIHF1ZSBvIGNvbXByb21pc3NvIGZvaSBlbmNlcnJhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdTZW0gcGVybWlzc8OjbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTsOjbyDDqSBwb3Nzw612ZWwgZXhjbHVpciBvIGNvbXByb21pc3NvIGRvIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ1NlbSBwZXJtaXNzw7VlcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnU2VtIHBlcm1pc3PDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnU2lzdGVtYSBuw6NvIGZvaSBjYXBheiBkZSBpbXBvcnRhciBhcnF1aXZvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdQb3IgZmF2b3IgdmVyaWZpcXVlIG8gbG9nIHBhcmEgbWFpcyBpbmZvcm1hw6fDtWVzLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIG1haXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdOZW5odW0gJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdVc3XDoXJpbyBuw6NvIGVuY29udHJhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdDYWxlbmTDoXJpbyBpbnZhbGlkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnVVJMIGludsOhbGlkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnSG91dmUgdW0gZXJybyBhbyBleHBvcnRhciBvIGNhbGVuZMOhcmlvISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0F0dWFsaXphw6fDo28gKG1pbnV0b3MpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdQw6FnaW5hIGRlIHZpc8OjbyBnZXJhbCBkZSBjYWxlbmTDoXJpbyBkZSBjb21wcm9taXNzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYcOnw7VlcyBkZSBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG8gZG8gY2FsZW5kw6FyaW8gZGUgY29tcHJvbWlzc29zIHF1ZSBwcmVwYXJhIGEgZW50cmFkYSBkZSBub3RpZmljYcOnw6NvIHBhcmEgYXBvbnRhbWVudG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG8gZG8gY2FsZW5kw6FyaW8gZGUgY29tcHJvbWlzc29zIHF1ZSBhdHVhbGl6YSBvIGNoYW1hZG8gY29tIGRhZG9zIGRvIGNvbXByb21pc3NvIGRlIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1RlbGEgZGUgZWRpw6fDo28gZGUgY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdMaXN0YSBkZSBjb21wcm9taXNzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSBkZSBjb21wcm9taXNzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYcOnw7VlcyBkZSBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdDb21wcm9taXNzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdUZWxhIGRlIGdlcmVuY2lhbWVudG8gZGUgY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0VzY29saGEgcGFyYSBhIHF1YWwgdGlwbyBkZSBhbHRlcmHDp8O1ZXMgbm8gY29tcHJvbWlzc28gdm9jw6ogZGVzZWphIHJlY2ViZXIgbm90aWZpY2HDp8O1ZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdDcmlhciB1bSBub3ZvIGNvbXByb21pc3NvIGRlIGNhbGVuZMOhcmlvIGFzc29jaWFkbyBhIGVzc2UgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIG5vdGlmaWNhw6fDtWVzIGRlIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0NyaWFyIG5vdm8gY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnRGVmaW5lIHF1YWlzIGNvbHVuYXMgc2Vyw6NvIGV4aWJpZGFzIG5vIHdpZGdldCBkZSBjb21wcm9taXNzb3MgYXNzb2NpYWRvcyAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBDb25maWd1cmHDp8O1ZXMgcG9zc8OtdmVpczogMCA9IERlc2FiaWxpdGFkbyAsIDEgPSBEaXNwb27DrXZlbCwgMiA9IEF0aXZhZG8gcG9yIHBhZHLDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluZSB1bSDDrWNvbmUgY29tIGxpbmsgcGFyYSBhIHDDoWdpbmEgY29tIG1hcGEgZG8gZ29vZ2xlIGRhIGxvY2FsaXphw6fDo28gYXR1YWwgbmEgdGVsYSBkZSBlZGnDp8OjbyBkZSBjb21wcm9taXNzby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICdEZWZpbmUgb3MgdGlwb3MgZGUgZXZlbnRvcyBkZSBvYmpldG9zIHF1ZSBzZXLDo28gdHJhdGFkYXMgYXRyYXbDqXMgZGUgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ0RlZmluZSBhIGxpc3RhIGRlIHBhcsOibWV0cm9zIHF1ZSBwb2RlbSBzZXIgcGFzc2Fkb3MgcGFyYSBhIGZ1bsOnw6NvIGRlIGJ1c2NhIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBwYXJhIG8gdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBwYXJhIG8gdGlja2V0IGVzY2FsYXRpb24gdGltZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgcGFyYSBvIHRpY2tldCBwZW5kaW5nIHRpbWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdEZWZpbmUgbyBwbHVnaW4gZG8gdGlja2V0IHBhcmEgY29tcHJvbWlzc29zIGRvIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkaXRhciBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnVGVtcG8gZGUgcHJpbWVpcmEgcmVzcG9zdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnVGVsYSBkZSBpbXBvcnRhw6fDo28gZGUgY29tcHJvbWlzc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ0Fzc29jaWFyIGNvbXByb21pc3NvcyBlIGNoYW1hZG9zIGNvbW8gdW1hIHRpcG8gIk5vcm1hbCIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBvcyBldmVudG9zIGRlIGNvbXByb21pc3NvIHF1ZSBzZXLDo28gZXhpYmlkbyBuYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBvcyBldmVudG9zIGRvIGNhbGVuZMOhcmlvIGEgc2VyIGV4aWJpZG8gbmEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ0xpc3RhIGRlIGNvcmVzIGVtIFJHQiBoZXhhZGVjaW1hbCBxdWUgZXN0YXLDo28gZGlzcG9uw612ZWlzIHBhcmEgc2VsZcOnw6NvIGR1cmFudGUgYSBjcmlhw6fDo28gZG8gY2FsZW5kw6FyaW8uIENlcnRpZmlxdWUtc2UgZGUgYXMgY29yZXMgc8OjbyBlc2N1cmFzIG8gc3VmaWNpZW50ZSwgdGV4dG8gYnJhbmNhcyBwb2RlbSBzZXIgc29icmVwb3N0b3MuICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdHZXJlbmNpYXIgY2FsZW5kw6FyaW8gZGlmZXJlbnRlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdOw7ptZXJvIG3DoXhpbW8gZGUgY2FsZW5kw6FyaW8gYXRpdm9zIG5hcyB2aXPDtWVzIGdlcmFpcy4gUG9yIGZhdm9yLCBub3RlIHF1ZSB1bSBudW1lcm8gZ3JhbmRlIGRlIGNhbGVuZMOhcmlvIGF0aXZvcyB2b2PDqiBwb2RlcsOhIHRlciBpbXBhY3RvcyBuYSBwZXJmb3JtYW5jZSBkbyBzZXJ2aWRvciBkZXZpZG8gYSBtdWl0YXMgY2hhbWFkYXMgc2ltdWx0w6JuZWFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPIE9UUlMgbsOjbyBzdXBvcnRhIGNvbXByb21pc3NvcyByZWNvcnJlbnRlcywgc2VtIGRhdGEgZGUgdMOpcm1pbm8gb3UgbyBuw7ptZXJvIGRlIGl0ZXJhw6fDtWVzLiBEdXJhbnRlIG8gcHJvY2Vzc28gZGUgaW1wb3J0YcOnw6NvLCBwb2RlIGFjb250ZWNlciBkbyBhcnF1aXZvIElDUywgY29udGVyIGVzc2VzIGNvbXByb21pc3Nvcy4gRW0gdmV6IGRpc3NvLCBvIHNpc3RlbWEgY3JpYSB0b2RvcyBvcyBjb21wcm9taXNzb3Mgbm8gcGFzc2FkbywgYWzDqW0gZGUgY29tcHJvbWlzc29zIHBhcmEgb3MgcHLDs3hpbW9zIG4gbWVzZXMgKDEyMCBtZXNlcy8xMCBhbm9zIHBvciBwYWRyw6NvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdWaXPDo28gZ2VyYWwgZGUgdG9kb3Mgb3MgY29tcHJvbWlzc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdEYXRhIGRlIHBlbmTDqm5jaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ1Blc3F1aXNhciBQbHVnaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdNw7NkdWxvIGRlIHBlc3F1aXNhIGRlIGF1dG9jb21wbGV0YXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ0NhbGVuZMOhcmlvIHDDumJsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdDYWxlbmTDoXJpbyBww7pibGljbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Zpc8OjbyBnZXJhbCBkZSByZWN1cnNvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdWaXPDo28gZ2VyYWwgZGUgcmVjdXJzbyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIGNyaWFyIHVtIGNvbXByb21pc3NvIGRlIGNhbGVuZMOhcmlvIHZpbmN1bGFkbyBhbyBjaGFtYWRvIG5hIHZpc8OjbyB0aWNrZXQgem9vbSBuYSBpbnRlcmZhY2UgZG8gYXRlbmRlbnRlLiBDb250cm9sZSBkZSBhY2Vzc28gYWRpY2lvbmFsIHBhcmEgbW9zdHJhciBvdSBuw6NvIG8gdsOtbmN1bG8gcG9kZSBzZXIgZmVpdG8gdXNhbmRvIGEgY2hhdmUgIkdyb3VwIiBlIG8gY29udGXDumRvIGNvbW8gInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gUGFyYSBhZ3J1cGFyIGl0ZW5zIGRlIG1lbnUgdXNlIGEgY2hhdmUgIkNsdXN0ZXJOYW1lIiBlIHBhcmEgbyBjb250ZcO6ZG8gcXVhbHF1ZXIgbm9tZSBxdWUgZGVzZWplIHZlciBuYSBpbnRlcmZhY2UgZG8gdXN1w6FyaW8uIFVzZSAiQ2x1c3RlclByaW9yaXR5IiBwYXJhIGNvbmZpZ3VyYXIgYSBvcmRlbSBkZSB1bSBkZXRlcm1pbmFkbyBjb25qdW50byBkZW50cm8gZG8gdG9vbGJhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ1RlbXBvIGRlIHNvbHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1NlbGXDp8OjbyBkZSB0cmFuc3BvcnRlIHBhcmEgbm90aWZpY2HDp8O1ZXMgZGUgY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ0Rpc3BhcmEgYWRpw6fDo28gb3UgYXR1YWxpemHDp8OjbyBkZSBjb21wcm9taXNzb3MgZG8gY2FsZW5kw6FyaW8gYXV0b23DoXRpY28gY29tIGJhc2UgZW0gZGV0ZXJtaW5hZG9zIHRlbXBvcyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnVGVtcG8gZGUgYXR1YWxpemHDp8Ojbyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICfQo9Cy0LXQtNC+0LzQu9C10L3QuNC1INC+INC90LDQv9C+0LzQuNC90LDQvdC40Lgg0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn0JLRiyDQv9C+0LvRg9GH0LjRgtC1INGC0LDQutC+0LUg0YPQstC10LTQvtC80LvQtdC90LjQtSDQstGB0Y/QutC40Lkg0YDQsNC3INC60L7Qs9C00LAg0L3QsNGB0YLRg9C/0LjRgiDRgdGA0L7QuiDQvdCw0L/QvtC80LjQvdCw0L3QuNGPINC/0L4g0L7QtNC90L7QvNGDINC40Lcg0LLQsNGI0LjRhSDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INGD0LLQtdC00L7QvNC70LXQvdC40Y/QvNC4INC+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/RhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ9CX0LTQtdGB0Ywg0LLRiyDQvNC+0LbQtdGC0LUg0LfQsNCz0YDRg9C30LjRgtGMINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90L3Ri9C5INGE0LDQudC7INC00LvRjyDQuNC80L/QvtGA0YLQsCDRg9Cy0LXQtNC+0LzQu9C10L3QuNC5INC+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/RhSDQsiDQstCw0YjRgyDRgdC40YHRgtC10LzRgy4g0KTQsNC50Lsg0LTQvtC70LbQtdC9INCx0YvRgtGMINCyINGE0L7RgNC80LDRgtC1IC55bWwg0LIg0LrQvtGC0L7RgNC+0Lwg0Y3QutGB0L/QvtGA0YLQuNGA0YPRjtGC0YHRjyDQuNC3INC80L7QtNGD0LvRjyDRg9Cy0LXQtNC+0LzQu9C10L3QuNC5INC+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/RhS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICfQl9C00LXRgdGMINCy0Ysg0LzQvtC20LXRgtC1INCy0YvQsdGA0LDRgtGMINC60LDQutC40LUg0YHQvtCx0YvRgtC40Y8g0LHRg9C00YPRgiDQstC60LvRjtGH0LDRgtGMINGN0YLQviDRg9Cy0LXQtNC+0LzQu9C10L3QuNC1LiDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C5INGE0LjQu9GM0YLRgCDQvNC+0LbQtdGCINCx0YvRgtGMINC/0YDQuNC80LXQvdGR0L0g0L3QuNC20LUg0LTQu9GPINC40YUg0L7RgtC/0YDQsNCy0LrQuCDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSwg0YPQtNC+0LLQu9C10YLQstC+0YDRj9GO0YnQuNGFINC30LDQtNCw0L3QvdC+0LzRgyDRg9GB0LvQvtCy0LjRji4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAn0KTQuNC70YzRgtGAINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICfQmtC+0LzQsNC90LTQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ9Cg0LXRgdGD0YDRgdGLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAn0KPQstC10LTQvtC80LjRgtGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjyDRgtC+0LvRjNC60L4g0YDQsNC3INCyINC00LXQvdGMINC00LvRjyDQutCw0LbQtNC+0LPQviDQvtGC0LTQtdC70YzQvdC+0LPQviDQvNC10YDQvtC/0YDQuNGP0YLQuNGPLCDQuNGB0L/QvtC70YzQt9GD0Y8g0YPQutCw0LfQsNC90L3Ri9C5INGB0L/QvtGB0L7QsSDQtNC+0YHRgtCw0LLQutC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ9Cj0LLQtdC00L7QvNC70LXQvdC40Y8g0L3QsNC/0YDQsNCy0LvRj9GO0YLRgdGPINC6INCw0LPQtdC90YLRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ9Cn0YLQvtCx0Ysg0L/QvtC70YPRh9C40YLRjCDQv9C10YDQstGL0LUgMjAg0YHQuNC80LLQvtC70L7QsiDRgtC10LzRiyDQvNC10YDQvtC/0YDQuNGP0YLQuNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ9Cn0YLQvtCx0Ysg0L/QvtC70YPRh9C40YLRjCDQsNGC0YDQuNCx0YPRgiDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAn0KfRgtC+0LHRiyDQv9C+0LvRg9GH0LjRgtGMINCw0YLRgNC40LHRg9GCINC60LDQu9C10L3QtNCw0YDRjyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICfQntCx0LfQvtGAINC/0L7QstC10YHRgtC60Lgg0LTQvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICfQo9C/0YDQsNCy0LvRj9GC0Ywg0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICfQlNC+0LHQsNCy0LjRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICfQptCy0LXRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ9CU0LDRgtCwINC+0LrQvtC90YfQsNC90LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfQn9C+0LLRgtC+0YDQtdC90LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICfQndC1INC90LDQt9C90LDRh9C10L0g0LrQsNC70LXQvdC00LDRgNGMLiDQlNC+0LHQsNCy0YzRgtC1INC60LDQu9C10L3QtNCw0YDRjCDQuNGB0L/QvtC70YzQt9GD0Y8g0Y3QutGA0LDQvSDRg9C/0YDQsNCy0LvQtdC90LjRjyDQutCw0LvQtdC90LTQsNGA0Y/QvNC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ9Ct0YLQviDQv9C+0LLRgtC+0YDRj9GO0YnQtdC10YHRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAn0JLRiyDQttC10LvQsNC10YLQtSDRgNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDRgtC+0LvRjNC60L4g0YLQtdC60YPRidC10LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDQuNC70Lgg0LLRgdC1INC10LPQviDQv9C+0LLRgtC+0YDQtdC90LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICfQktGB0LUg0LLRhdC+0LbQtNC10L3QuNGPL9C60L7Qv9C40LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICfQotC+0LvRjNC60L4g0Y3RgtGDINC60L7Qv9C40Y4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INC60LDQu9C10L3QtNCw0YDRj9C80LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfQntCx0LfQvtGAINC60LDQu9C10L3QtNCw0YDQtdC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICfQlNC+0LHQsNCy0LjRgtGMINC90L7QstGL0Lkg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICfQmNC80L/QvtGA0YLQuNGA0L7QstCw0YLRjCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ9CY0LzQv9C+0YDRgiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfQl9C00LXRgdGMINCy0Ysg0LzQvtC20LXRgtC1INC30LDQs9GA0YPQt9C40YLRjCDRhNCw0LnQuyDQutC+0L3RhNC40LPRg9GA0LDRhtC40Lgg0LTQu9GPINC40LzQv9C+0YDRgtCwINC60LDQu9C10L3QtNCw0YDRjyDQsiDQstCw0YjRgyDRgdC40YHRgtC10LzRgy4g0KTQsNC50Lsg0LTQvtC70LbQtdC9INCx0YvRgtGMINCyINGE0L7RgNC80LDRgtC1IC55bWwg0YTQsNC50Lsg0Y3QutGB0L/QvtGA0YLQsCDQuNC3INC80L7QtNGD0LvRjyDRg9C/0YDQsNCy0LvQtdC90LjRjyDQutCw0LvQtdC90LTQsNGA0Y/QvNC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ9CX0LDQs9GA0YPQt9C40YLRjCDQutC+0L3RhNC40LPRg9GA0LDRhtC40Y4g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ9CY0LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINC60LDQu9C10L3QtNCw0YDRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ9Ck0LjQu9GM0YLRgCDQtNC70Y8g0JrQsNC70LXQvdC00LDRgNC10LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAn0JIg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQvtGCINC30L3QsNGH0LXQvdC40Y8g0LIg0L/QvtC70LUgZ3JvdXAsINGB0LjRgdGC0LXQvNCwINC/0YDQtdC00L7RgdGC0LDQstC70Y/QtdGCINCw0LPQtdC90YLQsNC8INC00L7RgdGC0YPQvyDQuiDQutCw0LvQtdC90LTQsNGA0Y4g0LIg0LIg0YHQvtC+0YLQstC10YLRgdGC0LLQuNC4INGBINGD0YDQvtCy0L3QtdC8INC10LPQviDQv9C+0LvQvdC+0LzQvtGH0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICfQotC+0LvRjNC60L4g0YfRgtC10L3QuNC1OiDQv9C+0LvRjNC30L7QstCw0YLQtdC70Lgg0LzQvtCz0YPRgiDRgdC80L7RgtGA0LXRgtGMINC4INGN0LrRgdC/0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0LLRgdC1INC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LrQsNC70LXQvdC00LDRgNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ9Cf0LXRgNC10LzQtdGB0YLQuNGC0Ywg0LI6INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQuCDQvNC+0LPRg9GCINC40LfQvNC10L3Rj9GC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsiDQutCw0LvQtdC90LTQsNGA0LUsINC90L4g0LHQtdC3INCy0YvQsdC+0YDQsCDQutCw0LvQtdC90LTQsNGA0Y8gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICfQodC+0LfQtNCw0YLRjDog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C4INC80L7Qs9GD0YIg0YHQvtC30LTQsNCy0LDRgtGMINC4INGD0LTQsNC70Y/RgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LIg0LrQsNC70LXQvdC00LDRgNC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAn0JfQsNC/0LjRgdGML9GH0YLQtdC90LjQtTog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C4INC40LzQtdGO0YIg0L/QvtC70L3QvtC1INGD0L/RgNCw0LLQu9C10L3QuNC1INC60LDQu9C10L3QtNCw0YDQtdC8Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICdVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAn0K3QutGB0L/QvtGA0YIg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAn0JfQsNCz0YDRg9C30LrQsCDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAn0JrQvtC/0LjRgNC+0LLQsNGC0Ywg0L/Rg9Cx0LvQuNGH0L3Ri9C5IFVSTCDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ9CY0LzRjyDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAn0JrQsNC70LXQvdC00LDRgNGMINGBINGC0LDQutC40Lwg0LjQvNC10L3QtdC8INGD0LbQtSDRgdGD0YnQtdGB0YLQstGD0LXRgi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ9CT0YDRg9C/0L/QvtCy0YvQtSDQv9GA0LDQstCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICfQnNC10YDQvtC/0YDQuNGP0YLQuNGPINC30LDRj9Cy0LrQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAn0J/RgNCw0LLQuNC70L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAn0JjRgdC/0L7Qu9GM0LfRg9C50YLQtSDQvtC/0YbQuNC4INC90LjQttC1LCDRh9GC0L7QsdGLINGD0LrQsNC30LDRgtGMLCDQutCw0LrQuNC1INC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LfQsNGP0LLQvtC6INCx0YPQtNGD0YIg0YHQvtC30LTQsNC90Ysg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICfQktGL0LHQtdGA0LjRgtC1INC/0YDQsNCy0LjQu9GM0L3Rg9GOINC+0YfQtdGA0LXQtNGMLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ9CQ0YLRgNC40LHRg9GC0Ysg0L/QvtC40YHQutCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAn0JfQsNC00LDRgtGMINC/0YDQsNCy0LjQu9CwINC00LvRjyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQvtCz0L4g0YHQvtC30LTQsNC90LjRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INCyINGN0YLQvtC8INC60LDQu9C10L3QtNCw0YDQtSwg0L7RgdC90L7QstCw0L3QvdGL0YUg0L3QsCDQtNCw0L3QvdGL0YUg0LfQsNGP0LLQutC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0L/RgNCw0LLQuNC70L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ9CR0L7Qu9C10LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ9Cc0LXQvdC10LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAn0JTQvtCx0LDQstC40YLRjCDQvdC+0LLQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAn0JrQsNC70LXQvdC00LDRgNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICfQodC70LjRiNC60L7QvCDQvNC90L7Qs9C+INCw0LrRgtC40LLQvdGL0YUg0LrQsNC70LXQvdC00LDRgNC10LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAn0J/QvtC20LDQu9GD0LnRgdGC0LAg0LjQu9C4INC+0YLQutC70Y7Rh9C40YLQtSDQvdC10LrQvtGC0L7RgNGL0LUg0LjQu9C4INGD0LLQtdC70LjRh9GM0YLQtSDQv9GA0LXQtNC10LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQsiDQvdCw0YHRgtGA0L7QudC60LDRhS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ9Cd0LXQtNC10LvRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ9Cc0LXRgdGP0YfQvdGL0Lkg0LPRgNCw0YTQuNC6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICfQndC10LTQtdC70YzQvdGL0Lkg0LPRgNCw0YTQuNC6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ9CT0YDQsNGE0LjQuiDQtNC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ9Cf0LXRgNC10LnRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICfQntGC0LrQu9C+0L3QuNGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ9Cf0L7QutCw0LfQsNGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICfQntGB0L3QvtCy0L3Ri9C1INC00LDQvdC90YvQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICfQlNCw0YLQsC/QktGA0LXQvNGPJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfQn9C+0LbQsNC70YPQudGB0YLQsCwg0YPRgdGC0LDQvdC+0LLQuNGC0LUg0Y3RgtC+INC30L3QsNGH0LXQvdC40LUg0LTQviDQstGA0LXQvNC10L3QuCDQvtC60L7QvdGH0LDQvdC40Y8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ9Cf0L7QttCw0LvRg9C50YHRgtCwLCDRg9GB0YLQsNC90L7QstC40YLQtSDRjdGC0L4g0LfQvdCw0YfQtdC90LjQtSDQv9C+0YHQu9C1INCy0YDQtdC80LXQvdC4INC90LDRh9Cw0LvQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ9Ct0YLQviDRgNGP0LQg0L/QvtCy0YLQvtGA0Y/RjtGJ0LjRhdGB0Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfQmtC70LjQutC90LjRgtC1INGB0Y7QtNCwINGH0YLQvtCx0Ysg0L7RgtC60YDRi9GC0Ywg0YDQvtC00LjRgtC10LvRjNGB0LrQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ9Ca0LvQuNC60L3QuNGC0LUg0YHRjtC00LAg0YfRgtC+0LHRiyDRgNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAn0KfQsNGB0YLQvtGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICfQmtCw0LbQtNGL0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ9Ce0YLQvdC+0YHQuNGC0LXQu9GM0L3QsNGPINGC0L7Rh9C60LAg0LLRgNC10LzQtdC90LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAn0JLRiyDQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3QviDQttC10LvQsNC10YLQtSDRg9C00LDQu9C40YLRjCDRjdGC0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtT8g0K3RgtCwINC+0L/QtdGA0LDRhtC40Y8g0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0YLQvNC10L3QtdC90LAuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICfQmNC80L/QvtGA0YIg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ9CX0LDQs9GA0YPQttCw0LXQvNGL0Lkg0YTQsNC50Lsg0LTQvtC70LbQtdC9INC40LzQtdGC0Ywg0L/RgNCw0LLQuNC70YzQvdGL0LkgaUNhbCDRhNC+0YDQvNCw0YIgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICfQldGB0LvQuCDQttC10LvQsNC10LzRi9C5INC60LDQu9C10L3QtNCw0YDRjCDQvtGC0YHRg9GC0YHRgtCy0YPQtdGCINCyINGB0L/QuNGB0LrQtSwg0YPQsdC10LTQuNGC0LXRgdGMLCDRh9GC0L4g0YMg0LLQsNGBINC10YHRgtGMINGF0L7RgtGPINCx0Ysg0L/RgNCw0LLQsCDQvdCwINGB0L7Qt9C00LDQvdC40LUgLSBcJ2NyZWF0ZVwnLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ9Ce0LHQvdC+0LLQuNGC0Ywg0YHRg9GJ0LXRgdGC0LLRg9GO0YnQtdC1INC80LXRgNC+0L/RgNC40Y/RgtC40LU/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAn0JLRgdC1INGB0YPRidC10YHRgtCy0YPRjtGJ0LjQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINCyINC60LDQu9C10L3QtNCw0YDQtSDRgSDQvtC00LjQvdCw0LrQvtCy0YvQvCBVbmlxdWVJRCDQsdGD0LTRg9GCINC/0LXRgNC10LfQsNC/0LjRgdCw0L3Riy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAn0JfQsNCz0YDRg9C30LjRgtGMINC60LDQu9C10L3QtNCw0YDRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAn0JjQvNC/0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICfQndC+0LLQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ9Ch0LrQvtGA0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSDQtNC90LXQuSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICfQo9Cy0LXQtNC+0LzQu9C10L3QuNC1INGBINGC0LDQutC40Lwg0LjQvNC10L3QtdC8INGD0LbQtSDRgdGD0YnQtdGB0YLQstGD0LXRgiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ9CQ0LPQtdC90YIgKNGA0LXRgdGD0YDRgSksINC60L7RgtC+0YDRi9C5INCy0YvQsdGA0LDQvSDQsiDQvNC10YDQvtC/0YDQuNGP0YLQuNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ9CS0YHQtSDQsNCz0LXQvdGC0Ysg0YEg0L/RgNCw0LLQvtC8INGH0YLQtdC90LjRjyAo0LrQsNC6INC80LjQvdC40LzRg9C8KSDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyAo0LrQsNC70LXQvdC00LDRgNGPKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ9CS0YHQtSDQsNCz0LXQvdGC0Ysg0YEg0L/RgNCw0LLQvtC8IC13L9C30LDQv9C40YHQuCDQvdCwINC30LDRj9Cy0LrRgyDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyAo0LrQsNC70LXQvdC00LDRgNGPKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAn0KHQuNGB0YLQtdC80LUg0L3QtSDRg9C00LDQu9C+0YHRjCDRgdC+0LfQtNCw0YLRjCDQutCw0LvQtdC90LTQsNGA0YwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAn0J7RgtGB0YPRgtGB0YLQstGD0LXRgiBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICfQoyDQstCw0YEg0L3QtdGCINC/0YDQsNCyINC90LAg0LTQvtGB0YLRg9C/INC6INGN0YLQvtC80YMg0LrQsNC70LXQvdC00LDRgNGOISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQntGI0LjQsdC60Lgg0L/RgNC4INC+0LHQvdC+0LLQu9C10L3QuNC4INC60LDQu9C10L3QtNCw0YDRjyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INC/0YDQvtGH0LjRgtCw0YLRjCDRhNCw0LnQuyDQvdCw0YHRgtGA0L7QtdC6INC60LDQu9C10L3QtNCw0YDRjy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAn0KPQsdC10LTQuNGC0LXRgdGMLCDQv9C+0LbQsNC70YPQudGB0YLQsCwg0YfRgtC+INGE0LDQudC7INC40LzQtdC10YIg0L/RgNCw0LLQuNC70YzQvdGL0Lkg0YTQvtGA0LzQsNGCLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICfQndC10LLQvtC30LzQvtC20L3QviDQuNC80L/QvtGA0YLQuNGA0L7QstCw0YLRjCDQutCw0LvQtdC90LTQsNGA0YwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ9Ca0LDQu9C10L3QtNCw0YDRjCDQuNC80L/QvtGA0YLQuNGA0L7QstCw0L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICfQotGA0LXQsdGD0LXRgtGB0Y8gQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICfQndC10LLQvtC30LzQvtC20L3QviDQv9C+0LvRg9GH0LjRgtGMINC00LDQvdC90YvQtSDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtCz0L4gQ2FsZW5kYXJJRCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAn0KPRgdC/0LXRiNC90L4g0LjQvNC/0L7RgNGC0LjRgNC+0LLQsNC90YsgJXMg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQsiDQutCw0LvQtdC90LTQsNGA0YwgJXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcgKzUg0LzQuNC90YPRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSDQvNC40L3Rg9GCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwINC80LjQvdGD0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxINGH0LDRgSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICfQktGB0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICfQnNC10YDQvtC/0YDQuNGP0YLQuNGPINC90LDQt9C90LDRh9C10L3QvdGL0LUg0LzQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICfQn9C+0LrQsNC30LDQvdGLINGC0L7Qu9GM0LrQviDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINC90LDQt9C90LDRh9C10L3QvdGL0LUg0JLQsNC8ISDQmNC30LzQtdC90LjRgtC1INC90LDRgdGC0YDQvtC50LrQuCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICfQnNC10YDQvtC/0YDQuNGP0YLQuNGPINC90LUg0L3QsNC50LTQtdC90YshJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAn0J3QuNC60L7Qs9C00LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAn0JrQsNC20LTRi9C5INC00LXQvdGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfQmtCw0LbQtNGD0Y4g0L3QtdC00LXQu9GOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAn0JrQsNC20LTRi9C5INC80LXRgdGP0YYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ9Ca0LDQttC00YvQuSDQs9C+0LQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAn0J/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfQldC20LXQtNC90LXQstC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAn0JXQttC10L3QtdC00LXQu9GM0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAn0JXQttC10LzQtdGB0Y/Rh9C90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAn0JXQttC10LPQvtC00L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ9C60LDQttC00YvQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ9C/0L7QstGC0L7RgNC40YLRjCAlcyDRgNCw0Lco0LApJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ9C00L4gLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJ9C/0L7QstGC0L7RgNC40YLRjCAuLi4g0YDQsNC3KNCwKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ9C00L4gJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAn0J3QtSDRg9Cy0LXQtNC+0LzQu9GP0YLRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAn0LfQsCAlcyDQvNC40L3Rg9GCKNGDKSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAn0LfQsCAlcyDRh9Cw0YEo0L7Qsikg0LTQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAn0LfQsCAlcyDQtNC10L3RjCjQtNC90LXQuSkg0LTQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJ9C30LAgJXMg0L3QtdC00LXQu9GOINC00L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICfQtNC+INC90LDRh9Cw0LvQsCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAn0L/QvtGB0LvQtSDQvdCw0YfQsNC70LAg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICfQtNC+INC+0LrQvtC90YfQsNC90LjRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ9C/0L7RgdC70LUg0L7QutC+0L3Rh9Cw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICfQndC10YIg0L/RgNCw0LIg0LTQvtGB0YLRg9C/0LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INGD0LTQsNC70LjRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40LUg0LfQsNGP0LLQutC4ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfQndC10YIg0L/RgNCw0LIg0LTQvtGB0YLRg9C/0LAhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ9Cd0LXRgiDQv9GA0LDQsiDQtNC+0YHRgtGD0L/QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICfQodC40YHRgtC10LzQtSDQvdC1INGD0LTQsNC70L7RgdGMINC40LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINGE0LDQudC7ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICfQn9C+0LbQsNC70YPQudGB0YLQsCwg0L/RgNC+0LLQtdGA0YzRgtC1INC20YPRgNC90LDQuyDQtNC70Y8g0L/QvtC70YPRh9C10L3QuNGPINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LguJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQg0LXRidC1JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAn0J7RgtGB0YPRgtGB0YLQstGD0LXRgiAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ9Ci0LDQutC+0Lkg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GMINC90LUg0YHRg9GJ0LXRgdGC0LLRg9C10YIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn0J3QtdC00LXQudGB0YLQstC40YLQtdC70YzQvdGL0Lkg0LrQsNC70LXQvdC00LDRgNGMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICfQndC10LLQtdGA0L3Ri9C5IFVSTCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn0J/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsCDQv9GA0Lgg0Y3QutGB0L/QvtGA0YLQtSDQutCw0LvQtdC90LTQsNGA0Y8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAn0JjQvdGC0LXRgNCy0LDQuyDQvtCx0L3QvtCy0LvQtdC90LjRjyAo0LIg0LzQuNC90YPRgtCw0YUpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICfQodGC0YDQsNC90LjRhtCwINC+0LHQt9C+0YDQsCDQmtCw0LvQtdC90LTQsNGA0Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ9Cj0LLQtdC00L7QvNC70LXQvdC40Y8g0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRj9GFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQnNC+0LTRg9C70Ywg0YPQv9GA0LDQstC70LXQvdC40Y8g0YHQvtCx0YvRgtC40Y/QvNC4INCa0LDQu9C10L3QtNCw0YDRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5LCDQutC+0YLQvtGA0YvQuSDQv9C+0LTQs9C+0YLQsNCy0LvQuNCy0LDQtdGCINGD0LLQtdC00L7QvNC70LXQvdC40Y8g0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICfQnNC+0LTRg9C70Ywg0YPQv9GA0LDQstC70LXQvdC40Y8g0YHQvtCx0YvRgtC40Y/QvNC4INCa0LDQu9C10L3QtNCw0YDRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5LCDQutC+0YLQvtGA0YvQuSDQvtCx0L3QvtCy0LvRj9C10YIg0LfQsNGP0LLQutC4INGBINC00LDQvdC90YvQvNC4INC40Lcg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQt9Cw0Y/QstC60LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ9Ct0LrRgNCw0L0g0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjyDQnNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAn0KHQv9C40YHQvtC6INC80LXRgNC+0L/RgNC40Y/RgtC40LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICfQodC/0LjRgdC+0Log0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ9Cj0LLQtdC00L7QvNC70LXQvdC40Y8g0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRj9GFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICfQrdC60YDQsNC9INCj0L/RgNCw0LLQu9C10L3QuNC1INC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ9CS0YvQsdC10YDQuNGC0LUg0LTQu9GPINC60LDQutC+0LPQviDRgtC40L/QsCDQuNC30LzQtdC90LXQvdC40Lkg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQstGLINC20LXQu9Cw0LXRgtC1INC/0L7Qu9GD0YfQsNGC0Ywg0YPQstC10LTQvtC80LvQtdC90LjRjy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ9Ch0L7Qt9C00LDRgtGMINC90L7QstC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDQutCw0LvQtdC90LTQsNGA0Y8g0YHQstGP0LfQsNC90L3QvtC1INGBINGN0YLQvtC5INC30LDRj9Cy0LrQvtC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0KHQvtC30LTQsNC90LjQtSDQuCDRg9C/0YDQsNCy0LvQtdC90LjQtSDRg9Cy0LXQtNC+0LzQu9C10L3QuNGP0LzQuCDQv9C+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/QvC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfQodC+0LfQtNCw0YLRjCDQvdC+0LLQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAn0JfQsNC00LDQudGC0LUsINC60LDQutC40LUg0LrQvtC70L7QvdC60Lgg0L7RgtC+0LHRgNCw0LbQsNGC0Ywg0LIg0YHQstGP0LfQsNC90L3QvtC8INCy0LjQtNC20LXRgtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LkgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4g0JLQvtC30LzQvtC20L3Ri9C1INC30L3QsNGH0LXQvdC40Y86IDAgPSDQntGC0LrQu9GO0YfQtdC90L4sIDEgPSDQlNCwLCAyID0g0JLQutC70Y7Rh9C10L3QsCDQv9C+INGD0LzQvtC70YfQsNC90LjRji4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC40LrQvtC90LrRgyDRgdC+INGB0YHRi9C70LrQvtC5INC90LAg0YHRgtGA0LDQvdC40YbRgyDRgtC10LrRg9GJ0LXQs9C+INC80LXRgdGC0L7Qv9C+0LvQvtC20LXQvdC40Y8g0LIgR29vZ2xlIE1hcCDQvdCwINGN0LrRgNCw0L3QtSDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0LjQv9GLINGB0L7QsdGL0YLQuNC5LCDQutC+0YLQvtGA0YvQtSDQsdGD0LTRg9GCINGD0L/RgNCw0LLQu9GP0YLRjNGB0Y8gINGBINC/0L7QvNC+0YnRjNGOIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0L/QtdGA0LXRh9C10L3RjCDQsNGC0YDQuNCx0YPRgtC+0LIsINC60L7RgtC+0YDRi9C1INC80L7Qs9GD0YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyDQv9GA0Lgg0L/QvtC40YHQutC1INC30LDRj9Cy0L7Qui4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC80L7QtNGD0LvRjCDQvtCx0YDQsNCx0L7RgtC60Lgg0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LfQsNGP0LLQutC4INC00LvRjyDQtNC40L3QsNC80LjRh9C10YHQutC40YUg0L/QvtC70LXQuSDRgtC40L/QsCDQtNCw0YLQsC/QstGA0LXQvNGPIC8gZGF0ZSB0aW1lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC80L7QtNGD0LvRjCDQvtCx0YDQsNCx0L7RgtC60Lgg0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LfQsNGP0LLQutC4INC/0L4gdGlja2V0IGVzY2FsYXRpb24gdGltZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQvNC+0LTRg9C70Ywg0L7QsdGA0LDQsdC+0YLQutC4INC00LvRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INC30LDRj9Cy0LrQuCDQv9C+IHRpY2tldCBwZW5kaW5nIHRpbWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICfQl9Cw0LTQsNC10YIg0L/Qu9Cw0LPQuNC9INC+0LHRgNCw0LHQvtGC0LrQuCDQt9Cw0Y/QstC+0Log0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LrQsNC70LXQvdC00LDRgNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ9CS0YDQtdC80Y8g0LTQviDQv9C10YDQstC+0LPQviDQvtGC0LLQtdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAn0K3QutGA0LDQvSDQuNC80L/QvtGA0YLQsCDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICfQodCy0Y/Qt9GL0LLQsNC10YIg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDRgSDQt9Cw0Y/QstC60LDQvNC4INGB0LLRj9C30YzRjiDRgtC40L/QsCAiTm9ybWFsL9Ce0LHRi9GH0L3QsNGPIi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ9Ch0L/QuNGB0L7QuiDQstGB0LXRhSDRgdC+0LHRi9GC0LjQuSwg0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40LksINC+0YLQvtCx0YDQsNC20LDQtdC80YvRhSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ9Ch0L/QuNGB0L7QuiDQstGB0LXRhSDRgdC+0LHRi9GC0LjQuSDQutCw0LvQtdC90LTQsNGA0Y8sINC+0YLQvtCx0YDQsNC20LDQtdC80YvRhSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0YbQstC10YLQvtCyINCyINGI0LXRgdGC0L3QsNC00YbQsNGC0LXRgNC40YfQvdC+0LwgUkdCINC00L7RgdGC0YPQv9C90YvRhSDQtNC70Y8g0LLRi9Cx0L7RgNCwINC/0YDQuCDRgdC+0LfQtNCw0L3QuNC4INC60LDQu9C10L3QtNCw0YDRjy4g0KPQsdC10LTQuNGC0LXRgdGMINC/0YDQuCDQstGL0LHQvtGA0LUsINGH0YLQviDRhtCy0LXRgiDRhNC+0L3QsCDQtNC+0YHRgtCw0YLQvtGH0L3QviDRgtC10LzQvdGL0LksINGH0YLQvtCx0Ysg0LHQtdC70YvQuSDRgtC10LrRgdGCINCx0YvQuyDQvdCwINC90LXQvCDQstC40LTQtdC9L9GH0LjRgtCw0LXQvC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAn0KPQv9GA0LDQstC70Y/RgtGMINGA0LDQt9C70LjRh9C90YvQvNC4INC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAn0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INCw0LrRgtC40LLQvdGL0YUg0LrQsNC70LXQvdC00LDRgNC10Lkg0L3QsCDRjdC60YDQsNC90LDRhSDQvtCx0LfQvtGA0LAuINCf0L7QvNC90LjRgtC1LCDRh9GC0L4g0LHQvtC70YzRiNC+0LUg0YfQuNGB0LvQviDQsNC60YLQuNCy0L3Ri9GFINC60LDQu9C10L3QtNCw0YDQtdC5INC80L7QttC10YIg0L7QutCw0LfQsNGC0Ywg0LLQu9C40Y/QvdC40LUg0L3QsCDQv9GA0L7QuNC30LLQvtC00LjRgtC10LvRjNC90L7RgdGC0Ywg0YHQtdGA0LLQtdGA0LAsINC00LXQu9Cw0Y8g0YHQu9C40YjQutC+0Lwg0LzQvdC+0LPQviDQvtC00L3QvtCy0YDQtdC80LXQvdC90YvRhSDQstGL0LfQvtCy0L7Qsi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQv9C+0LLRgtC+0YDRj9GO0YnQuNC10YHRjyDQnNC10YDQvtC/0YDQuNGP0YLQuNGPINCx0LXQtyDQtNCw0YLRiyDQvtC60L7QvdGH0LDQvdC40Y8g0LjQu9C4INC60L7Qu9C40YfQtdGB0YLQstCwINC/0L7QstGC0L7RgNC10L3QuNC5LiDQn9GA0Lgg0LjQvNC/0L7RgNGC0LUg0LzQvtC20LXRgiDRgtCw0Log0YHQu9GD0YfQuNGC0YzRgdGPLCDRh9GC0L4gSUNTINGE0LDQudC7INGB0L7QtNC10YDQttC40YIg0L/QvtC00L7QsdC90YvQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNGPLiDQkiDRgNC10LfRg9C70YzRgtCw0YLQtSDQvNC+0LbQtdGCINGC0LDQuiDRgdC70YPRh9C40YLRjNGB0Y8sINGH0YLQviDRgdC40YHRgtC10LzQsCDRgdC+0LfQtNCw0YHRgiDQstGB0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsiDQv9GA0L7RiNC70L7QvCDQuCwg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90L4sINC00LvRjyDQv9C+0YHQu9C10LTRg9GO0YnQuNGFIG4g0LzQtdGB0Y/RhtC10LIgKDEyMCDQvNC10YHRj9GG0LXQsi8xMCDQu9C10YIg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ9Ce0LHQt9C+0YAg0LLRgdC10YUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAn0JLRgNC10LzRjyDQsiDQvtC20LjQtNCw0L3QuNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfQn9C+0LjRgdC60L7QstGL0Lkg0L/Qu9Cw0LPQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAn0J/QvtC40YHQutC+0LLRi9C5INC/0LvQsNCz0LjQvSDQtNC70Y8g0LDQstGC0L7Qt9Cw0LLQtdGA0YjQtdC90LjRjy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAn0J7QsdGJ0LXQtNC+0YHRgtGD0L/QvdGL0Lkg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICfQntCx0YnQtdC00L7RgdGC0YPQv9C90YvQuSDQutCw0LvQtdC90LTQsNGA0YwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAn0J7QsdC30L7RgCDRgNC10YHRg9GA0YHQvtCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ9Ce0LHQt9C+0YAg0YDQtdGB0YPRgNGB0L7QsiAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAn0J7RgtC+0LHRgNCw0LbQsNC10YIg0YHRgdGL0LvQutGDL9C/0YPQvdC60YIg0LzQtdC90Y4g0LTQu9GPINGB0L7Qt9C00LDQvdC40Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQutCw0LvQtdC90LTQsNGA0Y8sINGB0LLRj9C30LDQvdC90L7Qs9C+INGBINC30LDRj9Cy0LrQvtC5INC90LXQv9C+0YHRgNC10LTRgdGC0LLQtdC90L3QviDQuNC3INC/0L7QtNGA0L7QsdC90L7Qs9C+INC/0YDQvtGB0LzQvtGC0YDQsCDQt9Cw0Y/QstC60LgvVGlja2V0Wm9vbSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+LCDQvNC+0LbQvdC+INC+0LPRgNCw0L3QuNGH0LjRgtGMINC00L7RgdGC0YPQvyDQuiDRjdGC0L7QvNGDINC/0YPQvdC60YLRgyDQvNC10L3Rjiwg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCDQutC70Y7Rh9CwICJHcm91cCIsINCz0LTQtSDQsiDRgdC+0LTQtdGA0LbQsNC90LjQuCDRg9C60LDQt9GL0LLQsNC10YLRgdGPINC/0LXRgNC10YfQtdC90Ywg0LPRgNGD0L/Qvywg0LrQvtGC0L7RgNGL0Lwg0Y3RgtCwINC60L3QvtC/0LrQsCDQsdGD0LTQtdGCINC00L7RgdGC0YPQv9C90LAgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4g0JTQu9GPINC+0YDQs9Cw0L3QuNC30LDRhtC40Lgg0L/Rg9C90LrRgtC+0LIg0LzQtdC90Y4g0LIg0LPRgNGD0L/Qv9GLL9C60LvQsNGB0YLQtdGA0Ysg0LjRgdC/0L7Qu9GM0LfRg9C50YLQtSDQsiDQutCw0YfQtdGB0YLQstC1INC60LvRjtGH0LAgIkNsdXN0ZXJOYW1lIiDQuCDQsiDRgdC+0LTQtdGA0LbQsNC90LjQuCDRg9C60LDQttC40YLQtSDRgtC+INC40LzRjywg0LrQvtGC0L7RgNC+0LUg0LbQtdC70LDQtdGC0LUg0YPQstC40LTQtdGC0Ywg0LIg0YHRgtGA0L7QutC1INC80LXQvdGOLiDQmNGB0L/QvtC70YzQt9GD0LnRgtC1ICJDbHVzdGVyUHJpb3JpdHkiINC00LvRjyDQvdCw0YHRgtGA0L7QudC60Lgg0L/QvtGA0Y/QtNC60LAg0L7RgtC+0LHRgNCw0LbQtdC90LjRjyDQs9GA0YPQv9C/L9C60LvQsNGB0YLQtdGA0L7QsiDQsiDQvNC10L3Rji4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ9CS0YDQtdC80Y8g0YDQtdGI0LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICfQktGL0LHQvtGAINGB0L/QvtGB0L7QsdCwINC+0YLQv9GA0LDQstC60Lgg0LTQu9GPINGD0LLQtdC00L7QvNC70LXQvdC40Lkg0L/QviDQvNC10YDQvtC/0YDQuNGP0YLQuNGP0LwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ9Cf0LXRgNC10LrQu9GO0YfQsNC10YIg0LTQvtCx0LDQstC40YLRjCDQuNC70Lgg0LjQt9C80LXQvdC40YLRjCDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQvtC1INGB0L7Qt9C00LDQvdC40LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQutCw0LvQtdC90LTQsNGA0Y8sINC+0YHQvdC+0LLQsNC90L3QvtC1INC90LAg0L7Qv9GA0LXQtNC10LvQtdC90L3Ri9GFINCy0YDQtdC80LXQvdCd0YvRhSDQv9Cw0YDQsNC80LXRgtGA0LDRhSDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICfQktGA0LXQvNGPINC40LfQvNC10L3QtdC90LjRjyDQt9Cw0Y/QstC60LgnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnNyX0N5cmxfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ9Ce0LHQsNCy0LXRiNGC0LXRmtC1INC/0L7QtNGB0LXRgtC90LjQutCwINC+INGC0LXRgNC80LjQvdGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQlNC+0LHQuNGb0LXRgtC1INC+0LHQsNCy0LXRiNGC0LXRmtC1INGB0LLQsNC60Lgg0L/Rg9GCINC60LDQtGEg0LTQvtGS0LUg0LTQviDQstGA0LXQvNC10L3QsCDQv9C+0LTRgdC10YLQvdC40LrQsCDQt9CwINC90LXQutC4INC+0LQg0LLQsNGI0LjRhSDRgtC10YDQvNC40L3QsC4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICfQo9C/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+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+eydObyBDYWxlbmRhcklEISd9ID0gJ9Cd0LXQvNCwIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ9Cd0LXQvNCw0YLQtSDQv9GA0LjRgdGC0YPQvyDQvtCy0L7QvCDQutCw0LvQtdC90LTQsNGA0YMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfQmNC30LzQtdC90Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn0JPRgNC10YjQutCwINC/0YDQuNC70LjQutC+0Lwg0LjQt9C80LXQvdC1INC60LDQu9C10L3QtNCw0YDQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAn0KPRh9C40YLQsNCy0LDRmtC1INC60L7QvdGE0LjQs9GD0YDQsNGG0LjRmNC1INC60LDQu9C10L3QtNCw0YDQsCDQvdC40ZjQtSDQsdC40LvQviDQvNC+0LPRg9Gb0LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ9Cc0L7Qu9C40LzQviDQstCw0YEg0LTQsCDQv9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INGY0LUg0LLQsNGIINGE0LDRmNC7INC40YHQv9GA0LDQstCw0L0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ9Cd0LjRmNC1INC80L7Qs9GD0Zsg0YPQstC+0Lcg0LrQsNC70LXQvdC00LDRgNCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICfQmtCw0LvQtdC90LTQsNGAINGY0LUg0YPQstC10LfQtdC9ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAn0J/QvtGC0YDQtdCx0LDQvSDQmNCUINC60LDQu9C10L3QtNCw0YDQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICfQndC1INC80L7Qs9GDINC/0YDQuNCx0LDQstC40YLQuCDQv9C+0LTQsNGC0LrQtSDQt9CwINC00LDRgtC4IENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ9Cj0YHQv9C10YjQvdC+INGD0LLQtdC30LXQvdC+ICVzINGC0LXRgNC80LjQvSjQsCkg0YMg0LrQsNC70LXQvdC00LDRgCAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1INC80LjQvdGD0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSDQvNC40L3Rg9GC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAg0LzQuNC90YPRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSDRgdCw0YInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAn0KHQstC4INGC0LXRgNC80LjQvdC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ9Ci0LXRgNC80LjQvdC4INC00L7QtNC10ZnQtdC90Lgg0LzQtdC90LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ9Cf0YDQuNC60LDQtyDRgdCw0LzQviDRgtC10YDQvNC40L3QsCDQtNC+0LTQtdGZ0LXQvdC40YUg0LLQsNC80LAhINCY0LfQvNC10L3QuNGC0LUg0L/QvtC00LXRiNCw0LLQsNGa0LAnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAn0KLQtdGA0LzQuNC9INC90LjRmNC1INC/0YDQvtC90LDRktC10L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAn0J3QuNC60LDQtNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ9Ch0LLQsNC60Lgg0LTQsNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfQodCy0LDQutC1INGB0LXQtNC80LjRhtC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAn0KHQstCw0LrQvtCzINC80LXRgdC10YbQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAn0KHQstCw0LrQtSDQs9C+0LTQuNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAn0J/RgNC40LvQsNCz0L7RktC10L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ9CU0L3QtdCy0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICfQodC10LTQvNC40YfQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICfQnNC10YHQtdGH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfQk9C+0LTQuNGI0ZrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ9GB0LLQsNC60L7QsyjQtSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICfRg9C60YPQv9C90L4gJXMg0L/Rg9GCKNCwKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICfQtNC+IC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICfRg9C60YPQv9C90L4gLi4uINC/0YPRgijQsCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICfQtNC+ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ9CR0LXQtyDQvtCx0LDQstC10YjRgtC10ZrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMg0LzQuNC90YPRgijQsCkg0L/RgNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMg0YHQsNGCKNCwKSDQv9GA0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzINC00LDQvSjQsCkg0L/RgNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMg0L3QtdC00LXRmdCwINC/0YDQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ9C/0YDQtSDQvdC10LPQviDRiNGC0L4g0YLQtdGA0LzQuNC9INC30LDQv9C+0YfQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAn0L/QvtGI0YLQviDRgtC10YDQvNC40L0g0LfQsNC/0L7Rh9C90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAn0L/RgNC1INC90LXQs9C+INGI0YLQviDRgdC1INGC0LXRgNC80LjQvSDQt9Cw0LLRgNGI0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn0L/QvtGI0YLQviDRgdC1INGC0LXRgNC80LjQvSDQt9Cw0LLRgNGI0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICfQkdC10Lcg0LTQvtC30LLQvtC70LUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ9Cd0LjRmNC1INC80L7Qs9GD0ZvQtSDQvtCx0YDQuNGB0LDRgtC4INGC0LXRgNC80LjQvSDRgtC40LrQtdGC0LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ9CR0LXQtyDQtNC+0LfQstC+0LvQtSEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAn0JHQtdC3INC00L7Qt9Cy0L7Qu9C1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ9Ch0LjRgdGC0LXQvCDQvdC40ZjQtSDRg9GB0L/QtdC+INC00LAg0YPQstC10LfQtSDRhNCw0ZjQuyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAn0JzQvtC70LjQvNC+INC/0YDQvtCy0LXRgNC40YLQtSDQu9C+0LMg0LfQsCDQstC40YjQtSDQuNC90YTQvtGA0LzQsNGG0LjRmNCwLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkINCy0LjRiNC1JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAn0JHQtdC3ICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAn0J3QtdC/0L7Qt9C90LDRgiDQutC+0YDQuNGB0L3QuNC6ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ9Cd0LXQuNGB0L/RgNCw0LLQsNC9INC60LDQu9C10L3QtNCw0YAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ9Cd0LXQuNGB0L/RgNCw0LLQvdCwINCw0LTRgNC10YHQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn0JPRgNC10YjQutCwINC/0YDQuNC70LjQutC+0Lwg0LXQutGB0L/QvtGA0YLQvtCy0LDRmtCwINC60LDQu9C10L3QtNCw0YDQsCEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICfQntGB0LLQtdC20LggKNC80LjQvdGD0YLQsCknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ9Ch0YLRgNCw0L3QuNGG0LAg0LfQsCDQv9GA0LXQs9C70LXQtCDQutCw0LvQtdC90LTQsNGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICfQntCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3Rgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn0JzQvtC00YPQuyDQtNC+0LPQsNGS0LDRmNCwINC60LDQu9C10L3QtNCw0YDQsCDQt9CwINC/0YDQuNC/0YDQtdC80YMg0L7QsdCw0LLQtdGI0YLQtdGa0LAg0L4g0YLQtdGA0LzQuNC90LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAn0JzQvtC00YPQuyDQtNC+0LPQsNGS0LDRmNCwINC60LDQu9C10L3QtNCw0YDQsCDQt9CwINC+0YHQstC10LbQsNCy0LDRmtC1INGC0LjQutC10YLQsCDQv9C+0LTQsNGG0LjQvNCwINC40Lcg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ9Ch0YLRgNCw0L3QuNGG0LAg0LfQsCDQuNC30LzQtdC90YMg0LrQsNC70LXQvdC00LDRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAn0JvQuNGB0YLQsCDRgtC10YDQvNC40L3QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ9Cb0LjRgdGC0LAg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICfQntCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3Rgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICfQotC10YDQvNC40L3QuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ9Ch0YLRgNCw0L3QuNGG0LAg0LfQsCDRg9C/0YDQsNCy0ZnQsNGa0LUg0LrQsNC70LXQvdC00LDRgNC40LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAn0JjQt9Cw0LHQtdGA0Lgg0LfQsCDQutCw0LrQstC1INC/0YDQvtC80LXQvdC1INGC0LXRgNC80LjQvdCwINC20LXQu9C40Ygg0LTQsCDQv9GA0LjQvNC40Ygg0L7QsdCw0LLQtdGI0YLQtdGa0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICfQmtGA0LXQuNGA0LAg0L3QvtCy0Lgg0YLQtdGA0LzQuNC9INGDINC60LDQu9C10L3QtNCw0YDRgyDQv9C+0LLQtdC30LDQvSDRgdCwINC+0LLQuNC8INGC0LjQutC10YLQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0JrRgNC10LjRgNCw0ZrQtSDQuCDRg9C/0YDQsNCy0ZnQsNGa0LUg0L7QsdCw0LLQtdGI0YLQtdGa0LjQvNCwINC30LAg0YLQtdGA0LzQuNC90LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAn0JrRgNC10LjRgNCwINC90L7QstC4INGC0LXRgNC80LjQvS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC60L7RmNC1INC60L7Qu9C+0L3QtSDRm9C1INCx0LjRgtC4INC/0YDQuNC60LDQt9Cw0L3QtSDRgyDQsNC/0LvQuNC60LDRgtC40LLQvdC+0Lwg0LTQvtC00LDRgtC60YMg0LvQuNC90LrQvtCy0LDQvdC40YUg0YLQtdGA0LzQuNC90LAgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4g0JzQvtCz0YPRm9CwINC/0L7QtNC10YjQsNCy0LDRmtCwOiAwID0g0J7QvdC10LzQvtCz0YPRm9C10L3QviwgMSA9INCe0LzQvtCz0YPRm9C10L3QviwgMiA9INCf0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC+INC+0LzQvtCz0YPRm9C10L3Qvi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQuNC60L7QvdGDINGB0LAg0LvQuNC90LrQvtC8INC90LAgR29vZ2xlINC80LDQv9GDINGC0YDQtdC90YPRgtC90LUg0LvQvtC60LDRhtC40ZjQtSDRgyDQtdC60YDQsNC90YMg0LfQsCDQuNC30LzQtdC90YMg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDRgtC40L/QvtCy0LUg0L7QsdGY0LXQutGC0LAg0LTQvtCz0LDRktCw0ZjQsCDQutC+0ZjQuCDRm9C1INCx0LjRgtC4INC/0YDQvtGG0LXRgdC40YDQsNC90Lgg0L/Rg9GC0LXQvCBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQu9C40YHRgtGDINC/0LDRgNCw0LzQtdGC0LDRgNCwINC60L7RmNC4INC80L7Qs9GDINCx0LjRgtC4INC/0YDQvtGB0LvQtdGS0LXQvdC4INGE0YPQvdC60YbQuNGY0Lgg0L/RgNC10YLRgNCw0LPQtSDRgtC40LrQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0L/QvtC30LDQtNC40L3RgdC60Lgg0LzQvtC00YPQuyDRgtC10YDQvNC40L3QsCDRgtC40LrQtdGC0LAg0LfQsCDQtNC40L3QsNC80LjRh9C60L4g0L/QvtGZ0LUg0LTQsNGC0YPQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQv9C+0LfQsNC00LjQvdGB0LrQuCDQvNC+0LTRg9C7INGC0LXRgNC80LjQvdCwINGC0LjQutC10YLQsCDQt9CwINCy0YDQtdC80LUg0LXRgdC60LDQu9Cw0YbQuNGY0LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC/0L7Qt9Cw0LTQuNC90YHQutC4INC80L7QtNGD0Lsg0YLQtdGA0LzQuNC90LAg0YLQuNC60LXRgtCwINC30LAg0LLRgNC10LzQtSDRh9C10LrQsNGa0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICfQlNC10YTQuNC90LjRiNC1INGC0LjQutC10YIg0LzQvtC00YPQuyDQt9CwINC60LDQu9C10L3QtNCw0YDRgdC60LUg0YLQtdGA0LzQuNC90LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn0JjQt9C80LXQvdCwINGC0LXRgNC80LjQvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICfQktGA0LXQvNC1INC/0YDQstC+0LMg0L7QtNCz0L7QstC+0YDQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICfQldC60YDQsNC9INC30LAg0YPQstC+0Lcg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ9Cf0L7QstC10LfRg9GY0LUg0YLQtdGA0LzQuNC90LUg0Lgg0YLQuNC60LXRgtC1ICLQndC+0YDQvNCw0LvQvdC40LwiINCy0YDRgdGC0LDQvNCwINCy0LXQt9CwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn0JvQuNGB0YLQsCDRgdCy0LjRhSDQvtCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3QuNC80LAg0LfQsCDQv9GA0LjQutCw0Lcg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICfQm9C40YHRgtCwINGB0LLQuNGFINC00L7Qs9Cw0ZLQsNGY0LAg0L3QsCDQutCw0LvQtdC90LTQsNGA0LjQvNCwINC60L7RmNCwINGb0LUg0LHQuNGC0Lgg0L/RgNC40LrQsNC30LDQvdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ9Cb0LjRgdGC0LAg0LHQvtGY0LAg0YMg0YXQtdC60YHQsNC00LXRhtC40LzQsNC70L3QvtC8IFJHQiDQt9Cw0L/QuNGB0YMg0LrQvtGY0LUg0ZvQtSDQsdC40YLQuCDQtNC+0YHRgtGD0L/QvdC1INC30LAg0LjQt9Cx0L7RgCDQv9GA0LjQu9C40LrQvtC8INC/0YDQsNCy0ZnQtdGa0LAg0LrQsNC70LXQvdC00LDRgNCwLiDQntCx0YDQsNGC0LjRgtC1INC/0LDQttGa0YMg0LTQsCDRgdGDINCx0L7RmNC1INC00L7QstC+0ZnQvdC+INGC0LDQvNC90LUg0YLQsNC60L4g0LTQsCDQsdC10LvQuCDRgtC10LrRgdGCINC80L7QttC1INCx0LjRgtC4INC40YHQv9C40YHQsNC9INC90LAg0ZrQuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ9Cj0L/RgNCw0LLRmdCw0ZrQtSDRgNCw0LfQu9C40YfQuNGC0LjQvCDQutCw0LvQtdC90LTQsNGA0LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ9Cc0LDQutGB0LjQvNCw0LvQvdC4INCx0YDQvtGYINCw0LrRgtC40LLQvdC40YUg0LrQsNC70LXQvdC00LDRgNCwINGDINC10LrRgNCw0L3QuNC80LAg0LfQsCDQv9GA0LXQs9C70LXQtC4g0J7QsdGA0LDRgtC40YLQtSDQv9Cw0LbRmtGDINC00LAg0LLQtdC70LjQutC4INCx0YDQvtGYINCw0LrRgtC40LLQvdC40YUg0LrQsNC70LXQvdC00LDRgNCwINC80L7QttC1INC40LzQsNGC0Lgg0YPRgtC40YbQsNGYINC90LAg0L/QtdGA0YTQvtGA0LzQsNC90YHQtSDQstCw0YjQtdCzINGB0LXRgNCy0LXRgNCwINC/0YDQsNCy0ZnQtdGa0LXQvCDQv9GA0LXQstC40YjQtSDRgdC40LzRg9C70YLQsNC90LjRhSDQt9Cw0YXRgtC10LLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyDQvdC1INC/0L7QtNGA0LbQsNCy0LAg0YLQtdGA0LzQuNC90LUg0LrQvtGY0Lgg0YHQtSDQv9C+0L3QsNCy0ZnQsNGY0YMg0LHQtdC3INC60YDQsNGY0ZrQtdCzINC00LDRgtGD0LzQsCDQuNC70Lgg0LHRgNC+0ZjQsCDQuNGC0LXRgNCw0YbQuNGY0LAuINCf0YDQuNC70LjQutC+0Lwg0YPQstC+0LfQsCDQutCw0LvQtdC90LTQsNGA0LAsINC80L7QttC1INGB0LUg0LTQvtCz0L7QtNC40YLQuCDQtNCwIElDUyDRhNCw0ZjQuyDRgdCw0LTRgNC20Lgg0YLQsNC60LLQtSBcJ9Cx0LXRgdC60L7QvdCw0YfQvdC1XCcg0YLQtdGA0LzQuNC90LUuINCj0LzQtdGB0YLQviDRgtCw0LrQstC+0LMg0L/QvtC90LDRiNCw0ZrQsCwg0YHQuNGB0YLQtdC8INGb0LUg0LrRgNC10LjRgNCw0YLQuCDRgdCy0LUg0YLQtdGA0LzQuNC90LUg0LjQtyDQv9GA0L7RiNC70L7RgdGC0LgsINC60LDQviDQuCDRgtC10YDQvNC40L3QtSDQt9CwINGB0LvQtdC00LXRm9C4IG4g0LHRgNC+0Zgg0LzQtdGB0LXRhtC4ICjQv9C+0LTRgNCw0LfRg9C80LXQstCw0L3QviAxMjAg0LzQtdGB0LXRhtC4LzEwINCz0L7QtNC40L3QsCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAn0J/RgNC10LPQu9C10LQg0YHQstC40YUg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ9CS0YDQtdC80LUg0YfQtdC60LDRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfQnNC+0LTRg9C7INC/0YDQtdGC0YDQsNCz0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICfQnNC+0LTRg9C7INC/0YDQtdGC0YDQsNCz0LUg0LfQsCDQsNGD0YLQvtC80LDRgtGB0LrQviDQtNC+0L/Rg9Ga0LDQstCw0ZrQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAn0IjQsNCy0L3QuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICfQiNCw0LLQvdC4INC60LDQu9C10L3QtNCw0YAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAn0J/RgNC10LPQu9C10LQg0YDQtdGB0YPRgNGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAn0J/RgNC10LPQu9C10LQg0YDQtdGB0YPRgNGB0LAgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQstC10LfRgyDRgyDQvNC10L3QuNGY0YMg0YLQuNC60LXRgtCwINC30LAg0LrRgNC10LjRgNCw0ZrQtSDRgtC10YDQvNC40L3QsCDRgyDQutCw0LvQtdC90LTQsNGA0YMg0L/QvtCy0LXQt9Cw0L3QvtCzINGB0LAg0YLQuNC8INGC0LjQutC10YLQvtC8LiDQlNC+0LTQsNGC0L3QsCDQutC+0L3RgtGA0L7Qu9CwINC/0YDQuNC60LDQt9CwINC+0LLQtSDQstC10LfQtSDQvNC+0LbQtSDRgdC1INC/0L7RgdGC0LjRm9C4INC60L7RgNC40YjRm9C10ZrQtdC8INC60ZnRg9GH0LAgIkdyb3VwIiDRgdCwINGB0LDQtNGA0LbQsNGY0LXQvCAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiDQl9CwINC30LTRgNGD0LbQuNCy0LDRmtC1INCy0LXQt9CwINGDINC80LXQvdC40ZjRgyDQv9C+0LTQtdGB0LjRgtC1INC60ZnRg9GHICJDbHVzdGVyTmFtZSIg0YHQsCDRgdCw0LTRgNC20LDRmNC10Lwg0LrQvtGY0Lgg0ZvQtSDQsdC40YLQuCDQvdCw0LfQuNCyINC60L7RmNC4INC20LXQu9C40YLQtSDQtNCwINCy0LjQtNC40YLQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgy4g0JrQvtGA0LjRgdGC0LjRgtC1INC60ZnRg9GHICJDbHVzdGVyUHJpb3JpdHkiINC30LAg0LjQt9C80LXQvdGDINGA0LXQtNC+0YHQu9C10LTQsCDQs9GA0YPQv9CwINGDINC80LXQvdC40ZjRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ9CS0YDQtdC80LUg0YDQtdGI0LDQstCw0ZrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ9CY0LfQsdC+0YAg0YLRgNCw0L3RgdC/0L7RgNGC0LAg0LfQsCDQvtCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3Rgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAn0JDQutGC0LjQstC40YDQsCDQtNC+0LTQsNCy0LDRmtC1INC40LvQuCDQvtGB0LLQtdC20LDQstCw0ZrQtSDQsNGD0YLQvtC80LDRgtGB0LrQuNGFINGC0LXRgNC80LjQvdCwINC90LAg0L7RgdC90L7QstGDINCy0YDQtdC80LXQvdCwINGC0LjQutC10YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICfQktGA0LXQvNC1INCw0LbRg9GA0LjRgNCw0ZrQsCc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnNyX0xhdG5fT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ09iYXZlxaF0ZW5qZSBwb2RzZXRuaWthIG8gdGVybWludSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnRG9iacSHZXRlIG9iYXZlxaF0ZW5qZSBzdmFraSBwdXQga2FkYSBkb8SRZSBkbyB2cmVtZW5hIHBvZHNldG5pa2EgemEgbmVraSBvZCB2YcWhaWggdGVybWluYS4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdVcHJhdmxqYW5qZSBvYmF2ZcWhdGVuamltYSBvIHRlcm1pbmltYSc7CiAgICAkU2VsZi0+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+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+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ1N2aSBvcGVyYXRlcmkgc2EgZG96dm9sb20gcGlzYW5qYSB1IHRlcm1pbnUgKGthbGVuZGFydSknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ1Npc3RlbSBuaWplIHVzcGVvIGRhIGtyZWlyYSBrYWxlbmRhciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdOZW1hIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05lbWF0ZSBwcmlzdHVwIG92b20ga2FsZW5kYXJ1ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAnSXptZW5pIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdHcmXFoWthIHByaWxpa29tIGl6bWVuZSBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ1XEjWl0YXZhbmplIGtvbmZpZ3VyYWNpamUga2FsZW5kYXJhIG5pamUgYmlsbyBtb2d1xIdlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdNb2xpbW8gdmFzIGRhIHByb3Zlcml0ZSBkYSBsaSBqZSB2YcWhIGZhamwgaXNwcmF2YW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05pamUgbW9ndcSHIHV2b3oga2FsZW5kYXJhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdLYWxlbmRhciBqZSB1dmV6ZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdQb3RyZWJhbiBJRCBrYWxlbmRhcmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnTmUgbW9ndSBwcmliYXZpdGkgcG9kYXRrZSB6YSBkYXRpIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1VzcGXFoW5vIHV2ZXplbm8gJXMgdGVybWluKGEpIHUga2FsZW5kYXIgJXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSBtaW51dGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgbWludXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgc2F0JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1N2aSB0ZXJtaW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ1Rlcm1pbmkgZG9kZWxqZW5pIG1lbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ1ByaWtheiBzYW1vIHRlcm1pbmEgZG9kZWxqZW5paCB2YW1hISBJem1lbml0ZSBwb2RlxaFhdmFuamEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnVGVybWluIG5pamUgcHJvbmHEkWVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ05pa2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdTdmFraSBkYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ1N2YWtlIHNlZG1pY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdTdmFrb2cgbWVzZWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdTdmFrZSBnb2RpbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnUHJpbGFnb8SRZW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRG5ldm5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlZG1pxI1ubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTWVzZcSNbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnR29kacWhbmplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnc3Zha29nKGUpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAndWt1cG5vICVzIHB1dChhKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdkbyAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAndWt1cG5vIC4uLiBwdXQoYSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdkbyAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICdCZXogb2JhdmXFoXRlbmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dChhKSBwcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBzYXQoYSkgcHJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkYW4oYSkgcHJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgbmVkZWxqYSBwcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdwcmUgbmVnbyDFoXRvIHRlcm1pbiB6YXBvxI1uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ3BvxaF0byB0ZXJtaW4gemFwb8SNbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAncHJlIG5lZ28gxaF0byBzZSB0ZXJtaW4gemF2csWhaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICdwb8WhdG8gc2UgdGVybWluIHphdnLFoWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdCZXogZG96dm9sZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTmlqZSBtb2d1xIdlIG9icmlzYXRpIHRlcm1pbiB0aWtldGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ0JleiBkb3p2b2xlISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICdCZXogZG96dm9sZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICdTaXN0ZW0gbmlqZSB1c3BlbyBkYSB1dmV6ZSBmYWpsISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdNb2xpbW8gcHJvdmVyaXRlIGxvZyB6YSB2acWhZSBpbmZvcm1hY2lqYS4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCB2acWhZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ0JleiAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ05lcG96bmF0IGtvcmlzbmlrISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ05laXNwcmF2YW4ga2FsZW5kYXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ05laXNwcmF2bmEgYWRyZXNhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdHcmXFoWthIHByaWxpa29tIGVrc3BvcnRvdmFuamEga2FsZW5kYXJhISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ09zdmXFvmkgKG1pbnV0YSknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1N0cmFuaWNhIHphIHByZWdsZWQga2FsZW5kYXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnT2JhdmXFoXRlbmphIG8gdGVybWludSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnTW9kdWwgZG9nYcSRYWphIGthbGVuZGFyYSB6YSBwcmlwcmVtdSBvYmF2ZcWhdGVuamEgbyB0ZXJtaW5pbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdNb2R1bCBkb2dhxJFhamEga2FsZW5kYXJhIHphIG9zdmXFvmF2YW5qZSB0aWtldGEgcG9kYWNpbWEgaXogdGVybWluYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnU3RyYW5pY2EgemEgaXptZW51IGthbGVuZGFyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0xpc3RhIHRlcm1pbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnT2JhdmXFoXRlbmphIG8gdGVybWludSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdUZXJtaW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnU3RyYW5pY2EgemEgdXByYXZsamFuamUga2FsZW5kYXJpbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0l6YWJlcmkgemEga2FrdmUgcHJvbWVuZSB0ZXJtaW5hIMW+ZWxpxaEgZGEgcHJpbWnFoSBvYmF2ZcWhdGVuamEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdLcmVpcmEgbm92aSB0ZXJtaW4gdSBrYWxlbmRhcnUgcG92ZXphbiBzYSBvdmltIHRpa2V0b20nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdLcmVpcmFuamUgaSB1cHJhdmxqYW5qZSBvYmF2ZcWhdGVuamltYSB6YSB0ZXJtaW5lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0tyZWlyYSBub3ZpIHRlcm1pbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdEZWZpbmnFoWUga29qZSBrb2xvbmUgxIdlIGJpdGkgcHJpa2F6YW5lIHUgYXBsaWthdGl2bm9tIGRvZGF0a3UgbGlua292YW5paCB0ZXJtaW5hIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIE1vZ3XEh2EgcG9kZcWhYXZhbmphOiAwID0gT25lbW9ndcSHZW5vLCAxID0gT21vZ3XEh2VubywgMiA9IFBvZHJhenVtZXZhbm8gb21vZ3XEh2Vuby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnRGVmaW5pxaFlIGlrb251IHNhIGxpbmtvbSBuYSBHb29nbGUgbWFwdSB0cmVudXRuZSBsb2thY2lqZSB1IGVrcmFudSB6YSBpem1lbnUgdGVybWluYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICdEZWZpbmnFoWUgdGlwb3ZlIG9iamVrdGEgZG9nYcSRYWphIGtvamkgxIdlIGJpdGkgcHJvY2VzaXJhbmkgcHV0ZW0gQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBsaXN0dSBwYXJhbWV0YXJhIGtvamkgbW9ndSBiaXRpIHByb3NsZcSRZW5pIGZ1bmtjaWppIHByZXRyYWdlIHRpa2V0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnRGVmaW5pxaFlIHBvemFkaW5za2kgbW9kdWwgdGVybWluYSB0aWtldGEgemEgZGluYW1pxI1rbyBwb2xqZSBkYXR1bWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmnFoWUgcG96YWRpbnNraSBtb2R1bCB0ZXJtaW5hIHRpa2V0YSB6YSB2cmVtZSBlc2thbGFjaWplLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnRGVmaW5pxaFlIHBvemFkaW5za2kgbW9kdWwgdGVybWluYSB0aWtldGEgemEgdnJlbWUgxI1la2FuamEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdEZWZpbmnFoWUgdGlrZXQgbW9kdWwgemEga2FsZW5kYXJza2UgdGVybWluZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdJem1lbmEgdGVybWluYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnVnJlbWUgcHJ2b2cgb2Rnb3ZvcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnRWtyYW4gemEgdXZveiB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdQb3ZlenVqZSB0ZXJtaW5lIGkgdGlrZXRlICJOb3JtYWxuaW0iIHZyc3RhbWEgdmV6YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIHN2aWggb2JhdmXFoXRlbmphIG8gdGVybWluaW1hIHphIHByaWtheiB1IGludGVyZmVqc3UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBzdmloIGRvZ2HEkWFqYSBuYSBrYWxlbmRhcmltYSBrb2phIMSHZSBiaXRpIHByaWthemFuYSB1IGludGVyZmVqc3UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnTGlzdGEgYm9qYSB1IGhla3NhZGVjaW1hbG5vbSBSR0IgemFwaXN1IGtvamUgxIdlIGJpdGkgZG9zdHVwbmUgemEgaXpib3IgcHJpbGlrb20gcHJhdmxqZW5qYSBrYWxlbmRhcmEuIE9icmF0aXRlIHBhxb5uanUgZGEgc3UgYm9qZSBkb3ZvbGpubyB0YW1uZSB0YWtvIGRhIGJlbGkgdGVrc3QgbW/FvmUgYml0aSBpc3Bpc2FuIG5hIG5qaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdVcHJhdmxqYW5qZSByYXpsacSNaXRpbSBrYWxlbmRhcmltYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdNYWtzaW1hbG5pIGJyb2ogYWt0aXZuaWgga2FsZW5kYXJhIHUgZWtyYW5pbWEgemEgcHJlZ2xlZC4gT2JyYXRpdGUgcGHFvm5qdSBkYSB2ZWxpa2kgYnJvaiBha3Rpdm5paCBrYWxlbmRhcmEgbW/FvmUgaW1hdGkgdXRpY2FqIG5hIHBlcmZvcm1hbnNlIHZhxaFlZyBzZXJ2ZXJhIHByYXZsamVuamVtIHByZXZpxaFlIHNpbXVsdGFuaWggemFodGV2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyBuZSBwb2Ryxb5hdmEgdGVybWluZSBrb2ppIHNlIHBvbmF2bGphanUgYmV6IGtyYWpuamVnIGRhdHVtYSBpbGkgYnJvamEgaXRlcmFjaWphLiBQcmlsaWtvbSB1dm96YSBrYWxlbmRhcmEsIG1vxb5lIHNlIGRvZ29kaXRpIGRhIElDUyBmYWpsIHNhZHLFvmkgdGFrdmUgXCdiZXNrb25hxI1uZVwnIHRlcm1pbmUuIFVtZXN0byB0YWt2b2cgcG9uYcWhYW5qYSwgc2lzdGVtIMSHZSBrcmVpcmF0aSBzdmUgdGVybWluZSBpeiBwcm/FoWxvc3RpLCBrYW8gaSB0ZXJtaW5lIHphIHNsZWRlxIdpIG4gYnJvaiBtZXNlY2kgKHBvZHJhenVtZXZhbm8gMTIwIG1lc2VjaS8xMCBnb2RpbmEpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ1ByZWdsZWQgc3ZpaCB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdWcmVtZSDEjWVrYW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnTW9kdWwgcHJldHJhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdNb2R1bCBwcmV0cmFnZSB6YSBhdXRvbWF0c2tvIGRvcHVuamF2YW5qZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnSmF2bmkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ0phdm5pIGthbGVuZGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1ByZWdsZWQgcmVzdXJzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdQcmVnbGVkIHJlc3Vyc2EgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ1ByaWthenVqZSB2ZXp1IHUgbWVuaWp1IHRpa2V0YSB6YSBrcmVpcmFuamUgdGVybWluYSB1IGthbGVuZGFydSBwb3ZlemFub2cgc2EgdGltIHRpa2V0b20uIERvZGF0bmEga29udHJvbGEgcHJpa2F6YSBvdmUgdmV6ZSBtb8W+ZSBzZSBwb3N0acSHaSBrb3JpxaHEh2VuamVtIGtsanXEjWEgIkdyb3VwIiBzYSBzYWRyxb5hamVtICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFphIHpkcnXFvml2YW5qZSB2ZXphIHUgbWVuaWp1IHBvZGVzaXRlIGtsanXEjSAiQ2x1c3Rlck5hbWUiIHNhIHNhZHLFvmFqZW0ga29qaSDEh2UgYml0aSBuYXppdiBrb2ppIMW+ZWxpdGUgZGEgdmlkaXRlIHUgaW50ZXJmZWpzdS4gS29yaXN0aXRlIGtsanXEjSAiQ2x1c3RlclByaW9yaXR5IiB6YSBpem1lbnUgcmVkb3NsZWRhIGdydXBhIHUgbWVuaWp1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnVnJlbWUgcmXFoWF2YW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0l6Ym9yIHRyYW5zcG9ydGEgemEgb2JhdmXFoXRlbmphIG8gdGVybWludS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnQWt0aXZpcmEgZG9kYXZhbmplIGlsaSBvc3Zlxb5hdmFuamUgYXV0b21hdHNraWggdGVybWluYSBuYSBvc25vdnUgdnJlbWVuYSB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnVnJlbWUgYcW+dXJpcmFuamEnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnN2X09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICdLYWxlbmRlcmjDpG5kZWxzZXDDpW1pbm5lbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdEdSBmw6VyIGVuIG5vdGlmaWVyaW5nIGbDtnIgdmFyamUgcMOlbWlubmVsc2V0aWQgZsO2ciBkaW5hIGthbGVuZGVyaMOkbmRlbHNlci4gJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnS2FsZW5kZXJow6RuZGVsc2Vww6VtaW5uZWxzZWhhbnRlcmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ0R1IGthbiBsw6RzYSBpbiBlbiBrb25maWd1cmF0aW9uc2ZpbCBtZWQga2FsZW5kZXJow6RuZGVsc2Vww6VtaW5uZWxzZXIuIEZpbGVuIGJlaMO2dmVyIHZhcmEgcMOlIGRldCAgLnltbC1mb3JtYXQgc29tIGR1IGbDpXIgdmlkIGV4cG9ydCBmcsOlbiBrYWxlbmRlcmjDpG5kZWxzZXDDpW1pbm5lbHNlLXZ5bi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICdCZXN0w6RtIHZpbGthIGjDpG5kZWxzZXIgc29tIGFrdGl2ZXJhciBkZW5uYSBww6VtaW5uZWxzZW5vdGlmaWVyaW5nLiBZdHRlcmxpZ2FyZSBmaWx0ZXIga2FuIGFwcGxpY2VyYXMgZsO2ciBhdHQgZW5kYXN0IHNraWNrYSBww6VtaW5uZWxzZXIgZsO2ciBrYWxlbmRlcmjDpG5kZWxzZXIgc29tIHVwcGZ5bGxlciBmaWx0ZXJrcml0ZXJpZXJuYS4gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0thbGVuZGVyaMOkbmRlbHNmaWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0dydXBwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVzdXJzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnUMOlbWlubmVsc2VyIHNraWNrYXMgdGlsbCBoYW5kbMOkZ2dhcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnRGFnb3JkbmluZ3N2eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAnSGFudGVyYSBrYWxlbmRyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnTMOkZ2cgdGlsbCBow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdGw6RyZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ1NsdXRkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdVcHByZXBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ0hpdHRhciBpbmdlbiBrYWxlbmRlci4gTMOkZ2cgdGlsbCBlbiBrYWxlbmRlciB1bmRlciBIYW50ZXJhIGthbGVuZHJhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdLYWxlbmRlcmjDpG5kZWxzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAnVXBwcmVwYWQga2FsZW5kZXJow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnQWxsYSBmw7ZyZWtvbXN0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICdFbmRhc3QgZGVubmEgaMOkbmRlbHNlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdLYWxlbmRlcmhhbnRlcmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ0thbGVuZGVyw7Z2ZXJzaWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdMw6RnZyB0aWxsIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ0zDpGdnIHRpbGwga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGVyYSBrYWxlbmRlcmjDpG5kZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAnSW1wb3J0ZXJhIGthbGVuZHJhciAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdMw6RzIGluIGthbGVuZGVya29uZmlndXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRlcmEga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdLYWxlbmRlcmZpbHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRlcmEga2FsZW5kZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnSMOkbXRhIGthbGVuZGVybic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdLb3BpZXJhIGthbGVuZGVybnMgcHVibGlrYSBVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ0thbGVuZGVybmFtbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICdSZWdlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ0zDpGdnIHRpbGwgcmVnZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ01lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWluZHJlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0zDpGdnIHRpbGwgbnkga2FsZW5kZXJow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnS2FsZW5kcmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdGw7ZyIG3DpW5nYSBha3RpdmEga2FsZW5kcmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnVmVja2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdNw6VuYWRzdnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ1ZlY2tvdnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnRGFnc3Z5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdIb3BwYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnQXZmw6RyZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ1Zpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0dW0vdGlkJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnS2FsZW5kZXJow6RuZGVsc2VpbXBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICdJbmzDpHN0YSBmaWxlciBtw6VzdGUgdmFyYSBpQ2FsLWZpbGVyICguaWNzKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnVXBwZGF0ZXJhIG51dmFyYW5kZSBrYWxlbmRlcmjDpG5kZWxzZXI/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnQWxsYSBudXZhcmFuZGUga2FsZW5kZXJow6RuZGVsc2VyIG1lZCBzYW1tYSBJRCBza3JpdnMgw7Z2ZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0zDpHMgaW4gZW4ga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGVyYSBrYWxlbmRlcmjDpG5kZWxzZXInOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnkga2FsZW5kZXJow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ1NuYXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZGFnYXInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnUMOlbWlubmVsc2VuYW1uZXQgZmlubnMgcmVkYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQWxsYSBoYW5kbMOkZ2dhcmUgbWVkICjDpXRtaW5zdG9uZSkgbMOkc3LDpHR0aWdoZXRlciBmw7ZyIGthbGVuZGVyaMOkbmRlbHNlbiAoa2FsZW5kZXJuKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FsbGEgaGFuZGzDpGdnYXJlIG1lZCBza3JpdnLDpHR0aWdoZXRlciBmw7ZyIGthbGVuZGVyaMOkbmRlbHNlbiAoa2FsZW5kZXJuKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnS3VuZGUgaW50ZSBza2FwYSBrYWxlbmRlcm4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnS2FsZW5kZXItSUQgc2FrbmFzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdEdSBoYXIgaW5nZW4gw6V0a29tc3QgdGlsbCBrYWxlbmRlcm4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdSZWRpZ2VyYSBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnS3VuZGUgaW50ZSB1cHBkYXRlcmEga2FsZW5kZXJuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnS2FsZW5kZXJrb25maWd1cmF0aW9uc2ZpbGVuIGt1bmRlIGludGUgbMOkc2FzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnS3VuZGUgaW50ZSBpbXBvcnRlcmEga2FsZW5kZXJuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdLYWxlbmRlciBpbXBvcnRlcmFkISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnS2FsZW5kZXItSUQga3LDpHZzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ0luZ2EgZGF0YSBoaXR0YWRlcyBmw7ZyIGthbGVuZGVyLUlEOnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ0x5Y2thZGVzIGltcG9ydGVyYSAlcyBrYWxlbmRlcmjDpG5kZWxzZShyKSB0aWxsIGthbGVuZGVyICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIHRpbW1lJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ0FsbGEga2FsZW5kZXJow6RuZGVsc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ01pbmEga2FsZW5kZXJow6RuZGVsc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnQWxkcmlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ1ZhcmplIGRhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBXZWVrJ30gPSAnVmFyamUgdmVja2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdWYXJqZSBtw6VuYWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ1ZhcmplIMOlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdBbnBhc3NhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RhZ2xpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdWZWNrb3Zpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnTcOlbmFkc3Zpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfDhXJsaWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICd2YXJqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJyVzIGfDpW5nKGVyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICd0aWxscyAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnLi4uIGfDpW5nKGVyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ3RpbGxzICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0luZ2VuIHDDpW1pbm5lbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dChlcikgaW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyB0aW1tZS90aW1tYXIgaW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIGRhZyhhcikgaW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyB2ZWNrYS92ZWNrb3IgaW5uYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdpbm5hbiBow6RuZGVsc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnZWZ0ZXIgaMOkbmRlbHNlbiBiw7ZyamF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2lubmFuIGjDpG5kZWxzZW4gc2x1dGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2VmdGVyIGjDpG5kZWxzZW4gaGFyIHNsdXRhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ1Nha25hciByw6R0dGlnaGV0ZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ0t1bmRlIGludGUgdGEgYm9ydCBrYWxlbmRlcmjDpG5kZWxzZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ1LDpHR0aWdoZXRlciBzYWtuYXMhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ1LDpHR0aWdoZXRlciBzYWtuYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnS3VuZGUgaW50ZSBpbXBvcnRlcmEgZmlsZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIGZsZXInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdJbmdhICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnT2vDpG5kIGFudsOkbmRhcmUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnT2dpbHRpZyBrYWxlbmRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnT2dpbHRpZyBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0thbGVuZGVybiBrdW5kZSBpbnRlIGV4cG9ydGVyYXMhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnRsO2cm55YSAobWludXRlciknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ0thbGVuZGVyaMOkbmRlbHNlw7Z2ZXJzaWt0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnS2FsZW5kZXJow6RuZGVsc2Vww6VtaW5uZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1JlZGlnZXJhIGthbGVuZGVyaMOkbmRlbHNlLXZ5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnS2FsZW5kZXJow6RuZGVsc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnS2FsZW5kZXJow6RuZGVsc2VyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnS2FsZW5kZXJow6RuZGVsc2Vww6VtaW5uZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnS2FsZW5kZXJow6RuZGVsc2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnSGFudGVyYSBrYWxlbmRyYXItdnkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnTMOkZ2cgdGlsbCBrYWxlbmRlcmjDpG5kZWxzZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ1JlZGlnZXJhIGthbGVuZGVyaMOkbmRlbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnSW1wb3J0ZXJhIGthbGVuZGVyaMOkbmRlbHNlLXZ5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdLYWxlbmRlcmjDpG5kZWxzZcO2dmVyc2lrdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnw5ZwcGVuIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICfDlnBwZW4ga2FsZW5kZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnUmVzdXJzw7Z2ZXJzaWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICcnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnVrX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICfQv9C+0LLRltC00L7QvNC70LXQvdC90Y8g0L3QsNCz0LDQtNGD0LLQsNC90L3RjyDQv9GA0L4g0J/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn0JLQuCDQsdGD0LTQtdGC0LUg0L7RgtGA0LjQvNGD0LLQsNGC0Lgg0L/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPINGJ0L7RgNCw0LfRgywg0Y/QuiDQvdCw0YHRgtCw0LLQsNGC0LjQvNC1INCy0LjQt9C90LDRh9C10L3QuNC5INGH0LDRgSAo0LTQu9GPINCS0LDRiNC+0Zcg0J/QvtC00ZbRlyknOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0LvRltC90L3RjyDQv9C+0LLRltC00L7QvNC70LXQvdC90Y/QvNC4INCf0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAn0KTRltC70YzRgtGAINCf0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ9Ca0L7QvNCw0L3QtNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAn0KDQtdGB0YPRgNGBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAn0J/QvtCy0ZbQtNC+0LzQu9GP0YLQuCDQutC+0YDQuNGB0YLRg9Cy0LDRh9CwINGC0ZbQu9GM0LrQuCDQvtC00LjQvSDRgNCw0Lcg0LIg0LTQtdC90Ywg0L/QviDQvtC00L3RltC5INC/0L7QtNGW0Zcg0Lcg0LLQuNC60L7RgNC40YHRgtCw0L3QvdGP0Lwg0L7QsdGA0LDQvdC+0LPQviDRgdC/0L7RgdC+0LHRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ9Cf0L7QstGW0LTQvtC80LvQtdC90L3Rjywg0YnQviDQvdCw0LTRgdC40LvQsNGO0YLRjNGB0Y8g0LDQs9C10L3RgtGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICfQlNC70Y8g0L7RgtGA0LjQvNCw0L3QvdGPINC/0LXRgNGI0LjRhSAyMC3RgtC4INGB0LjQvNCy0L7Qu9GW0LIg0LfQsNCz0L7Qu9C+0LLQutGDINCf0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICfQlNC70Y8g0L7RgtGA0LjQvNCw0L3QvdGPINCw0YLRgNC40LHRg9GC0YMg0J/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJ9CU0LvRjyDQvtGC0YDQuNC80LDQvdC90Y8g0LDQsNGC0YDQuNCx0YPRgtGW0LIg0LrQsNC70LXQvdC00LDRgNGPJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ9Ce0LPQu9GP0LQg0L/QvtGA0Y/QtNC60YMg0LTQtdC90L3QvtCz0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ9C60LXRgNGD0LLQsNGC0Lgg0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICfQlNC+0LTQsNGC0Lgg0L/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ9Ca0L7Qu9GW0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICfQmtGW0L3RhtC10LLQsCDQtNCw0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfQn9C+0LLRgtC+0YDQuNGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAn0JrQsNC70LXQvdC00LDRgNGWINC90LUg0LfQvdCw0LnQtNC10L3Rli4g0JHRg9C00Ywg0LvQsNGB0LrQsCwg0YHQv9C+0YfQsNGC0LrRgyDQtNC+0LTQsNC50YLQtSDQutCw0LvQtdC90LTQsNGAINC30LAg0LTQvtC/0L7QvNC+0LPQvtGOINGB0YLQvtGA0ZbQvdC60Lgg0KPQv9GA0LDQstC70ZbQvdC90Y8g0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ9Cf0L7QtNGW0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ9Cm0LUg0L/QvtCy0YLQvtGA0Y7QstCw0L3QsCDQv9C+0LTRltGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAn0JLQuCDRhdC+0YfQtdGC0LUg0LfQvNGW0L3QuNGC0Lgg0YLRltC70YzQutC4INGG0LXQuSDQstC40L/QsNC00L7QuiDRh9C4INCy0YHRliDQstC40L/QsNC00LrQuD8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAn0JLRgdGWINCy0LjQv9Cw0LTQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAn0JvQuNGI0LUg0YbQtdC5INCy0LjQv9Cw0LTQvtC6JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICfQmtC10YDRg9Cy0LDQvdC90Y8g0LrQsNC70LXQvdC00LDRgNC10LwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfQn9C10YDQtdCz0LvRj9C0INC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAn0JTQvtC00LDRgtC4INC90L7QstC40Lkg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICfQlNC+0LTQsNGC0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAn0IbQvNC/0L7RgNGC0YPQstCw0YLQuCDQn9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ9CG0LzQv9C+0YDRgiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfQotGD0YIg0LLQuCDQvNC+0LbQtdGC0LUg0LfQsNCy0LDQvdGC0LDQttC40YLQuCDRhNCw0LnQuyDQutC+0L3RhNGW0LPRg9GA0LDRhtGW0ZcsINGJ0L7QsSDRltC80L/QvtGA0YLRg9Cy0LDRgtC4INC60LDQu9C10L3QtNCw0YAg0LTQviDQktCw0YjQvtGXINGB0LjRgdGC0LXQvNC4LtCk0LDQudC7INC/0L7QstC40L3QtdC9INCx0YPRgtC4INCyIC55bWwg0YTQvtGA0LzQsNGC0ZYsINGJ0L4g0LXQutGB0L/QvtGA0YLRg9GO0YLRjNGB0Y8g0LzQvtC00YPQu9C10Lwg0YPQv9GA0LDQstC70ZbQvdC90Y8g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAn0JfQsNCy0LDQvdGC0LDQttC40YLQuCDQutC+0L3RhNGW0LPRg9GA0LDRhtGW0Y4g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ9CG0LzQv9C+0YDRgiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICfQpNGW0LvRjNGC0YAg0LTQu9GPINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICfQl9Cw0LvQtdC20L3QviDQstGW0LQg0L/QvtC70Y8g0LPRgNGD0L/QuCwg0YHQuNGB0YLQtdC80LAg0L3QsNC00LDRgdGC0Ywg0LrQvtGA0LjRgdGC0YPQstCw0YfQsNC8INC00L7RgdGC0YPQvyDQtNC+INC60LDQu9C10L3QtNCw0YDRjyDQstGW0LTQv9C+0LLRltC00L3QviDQtNC+INGX0YUg0YDRltCy0L3RjyDQtNC+0YHRgtGD0L/Rgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ9Ci0ZbQu9GM0LrQuCDQtNC70Y8g0YfQuNGC0LDQvdC90Y86INC60L7RgNC40YHRgtGD0LLQsNGH0ZYg0LfQvNC+0LbRg9GC0Ywg0L/QtdGA0LXQs9C70Y/QtNCw0YLQuCDRgtCwINC10LrRgdC/0L7RgNGC0YPQstCw0YLQuCDQstGB0ZYg0L/QvtC00ZbRlyDQsiDQutCw0LvQtdC90LTQsNGA0ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICfQn9C10YDQtdC80ZbRgdGC0LjRgtC4INCyOiDQutC+0YDQuNGB0YLRg9Cy0LDRh9GWINC80L7QttGD0YLRjCDQt9C80ZbQvdGO0LLQsNGC0Lgg0L/QvtC00ZbRlyDQsiDQutCw0LvQtdC90LTQsNGA0ZYsINCw0LvQtSDQsdC10Lcg0LfQvNGW0L3QuCDQstC40LHQvtGA0YMg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICfQodGC0LLQvtGA0LjRgtC4OiDQutC+0YDQuNGB0YLRg9Cy0LDRh9GWINC80L7QttGD0YLRjCDRgdGC0LLQvtGA0Y7QstCw0YLQuCDRliDQstC40LTQsNC70Y/RgtC4INC30YPRgdGC0YDRltGH0ZYg0LIg0LrQsNC70LXQvdC00LDRgNGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfQp9C40YLQsNC90L3Rjy/Qt9Cw0L/QuNGBOiDQutC+0YDQuNGB0YLRg9Cy0LDRh9GWINC80L7QttGD0YLRjCDRg9C/0YDQsNCy0LvRj9GC0Lgg0LrQsNC70LXQvdC00LDRgNC10Lwg0YHQsNC80L7RgdGC0ZbQudC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAn0YjQu9GP0YUgVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ9CV0LrRgdC/0L7RgNGC0YPQstCw0YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAn0JfQsNCy0LDQvdGC0LDQttC40YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ9Ca0L7Qv9GW0Y7QstCw0YLQuCBVUkwg0L/Rg9Cx0LvRltGH0L3QvtCz0L4g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICfQhtC80Y8g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ9Ca0LDQu9C10L3QtNCw0YAg0Lcg0YLQsNC60LjQvCDRltC80Y/QvCDRg9C20LUg0ZbRgdC90YPRlCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAn0JPRgNGD0L/QsCDQtNC+0LfQstC+0LvRltCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICfQn9C+0LTRltGXINC30LDRj9Cy0LrQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAn0J/RgNCw0LLQuNC70L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAn0JLQuNC60L7RgNC40YHRgtC+0LLRg9C50YLQtSDQvtC/0YbRltGXINC90LjQttGH0LUsINGJ0L7QsSDQt9Cy0YPQt9C40YLQuCwg0LTQu9GPINGP0LrQuNGFINGC0ZbQutC10YLRltCyINC/0L7QtNGW0Zcg0LHRg9C00YPRgtGMINGB0YLQstC+0YDQtdC90ZYg0LDQstGC0L7QvNCw0YLQuNGH0L3Qvi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ9CR0YPQtNGMINC70LDRgdC60LAg0LLQuNCx0LXRgNGW0YLRjCDQtNGW0LnRgdC90YMg0YfQtdGA0LPRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ9Cf0L7RiNGD0Log0LDRgtGA0LjQsdGD0YLRltCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAn0JLQuNC30L3QsNGH0LXQvdC90Y8g0L/RgNCw0LLQuNC7INC00LvRjyDRgdGC0LLQvtGA0LXQvdC90Y8g0LDQstGC0L7QvNCw0YLQuNGH0L3QuNGFINC/0L7QtNGW0Lkg0LIg0YbRjNC+0LzRgyDQutCw0LvQtdC90LTQsNGA0ZYg0L3QsCDQv9GW0LTRgdGC0LDQstGWINC00LDQvdC40YUg0LfQsNGP0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAn0JTQvtC00LDRgtC4INC/0YDQsNCy0LjQu9C+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICfQkdGW0LvRjNGI0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ9Cc0LXQvdGI0LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAn0JTQvtC00LDRgtC4INC90L7QstGDINCf0L7QtNGW0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAn0JrQsNC70LXQvdC00LDRgNGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICfQlNGD0LbQtSDQsdCw0LPQsNGC0L4g0LDQutGC0LjQstC90LjRhSDQutCw0LvQtdC90LTQsNGA0ZbQsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICfQkdGD0LTRjCDQu9Cw0YHQutCwINCy0LjQvNC60L3RltGC0Ywg0LTQtdGP0LrRliDQsNCx0L4g0LfQsdGW0LvRjNGI0ZbRgtGMINC70ZbQvNGW0YIg0LIg0LrQvtC90YTRltCz0YPRgNCw0YbRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICfQotC40LbQtNC10L3RjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ9Ce0LPQu9GP0LQg0LzRltGB0Y/RhtGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICfQntCz0LvRj9C0INGC0LjQttC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAn0J7Qs9C70Y/QtCDQtNC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ9Cf0LXRgNC10LnRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICfQktGW0LTRhdC40LvQuNGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ9Cf0L7QutCw0LfQsNGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICfQkdCw0LfQvtCy0LAg0ZbQvdGE0L7RgNC80LDRhtGW0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAn0JTQsNGC0LAv0KfQsNGBJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfQkdGD0LTRjCDQu9Cw0YHQutCwINCy0YHRgtCw0L3QvtCy0ZbRgtGMINGG0LUg0L/QtdGA0LXQtCDQtNCw0YLQvtGOINC30LDQtdGA0YjQtdC90L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICfQkdGD0LTRjCDQu9Cw0YHQutCwINCy0YHRgtCw0L3QvtCy0ZbRgtGMINGG0LUg0L/QtdGA0LXQtCDQtNCw0YLQvtGOINC/0L7Rh9Cw0YLQutGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICfQptC10Lkg0LLQuNC/0LDQtNC+0Log0L/QvtCy0YLQvtGA0Y7QstCw0L3QvtGXINC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfQndCw0YLQuNGB0L3RltGC0Ywg0YHRjtC00LgsINGJ0L7QsSDQv9C+0LHQsNGH0LjRgtC4INCx0LDRgtGM0LrRltCy0YHRjNC60YMg0J/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfQndCw0YLQuNGB0L3RltGC0Ywg0YLRg9GCINC00LvRjyDRgNC10LTQsNCz0YPQstCw0L3QvdGPINCx0LDRgtGM0LrRltCy0YHRjNC60L7Qs9C+INC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICfQp9Cw0YHRgtC+0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ9Ca0L7QttC90ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ9CS0ZbQtNC90L7RgdC90LAg0YfQsNGB0L7QstCwINGC0L7Rh9C60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAn0JLQuCDQstC/0LXQstC90LXQvdGWLCDRidC+INGF0L7Rh9C10YLQtSDQstC40LTQsNC70LjRgtC4INGG0Y4g0L/QvtC00ZbRjj8g0KbRjyDQvtC/0LXRgNCw0YbRltGPINC90LUg0LzQvtC20LUg0LHRg9GC0Lgg0YHQutCw0YHQvtCy0LDQvdCwJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICfQhtC80L/QvtGA0YLRg9Cy0LDRgtC4INCf0L7QtNGW0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICfQl9Cw0LLQsNC90YLQsNC20LXQvdC40Lkg0YTQsNC50Lsg0L/QvtCy0LjQvdC10L0g0LHRg9GC0Lgg0LIg0L/RgNCw0LLQuNC70YzQvdC+0LzRgyBpY2FsINGE0L7RgNC80LDRgtGWICguaWNzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICfQr9C60YnQviDQvtCx0YDQsNC90LjQuSDQutCw0LvQtdC90LTQsNGAINC90LUg0LIg0YHQv9C40YHQutGDLCDQv9C10YDQtdC60L7QvdCw0LnRgtC10YHRjyDQsdGD0LTRjCDQu9Cw0YHQutCwLCDRidC+INGDINCy0LDRgSDRlCDQv9C+0LLQvdC+0LLQsNC20LXQvdC90Y8g0L3QsCDRgdGC0LLQvtGA0LXQvdC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfQntC90L7QstC40YLQuCDRltGB0L3Rg9GO0YfRliDQn9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAn0JLRgdGWINGW0YHQvdGD0Y7Rh9GWINC/0L7QtNGW0Zcg0LIg0LrQsNC70LXQvdC00LDRgNGWINC3INGC0LDQutC40Lwg0LbQtSBVbmlxdWVJRCDQsdGD0LTRg9GC0Ywg0L/QtdGA0LXQt9Cw0L/QuNGB0LDQvdGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ9CX0LDQstCw0L3RgtCw0LbQuNGC0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAn0IbQvNC/0L7RgNGC0YPQstCw0YLQuCDQn9C+0LTRltGXJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ9Cd0L7QstCwINCf0L7QtNGW0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ9Ch0LrQvtGA0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSDQtNC90ZbQsic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICfQhtC80Y8g0L3QsNCz0LDQtNGD0LLQsNC90L3RjyDQstC20LUg0ZbRgdC90YPRlCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAn0JDQs9C10L3RgiAo0YDQtdGB0YPRgNGB0LgpLCDRj9C60ZYg0LLQuNCx0LjRgNCw0Y7RgtGM0YHRjyDQsiDRgNCw0LzQutCw0YUg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfQktGB0ZYg0LDQs9C10L3RgtC4INC3INC00L7Qt9Cy0L7Qu9C+0Lwg0L3QsCDRh9C40YLQsNC90L3RjyDQtNC70Y8g0L/QvtC00ZbRlyAo0LrQsNC70LXQvdC00LDRgCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfQktGB0ZYg0LDQs9C10L3RgtC4LCDRj9C60ZYg0LzQsNGO0YLRjCDQtNC+0LfQstGW0Lsg0L3QsCDQt9Cw0L/QuNGBINC00LvRjyDQv9C+0LTRltC5ICjQutCw0LvQtdC90LTQsNGAKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAn0KHQuNGB0YLQtdC80LAg0L3QtSDQvNC+0LbQtSDRgdGC0LLQvtGA0LjRgtC4INC60LDQu9C10L3QtNCw0YAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAn0J3QtdC80LDRlCBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ9CS0Lgg0L3QtSDQvNCw0ZTRgtC1INC00L7RgdGC0YPQv9GDINC00L4g0YbRjNC+0LPQviDQutCw0LvQtdC90LTQsNGA0Y8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfQoNC10LTQsNCz0YPQstCw0YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0L7QvdC+0LLQu9C00LXQvdC90ZYg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICfQndC1INC80L7QttC70LjQstC+INC/0YDQvtGH0LjRgtCw0YLQuCDRhNCw0LnQuyDQutC+0L3RhNGW0LPRg9GA0LDRhtGW0Zcg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ9CR0YPQtNGMINC70LDRgdC60LAg0L/QtdGA0LXQutC+0L3QsNC50YLQtdGB0YwsINGJ0L4g0YTQsNC5INGE0LDQudC7INC90LUg0L/QvtGI0LrQvtC00LbQtdC90LjQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICfQndC1INC80L7QttC70LjQstC+INGW0LzQv9C+0YDRgtGD0LLQsNGC0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICfQmtCw0LvQtdC90LTQsNGAINGW0LzQv9C+0YDRgtC+0LLQsNC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ9Cf0L7RgtGA0LXRjNGD0ZTRgtGM0YHRjyBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAn0J3QtSDQvNC+0LbQu9C40LLQviDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINC00LvRjyBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICfQo9GB0L/RltGI0L3QviDRltC80L/QvtGA0YLQvtCy0LDQvdC+ICVzINC/0L7QtNGW0Lkg0LIg0LrQsNC70LXQvdC00LDRgCAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUg0YXQstC40LvQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1INGF0LLQuNC70LjQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCDRhdCy0LjQu9C40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxINCz0L7QtNC40L3QsCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICfQktGB0ZYg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICfQn9C+0LTRltGXLCDQv9C+0LLRj9C30LDQvdGWINC30ZYg0LzQvdC+0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ9Cf0L7QutCw0LfRg9GO0YLRjNGB0Y8g0YLRltC70YzQutC4INC/0L7QstGP0LfQsNC90ZYg0Lcg0LLQsNC80Lgg0L/QvtC00ZbRly4g0JfQvNGW0L3QuNGC0Lgg0L3QsNC70LDRiNGC0YPQstCw0L3QvdC90Y8uJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ9Cf0L7QtNGW0Y8g0L3QtSDQt9C90LDQudC00LXQvdCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ9Cd0ZbQutC+0LvQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICfQqdC+0LTQvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfQqdC+0YLQuNC20L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ9Cp0L7QvNGW0YHRj9GG0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ9Cp0L7RgNC+0LrRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICfQmtC+0YDQuNGB0YLRg9Cy0LDRhtGM0LrQuNC5INCy0LjQsdGW0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfQqdC+0LTQtdC90L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICfQqdC+0YLQuNC20L3QtdCy0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ9Cp0L7QvNGW0YHRj9GH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfQqdC+0YDRltGH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ9C60L7QttC90ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICfQtNC70Y8gJXMg0YDQsNC30YMo0ZbQsiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAn0LTQvtC60LguLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAn0LTQviAuLi4g0YDQsNC30YMo0ZbQsiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICfQtNC+0LrQuCAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICfQndC10LzQsNGUINC/0L7QstGW0LTQvtC80LvQtdC90YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzINGF0LLQuNC70LjQvSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMg0LPQvtC00LjQvSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyDQtNC90ZYo0ZbQsikg0LTQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzINGC0LjQttC90ZbQsiDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAn0L/QtdGA0LXQtCDQv9C+0YfQsNGC0LrQvtC8INC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICfQv9GW0YHQu9GPINC/0L7Rh9Cw0YLQutGDINC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAn0L/QtdGA0LXQtCDQt9Cw0LLQtdGA0YjQtdC90L3Rj9C8INC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn0L/RltGB0LvRjyDQt9Cw0LLQtdGA0YjQtdC90L3RjyDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAn0J3QtdC80LDRlCDQv9C+0LLQvdC+0LLQsNC20LXQvdGMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICfQndC1INC80L7QttC70LjQstC+INCy0LjQtNCw0LvQuNGC0Lgg0L/QvtC00ZbRjiDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAn0J3QtdC80LDRlCDQv9C+0LLQvdC+0LLQsNCy0LbQtdC90YwhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ9Cd0LXQvNCw0ZQg0L/QvtCy0L3QvtCy0LDQttC10L3RjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICfQodC40YHRgtC10LzQsCDQvdC1INC80L7QttC1INGW0LzQv9C+0YDRgtGD0LLQsNGC0Lgg0YTQsNC50LsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAn0JHRg9C00Ywg0LvQsNGB0LrQsCDQv9C10YDQtdCy0ZbRgNGC0LUg0LvQvtCzINC00LvRjyDQtNC+0LTQsNGC0LrQvtCy0L7RlyDRltC90YTQvtGA0LzQsNGG0ZbRlyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkINCx0ZbQu9GM0YjQtSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ9C90LXQvNCw0ZQgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ9CS0ZbQtNGB0YPRgtC90ZbQuSDRgtCw0LrQuNC5INC60L7RgNC40YHRgtGD0LLQsNGHJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn0KXQuNCx0L3QuNC5INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAn0KXQuNCx0L3QtSDQv9C+0YHQuNC70LDQvdC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn0KHRgtCw0LvQsNGB0Ywg0L/QvtC80LjQu9C60LAg0L/RltC0INGH0LDRgSDQtdC60YHQv9C+0YDRgtGDINC60LDQu9C10L3QtNCw0YDRjyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ9Ce0L3QvtCy0LvQtdC90L3RjyAo0YXQstC40LvQuNC90LgpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICfQodGC0L7RgNGW0L3QutCwINC/0LXRgNC10LPQu9GP0LTRgyDQn9C+0LTRltC5INC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAn0J/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPINC/0L4g0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn0LzQvtC00YPQu9GMINC/0L7QtNGW0Lkg0LrQsNC70LXQvdC00LDRgNGPLCDRj9C60LjQuSDQs9C+0YLRg9GUINC30LDQv9C40YHQuCDQv9C+0LLRltC00L7QvNC70LXQvdC90Y8g0LTQu9GPINC/0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ9C80L7QtNGD0LvRjCDQv9C+0LTRltC5INC60LDQu9C10L3QtNCw0YDRjywg0Y/QutC40Lkg0L7QvdC+0LLQu9GO0ZQg0YLRltC60LXRgiDQtyDQtNCw0L3QuNC80Lgg0LLRltC0INC/0L7QtNGW0Lkg0LfQsNGP0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ9CV0LrRgNCw0L0g0YDQtdC00LDQs9GD0LLQsNC90L3RjyDQv9C+0LTRltC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICfQn9C10YDQtdC70ZbQuiDQv9C+0LTRltC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAn0J/QtdGA0LXQu9GW0Log0L/QvtC00ZbQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAn0J/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPINC/0L4g0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICfQn9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAn0JXQutGA0LDQvSDQutC10YDRg9Cy0LDQvdC90Y8g0LrQsNC70LXQvdC00LDRgNC10LwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAn0JLQuNCx0YDQsNGC0Lgg0Y/QutC40Lkg0LLQuNC0INC/0L7QstGW0LTQvtC80LvQtdC90L3RjyDQv9GA0L4g0LfQvNGW0L3QuCDQv9C+0LTRltGXINCS0Lgg0YXQvtGH0LXRgtC1INC+0YLRgNC40LzRg9Cy0LDRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICfQodGC0LLQvtGA0LjRgtC4INC90L7QstC40Lkg0LrQsNC70LXQvdC00LDRgCDQv9C+0LTRltC5INC/0L7QstGP0LfQsNC90LjQuSDQtyDRhtGW0ZTRjiDQt9Cw0Y/QstC60L7Rjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ9Ch0YLQstC+0YDQuNGC0Lgg0ZYg0LrQtdGA0YPQstCw0YLQuCDQv9C+0LLRltC00L7QvNC70LXQvdC90Y/QvNC4INC/0YDQviDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAn0KHRgtCy0L7RgNC40YLQuCDQvdC+0LLRgyDQv9C+0LTRltGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAn0JfQsNC00LDRlCDRj9C60ZYg0LrQvtC70L7QvdC60Lgg0LHRg9C00YPRgtGMINC/0L7QutCw0LfQsNC90ZYg0LIg0L/QvtCy0Y/Qt9Cw0LDQvdC+0LzRgyDQstGW0LTQttC10YLRliDQv9C+0LTRltC5KExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAn0JLQuNC30L3QsNGH0LDRlCDRltC60L7QvdC60YMg0Lcg0L/QvtGB0LjQu9Cw0L3QvdGP0Lwg0L3QsCDRgdGC0L7RgNGW0L3QutGDINC60LDRgNGCIEdvb2dsZSDQtyDQv9C+0YLQvtGH0L3QuNC8INC80ZbRgdGG0LXQt9C90LDRhdC+0LTQttC10L3QvdGP0Lwg0YMg0LLRltC60L3RliDRgNC10LTQsNCz0YPQstCw0L3QvdGPINC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICfQktC40LfQvdCw0YfQsNGUINGC0LjQv9C4INC+0LHRlNC60YLRltCyINC/0L7QtNGW0LksINGP0LrRliDQsdGD0LTRg9GC0Ywg0L7QsdGA0L7QsdC70Y/RgtC40YHRjyDQt9CwINC00L7Qv9C+0LzQvtCz0L7RjiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICfQktC40LfQvdCz0LDRh9Cw0ZQg0L/QtdGA0LXQu9GW0Log0L/QvtGA0LDQvNC10YLRgNGW0LIg0Y/QutGWINC80L7QttGD0YLRjCDQsdGD0YLQuCDQsiDQvtC/0YbRltGP0YUg0L/QvtGI0YPQutGDINC/0L4g0LfQsNGP0LLRhtGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ9Cg0LXQtNCw0LPRg9Cy0LDRgtC4INC/0L7QtNGW0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ9Cn0LDRgSDQv9C10YDRiNC+0Zcg0LLRltC00L/QvtCy0ZbQtNGWJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ9CG0LzQv9C+0YDRgtGD0LLQsNGC0Lgg0LXRgNC60LDQvSDQv9C+0LTRltC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ9Cf0L7QstGP0LfQsNGC0Lgg0L/QvtC00ZbRlyDRliDQt9Cw0Y/QstC60Lgg0LcgIk5vcm1hbCIg0YLQuNC/0L7QvCDQt9Cy0Y/Qt9C60YMgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICfQn9C10YDQtdC70ZbQuiDQstGB0ZbRhSDQv9C+0LTRltC5INC00LvRjyDQstGW0LTQvtCx0YDQsNC20LDRjtGC0YzRgdGPINCyIEdVSSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn0J/QtdGA0LXQu9GW0Log0LLRgdGW0YUg0L/QvtC00ZbQuSDQutCw0LvQtdC90LTQsNGA0Y8g0LTQu9GPINCy0ZbQtNC+0LHRgNCw0LbQtdC90L3RjyDQsiBHVUknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAn0JrQtdGA0YPQstCw0YLQuCDRgNGW0LfQvdC40LzQuNC8INC60LDQu9C10L3QtNCw0YDRj9C80LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAn0J/QtdGA0LXQs9C70Y/QvdGD0YLQuCDQstGB0ZYg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICfRh9Cw0YEsINGJ0L4g0LfQsNC70LjRiNC40LLRgdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfQn9C+0YjRg9C6INGD0YLQuNC70ZbRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAn0KPRgtC40LvRltGC0LAg0L/QvtGI0YPQutGDINC80L7QtNGD0LvRjyDQtNC70Y8g0LDQstGC0L7Qt9Cw0L/QvtCy0L3QtdC90L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICfQn9GD0LHQu9GW0YfQvdC40Lkg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAn0J/Rg9Cx0LvRltGH0L3QuNC5INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICfQn9C10YDQtdCz0LvRj9C0INGA0LXRgdGD0YDRgdGW0LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAn0J/QtdGA0LXQs9C70Y/QtCDRgNC10YHRg9GA0ZbQsiAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICfQp9Cw0YEg0LLQuNGA0ZbRiNC10L3QvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0JLQuNCx0ZbRgCDRgdC/0L7RgdC+0LHRgyDQtNC70Y8g0LLRltC00L/RgNCw0LLQutC4INC/0L7QstGW0LTQvtC80LvQtdC90Ywg0L/QviDQv9C+0LTRltGP0YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAn0KLRgNC40LPQtdGA0Lgg0LTQu9GPINC00L7QtNCw0LLQsNC90L3RjyDRh9C4INCw0LLRgtC+0LzQsNGC0LjRh9C90L7Qs9C+INC+0L3QvtCy0LvQtdC90L3RjyDQv9C+0LTRltC5INC90LAg0L7RgdC90L7QstGWINC/0LXQstC90LjRhSDRh9Cw0YHRltCyINGC0ZbQutC10YLRgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ9Cn0LDRgSDQvtC90L7QstC70LXQvdC90Y8nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX09UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nfSA9ICfpooTnuqbmj5DphpLpgJrnn6XjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ+avj+W9k+S9oOeahOS4gOS4qumihOe6puWIsOi+vuaPkOmGkuaXtumXtOaXtu+8jOS9oOWwseS8muaUtuWIsOS4gOS4qumAmuefpeOAgic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ+mihOe6pumAmuefpeeuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ+WcqOi/memHjOS9oOWPr+S7peS4iuS8oOS4gOS4qumFjee9ruaWh+S7tuS7peS+v+WvvOWFpemihOe6pumAmuefpe+8jOW/hemhu+aYr+S4jumihOe6pumAmuefpeaooeWdl+WvvOWHuueahOaWh+S7tuS4gOagt+eahC55bWzmoLzlvI/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICflnKjov5nph4zkvaDlj6/ku6XpgInmi6nlk6rkuKrkuovku7blsIbkvJrop6blj5Hov5nkuKrpgJrnn6XvvIzkuIvpnaLnmoTpooTnuqbov4fmu6Tlmajlj6/ku6XpgInmi6nnrKblkIjnibnlrprmnaHku7bnmoTpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAn6L+H5ruk6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICflm6LpmJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICfotYTmupAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICfmr4/kuKrpooTnuqbnmoTpgJrnn6Xkvb/nlKjpgInmi6nnmoTmlrnlvI/kuIDlpKnlj6rlj5HpgIHkuIDmrKHjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICflj5HpgIHnu5nmnI3liqHkurrlkZjnmoTpgJrnn6XjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ+iOt+WPlumihOe6pueahOWJjTIw5Liq5a2X56ym44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAn6I635Y+W6aKE57qm55qE5bGe5oCnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAn6I635Y+W5pel5Y6G55qE5bGe5oCnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ+aXpeeoi+amguiniCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAn566h55CG5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ+a3u+WKoOmihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ+minOiJsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ+e7k+adn+aXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfph43lpI0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAn5rKh5pyJ5om+5Yiw5pel5Y6G44CC6K+35YWI6YCa6L+H566h55CG5pel5Y6G55WM6Z2i5re75Yqg5LiA5Liq5pel5Y6G44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICfov5nmmK/kuIDkuKrph43lpI3nmoTpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICfkvaDmg7Pku4XnvJbovpHmnKzmrKHpooTnuqbnmoTml7bpl7Tov5jmmK/ph43lpI3pooTnuqbmiYDmnInnmoTml7bpl7TvvJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAn5omA5pyJ6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAn5LuF5pys5qyhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICfml6XljobnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfml6XljobmpoLop4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ+a3u+WKoOaWsOeahOaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICfmt7vliqDml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ+WvvOWFpemihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICfml6Xljoblr7zlhaUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfkvaDlj6/ku6XlnKjov5nph4zkuIrkvKDkuIDkuKrphY3nva7mlofku7bmnaXlr7zlhaXkuIDkuKrml6XljobliLDns7vnu5/kuK3jgILov5nkuKrmlofku7blv4XpobvmmK/nsbvkvLzpgJrov4fml6XljobnrqHnkIbmqKHlnZflr7zlh7rnmoQueW1s5qC85byP44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAn5LiK5Lyg5pel5Y6G6YWN572uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ+WvvOWFpeaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ+i/h+a7pOaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICfmoLnmja7nu4TlrZfmrrXvvIzns7vnu5/pgJrov4fnlKjmiLfnmoTmnYPpmZDnuqfliKvmnaXlhYHorrjnlKjmiLfog73lpJ/orr/pl67nmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICflj6ror7vvvJrnlKjmiLflj6/ku6XnnIvliLDlkozlr7zlh7rml6XljobkuK3miYDmnInnmoTpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICfovaznp7vvvJrnlKjmiLflj6/ku6Xkv67mlLnml6XljobkuK3nmoTpooTnuqbvvIzkvYbkuI3og73kv67mlLnpgInmi6nnmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ+WIm+W7uu+8mueUqOaIt+WPr+S7peWIm+W7uuWSjOWIoOmZpOaXpeWOhuS4reeahOmihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAn6K+75YaZ77ya55So5oi35Y+v5Lul566h55CG5pel5Y6G44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ+e9keWdgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICflr7zlh7rml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfkuIvovb3ml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAn5aSN5Yi25YWs5YWx5pel5Y6G572R5Z2AJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICfml6XljoblkI3np7AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAn5bey5pyJ5ZCM5ZCN55qE5pel5Y6G44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICfmnYPpmZDnu4QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ+W3peWNlemihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAn6KeE5YiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ+S9v+eUqOS4i+mdoueahOmAiemhueadpeWHj+WwkeiHquWKqOWIm+W7uueahOW3peWNlemihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAn6K+36YCJ5oup5LiA5Liq5pyJ5pWI55qE6Zif5YiX44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAn5pCc57Si5bGe5oCnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAn5a6a5LmJ5Zyo6L+Z5Liq5pel5Y6G5Lit5Z+65LqO5bel5Y2V5pWw5o2u6Ieq5Yqo5Yib5bu66aKE57qm55qE6KeE5YiZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAn5re75Yqg6KeE5YiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICfmm7TlpJonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ+abtOWwkSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICfmt7vliqDmlrDnmoTpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAn5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICfmv4DmtLvnmoTml6XljoblpKrlpJonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAn6K+35YWz6Zet5LiA5Lqb5pel5Y6G5oiW6ICF5Zyo6YWN572u5Lit5aKe5Yqg6ZmQ5Yi25pWw44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICflkagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICfmnIjml7bpl7TooagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ+WRqOaXtumXtOihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICfmr4/ml6Xml7bpl7TooagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ+i3s+i9rCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAn5Y+W5raIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICfmmL7npLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICfln7rmnKzkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAn5pel5pyfIC8g5pe26Ze0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfor7forr7nva7ov5nkuKrlgLzkuLrnu5PmnZ/ml6XmnJ/kuYvliY3jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAn6K+36K6+572u6L+Z5Liq5YC85Li65byA5aeL5pel5pyf5LmL5ZCO44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICfov5nmmK/kuIDkuKrph43lpI3pooTnuqbnmoTkuIDmrKHml7bpl7TjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfngrnlh7vov5nph4zmn6XnnIvniLbpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAn54K55Ye76L+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+eyc1IGRheXMnfSA9ICc15aSpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ+i/meS4qumAmuefpeeahOWQjeWtl+W3suWtmOWcqCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ+i/meS4qumihOe6pumAieaLqeeahOacjeWKoeS6uuWRmO+8iOi1hOa6kO+8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfmiYDmnInlr7nov5nkuKrpooTnuqbvvIjml6XljobvvInoh7PlsJHmnInor7vmnYPpmZDnmoTmnI3liqHkurrlkZjjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfmiYDmnInlr7nov5nkuKrpooTnuqbvvIjml6XljobvvInmnInlhpnmnYPpmZDnmoTmnI3liqHkurrlkZjjgIInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ+ezu+e7n+S4jeiDveWIm+W7uuaXpeWOhu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ+ayoeacieaXpeWOhklE77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ+S9oOaXoOadg+iuv+mXrui/meS4quaXpeWOhu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAn57yW6L6R5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfmm7TmlrDml6Xljoblh7rplJnvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ+S4jeiDveivu+WPluaXpeWOhueahOmFjee9ruaWh+S7tuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICfor7fnoa7kv53kvaDnmoTmlofku7bmmK/mnInmlYjnmoTjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAn5peg5rOV5a+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/liY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn5Zyo6aKE57qm57uT5p2f5ZCOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAn5rKh5pyJ5p2D6ZmQ77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ+S4jeiDveWIoOmZpOW3peWNlemihOe6pu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfmsqHmnInmnYPpmZDvvIEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAn5rKh5pyJ5p2D6ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ+ezu+e7n+aXoOazleWvvOWFpeaWh+S7tu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICfmm7TlpJrkv6Hmga/or7fmo4Dmn6Xml6Xlv5fjgIInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJ+WkmuS6jislZCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ+ayoeaciSVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAn5rKh5pyJ6L+Z5Liq55So5oi377yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn5peg5pWI5pel5Y6G77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ+aXoOaViOe9keWdgO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICflr7zlh7rml6Xljobml7blh7rplJnvvIEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICfliLfmlrDvvIjliIbpkp/vvIknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ+mihOe6puaXpeWOhuamguiniOmhtemdouOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAn6aKE57qm6YCa55+lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfpooTnuqbml6Xljobkuovku7bmqKHlnZfvvIzlh4blpIfpooTnuqbnmoTpgJrnn6Xmtojmga/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ+mihOe6puaXpeWOhuS6i+S7tuaooeWdl++8jOabtOaWsOW3peWNleeahOmihOe6puaVsOaNruOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICfpooTnuqbnvJbovpHnqpflj6PjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ+mihOe6puWIl+ihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ+mihOe6puWIl+ihqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAn6aKE57qm6YCa55+lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ+mihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ+aXpeWOhueuoeeQhueql+WPo+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICfpgInmi6nkvaDpnIDopoHmjqXmlLblk6rkupvpooTnuqblj5jliqjpgJrnn6Xmtojmga/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ+WIm+W7uuS4gOS4quaWsOeahOaXpeWOhumihOe6puWIsOi/meS4quW3peWNleOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ+WIm+W7uuWSjOeuoeeQhumihOe6pumAmuefpS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfliJvlu7rmlrDnmoTpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICflrprkuYnpk77mjqXnmoTpooTnuqblsI/pg6jku7YoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIp6KaB5pi+56S655qE5YiX44CC5Y+v55So55qE6K6+572u5YC85Li677yaMCA9IOemgeeUqO+8jDEgPSDlj6/nlKjvvIwgMiA9IOm7mOiupOWQr+eUqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICflrprkuYnkuIDkuKrlm77moIfvvIzpk77mjqXpooTnuqbnvJbovpHnqpflj6PkuK3nmoTlvZPliY3kvY3nva7liLDosLfmrYzlnLDlm77pobXpnaLjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICflrprkuYnkuovku7blr7nosaHnsbvlnovvvIzku6Xkvr/pgJrov4dBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnTvvIjnrqHnkIbpooTnuqbpgJrnn6Xkuovku7bvvInlpITnkIbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICflrprkuYnog73kvKDpgJLliLDlt6XljZXmkJzntKLlip/og73nmoTlj4LmlbDmuIXljZXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAn5a6a5LmJ5bel5Y2V6aKE57qm57G75Z6L5ZCO56uv77yM55So5LqO5bel5Y2V5Yqo5oCB5a2X5q615pel5pyf5pe26Ze044CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICflrprkuYnlt6XljZXpooTnuqbnsbvlnovlkI7nq6/vvIznlKjkuo7lt6XljZXljYfnuqfml7bpl7TjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ+WumuS5ieW3peWNlemihOe6puexu+Wei+WQjuerr++8jOeUqOS6juW3peWNleaMgui1t+aXtumXtOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAn5a6a5LmJ5pel5Y6G6aKE57qm55qE5bel5Y2V5o+S5Lu244CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn57yW6L6R6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICfpppbmrKHlk43lupTml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAn5a+85YWl6aKE57qm56qX5Y+j44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ+WwhumihOe6puWSjOW3peWNlemTvuaOpeS4uuKAnOaZrumAmuKAneexu+Wei+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn5YiX5Ye66KaB5Zyo5Zu+5b2i55WM6Z2i5pi+56S655qE5omA5pyJ6aKE57qm5LqL5Lu244CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICflm77lvaLnlYzpnaLmmL7npLrnmoTmiYDmnInml6Xljobkuovku7bliJfooajjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICflnKjliJvlu7rml6Xljobml7blj6/nlKjkuo7pgInmi6nnmoQxNui/m+WItlJHQuminOiJsuWIl+ihqOOAguivt+S9v+eUqOi2s+Wkn+a3seiJsueahOminOiJsu+8jOS7peehruS/neiDveWkn+aYvuekuuS4iumdoueZveiJsueahOaWh+acrOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICfnrqHnkIbkuI3lkIznmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICfml6XljobmpoLop4jnqpflj6Pog73mv4DmtLvnmoTml6XljobmnIDlpKfmlbDjgILor7fms6jmhI/vvJrlpKfph4/nmoTmv4DmtLvml6XljobkvJrlr7nmnI3liqHlmajkuqfnlJ/lpKrlpJrnmoTlkIzmraXosIPnlKjvvIzlj6/og73kvJrmnInmgKfog73lvbHlk43jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSU+S4jeaUr+aMgeWvueayoeaciee7k+adn+aXpeacn+aIluayoeaciemHjeWkjeasoeaVsOeahOmihOe6puWBmuW+queOr+WkhOeQhuOAguWcqOWvvOWFpei/h+eoi+S4re+8jOWPr+iDveaciUlDU+aWh+S7tuWMheWQq+S6huatpOexu+mihOe6puOAguS9nOS4uuabv+S7o++8jOezu+e7n+WwhuaJgOacieeahOatpOexu+mihOe6puWIm+W7uuS4uuW3sui/h+WOu+eahOmihOe6pu+8jOeEtuWQjuWKoOS4iuaOpeS4i+adpeeahG7kuKrmnIgo6buY6K6kMTIw5Liq5pyI5oiWMTDlubQp55qE6YeN5aSN6aKE57qm44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAn5omA5pyJ6aKE57qm55qE5qaC6KeI44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ+aMgui1t+aXtumXtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAn5pCc57Si5o+S5Lu2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAn55So5LqO6Ieq5Yqo5a6M5oiQ55qE5pCc57Si5o+S5Lu25qih5Z2X44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ+WFrOWFseaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAn5YWs5YWx5pel5Y6G44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAn6LWE5rqQ5qaC6KeIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ+i1hOa6kOamguiniO+8iE9UUlPllYbkuJrniYjvvIknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6K+m5oOF56qX5Y+j77yM5Zyo6I+c5Y2V5LiK5pi+56S65LiA5Liq6ZO+5o6l77yM5Lul5Yib5bu65LiA5Liq5pel5Y6G6aKE57qm5bm255u05o6l6ZO+5o6l5Yiw5q2k5bel5Y2V44CC5Y+v6YCa6L+H6ZSu4oCcR3JvdXDigJ3lkozlgLzlpoLigJxydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMuKAnei/m+ihjOmineWklueahOiuv+mXruaOp+WItu+8jOS7peaYvuekuuaIluS4jeaYvuekuui/meS4qumTvuaOpeOAguWmguaenOimgeaUvuWIsOiPnOWNlee7hOS4re+8jOS9v+eUqOmUruKAnENsdXN0ZXJOYW1l4oCd77yM5YC85Y+v5Lul5piv55WM6Z2i5LiK6IO955yL5Yiw55qE5Lu75oSP5ZCN56ew44CC5L2/55So6ZSu4oCcQ2x1c3RlclByaW9yaXR54oCd5p2l6YWN572u6I+c5Y2V57uE5Zyo5bel5YW35qCP5Lit5pi+56S655qE6aG65bqP44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICfop6PlhrPml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICfpooTnuqbpgJrnn6XnmoTkvKDovpPmlrnlvI/pgInmi6njgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAn5Z+65LqO5p+Q5Lqb5bel5Y2V5pe26Ze05re75Yqg5oiW5pu05paw6Ieq5Yqo5pel5Y6G6aKE57qm55qE6Kem5Y+R5Zmo44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAn5pu05paw5pe26Ze0JzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3OwoKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpNaWdyYXRpb25zOjpPVFJTNjo6VGltZVpvbmVPZmZzZXQpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IGRlYnVnCiAgICAkU2VsZi0+e0RlYnVnfSA9IDA7CgogICAgJFNlbGYtPntWaWV3fSA9ICdBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGZpbHRlcnMgc3RvcmVkIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICRMYXN0RmlsdGVyS2V5ID0gJ1VzZXJMYXN0RmlsdGVyLScgLiAkU2VsZi0+e1ZpZXd9OwogICAgbXkgJExhc3RGaWx0ZXIgICAgPSAkUHJlZmVyZW5jZXN7JExhc3RGaWx0ZXJLZXl9IHx8ICdXZWVrJzsKCiAgICBteSAlRmlsdGVycyA9ICgKICAgICAgICBNb250aCA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdNb250aCcpLAogICAgICAgICAgICBQcmlvID0+IDEwMCwKICAgICAgICB9LAogICAgICAgIFdlZWsgPT4gewogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnV2VlaycpLAogICAgICAgICAgICBQcmlvID0+IDIwMCwKICAgICAgICB9LAogICAgICAgIERheSA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdEYXknKSwKICAgICAgICAgICAgUHJpbyA9PiAzMDAsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgY3VycmVudCBmaWx0ZXIKICAgICRQYXJhbXtGaWx0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAkTGFzdEZpbHRlcjsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgZmlsdGVyIGlzIHZhbGlkCiAgICBpZiAoICEkRmlsdGVyc3sgJFBhcmFte0ZpbHRlcn0gfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0ludmFsaWQgRmlsdGVyOiAlcyEnLCAkUGFyYW17RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBwcmVwYXJlIGZpbHRlcnMKICAgIG15ICVOYXZCYXJGaWx0ZXI7CiAgICBmb3IgbXkgJEZpbHRlckNvbHVtbiAoIHNvcnQga2V5cyAlRmlsdGVycyApIHsKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyQ29sdW1ufS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyQ29sdW1uLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyQ29sdW1ufSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBHZXQgdXNlcidzIHBlcm1pc3Npb25zIHRvIGFzc29jaWF0ZWQgbW9kdWxlcyB3aGljaCBhcmUgZGlzcGxheWVkIGFzIGxpbmtzLgogICAgZm9yIG15ICRNb2R1bGUgKHF3KEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSkpIHsKICAgICAgICBteSAkTW9kdWxlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykKICAgICAgICAgICAgLT57JE1vZHVsZX0tPntHcm91cH0gLy8gW107CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRNb2R1bGVHcm91cHMpICkgewogICAgICAgICAgICBNT0RVTEVfR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkTW9kdWxlR3JvdXAgKCBAeyRNb2R1bGVHcm91cHN9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRNb2R1bGVHcm91cF0ifSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgTU9EVUxFX0dST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFsd2F5cyBhbGxvdyBsaW5rcyBpZiBubyBncm91cHMgYXJlIHNwZWNpZmllZC4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVBlcm1pc3Npb25zfS0+eyRNb2R1bGV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGN1cnJlbnQgdGltZSBpbiB0aGUgdmlldwogICAgJFBhcmFte1N0YXJ0fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydCcgKQogICAgICAgIHx8ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFRpbWVzdGFtcEdldCgpOwoKICAgICMgaGFuZGxlIGp1bXAKICAgICRQYXJhbXtKdW1wfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdKdW1wJyApIHx8ICcnOwogICAgaWYgKCAkUGFyYW17SnVtcH0gKSB7CiAgICAgICAgbXkgJEp1bXBPZmZzZXQgPSAwOwogICAgICAgIGlmICggJFBhcmFte0ZpbHRlcn0gZXEgJ1dlZWsnICkgewogICAgICAgICAgICAkSnVtcE9mZnNldCA9IDYwICogNjAgKiAyNCAqIDc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0ZpbHRlcn0gZXEgJ0RheScgKSB7CiAgICAgICAgICAgICRKdW1wT2Zmc2V0ID0gNjAgKiA2MCAqIDI0OwogICAgICAgIH0KCiAgICAgICAgIyBjYWxjdWxhdGUgZGVzdGluYXRpb24gdGltZQogICAgICAgIG15ICRTdGFydCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnTW9udGgnICkgewogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkUGFyYW17SnVtcH0gZXEgJ1ByZXYnICkgewogICAgICAgICAgICAgICAgJE1vbnRoIC09IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17SnVtcH0gZXEgJ05leHQnICkgewogICAgICAgICAgICAgICAgJE1vbnRoICs9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkTW9udGggPCAxICkgewogICAgICAgICAgICAgICAgJE1vbnRoID0gMTI7CiAgICAgICAgICAgICAgICAkWWVhciAtPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE1vbnRoID4gMTIgKSB7CiAgICAgICAgICAgICAgICAkTW9udGggPSAxOwogICAgICAgICAgICAgICAgJFllYXIgKz0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU3RhcnQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgRGF5ICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte0p1bXB9IGVxICdQcmV2JyApIHsKICAgICAgICAgICAgICAgICRTdGFydCAtPSAkSnVtcE9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtKdW1wfSBlcSAnTmV4dCcgKSB7CiAgICAgICAgICAgICAgICAkU3RhcnQgKz0gJEp1bXBPZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRQYXJhbXtTdGFydH0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNhbGN1bGF0ZSBkYXRlIGJvdW5kYXJpZXMKICAgIGlmICggJFBhcmFte0ZpbHRlcn0gZXEgJ01vbnRoJyApIHsKCiAgICAgICAgIyBnZXQgZmlyc3QgZGF5IG9mIHRoZSBtb250aAogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnR9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17U3RhcnRUaW1lfSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRZZWFyLCAkTW9udGgsIDEgKSAuICcgMDA6MDA6MDAnOwoKICAgICAgICAjIGdldCBsYXN0IGRheSBvZiB0aGUgbW9udGgKICAgICAgICAkTW9udGggKz0gMTsKICAgICAgICBpZiAoICRNb250aCA+IDEyICkgewogICAgICAgICAgICAkTW9udGggPSAxOwogICAgICAgICAgICAkWWVhciArPSAxOwogICAgICAgIH0KICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZTJTeXN0ZW1UaW1lKAogICAgICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICBEYXkgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFN5c3RlbVRpbWUgLT0gMTsgICAgIyBzdWJ0cmFjdCBvbmUgc2Vjb25kCiAgICAgICAgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0VuZFRpbWV9ID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFllYXIsICRNb250aCwgJERheSApIC4gJyAyMzo1OTo1OSc7CgogICAgICAgICMgZ2V0IHRyYW5zbGF0ZWQgbmFtZSBvZiB0aGUgbW9udGgKICAgICAgICBteSBATW9udGhBcnJheSA9ICgKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICdKYW51YXJ5JywKICAgICAgICAgICAgJ0ZlYnJ1YXJ5JywKICAgICAgICAgICAgJ01hcmNoJywKICAgICAgICAgICAgJ0FwcmlsJywKICAgICAgICAgICAgJ01heV9sb25nJywKICAgICAgICAgICAgJ0p1bmUnLAogICAgICAgICAgICAnSnVseScsCiAgICAgICAgICAgICdBdWd1c3QnLAogICAgICAgICAgICAnU2VwdGVtYmVyJywKICAgICAgICAgICAgJ09jdG9iZXInLAogICAgICAgICAgICAnTm92ZW1iZXInLAogICAgICAgICAgICAnRGVjZW1iZXInLAogICAgICAgICk7CiAgICAgICAgbXkgJFRyYW5zbGF0ZU1vbnRoID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkTW9udGhBcnJheVskTW9udGhdICk7CgogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZX0gPSAiJFRyYW5zbGF0ZU1vbnRoICRZZWFyIjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0ZpbHRlcn0gZXEgJ1dlZWsnICkgewogICAgICAgIG15ICRDYWxlbmRhcldlZWtEYXlTdGFydCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCA3OwogICAgICAgIG15ICRDYWxlbmRhcldlZWtEYXlFbmQgPSAoICRDYWxlbmRhcldlZWtEYXlTdGFydCAtIDEgKSB8fCA3OwoKICAgICAgICAjIGdldCBzdGFydCBvZiB0aGUgd2VlawogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnR9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoICRXZWVrRGF5ICE9ICRDYWxlbmRhcldlZWtEYXlTdGFydCApIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSA2MCAqIDYwICogMjQ7CiAgICAgICAgICAgICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPQogICAgICAgICAgICBzdWJzdHIoICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KCBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUgKSwgMCwgMTAgKQogICAgICAgICAgICAuICcgMDA6MDA6MDAnOwoKICAgICAgICAjIGdldCBlbmQgb2YgdGhlIHdlZWsKICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgKTsKICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoICRXZWVrRGF5ICE9ICRDYWxlbmRhcldlZWtEYXlFbmQgKSB7CiAgICAgICAgICAgICRFbmRUaW1lICs9IDYwICogNjAgKiAyNDsKICAgICAgICAgICAgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0VuZFRpbWV9ID0KICAgICAgICAgICAgc3Vic3RyKCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCggU3lzdGVtVGltZSA9PiAkRW5kVGltZSApLCAwLCAxMCApCiAgICAgICAgICAgIC4gJyAyMzo1OTo1OSc7CgogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZX0gPQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKCAkUGFyYW17U3RhcnRUaW1lfSwgJ0RhdGVGb3JtYXRTaG9ydCcgKQogICAgICAgICAgICAuICcgJwogICAgICAgICAgICAuIGNocig4MjExKQogICAgICAgICAgICAuICcgJwogICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtFbmRUaW1lfSwgJ0RhdGVGb3JtYXRTaG9ydCcgKTsKICAgICAgICAkUGFyYW17SGVhZGVyVGl0bGVDV30gPSAiIyRDVyI7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtGaWx0ZXJ9IGVxICdEYXknICkgewogICAgICAgICRQYXJhbXtTdGFydFRpbWV9ID0gc3Vic3RyKCAkUGFyYW17U3RhcnR9LCAwLCAxMCApIC4gJyAwMDowMDowMCc7CiAgICAgICAgJFBhcmFte0VuZFRpbWV9ICAgPSBzdWJzdHIoICRQYXJhbXtTdGFydH0sIDAsIDEwICkgLiAnIDIzOjU5OjU5JzsKCiAgICAgICAgIyBnZXQgc3RhcnQgb2YgdGhlIHdlZWsKICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0fSwKICAgICAgICApOwogICAgICAgIG15ICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKCAkUGFyYW17U3RhcnRUaW1lfSwgJ0RhdGVGb3JtYXRTaG9ydCcgKTsKICAgICAgICAkUGFyYW17SGVhZGVyVGl0bGVDV30gPSAiIyRDVyI7CiAgICB9CgogICAgIyBkaXNwbGF5IGZpbHRlciBidXR0b25zCiAgICBteSBATmF2QmFyRmlsdGVyczsKICAgIGZvciBteSAkUHJpbyAoIHNvcnQga2V5cyAlTmF2QmFyRmlsdGVyICkgewogICAgICAgIHB1c2ggQE5hdkJhckZpbHRlcnMsICROYXZCYXJGaWx0ZXJ7JFByaW99OwogICAgfQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlRmlsdGVycywKICAgICAgICB9LAogICAgKTsKICAgIG15ICRDb3VudCA9IDA7CiAgICBmb3IgbXkgJEZpbHRlciAoQE5hdkJhckZpbHRlcnMpIHsKICAgICAgICAkQ291bnQrKzsKICAgICAgICBpZiAoICRDb3VudCA9PSBzY2FsYXIgQE5hdkJhckZpbHRlcnMgKSB7CiAgICAgICAgICAgICRGaWx0ZXItPntDU1N9ID0gJ0xhc3QnOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkRmlsdGVyLT57RmlsdGVyfSBlcSAkUGFyYW17RmlsdGVyfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICAjIGdldCBhbGwgdXNlcidzIHZhbGlkIGNhbGVuZGFycwogICAgbXkgJFZhbGlkSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMb29rdXAoCiAgICAgICAgVmFsaWQgPT4gJ3ZhbGlkJywKICAgICk7CiAgICBteSBAQ2FsZW5kYXJzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckxpc3QoCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICk7CgogICAgIyBjaGVjayBpZiB3ZSBmb3VuZCBzb21lCiAgICBpZiAoQENhbGVuZGFycykgewoKICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJzKSB7CiAgICAgICAgICAgICRQYXJhbXtDYWxlbmRhckRhdGF9LT57ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9IH0gPSB7CiAgICAgICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJOYW1lfSwKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAkQ2FsZW5kYXItPntDb2xvcn0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFwcG9pbnRtZW50IG9iamVjdAogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAgICAgbXkgQFZpZXdhYmxlQXBwb2ludG1lbnRzOwogICAgICAgIGZvciBteSAkQ2FsZW5kYXIgKEBDYWxlbmRhcnMpIHsKICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAVmlld2FibGVBcHBvaW50bWVudHMsIEBBcHBvaW50bWVudHM7CiAgICAgICAgfQoKICAgICAgICBpZiAoQFZpZXdhYmxlQXBwb2ludG1lbnRzKSB7CgogICAgICAgICAgICAjIHNvcnQgYnkgc3RhcnQgZGF0ZQogICAgICAgICAgICBAVmlld2FibGVBcHBvaW50bWVudHMgPSBzb3J0IHsgJGEtPntTdGFydFRpbWV9IGNtcCAkYi0+e1N0YXJ0VGltZX0gfSBAVmlld2FibGVBcHBvaW50bWVudHM7CgogICAgICAgICAgICBteSAkTGFzdERheSA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAVmlld2FibGVBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHNhdmUgdGltZSBzdGFtcHMgZm9yIGRpc3BsYXkgYmVmb3JlIGNhbGN1bGF0aW9uCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydERhdGV9ID0gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9ICAgPSAkQXBwb2ludG1lbnQtPntFbmRUaW1lfTsKCiAgICAgICAgICAgICAgICAjIGVuZCB0aW1lcyBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgYXJlIGluY2x1c2l2ZSwgc3VidHJhY3Qgd2hvbGUgZGF5CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgLT0gODY0MDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9ybWF0dGVkIGRhdGUvdGltZSBzdHJpbmdzIHVzZWQgaW4gZGlzcGxheQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnREYXRlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnREYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcgLiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gPyAnU2hvcnQnIDogJycgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcgLiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gPyAnU2hvcnQnIDogJycgKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGZvcm1hdHRlZCBub3RpZmljYXRpb24gZGF0ZSB1c2VkIGluIGRpc3BsYXkKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjdXQgdGhlIHRpbWUgcG9ydGlvbgogICAgICAgICAgICAgICAgJFBhcmFte1N0YXJ0RGF5fSA9IHN1YnN0ciggJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwgMCwgMTAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRMYXN0RGF5IG5lICRQYXJhbXtTdGFydERheX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FwcG9pbnRtZW50R3JvdXAnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnREYXkgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0U2hvcnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJExhc3REYXkgPyAnJyA6ICdGaXJzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJExhc3REYXkgPSAkUGFyYW17U3RhcnREYXl9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9ID0gJFBhcmFte1N0YXJ0RGF0ZX07CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kVGltZX0gICA9ICRQYXJhbXtFbmREYXRlfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcHBvaW50bWVudEFjdGlvblJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FwcG9pbnRtZW50Tm9EYXRhUm93JywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJzTm90Rm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBnZXQgcGFnZSBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCkgaWYgJFNlbGYtPntTdWJhY3Rpb259IG5lICdBSkFYRmlsdGVyVXBkYXRlJzsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRSaWNoVGV4dCAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwoKICAgIGlmICggJFJpY2hUZXh0ICYmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpBZG1pbjo6JFNlbGYtPntBY3Rpb259IiktPntSaWNoVGV4dH0gKSB7CiAgICAgICAgJFJpY2hUZXh0ID0gMDsKICAgIH0KCiAgICAjIHNldCB0eXBlIGZvciBub3RpZmljYXRpb25zCiAgICBteSAkQ29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICBpZiAoJFJpY2hUZXh0KSB7CiAgICAgICAgJENvbnRlbnRUeXBlID0gJ3RleHQvaHRtbCc7CiAgICB9CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50Jyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgZ2V0IHJlZ2lzdGVyZWQgdHJhbnNwb3J0IGxheWVycwogICAgbXkgJVJlZ2lzdGVyZWRUcmFuc3BvcnRzID0gJXsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0JykgfHwge30gfTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CgogICAgICAgICMgZ2V0IG5vdGlmaWNhdGlvbiBpZAogICAgICAgIG15ICRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIGRhdGEKICAgICAgICBteSAlRGF0YSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBSaWNoVGV4dCA9PiAkUmljaFRleHQsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZUFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgICAgIHF3KElEIE5hbWUgQ29tbWVudCBWYWxpZElEIEV2ZW50cyBUcmFuc3BvcnRzKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkgfHwgJyc7CiAgICAgICAgfQogICAgICAgIFBBUkFNRVRFUjoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgICAgIHF3KFJlY2lwaWVudHMgUmVjaXBpZW50QWdlbnRzIFJlY2lwaWVudEdyb3VwcyBSZWNpcGllbnRSb2xlcwogICAgICAgICAgICBFdmVudHMgQ2FsZW5kYXJJRCBUZWFtSUQgUmVzb3VyY2VJRCBUaXRsZSBMb2NhdGlvbgogICAgICAgICAgICBUcmFuc3BvcnRzIE9uY2VQZXJEYXkgU2VuZE9uT3V0T2ZPZmZpY2UKICAgICAgICAgICAgVmlzaWJsZUZvckFnZW50IFZpc2libGVGb3JBZ2VudFRvb2x0aXAgTGFuZ3VhZ2VJRCBBZ2VudEVuYWJsZWRCeURlZmF1bHQpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBEYXRhID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICBuZXh0IFBBUkFNRVRFUiBpZiAhQERhdGE7CiAgICAgICAgICAgICRHZXRQYXJhbXtEYXRhfS0+eyRQYXJhbWV0ZXJ9ID0gXEBEYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHN1YmplY3QgYW5kIGJvZHkgZm9yIGFsbCBsYW5ndWFnZXMKICAgICAgICBmb3IgbXkgJExhbmd1YWdlSUQgKCBAeyAkR2V0UGFyYW17RGF0YX0tPntMYW5ndWFnZUlEfSB9ICkgewoKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTGFuZ3VhZ2VJRCAuICdfU3ViamVjdCcgKSB8fCAnJzsKICAgICAgICAgICAgbXkgJEJvZHkgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTGFuZ3VhZ2VJRCAuICdfQm9keScgKSAgICB8fCAnJzsKCiAgICAgICAgICAgICRHZXRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfSA9IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAjIHNldCBzZXJ2ZXIgZXJyb3IgZmxhZyBpZiBmaWVsZCBpcyBlbXB0eQogICAgICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEJvZHkgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRMYW5ndWFnZUlEIC4gJ19Cb2R5U2VydmVyRXJyb3InIH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0cmFuc3BvcnQgc2V0dGluZ3MgdmFsdWVzCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVSZWdpc3RlcmVkVHJhbnNwb3J0cyApICkgewoKICAgICAgICAgICAgVFJBTlNQT1JUOgogICAgICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydCAoIHNvcnQga2V5cyAlUmVnaXN0ZXJlZFRyYW5zcG9ydHMgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0gKTsKICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICEkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9OwoKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9LCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyBzdHJpbmcgZnJvbSB0cmFuc3BvcnQgb2JqZWN0CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9ICktPlRyYW5zcG9ydFBhcmFtU2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlCiAgICAgICAgbXkgJE9rOwogICAgICAgIG15ICREdXBsaWNhdGVkRW50cnkgPSAwOwogICAgICAgIG15ICRFcnJvciAgICAgICAgICAgPSAwOwoKICAgICAgICAjIENoZWNrIGZvciAnQWRkaXRpb25hbCByZWNpcGllbnQnIGZpZWxkIHZhbHVlIGxlbmd0aC4KICAgICAgICBpZiAoICRHZXRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudEVtYWlsfSAmJiBsZW5ndGggJEdldFBhcmFte0RhdGF9LT57UmVjaXBpZW50RW1haWx9ID4gMjAwICkgewogICAgICAgICAgICAkR2V0UGFyYW17UmVjaXBpZW50RW1haWxTZXJ2ZXJFcnJvcn0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVHlwZX0gPSBbJ0FwcG9pbnRtZW50J107CgogICAgICAgICMgR2V0IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIG5vdGlmaWNhdGlvbnMgYW5kIGNoZWNrIGlmIGEgbm90aWZpY2F0aW9uIHdpdGggdGhlCiAgICAgICAgIyBzYW1lIG5hbWUgYW5kIGFub3RoZXIgdHlwZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UuCiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkxpc3QgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgRGV0YWlscyA9PiAxLAogICAgICAgICAgICBBbGwgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgTk9USUZJQ0FUSU9OSUQ6CiAgICAgICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoIHNvcnQga2V5cyAlTm90aWZpY2F0aW9uTGlzdCApIHsKCiAgICAgICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgISROb3RpZmljYXRpb25JRDsKICAgICAgICAgICAgbmV4dCBOT1RJRklDQVRJT05JRCBpZiAkR2V0UGFyYW17TmFtZX0gbmUgJE5vdGlmaWNhdGlvbkxpc3R7JE5vdGlmaWNhdGlvbklEfS0+e05hbWV9OwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEdldFBhcmFte05hbWV9IGVxICROb3RpZmljYXRpb25MaXN0eyROb3RpZmljYXRpb25JRH0tPntOYW1lfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte0lEfSBuZSAkTm90aWZpY2F0aW9uSUQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJER1cGxpY2F0ZWRFbnRyeSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISREdXBsaWNhdGVkRW50cnkgJiYgISRFcnJvciApIHsKICAgICAgICAgICAgJE9rID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25VcGRhdGUoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRPaykgewogICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KCk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnTm90aWZpY2F0aW9uIHVwZGF0ZWQhJykgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KE5hbWUgRXZlbnRzIFRyYW5zcG9ydHMpKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICROZWVkZWQgLiAiU2VydmVyRXJyb3IiIH0gPSAiIjsKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyROZWVkZWR9IGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJE5lZWRlZCAuICJTZXJ2ZXJFcnJvciIgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICBpZiAoJER1cGxpY2F0ZWRFbnRyeSkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICBJbmZvICAgICA9PiBUcmFuc2xhdGFibGUoJ05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzIScpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgICAgIFJpY2hUZXh0ID0+ICRSaWNoVGV4dCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICdBZGQnLAogICAgICAgICAgICBSaWNoVGV4dCA9PiAkUmljaFRleHQsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgICAgIHF3KE5hbWUgQ29tbWVudCBWYWxpZElEIEV2ZW50cyBUcmFuc3BvcnRzKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkgfHwgJyc7CiAgICAgICAgfQogICAgICAgIFBBUkFNRVRFUjoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgICAgIHF3KFJlY2lwaWVudHMgUmVjaXBpZW50QWdlbnRzIFJlY2lwaWVudFJvbGVzIFJlY2lwaWVudEdyb3VwcyBFdmVudHMKICAgICAgICAgICAgQ3VzdG9tZXJJRCBDdXN0b21lclVzZXJJRCBUcmFuc3BvcnRzIE9uY2VQZXJEYXkgU2VuZE9uT3V0T2ZPZmZpY2UKICAgICAgICAgICAgVmlzaWJsZUZvckFnZW50IFZpc2libGVGb3JBZ2VudFRvb2x0aXAgTGFuZ3VhZ2VJRCBBZ2VudEVuYWJsZWRCeURlZmF1bHQpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBEYXRhID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICBuZXh0IFBBUkFNRVRFUiBpZiAhQERhdGE7CiAgICAgICAgICAgICRHZXRQYXJhbXtEYXRhfS0+eyRQYXJhbWV0ZXJ9ID0gXEBEYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHN1YmplY3QgYW5kIGJvZHkgZm9yIGFsbCBsYW5ndWFnZXMKICAgICAgICBmb3IgbXkgJExhbmd1YWdlSUQgKCBAeyAkR2V0UGFyYW17RGF0YX0tPntMYW5ndWFnZUlEfSB9ICkgewoKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTGFuZ3VhZ2VJRCAuICdfU3ViamVjdCcgKSB8fCAnJzsKICAgICAgICAgICAgbXkgJEJvZHkgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTGFuZ3VhZ2VJRCAuICdfQm9keScgKSAgICB8fCAnJzsKCiAgICAgICAgICAgICRHZXRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfSA9IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAjIHNldCBzZXJ2ZXIgZXJyb3IgZmxhZyBpZiBmaWVsZCBpcyBlbXB0eQogICAgICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEJvZHkgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRMYW5ndWFnZUlEIC4gJ19Cb2R5U2VydmVyRXJyb3InIH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0cmFuc3BvcnQgc2V0dGluZ3MgdmFsdWVzCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVSZWdpc3RlcmVkVHJhbnNwb3J0cyApICkgewoKICAgICAgICAgICAgVFJBTlNQT1JUOgogICAgICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydCAoIHNvcnQga2V5cyAlUmVnaXN0ZXJlZFRyYW5zcG9ydHMgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0gKTsKICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICEkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9OwoKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9LCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyBzdHJpbmcgZnJvbSB0cmFuc3BvcnQgb2JqZWN0CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9ICktPlRyYW5zcG9ydFBhcmFtU2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkCiAgICAgICAgbXkgJElEOwogICAgICAgIG15ICREdXBsaWNhdGVkRW50cnkgPSAwOwogICAgICAgIG15ICRFcnJvciAgICAgICAgICAgPSAwOwoKICAgICAgICAjIENoZWNrIGZvciAnQWRkaXRpb25hbCByZWNpcGllbnQnIGZpZWxkIHZhbHVlIGxlbmd0aC4KICAgICAgICBpZiAoICRHZXRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudEVtYWlsfSAmJiBsZW5ndGggJEdldFBhcmFte0RhdGF9LT57UmVjaXBpZW50RW1haWx9ID4gMjAwICkgewogICAgICAgICAgICAkR2V0UGFyYW17UmVjaXBpZW50RW1haWxTZXJ2ZXJFcnJvcn0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVHlwZX0gPSBbJ0FwcG9pbnRtZW50J107CgogICAgICAgICMgR2V0IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIG5vdGlmaWNhdGlvbnMgYW5kIGNoZWNrIGlmIGEgbm90aWZpY2F0aW9uIHdpdGggdGhlCiAgICAgICAgIyBzYW1lIG5hbWUgYW5kIGFub3RoZXIgdHlwZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UuCiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkxpc3QgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgRGV0YWlscyA9PiAxLAogICAgICAgICAgICBBbGwgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgTk9USUZJQ0FUSU9OSUQ6CiAgICAgICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoIHNvcnQga2V5cyAlTm90aWZpY2F0aW9uTGlzdCApIHsKCiAgICAgICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgISROb3RpZmljYXRpb25JRDsKICAgICAgICAgICAgbmV4dCBOT1RJRklDQVRJT05JRCBpZiAkR2V0UGFyYW17TmFtZX0gbmUgJE5vdGlmaWNhdGlvbkxpc3R7JE5vdGlmaWNhdGlvbklEfS0+e05hbWV9OwoKICAgICAgICAgICAgJER1cGxpY2F0ZWRFbnRyeSA9IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkRHVwbGljYXRlZEVudHJ5ICYmICEkRXJyb3IgKSB7CiAgICAgICAgICAgICRJRCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uQWRkKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRHZXRQYXJhbXtEYXRhfS0+e1RyYW5zcG9ydHN9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17VHJhbnNwb3J0U2VydmVyRXJyb3J9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICB9CgogICAgICAgIGlmICgkSUQpIHsKICAgICAgICAgICAgJFNlbGYtPl9PdmVydmlldygpOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ05vdGlmaWNhdGlvbiBhZGRlZCEnKSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBFdmVudHMgVHJhbnNwb3J0cykpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJE5lZWRlZCAuICJTZXJ2ZXJFcnJvciIgfSA9ICIiOwogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JE5lZWRlZH0gZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTmVlZGVkIC4gIlNlcnZlckVycm9yIiB9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgIGlmICgkRHVwbGljYXRlZEVudHJ5KSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CiAgICAgICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICdBZGQnLAogICAgICAgICAgICAgICAgUmljaFRleHQgPT4gJFJpY2hUZXh0LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhJRCkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uRGVsZXRlKAogICAgICAgICAgICBJRCAgICAgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISREZWxldGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE5vdGlmaWNhdGlvbkV4cG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ05vdGlmaWNhdGlvbkV4cG9ydCcgKSB7CgogICAgICAgIG15ICROb3RpZmljYXRpb25JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKICAgICAgICBteSAkTm90aWZpY2F0aW9uRGF0YTsKICAgICAgICBteSAlTm90aWZpY2F0aW9uU2luZ2xlRGF0YTsKICAgICAgICBteSAkRmlsZW5hbWUgPSAnRXhwb3J0X05vdGlmaWNhdGlvbi55bWwnOwoKICAgICAgICBpZiAoJE5vdGlmaWNhdGlvbklEKSB7CgogICAgICAgICAgICAlTm90aWZpY2F0aW9uU2luZ2xlRGF0YSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgSUQgICAgID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVOb3RpZmljYXRpb25TaW5nbGVEYXRhICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnVGhlcmUgd2FzIGFuIGVycm9yIGdldHRpbmcgZGF0YSBmb3IgTm90aWZpY2F0aW9uIHdpdGggSUQ6JXMhJywgJE5vdGlmaWNhdGlvbklEICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uTmFtZSA9ICROb3RpZmljYXRpb25TaW5nbGVEYXRhe05hbWV9OwogICAgICAgICAgICAkTm90aWZpY2F0aW9uTmFtZSA9fiBze1teYS16QS1aMC05LV9dfXtffXhtc2c7ICAgICMgY2xlYW51cCBuYW1lIGZvciBzYXZpbmcKCiAgICAgICAgICAgICRGaWxlbmFtZSAgICAgICAgID0gJ0V4cG9ydF9Ob3RpZmljYXRpb25fJyAuICROb3RpZmljYXRpb25OYW1lIC4gJy55bWwnOwogICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0YSA9IFsgXCVOb3RpZmljYXRpb25TaW5nbGVEYXRhIF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgbXkgJU5vdGlmaWNhdGlvbmRldGFpbHMgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERldGFpbHMgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBEYXRhOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQga2V5cyAlTm90aWZpY2F0aW9uZGV0YWlscyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQERhdGEsICROb3RpZmljYXRpb25kZXRhaWxzeyRJdGVtSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRhID0gXEBEYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBjb252ZXJ0IHRoZSBOb3RpZmljYXRpb24gZGF0YSBoYXNoIHRvIHN0cmluZwogICAgICAgIG15ICROb3RpZmljYXRpb25EYXRhWUFNTCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpZQU1MJyktPkR1bXAoIERhdGEgPT4gJE5vdGlmaWNhdGlvbkRhdGEgKTsKCiAgICAgICAgIyBzZW5kIHRoZSByZXN1bHQgdG8gdGhlIGJyb3dzZXIKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkTm90aWZpY2F0aW9uRGF0YVlBTUwsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBOb3RpZmljYXRpb25Db3B5CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTm90aWZpY2F0aW9uQ29weScgKSB7CgogICAgICAgIG15ICROb3RpZmljYXRpb25JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgTm90aWZpY2F0aW9uIGRhdGEKICAgICAgICBteSAlTm90aWZpY2F0aW9uRGF0YSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlTm90aWZpY2F0aW9uRGF0YSApICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1Vua25vd24gTm90aWZpY2F0aW9uICVzIScsICROb3RpZmljYXRpb25JRCApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IE5vdGlmaWNhdGlvbiBuYW1lCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbk5hbWUgPQogICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0YXtOYW1lfQogICAgICAgICAgICAuICcgKCcKICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NvcHknKQogICAgICAgICAgICAuICcpJzsKCiAgICAgICAgIyBvdGhlcndpc2Ugc2F2ZSBjb25maWd1cmF0aW9uIGFuZCByZXR1cm4gdG8gb3ZlcnZpZXcgc2NyZWVuCiAgICAgICAgbXkgJE5ld05vdGlmaWNhdGlvbklEID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25BZGQoCiAgICAgICAgICAgICVOb3RpZmljYXRpb25EYXRhLAogICAgICAgICAgICBOYW1lICAgPT4gJE5vdGlmaWNhdGlvbk5hbWUsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVycm9yIGlmIGNhbid0IGNyZWF0ZQogICAgICAgIGlmICggISROZXdOb3RpZmljYXRpb25JRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoIlRoZXJlIHdhcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgTm90aWZpY2F0aW9uIiksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiB0byBvdmVydmlldwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBOb3RpZmljYXRpb25JbXBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdOb3RpZmljYXRpb25JbXBvcnQnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkRm9ybUlEICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApIHx8ICcnOwogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+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+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+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/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgIG15ICRPVFJTQnVzaW5lc3NPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpPVFJTQnVzaW5lc3MnKTsKICAgIG15ICRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZCA9ICRPVFJTQnVzaW5lc3NPYmplY3QtPk9UUlNCdXNpbmVzc0lzSW5zdGFsbGVkKCk7CgogICAgIyBUaGlyZCBvcHRpb24gaXMgZW5hYmxlZCBvbmx5IHdoZW4gT1RSU0J1c2luZXNzIGlzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgogICAgJFBhcmFte1Zpc2libGVGb3JBZ2VudFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzEnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJzInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gVHJhbnNsYXRhYmxlKCdZZXMsIGJ1dCByZXF1aXJlIGF0IGxlYXN0IG9uZSBhY3RpdmUgbm90aWZpY2F0aW9uIG1ldGhvZC4nKSwKICAgICAgICAgICAgICAgIERpc2FibGVkID0+ICRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZCA/IDAgOiAxLAogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBOYW1lICAgICAgID0+ICdWaXNpYmxlRm9yQWdlbnQnLAogICAgICAgIFNvcnQgICAgICAgPT4gJ051bWVyaWNLZXknLAogICAgICAgIFNpemUgICAgICAgPT4gMSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWaXNpYmxlRm9yQWdlbnR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNTBwYycsCiAgICApOwoKICAgICMgaW5jbHVkZSByZWFkLW9ubHkgYXR0cmlidXRlCiAgICBpZiAoICEkUGFyYW17VmlzaWJsZUZvckFnZW50fSApIHsKICAgICAgICAkUGFyYW17VmlzaWJsZUZvckFnZW50VG9vbHRpcFJlYWRvbmx5fSA9ICdyZWFkb25seT0icmVhZG9ubHkiJzsKICAgIH0KCiAgICAjIGdldCByZWdpc3RlcmVkIHRyYW5zcG9ydCBsYXllcnMKICAgIG15ICVSZWdpc3RlcmVkVHJhbnNwb3J0cyA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQXBwb2ludG1lbnROb3RpZmljYXRpb246OlRyYW5zcG9ydCcpIHx8IHt9IH07CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVSZWdpc3RlcmVkVHJhbnNwb3J0cyApICkgewoKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgIFRSQU5TUE9SVDoKICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydCAoCiAgICAgICAgICAgIHNvcnQgeyAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JGF9LT57UHJpb30gPD0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skYn0tPntQcmlvfSB9CiAgICAgICAgICAgIGtleXMgJVJlZ2lzdGVyZWRUcmFuc3BvcnRzCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TW9kdWxlfTsKCiAgICAgICAgICAgICMgdHJhbnNwb3J0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lID0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e05hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9LCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgICAgICMgYmFja2VuZCBmb3IgdGhpcyB0cmFuc3BvcnQgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93RGlzYWJsZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgID0+ICRUcmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBpZiBub3Qgc3RhbmRhcmQgdHJhbnNwb3J0CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntJc09UUlNCdXNpbmVzc1RyYW5zcG9ydH0KICAgICAgICAgICAgICAgICAgICAmJiAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntJc09UUlNCdXNpbmVzc1RyYW5zcG9ydH0gZXEgJzEnCiAgICAgICAgICAgICAgICAgICAgJiYgISRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgIyB0cmFuc3BvcnQKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRUcmFuc3BvcnRDaGVja2VkID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJFBhcmFte0RhdGF9LT57VHJhbnNwb3J0c30gfSApIHsKICAgICAgICAgICAgICAgICAgICAkVHJhbnNwb3J0Q2hlY2tlZCA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZXQgRW1haWwgdHJhbnNwb3J0IHNlbGVjdGVkIG9uIGFkZCBzY3JlZW4KICAgICAgICAgICAgICAgIGlmICggJFRyYW5zcG9ydCBlcSAnRW1haWwnICYmICEkUGFyYW17SUR9ICkgewogICAgICAgICAgICAgICAgICAgICRUcmFuc3BvcnRDaGVja2VkID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCB0cmFuc3BvcnQgc2V0dGluZ3Mgc3RyaW5nIGZyb20gdHJhbnNwb3J0IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFRyYW5zcG9ydFNldHRpbmdzID0KICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+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
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkFzeW5jaHJvbm91c0V4ZWN1dG9yKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBDZXJ0YWluIHNlYXJjaCBwYXJhbWV0ZXJzIGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIHNob3VsZCBiZSBzdG9yZWQgYXMgc2NhbGFycywgbm90IGFycmF5IHJlZnMuCiAgICAkU2VsZi0+e1NlYXJjaFBhcmFtU2NhbGFyfSA9IFsgJ0Zyb20nLCAnVG8nLCAnQ2MnLCAnU3ViamVjdCcsICdCb2R5JywgJ0F0dGFjaG1lbnROYW1lJyBdOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBuYW1lcyBvZiBhbGwgcGFyYW1ldGVycwogICAgbXkgQFBhcmFtTmFtZXMgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIFBBUkFNTkFNRToKICAgIGZvciBteSAkS2V5IChAUGFyYW1OYW1lcykgewoKICAgICAgICAjIFF1ZXVlLCBPd25lcklEcyBhbmQgUmVzcG9uc2libGVJRHMgYXJlIG11bHRpcGxlIHNlbGVjdGlvbiBmaWVsZHMsIGdldCBhcnJheSBpbnN0ZWFkLgogICAgICAgIGlmICgKICAgICAgICAgICAgJEtleSA9fiAvXlF1ZXVlSURfLwogICAgICAgICAgICB8fCAkS2V5ID1+IC9eU2VhcmNoUGFyYW1fWzAtOWEtZl0rX093bmVySURzJC8KICAgICAgICAgICAgfHwgJEtleSA9fiAvXlNlYXJjaFBhcmFtX1swLTlhLWZdK19SZXNwb25zaWJsZUlEcyQvCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBQYXJhbUFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSBcQFBhcmFtQXJyYXk7CiAgICAgICAgICAgIG5leHQgUEFSQU1OQU1FOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgIG15ICRMYXlvdXRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgICMgR2V0IHVzZXIncyBwZXJtaXNzaW9ucyB0byBhc3NvY2lhdGVkIG1vZHVsZXMgd2hpY2ggYXJlIGRpc3BsYXllZCBhcyBsaW5rcy4KICAgIGZvciBteSAkTW9kdWxlIChxdyhBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyBBZ2VudEFwcG9pbnRtZW50SW1wb3J0KSkgewogICAgICAgIG15ICRNb2R1bGVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKQogICAgICAgICAgICAtPnskTW9kdWxlfS0+e0dyb3VwfSAvLyBbXTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1vZHVsZUdyb3VwcykgKSB7CiAgICAgICAgICAgIE1PRFVMRV9HUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRNb2R1bGVHcm91cCAoIEB7JE1vZHVsZUdyb3Vwc30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJE1vZHVsZUdyb3VwXSJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtNb2R1bGVQZXJtaXNzaW9uc30tPnskTW9kdWxlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBNT0RVTEVfR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWx3YXlzIGFsbG93IGxpbmtzIGlmIG5vIGdyb3VwcyBhcmUgc3BlY2lmaWVkLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTmV3JyApIHsKCiAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoKTsKICAgICAgICBteSAkQ29sb3JQYWxldHRlICAgICAgID0gJFNlbGYtPl9Db2xvclBhbGV0dGVHZXQoKTsKICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCgpOwogICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgQ29sb3JQYWxldHRlID0+ICRDb2xvclBhbGV0dGUsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gJFZhbGlkU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdTdG9yZU5ldycsCiAgICAgICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJENvbG9yUGFsZXR0ZS0+WyBpbnQgcmFuZCggc2NhbGFyIEB7JENvbG9yUGFsZXR0ZX0gKSBdLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQWRkIG5ldyBDYWxlbmRhcicpLAogICAgICAgICAgICAgICAgV2lkZ2V0U3RhdHVzID0+ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIGNoZWNrIG5hbWUKICAgICAgICBpZiAoICEkR2V0UGFyYW17Q2FsZW5kYXJOYW1lfSApIHsKICAgICAgICAgICAgJEVycm9yeydDYWxlbmRhck5hbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBjYWxlbmRhciB3aXRoIHNhbWUgbmFtZQogICAgICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICRHZXRQYXJhbXtDYWxlbmRhck5hbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVDYWxlbmRhcikgewogICAgICAgICAgICAgICAgJEVycm9ye0NhbGVuZGFyTmFtZUludmFsaWR9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgICAgICRFcnJvcntDYWxlbmRhck5hbWVFeGlzdHN9ICA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9ID0gJFNlbGYtPl9HZXRUaWNrZXRBcHBvaW50bWVudFBhcmFtcyglR2V0UGFyYW0pOwoKICAgICAgICAjIEdldCBxdWV1ZSBjcmVhdGUgcGVybWlzc2lvbnMgZm9yIHRoZSB1c2VyLgogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFZhbGlkSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICAgICAjIFF1ZXVlIGZpZWxkIGluIHRpY2tldCBhcHBvaW50bWVudHMgaXMgbWFuZGF0b3J5LCBjaGVjayBpZiBpdCdzIHByZXNlbnQgYW5kIHZhbGlkLgogICAgICAgIGZvciBteSAkUnVsZSAoIEB7ICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9IH0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUnVsZS0+e1F1ZXVlSUR9ICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFJ1bGUtPntRdWV1ZUlEfSApICkgewoKICAgICAgICAgICAgICAgIFFVRVVFX0lEOgogICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBAeyAkUnVsZS0+e1F1ZXVlSUR9IHx8IFtdIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgIWdyZXAgeyAkXyBlcSAkUXVldWVEYXRhe1ZhbGlkSUR9IH0gQFZhbGlkSURzCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH0tPntRdWV1ZUlESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFFVRVVFX0lEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH0tPntRdWV1ZUlESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdldCBzZWxlY3Rpb25zCiAgICAgICAgICAgIG15ICRHcm91cFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X0dyb3VwU2VsZWN0aW9uR2V0KCVHZXRQYXJhbSk7CiAgICAgICAgICAgIG15ICRDb2xvclBhbGV0dGUgICAgICAgPSAkU2VsZi0+X0NvbG9yUGFsZXR0ZUdldCgpOwogICAgICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCglR2V0UGFyYW0pOwogICAgICAgICAgICBteSAlVGlja2V0QXBwb2ludG1lbnRzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudHMoKTsKCiAgICAgICAgICAgICMgZ2V0IHJ1bGUgY291bnQKICAgICAgICAgICAgbXkgJFJ1bGVDb3VudCA9IHNjYWxhciBAeyAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIENvbG9yUGFsZXR0ZSA9PiAkQ29sb3JQYWxldHRlLAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdTdG9yZU5ldycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQWRkIG5ldyBDYWxlbmRhcicpLAogICAgICAgICAgICAgICAgICAgIFdpZGdldFN0YXR1cyA9PiAkUnVsZUNvdW50ID8gJ0V4cGFuZGVkJyA6ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgICAgICVUaWNrZXRBcHBvaW50bWVudHMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTaG93IGFsbCB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZSBibG9ja3MuCiAgICAgICAgICAgIG15ICRSdWxlTnVtYmVyID0gMTsKICAgICAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICRSdWxlLT57RXJyb3J9ID0gJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfTsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFJ1bGUgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cyggJXskUnVsZX0gKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50UnVsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJ1bGVOdW1iZXIgPT4gJFJ1bGVOdW1iZXIrKywKICAgICAgICAgICAgICAgICAgICAgICAgJXskUnVsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXRBcHBvaW50bWVudFJ1bGUsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBTaG93IGFueSBzZWFyY2ggcGFyYW1ldGVyIGJsb2NrcyB0b28uCiAgICAgICAgICAgICAgICAkU2VsZi0+X1Nob3dUaWNrZXRBcHBvaW50bWVudFBhcmFtcyggJXskUnVsZX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFzayglUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgY2FsZW5kYXIKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJUNhbGVuZGFyICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBQcm9jZXNzIHRpY2tldCBhcHBvaW50bWVudHMgaW4gYXN5bmMgY2FsbCB0byBjb3JlIG1vZHVsZSBtZXRob2QuCiAgICAgICAgJFNlbGYtPkFzeW5jQ2FsbCgKICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSAgID0+ICdUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcicsCiAgICAgICAgICAgIEZ1bmN0aW9uUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXQnICkgewoKICAgICAgICAjIGdldCBkYXRhCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICRHZXRQYXJhbXtDYWxlbmRhcklEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDYWxlbmRhcklEJyApIHx8ICcnOwoKICAgICAgICBpZiAoICEkR2V0UGFyYW17Q2FsZW5kYXJJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDYWxlbmRhcklEIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2FsZW5kYXIgZGF0YQogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEdldFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICElQ2FsZW5kYXIgKSB7CgogICAgICAgICAgICAjIGZha2UgbWVzc2FnZQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZWxlY3Rpb25zCiAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoJUNhbGVuZGFyKTsKICAgICAgICBteSAkQ29sb3JQYWxldHRlICAgICAgID0gJFNlbGYtPl9Db2xvclBhbGV0dGVHZXQoKTsKICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCglQ2FsZW5kYXIpOwogICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICBteSAkUnVsZUNvdW50ID0gc2NhbGFyIEB7ICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9IHx8IFtdIH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVDYWxlbmRhciwKICAgICAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBDb2xvclBhbGV0dGUgPT4gJENvbG9yUGFsZXR0ZSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gICAgPT4gJ1VwZGF0ZScsCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdFZGl0IENhbGVuZGFyJyksCiAgICAgICAgICAgICAgICBSdWxlQ291bnQgICAgPT4gJFJ1bGVDb3VudCwKICAgICAgICAgICAgICAgIFdpZGdldFN0YXR1cyA9PiAkUnVsZUNvdW50ID8gJ0V4cGFuZGVkJyA6ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFNob3cgYWxsIHRpY2tldCBhcHBvaW50bWVudCBydWxlIGJsb2Nrcy4KICAgICAgICBteSAkUnVsZU51bWJlciA9IDE7CiAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50UnVsZSA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRzKCAleyRSdWxlfSApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50UnVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBSdWxlTnVtYmVyID0+ICRSdWxlTnVtYmVyKyssCiAgICAgICAgICAgICAgICAgICAgJXskUnVsZX0sCiAgICAgICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50UnVsZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNob3cgYW55IHNlYXJjaCBwYXJhbWV0ZXIgYmxvY2tzIHRvby4KICAgICAgICAgICAgJFNlbGYtPl9TaG93VGlja2V0QXBwb2ludG1lbnRQYXJhbXMoICV7JFJ1bGV9ICk7CgogICAgICAgICAgICAjIGluaXRpYWxpemUgYnV0dG9uIGJlaGF2aW9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRSdWxlSW5pdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRSdWxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZScgKSB7CgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBDYWxlbmRhck5hbWUgQ29sb3IgR3JvdXBJRCkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyAkTmVlZGVkIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwoKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2soICVQYXJhbSwgJUdldFBhcmFtLCAlRXJyb3IgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgY2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJEdldFBhcmFte0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWxlbmRhcntDYWxlbmRhcklEfSAmJiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gIT0gJEdldFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICAgICAkRXJyb3J7Q2FsZW5kYXJOYW1lSW52YWxpZH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAkRXJyb3J7Q2FsZW5kYXJOYW1lRXhpc3RzfSAgPSAxOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gPSAkU2VsZi0+X0dldFRpY2tldEFwcG9pbnRtZW50UGFyYW1zKCVHZXRQYXJhbSk7CgogICAgICAgICMgR2V0IHF1ZXVlIGNyZWF0ZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHVzZXIuCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgUXVldWUgZmllbGQgaW4gdGlja2V0IGFwcG9pbnRtZW50cyBpcyBtYW5kYXRvcnksIGNoZWNrIGlmIGl0J3MgcHJlc2VudCBhbmQgdmFsaWQuCiAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRSdWxlLT57UXVldWVJRH0gJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkUnVsZS0+e1F1ZXVlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgUVVFVUVfSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IEB7ICRSdWxlLT57UXVldWVJRH0gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhZ3JlcCB7ICRfIGVxICRRdWV1ZURhdGF7VmFsaWRJRH0gfSBAVmFsaWRJRHMKICAgICAgICAgICAgICAgICAgICAgICAgfHwgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfS0+e1F1ZXVlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUVVFVUVfSUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfS0+e1F1ZXVlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2V0IHNlbGVjdGlvbnMKICAgICAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoJUdldFBhcmFtKTsKICAgICAgICAgICAgbXkgJENvbG9yUGFsZXR0ZSAgICAgICA9ICRTZWxmLT5fQ29sb3JQYWxldHRlR2V0KCk7CiAgICAgICAgICAgIG15ICRWYWxpZFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X1ZhbGlkU2VsZWN0aW9uR2V0KCVHZXRQYXJhbSk7CiAgICAgICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICAgICAgbXkgJFJ1bGVDb3VudCA9IHNjYWxhciBAeyAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIENvbG9yUGFsZXR0ZSA9PiAkQ29sb3JQYWxldHRlLAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0VkaXQgQ2FsZW5kYXInKSwKICAgICAgICAgICAgICAgICAgICBSdWxlQ291bnQgICAgPT4gJFJ1bGVDb3VudCwKICAgICAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2hvdyBhbGwgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgYmxvY2tzLgogICAgICAgICAgICBteSAkUnVsZU51bWJlciA9IDE7CiAgICAgICAgICAgIGZvciBteSAkUnVsZSAoIEB7ICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9IHx8IFtdIH0gKSB7CiAgICAgICAgICAgICAgICAkUnVsZS0+e0Vycm9yfSA9ICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH07CiAgICAgICAgICAgICAgICBteSAlVGlja2V0QXBwb2ludG1lbnRSdWxlID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudHMoICV7JFJ1bGV9ICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudFJ1bGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSdWxlTnVtYmVyID0+ICRSdWxlTnVtYmVyKyssCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFJ1bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRSdWxlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2hvdyBhbnkgc2VhcmNoIHBhcmFtZXRlciBibG9ja3MgdG9vLgogICAgICAgICAgICAgICAgJFNlbGYtPl9TaG93VGlja2V0QXBwb2ludG1lbnRQYXJhbXMoICV7JFJ1bGV9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2soJVBhcmFtKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGNhbGVuZGFyCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50cyBpbiBhc3luYyBjYWxsIHRvIGNvcmUgbW9kdWxlIG1ldGhvZC4KICAgICAgICAkU2VsZi0+QXN5bmNDYWxsKAogICAgICAgICAgICBPYmplY3ROYW1lICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICAgICAgICAgRnVuY3Rpb25OYW1lICAgPT4gJ1RpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyJywKICAgICAgICAgICAgRnVuY3Rpb25QYXJhbXMgPT4gewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2FsZW5kYXJJbXBvcnQnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCB0aGUgdXBsb2FkZWQgZmlsZSBjb250ZW50CiAgICAgICAgbXkgJEZvcm1JRCAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKSB8fCAnJzsKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICk7CiAgICAgICAgbXkgJENvbnRlbnQgPSAkVXBsb2FkU3R1ZmZ7Q29udGVudH07CgogICAgICAgICMgY2hlY2sgZm9yIG92ZXJ3cml0aW5nIG9wdGlvbgogICAgICAgIG15ICRPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ092ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXMnICkgfHwgMDsKCiAgICAgICAgIyBleHRyYWN0IHRoZSB0ZWFtIGRhdGEgZnJvbSB0aGUgdXBsb2FkZWQgZmlsZQogICAgICAgIG15ICRDYWxlbmRhckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpLT5Mb2FkKCBEYXRhID0+ICRDb250ZW50ICk7CiAgICAgICAgaWYgKCByZWYgJENhbGVuZGFyRGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCJDb3VsZG4ndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4iKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaW1wb3J0IHRoZSBjYWxlbmRhcgogICAgICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckltcG9ydCgKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJEYXRhLAogICAgICAgICAgICBPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0+ICRPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmeU1lc3NhZ2V9ID0gewogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZnlNZXNzYWdlfSA9IHsKICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDYWxlbmRhciBpbXBvcnRlZCEnKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICVQYXJhbSA9ICRTZWxmLT5fT3ZlcnZpZXcoJVBhcmFtKTsKICAgIH0KCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2FsZW5kYXJFeHBvcnQnICkgewoKICAgICAgICAjIGNoZWNrIGZvciBDYWxlbmRhcklECiAgICAgICAgbXkgJENhbGVuZGFySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2FsZW5kYXJJRCcgKSB8fCAnJzsKICAgICAgICBpZiAoICEkQ2FsZW5kYXJJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgQ2FsZW5kYXJJRCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNhbGVuZGFyIGRhdGEKICAgICAgICBteSAlQ2FsZW5kYXJEYXRhID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckV4cG9ydCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlQ2FsZW5kYXJEYXRhICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjb252ZXJ0IHRoZSBjYWxlbmRhciBkYXRhIGhhc2ggdG8gc3RyaW5nCiAgICAgICAgbXkgJENhbGVuZGFyRGF0YVlBTUwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpLT5EdW1wKCBEYXRhID0+IFwlQ2FsZW5kYXJEYXRhICk7CgogICAgICAgICMgcHJlcGFyZSBjYWxlbmRhciBuYW1lIHRvIGJlIHBhcnQgb2YgdGhlIGZpbGVuYW1lCiAgICAgICAgbXkgJENhbGVuZGFyTmFtZSA9ICRDYWxlbmRhckRhdGF7Q2FsZW5kYXJEYXRhfS0+e0NhbGVuZGFyTmFtZX07CiAgICAgICAgJENhbGVuZGFyTmFtZSA9fiBzL1xzKy9fL2c7CgogICAgICAgICMgc2VuZCB0aGUgcmVzdWx0IHRvIHRoZSBicm93c2VyCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJENhbGVuZGFyRGF0YVlBTUwsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydF9DYWxlbmRhcl8nIC4gJENhbGVuZGFyTmFtZSAuICcueW1sJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbXBvcnRBcHBvaW50bWVudHNTdWNjZXNzJyApIHx8ICcnICkgewogICAgICAgICAgICAkUGFyYW17Tm90aWZ5TWVzc2FnZX0gPSB7CiAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLicsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvdW50JyApIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICkgIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICVQYXJhbSA9ICRTZWxmLT5fT3ZlcnZpZXcoJVBhcmFtKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPl9NYXNrKCVQYXJhbSk7Cn0KCnN1YiBfT3ZlcnZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICAjIGdldCBhbGwgY2FsZW5kYXJzIHVzZXIgaGFzIFJXIGFjY2VzcyB0bwogICAgbXkgQENhbGVuZGFycyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3J3JywKICAgICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDYWxlbmRhckZpbHRlcicsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdDYWxlbmRhcnMnKSwKICAgICAgICB9LAogICAgKTsKCiAgICAkUGFyYW17VmFsaWRDb3VudH0gPSAwOwogICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFycykgewoKICAgICAgICAjIGdyb3VwIG5hbWUKICAgICAgICAkQ2FsZW5kYXItPntHcm91cH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJENhbGVuZGFyLT57R3JvdXBJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyB2YWxpZCB0ZXh0CiAgICAgICAgJENhbGVuZGFyLT57VmFsaWR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgICAgICBWYWxpZElEID0+ICRDYWxlbmRhci0+e1ZhbGlkSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQ2FsZW5kYXItPntWYWxpZElEfSA9PSAxICkgewogICAgICAgICAgICAkUGFyYW17VmFsaWRDb3VudH0rKzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFjY2VzcyB0b2tlbnMKICAgICAgICAkQ2FsZW5kYXItPntBY2Nlc3NUb2tlbn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldEFjY2Vzc1Rva2VuKAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VyTG9naW4gID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JENhbGVuZGFyfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggc2NhbGFyIEBDYWxlbmRhcnMgPT0gMCApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJOb0RhdGFSb3cnLAogICAgICAgICk7CiAgICB9CiAgICAkUGFyYW17T3ZlcnZpZXd9ID0gMTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNYWluQWN0aW9ucycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uSW1wb3J0JyApOwoKICAgIHJldHVybiAlUGFyYW07Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IHBhZ2UKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgIGlmICggJFBhcmFte05vdGlmeU1lc3NhZ2V9ICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAleyAkUGFyYW17Tm90aWZ5TWVzc2FnZX0gfSwKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0VkaXQgQ2FsZW5kYXInKSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dyb3VwU2VsZWN0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCBvZiBncm91cHMgd2hlcmUgdXNlciBoYXMgUlcgcGVybWlzc2lvbnMKICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CgogICAgbXkgJEdyb3VwU2VsZWN0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlR3JvdXBMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ0dyb3VwSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0dyb3VwSUR9IHx8ICcnLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICApOwoKICAgIHJldHVybiAkR3JvdXBTZWxlY3Rpb247Cn0KCnN1YiBfQ29sb3JQYWxldHRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29sb3IgcGFsZXR0ZQogICAgbXkgJENhbGVuZGFyQ29sb3JzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckNvbG9ycycpIHx8IFsKICAgICAgICAnIzAwMDAwMCcsICcjMUUxRTFFJywgJyMzQTNBM0EnLCAnIzU0NTQ1MycsICcjNkU2RTZFJywgJyM4Nzg2ODcnLCAnIzg4ODc4NycsICcjQTA5RkEwJywKICAgICAgICAnI0I4QjhCOCcsICcjRDBEMEQwJywgJyNFOEU4RTgnLCAnI0ZGRkZGRicsICcjODkxMTAwJywgJyM4OTQ4MDAnLCAnIzg4ODUwMScsICcjNDU4NDAxJywKICAgICAgICAnIzAyODQwMScsICcjMDE4NDQ4JywgJyMwMDg2ODgnLCAnIzAwNEE4OCcsICcjMDAxODg4JywgJyM0OTFBODgnLCAnIzg5MUU4OCcsICcjODkxNjQ4JywKICAgICAgICAnI0ZGMjEwMScsICcjRkY4ODAyJywgJyNGRkZBMDMnLCAnIzgzRjkwMicsICcjMDVGODAyJywgJyMwM0Y5ODcnLCAnIzAwRkRGRicsICcjMDA4Q0ZGJywKICAgICAgICAnIzAwMkVGRicsICcjODkzMUZGJywgJyNGRjM5RkYnLCAnI0ZGMjk4NycsICcjRkY3MjZFJywgJyNGRkNFNkUnLCAnI0ZGRkI2RCcsICcjQ0VGQTZFJywKICAgICAgICAnIzY4Rjk2RScsICcjNjhGREZGJywgJyM2OEZCRDAnLCAnIzZBQ0ZGRicsICcjNkU3NkZGJywgJyNEMjc4RkYnLCAnI0ZGN0FGRicsICcjRkY3RkQzJywKICAgIF07CgogICAgcmV0dXJuICRDYWxlbmRhckNvbG9yczsKfQoKc3ViIF9WYWxpZFNlbGVjdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVWYWxpZCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICRWYWxpZFNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIElEICAgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VmFsaWRJRH0gfHwgMSwKICAgICAgICBUaXRsZSAgICAgID0+IFRyYW5zbGF0YWJsZSgiVmFsaWQiKSwKICAgICk7CgogICAgcmV0dXJuICRWYWxpZFNlbGVjdGlvbjsKfQoKc3ViIF9Vc2VyU2VsZWN0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoKTsKCiAgICBteSAkVXNlclNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiBcJVVzZXJMaXN0LAogICAgICAgIE5hbWUgPT4gKCAkUGFyYW17UnVsZUlEfSAmJiAkUGFyYW17UGFyYW1OYW1lfSApCiAgICAgICAgPyAnU2VhcmNoUGFyYW1fJyAuICRQYXJhbXtSdWxlSUR9IC4gJ18nIC4gJFBhcmFte1BhcmFtTmFtZX0KICAgICAgICA6ICdTZWFyY2hQYXJhbVVzZXInLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBDbGFzcyAgICAgID0+ICdTZWFyY2hQYXJhbSBNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1BhcmFtVmFsdWV9IHx8IFtdLAogICAgKTsKCiAgICAjIEFkZCBwYXJhbSBuYW1lIGFzIGRhdGEgYXR0cmlidXRlIGZvciBsYXRlciByZWZlcmVuY2UgaW4gSlMuCiAgICBpZiAoICRQYXJhbXtQYXJhbU5hbWV9ICkgewogICAgICAgICRVc2VyU2VsZWN0aW9uID1+IHMvPHNlbGVjdC88c2VsZWN0IGRhdGEtcGFyYW09IiRQYXJhbXtQYXJhbU5hbWV9Ii87CiAgICB9CgogICAgcmV0dXJuICRVc2VyU2VsZWN0aW9uOwp9CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGZpZWxkIGlkIHN1ZmZpeAogICAgbXkgJEZpZWxkSUQgPSAnJzsKICAgIGlmICggJFBhcmFte1J1bGVJRH0gKSB7CiAgICAgICAgJEZpZWxkSUQgPSAnXycgLiAkUGFyYW17UnVsZUlEfTsKICAgIH0KCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRzOwoKICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICApOwoKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCgpOwogICAgbXkgJUF2YWlsYWJsZVF1ZXVlczsKCiAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgIFFVRVVFSUQ6CiAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVF1ZXVlcyApIHsKICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgbmV4dCBRVUVVRUlEIGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAkQXZhaWxhYmxlUXVldWVzeyRRdWV1ZUlEfSA9ICRRdWV1ZURhdGF7TmFtZX07CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1F1ZXVlSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgIENsYXNzICAgICAgICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcn0tPntRdWV1ZUlESW52YWxpZH0gLy8gJycgKSwKICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVBdmFpbGFibGVRdWV1ZXMsCiAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdRdWV1ZUlEJyAuICRGaWVsZElELAogICAgICAgIFRyZWVWaWV3ICAgICAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgT25DaGFuZ2VTdWJtaXQgICAgID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAkVGlja2V0QXBwb2ludG1lbnRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZScpIC8vIHt9OwogICAgbXkgQEFwcG9pbnRtZW50VHlwZXM7CiAgICBteSBARHluYW1pY0ZpZWxkVHlwZXM7CgogICAgVFlQRToKICAgIGZvciBteSAkVHlwZUtleSAoIHNvcnQga2V5cyAleyRUaWNrZXRBcHBvaW50bWVudENvbmZpZ30gKSB7CiAgICAgICAgbmV4dCBUWVBFIGlmICEkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntLZXl9OwogICAgICAgIG5leHQgVFlQRSBpZiAhJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57TmFtZX07CgogICAgICAgIGlmICggJFR5cGVLZXkgPX4gL0R5bmFtaWNGaWVsZCQvICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiBhbGwgdmFsaWQgZGF0ZSBhbmQgZGF0ZS90aW1lIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9IG5lICdEYXRlJyAmJiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSBuZSAnRGF0ZVRpbWUnICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZFR5cGVzLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gc3ByaW50ZiggJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSwgICREeW5hbWljRmllbGQtPntOYW1lfSApLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IHNwcmludGYoICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fS0+e05hbWV9LCAkRHluYW1pY0ZpZWxkLT57TmFtZX0gKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgVFlQRTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQEFwcG9pbnRtZW50VHlwZXMsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57TmFtZX0sCiAgICAgICAgfTsKICAgIH0KCiAgICBteSBAU3RhcnREYXRlVHlwZXMgPSAoIEBBcHBvaW50bWVudFR5cGVzLCBARHluYW1pY0ZpZWxkVHlwZXMgKTsKICAgICRUaWNrZXRBcHBvaW50bWVudHN7U3RhcnREYXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIERhdGEgICAgICAgPT4gXEBTdGFydERhdGVUeXBlcywKICAgICAgICBNdWx0aXBsZSAgID0+IDAsCiAgICAgICAgU2l6ZSAgICAgICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1N0YXJ0RGF0ZScgLiAkRmllbGRJRCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTdGFydERhdGV9LAogICAgKTsKCiAgICBteSBARW5kUGx1c1R5cGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnKzUgbWludXRlcycpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnUGx1c18xNScsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnKzE1IG1pbnV0ZXMnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1BsdXNfMzAnLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJyszMCBtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdQbHVzXzYwJywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCcrMSBob3VyJyksCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgQEVuZERhdGVUeXBlcyA9ICggQEVuZFBsdXNUeXBlcywgQER5bmFtaWNGaWVsZFR5cGVzICk7CiAgICAkVGlja2V0QXBwb2ludG1lbnRze0VuZERhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgRGF0YSAgICAgICA9PiBcQEVuZERhdGVUeXBlcywKICAgICAgICBNdWx0aXBsZSAgID0+IDAsCiAgICAgICAgU2l6ZSAgICAgICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0VuZERhdGUnIC4gJEZpZWxkSUQsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RW5kRGF0ZX0sCiAgICApOwoKICAgIG15ICRTZWFyY2hQYXJhbXNDb25maWcgPQogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbScpIC8vIHt9OwoKICAgICMgVHJhbnNsYXRlIHNlYXJjaCBwYXJhbWV0ZXIgbGFiZWxzIHByaW9yIHRvIHNvcnRpbmcuCiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbXNDb25maWd9ICkgewogICAgICAgICRTZWFyY2hQYXJhbXNDb25maWctPnskUGFyYW1OYW1lfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc0NvbmZpZy0+eyRQYXJhbU5hbWV9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNvcnQgc2VhcmNoIHBhcmFtZXRlciBsaXN0IGJ5IHRyYW5zbGF0ZWQgbGFiZWxzLgogICAgbXkgQFNlYXJjaFBhcmFtczsKICAgIGZvciBteSAkUGFyYW1OYW1lICggc29ydCB7ICRTZWFyY2hQYXJhbXNDb25maWctPnskYX0gY21wICRTZWFyY2hQYXJhbXNDb25maWctPnskYn0gfSBrZXlzICV7JFNlYXJjaFBhcmFtc0NvbmZpZ30gKSB7CiAgICAgICAgcHVzaCBAU2VhcmNoUGFyYW1zLCB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICRQYXJhbU5hbWUsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWFyY2hQYXJhbXNDb25maWctPnskUGFyYW1OYW1lfSwKICAgICAgICAgICAgRGlzYWJsZWQgPT4gJFBhcmFte1NlYXJjaFBhcmFtfS0+eyRQYXJhbU5hbWV9IHx8IDAsCiAgICAgICAgfTsKICAgIH0KCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1NlYXJjaFBhcmFtc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgQ2xhc3MgICAgPT4gJ1NlYXJjaFBhcmFtcyBNb2Rlcm5pemUnLAogICAgICAgIERhdGEgICAgID0+IFxAU2VhcmNoUGFyYW1zLAogICAgICAgIE11bHRpcGxlID0+IDAsCiAgICAgICAgU2l6ZSAgICAgPT4gMCwKICAgICAgICBOYW1lICAgICA9PiAnU2VhcmNoUGFyYW1zJyAuICRGaWVsZElELAogICAgKTsKCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1NlYXJjaFBhcmFtVXNlcn0gPSAkU2VsZi0+X1VzZXJTZWxlY3Rpb25HZXQoKTsKCiAgICByZXR1cm4gJVRpY2tldEFwcG9pbnRtZW50czsKfQoKc3ViIF9HZXRUaWNrZXRBcHBvaW50bWVudFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBjcmVhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFBhcmFtczsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSBRdWV1ZUlEIFNlYXJjaFBhcmFtKSkgewogICAgICAgICAgICBpZiAoICRLZXkgPX4gL14ke0ZpZWxkfV8oW0EtWmEtejAtOV0rKS8gKSB7CiAgICAgICAgICAgICAgICBteSAkUnVsZUlEID0gJDE7CgogICAgICAgICAgICAgICAgIyBpZiBydWxlIGlkIGlzIGludGVnZXIsIGdlbmVyYXRlIHJhbmRvbSBndWlkCiAgICAgICAgICAgICAgICBpZiAoIElzSW50ZWdlcigkUnVsZUlEKSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPntSdWxlSUR9ID0gJE1haW5PYmplY3QtPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGggICAgID0+IDMyLAogICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnYScgLi4gJ2YnIF0sICAgICMgaGV4YWRlY2ltYWwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCB1c2UgaXQgYXMtaXMKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfS0+e1J1bGVJRH0gPSAkUnVsZUlEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgZXEgJ1NlYXJjaFBhcmFtJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL15TZWFyY2hQYXJhbV8ke1J1bGVJRH1fKFtBLVphLXpdKykkLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtID0gJDE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIFN0b3JlIHNlYXJjaCBwYXJhbXM6CiAgICAgICAgICAgICAgICAgICAgICAgICMgICAtIGFzIHNjYWxhciwgcGVyIFRpY2tldFNlYXJjaCgpIGRvY3VtZW50YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIyAgIC0gYXMgYXJyYXkgcmVmLCBtdWx0aXBsZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgIyAgIC0gYXMgYXJyYXkgcmVmLCBzaW5nbGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJFNlYXJjaFBhcmFtIGVxICRfIH0gQHsgJFNlbGYtPntTZWFyY2hQYXJhbVNjYWxhcn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfS0+e1NlYXJjaFBhcmFtfS0+eyRTZWFyY2hQYXJhbX0gPSAkUGFyYW17JEtleX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJFBhcmFteyRLZXl9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPntTZWFyY2hQYXJhbX0tPnskU2VhcmNoUGFyYW19ID0gJFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50UGFyYW1zeyRSdWxlSUR9LT57U2VhcmNoUGFyYW19LT57JFNlYXJjaFBhcmFtfSA9IFsgJFBhcmFteyRLZXl9IF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPnskRmllbGR9ID0gJFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhbnNmb3JtIHRvIGFycmF5CiAgICBteSBAVGlja2V0QXBwb2ludG1lbnREYXRhOwogICAgZm9yIG15ICRSdWxlSUQgKCBzb3J0IGtleXMgJVRpY2tldEFwcG9pbnRtZW50UGFyYW1zICkgewogICAgICAgIHB1c2ggQFRpY2tldEFwcG9pbnRtZW50RGF0YSwgJFRpY2tldEFwcG9pbnRtZW50UGFyYW1zeyRSdWxlSUR9OwogICAgfQoKICAgIHJldHVybiBcQFRpY2tldEFwcG9pbnRtZW50RGF0YTsKfQoKc3ViIF9TaG93VGlja2V0QXBwb2ludG1lbnRQYXJhbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkUGFyYW1OYW1lICggc29ydCBrZXlzICV7ICRQYXJhbXtTZWFyY2hQYXJhbX0gfSApIHsKICAgICAgICBteSAkUGFyYW1WYWx1ZTsKICAgICAgICBteSAkUGFyYW1TdHJnOwoKICAgICAgICBpZiAoIGdyZXAgeyAkUGFyYW1OYW1lIGVxICRfIH0gQHsgJFNlbGYtPntTZWFyY2hQYXJhbVNjYWxhcn0gfSApIHsKICAgICAgICAgICAgJFBhcmFtVmFsdWUgPSAkUGFyYW17U2VhcmNoUGFyYW19LT57JFBhcmFtTmFtZX07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggcmVmICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAkUGFyYW1WYWx1ZSA9ICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfS0+WzBdIC8vICcnOwogICAgICAgIH0KCiAgICAgICAgIyBPd25lcklEcyBhbmQgUmVzcG9uc2libGVJRHMgYXJlIG11bHRpcGxlIHNlbGVjdGlvbiB1c2VyIGZpZWxkcy4KICAgICAgICBpZiAoICRQYXJhbU5hbWUgZXEgJ093bmVySURzJyB8fCAkUGFyYW1OYW1lIGVxICdSZXNwb25zaWJsZUlEcycgKSB7CiAgICAgICAgICAgICRQYXJhbVN0cmcgPSAkU2VsZi0+X1VzZXJTZWxlY3Rpb25HZXQoCiAgICAgICAgICAgICAgICBQYXJhbU5hbWUgID0+ICRQYXJhbU5hbWUsCiAgICAgICAgICAgICAgICBQYXJhbVZhbHVlID0+ICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfSAvLyBbXSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudFJ1bGVTZWFyY2hQYXJhbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUGFyYW1OYW1lICA9PiAkUGFyYW1OYW1lLAogICAgICAgICAgICAgICAgUGFyYW1WYWx1ZSA9PiAkUGFyYW1WYWx1ZSwKICAgICAgICAgICAgICAgIFBhcmFtU3RyZyAgPT4gJFBhcmFtU3RyZywKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57T3ZlcnZpZXdTY3JlZW59ID0gJ0NhbGVuZGFyT3ZlcnZpZXcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCB1c2VyJ3MgdmFsaWQgY2FsZW5kYXJzCiAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgKTsKCiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICBteSBAQ2FsZW5kYXJzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckxpc3QoCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIEdldCB1c2VyJ3MgcGVybWlzc2lvbnMgdG8gYXNzb2NpYXRlZCBtb2R1bGVzIHdoaWNoIGFyZSBkaXNwbGF5ZWQgYXMgbGlua3MuCiAgICBmb3IgbXkgJE1vZHVsZSAocXcoQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlKSkgewogICAgICAgIG15ICRNb2R1bGVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKQogICAgICAgICAgICAtPnskTW9kdWxlfS0+e0dyb3VwfSAvLyBbXTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1vZHVsZUdyb3VwcykgKSB7CiAgICAgICAgICAgIE1PRFVMRV9HUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRNb2R1bGVHcm91cCAoIEB7JE1vZHVsZUdyb3Vwc30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJE1vZHVsZUdyb3VwXSJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtNb2R1bGVQZXJtaXNzaW9uc30tPnskTW9kdWxlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBNT0RVTEVfR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWx3YXlzIGFsbG93IGxpbmtzIGlmIG5vIGdyb3VwcyBhcmUgc3BlY2lmaWVkLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHdlIGZvdW5kIHNvbWUKICAgIGlmIChAQ2FsZW5kYXJzKSB7CgogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgICAgICMgbmV3IGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBcHBvaW50bWVudENyZWF0ZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudENyZWF0ZX0gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydCcgKSAgICAgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgRW5kICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbmQnICkgICAgICAgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQbHVnaW5LZXknICkgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWFyY2gnICkgICAgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPYmplY3RJRCcgKSAgLy8gdW5kZWYsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNldHRpbmdzIGRpYWxvZwogICAgICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDYWxlbmRhclNldHRpbmdzU2hvdycgKSB7CiAgICAgICAgICAgICRQYXJhbXtDYWxlbmRhclNldHRpbmdzU2hvd30gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBlZGl0IGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17QXBwb2ludG1lbnRJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXBwb2ludG1lbnRJRCcgKSAvLyB1bmRlZjsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyRGl2JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDYWxlbmRhcldpZHRoID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJXaWRnZXQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHVzZXIgcHJlZmVyZW5jZSBrZXkKICAgICAgICBteSAkU2hvd25BcHBvaW50bWVudHNQcmVmS2V5ID0gJ1VzZXInIC4gJFNlbGYtPntPdmVydmlld1NjcmVlbn0gLiAnU2hvd25BcHBvaW50bWVudHMnOwogICAgICAgIG15ICRTaG93bkFwcG9pbnRtZW50c1ByZWZWYWwgPSAkUHJlZmVyZW5jZXN7JFNob3duQXBwb2ludG1lbnRzUHJlZktleX0gfHwgMTsKCiAgICAgICAgIyBzaG93biBhcHBvaW50bWVudHMgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1Nob3duQXBwb2ludG1lbnRzU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBbGwgYXBwb2ludG1lbnRzJyksCiAgICAgICAgICAgICAgICAyID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2hvd25BcHBvaW50bWVudHMnLAogICAgICAgICAgICBJRCAgICAgICAgICAgPT4gJ1Nob3duQXBwb2ludG1lbnRzJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNob3duQXBwb2ludG1lbnRzUHJlZlZhbCwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IG9ubHkgYXNzaWduZWQgYXBwb2ludG1lbnRzIHRvIGN1cnJlbnQgdXNlcgogICAgICAgIGlmICggJFNob3duQXBwb2ludG1lbnRzUHJlZlZhbCA9PSAyICkgewogICAgICAgICAgICAkUGFyYW17UmVzb3VyY2VJRH0gPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICAgICAjIGRpc3BsYXkgbm90aWZ5IGxpbmUKICAgICAgICAgICAgJFBhcmFte05vdGlmeUxpbmV9ID0gewogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ1dhcm5pbmcnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCdTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJyksCiAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztTdWJhY3Rpb249Q2FsZW5kYXJTZXR0aW5nc1Nob3cnLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgJENhbGVuZGFyTGltaXQgICAgID0gaW50ICRDb25maWdPYmplY3QtPkdldCgnQXBwb2ludG1lbnRDYWxlbmRhcjo6Q2FsZW5kYXJMaW1pdE92ZXJ2aWV3JykgfHwgMTA7CiAgICAgICAgbXkgJENhbGVuZGFyU2VsZWN0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICBEYXRhID0+ICRQcmVmZXJlbmNlc3sgJ1VzZXInIC4gJFNlbGYtPntPdmVydmlld1NjcmVlbn0gLiAnQ2FsZW5kYXJTZWxlY3Rpb24nIH0gfHwgJ1tdJywKICAgICAgICApOwoKICAgICAgICBteSAkQ3VycmVudENhbGVuZGFyID0gMTsKICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJzKSB7CgogICAgICAgICAgICAjIGNoZWNrIHRoZSBjYWxlbmRhciBpZiBzdG9yZWQgaW4gcHJlZmVyZW5jZXMKICAgICAgICAgICAgaWYgKCBzY2FsYXIgQHskQ2FsZW5kYXJTZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gPT0gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSBAeyRDYWxlbmRhclNlbGVjdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJENhbGVuZGFyLT57Q2hlY2tlZH0gPSAnY2hlY2tlZD0iY2hlY2tlZCIgJyBpZiAkQ3VycmVudENhbGVuZGFyIDw9ICRDYWxlbmRhckxpbWl0OwogICAgICAgICAgICAgICAgICAgICRDdXJyZW50Q2FsZW5kYXIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjYWxlbmRhciBieSBkZWZhdWx0IGlmIGxpbWl0IGlzIG5vdCB5ZXQgcmVhY2hlZAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhci0+e0NoZWNrZWR9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiICcgaWYgJEN1cnJlbnRDYWxlbmRhciA8PSAkQ2FsZW5kYXJMaW1pdDsKICAgICAgICAgICAgICAgICRDdXJyZW50Q2FsZW5kYXIrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYWNjZXNzIHRva2VucwogICAgICAgICAgICAkQ2FsZW5kYXItPntBY2Nlc3NUb2tlbn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldEFjY2Vzc1Rva2VuKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiAgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjYWxlbmRhciBjaGVja2JveCBpbiB0aGUgd2lkZ2V0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJTd2l0Y2gnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQ2FsZW5kYXJ9LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSBiZXN0IHRleHQgY29sb3IKICAgICAgICAgICAgJFBhcmFte1RleHRDb2xvcn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldFRleHRDb2xvcigKICAgICAgICAgICAgICAgIEJhY2tncm91bmQgPT4gJENhbGVuZGFyLT57Q29sb3J9LAogICAgICAgICAgICApIHx8ICcjRkZGRkZGJzsKCiAgICAgICAgICAgICMgY2FsZW5kYXIgc291cmNlIChKU09OKQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyU291cmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JENhbGVuZGFyfSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyU291cmNlQ29tbWEnLAogICAgICAgICAgICApIGlmICRDdXJyZW50Q2FsZW5kYXIgPD0gc2NhbGFyIEBDYWxlbmRhcnM7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBpbml0aWFsIHZpZXcKICAgICAgICAkUGFyYW17RGVmYXVsdFZpZXd9ID0gJFByZWZlcmVuY2VzeyAnVXNlcicgLiAkU2VsZi0+e092ZXJ2aWV3U2NyZWVufSAuICdEZWZhdWx0VmlldycgfQogICAgICAgICAgICB8fCAndGltZWxpbmVXZWVrJzsKCiAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICAgICAgICAgICMgc2hvdyByZXNvdXJjZSBibG9jayBpbiB0b29sdGlwcwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Rvb2x0aXBUZW1wbGF0ZVJlc291cmNlJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBsdWdpbiBsaXN0CiAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKS0+UGx1Z2luTGlzdCgpOwoKICAgICAgICAjIGdldCByZWdpc3RlcmVkIHRpY2tldCBhcHBvaW50bWVudCB0eXBlcwogICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCk7CgogICAgICAgIG15ICRDdXJyZW50VHlwZSA9IDE7CiAgICAgICAgZm9yIG15ICRUeXBlICggc29ydCBrZXlzICVUaWNrZXRBcHBvaW50bWVudFR5cGVzICkgewogICAgICAgICAgICBteSAkTm9EcmFnID0gMDsKCiAgICAgICAgICAgICMgcHJldmVudCBkcmFnZ2luZyBvZiB0aWNrZXQgZXNjYWxhdGlvbiBhcHBvaW50bWVudHMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFR5cGUgZXEgJ0ZpcnN0UmVzcG9uc2VUaW1lJwogICAgICAgICAgICAgICAgfHwgJFR5cGUgZXEgJ1VwZGF0ZVRpbWUnCiAgICAgICAgICAgICAgICB8fCAkVHlwZSBlcSAnU29sdXRpb25UaW1lJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkTm9EcmFnID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgY29uZmlndXJlZCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBtYXJrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRNYXJrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50VHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudE1hcmsgPT4gbGMgc3Vic3RyKCAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skVHlwZX0tPntNYXJrfSwgMCwgMSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQ3VycmVudFR5cGUgPCBzY2FsYXIga2V5cyAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50TWFya0NvbW1hJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IGNvbmZpZ3VyZWQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgZHJhZ2dhYmlsaXR5CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnROb0RyYWcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUeXBlID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgIE5vRHJhZyAgICAgICAgICA9PiAkTm9EcmFnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQ3VycmVudFR5cGUgPCBzY2FsYXIga2V5cyAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50Tm9EcmFnQ29tbWEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEN1cnJlbnRUeXBlKys7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB3b3JraW5nIGhvdXIgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgQFdvcmtpbmdIb3VycyA9ICRTZWxmLT5fR2V0V29ya2luZ0hvdXJzKCk7CgogICAgICAgIG15ICRDdXJyZW50QXBwb2ludG1lbnQgPSAxOwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBXb3JraW5nSG91cnMpIHsKCiAgICAgICAgICAgICMgc29ydCBkYXlzIG9mIHRoZSB3ZWVrCiAgICAgICAgICAgIG15IEBEb1cgPSBzb3J0IEB7ICRBcHBvaW50bWVudC0+e0RvV30gfTsKCiAgICAgICAgICAgICMgb3V0cHV0IGJsb2NrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya2luZ0hvdXJzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgICAgICBEb1cgPT4gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSggRGF0YSA9PiBcQERvVyApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JraW5nSG91cnNDb21tYScsCiAgICAgICAgICAgICkgaWYgJEN1cnJlbnRBcHBvaW50bWVudCA8IHNjYWxhciBAV29ya2luZ0hvdXJzOwoKICAgICAgICAgICAgJEN1cnJlbnRBcHBvaW50bWVudCsrOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgbm8gY2FsZW5kYXIgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vQ2FsZW5kYXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGV4dCBkaXJlY3Rpb24gZnJvbSBsYW5ndWFnZSBvYmplY3QKICAgIG15ICRUZXh0RGlyZWN0aW9uID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259IHx8ICcnOwoKICAgICMgb3V0cHV0IHBhZ2UKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgIGlmICggJFBhcmFte05vdGlmeUxpbmV9ICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAleyAkUGFyYW17Tm90aWZ5TGluZX0gfSwKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEVkaXRBY3Rpb24gICAgICAgID0+ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIEVkaXRNYXNrU3ViYWN0aW9uID0+ICdFZGl0TWFzaycsCiAgICAgICAgICAgIFByZWZTdWJhY3Rpb24gICAgID0+ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgIExpc3RBY3Rpb24gICAgICAgID0+ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgIERheXNTdWJhY3Rpb24gICAgID0+ICdBcHBvaW50bWVudERheXMnLAogICAgICAgICAgICBGaXJzdERheSAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0NhbGVuZGFyV2Vla0RheVN0YXJ0JykgfHwgMCwKICAgICAgICAgICAgSXNSVExMYW5ndWFnZSAgICAgPT4gKCAkVGV4dERpcmVjdGlvbiBlcSAncnRsJyApID8gJ3RydWUnIDogJ2ZhbHNlJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dldFdvcmtpbmdIb3VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHdvcmtpbmcgaG91cnMgZnJvbSBzeXNjb25maWcKICAgIG15ICRXb3JraW5nSG91cnNDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpbWVXb3JraW5nSG91cnMnKTsKCiAgICAjIGNyZWF0ZSB3b3JraW5nIGhvdXIgYXBwb2ludG1lbnRzIGZvciBlYWNoIGRheQogICAgbXkgQFdvcmtpbmdIb3VyczsKICAgIGZvciBteSAkRGF5TmFtZSAoIHNvcnQga2V5cyAleyRXb3JraW5nSG91cnNDb25maWd9ICkgewoKICAgICAgICAjIGRheSBvZiB0aGUgd2VlawogICAgICAgIG15ICREb1cgPSAwOyAgICAjIFN1bgogICAgICAgIGlmICggJERheU5hbWUgZXEgJ01vbicgKSB7CiAgICAgICAgICAgICREb1cgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXlOYW1lIGVxICdUdWUnICkgewogICAgICAgICAgICAkRG9XID0gMjsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF5TmFtZSBlcSAnV2VkJyApIHsKICAgICAgICAgICAgJERvVyA9IDM7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJERheU5hbWUgZXEgJ1RodScgKSB7CiAgICAgICAgICAgICREb1cgPSA0OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXlOYW1lIGVxICdGcmknICkgewogICAgICAgICAgICAkRG9XID0gNTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF5TmFtZSBlcSAnU2F0JyApIHsKICAgICAgICAgICAgJERvVyA9IDY7CiAgICAgICAgfQoKICAgICAgICBteSAkU3RhcnRUaW1lID0gMDsKICAgICAgICBteSAkRW5kVGltZSAgID0gMDsKCiAgICAgICAgU1RBUlRfVElNRToKICAgICAgICBmb3IgKCAkU3RhcnRUaW1lID0gMDsgJFN0YXJ0VGltZSA8IDI0OyAkU3RhcnRUaW1lKysgKSB7CgogICAgICAgICAgICAjIGlzIHRoaXMgd29ya2luZyBob3VyPwogICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkU3RhcnRUaW1lIH0gQHsgJFdvcmtpbmdIb3Vyc0NvbmZpZy0+eyREYXlOYW1lfSB9ICkgewoKICAgICAgICAgICAgICAgICMgZ28gdG8gdGhlIGVuZCBvZiB0aGUgd29ya2luZyBob3VycwogICAgICAgICAgICAgICAgZm9yICggbXkgJEVuZEhvdXIgPSAkU3RhcnRUaW1lOyAkRW5kSG91ciA8IDI0OyAkRW5kSG91cisrICkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAkRW5kSG91ciB9IEB7ICRXb3JraW5nSG91cnNDb25maWctPnskRGF5TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgPSAkRW5kSG91cjsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPiAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAV29ya2luZ0hvdXJzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+IHNwcmludGYoICclMDJkOjAwOjAwJywgJFN0YXJ0VGltZSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiBzcHJpbnRmKCAnJTAyZDowMDowMCcsICRFbmRUaW1lICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9XICAgICAgID0+IFskRG9XXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBzb21lIGhvdXJzCiAgICAgICAgICAgICAgICAgICAgICAgICRTdGFydFRpbWUgPSAkRW5kSG91cjsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgU1RBUlRfVElNRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjb2xsYXBzZSBhcHBvaW50bWVudHMgd2l0aCBzYW1lIHN0YXJ0IGFuZCBlbmQgdGltZXMKICAgIGZvciBteSAkQXBwb2ludG1lbnRBIChAV29ya2luZ0hvdXJzKSB7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudEIgKEBXb3JraW5nSG91cnMpIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50QS0+e1N0YXJ0VGltZX0gJiYgJEFwcG9pbnRtZW50Qi0+e1N0YXJ0VGltZX0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudEEtPntTdGFydFRpbWV9IGVxICRBcHBvaW50bWVudEItPntTdGFydFRpbWV9CiAgICAgICAgICAgICAgICAmJiAkQXBwb2ludG1lbnRBLT57RW5kVGltZX0gZXEgJEFwcG9pbnRtZW50Qi0+e0VuZFRpbWV9CiAgICAgICAgICAgICAgICAmJiAkQXBwb2ludG1lbnRBLT57RG9XfSBuZSAkQXBwb2ludG1lbnRCLT57RG9XfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRBcHBvaW50bWVudEEtPntEb1d9IH0sIEB7ICRBcHBvaW50bWVudEItPntEb1d9IH07CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRCID0gdW5kZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gb25seSBub24tZW1wdHkgYXBwb2ludG1lbnRzCiAgICByZXR1cm4gZ3JlcCB7IHNjYWxhciBrZXlzICV7JF99IH0gQFdvcmtpbmdIb3VyczsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudEVkaXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RW1wdHlTdHJpbmd9ID0gJy0nOwoKICAgICMgZ2V0IHRpbWUgem9uZSBvZmZzZXQKICAgICRTZWxmLT57VGltZVpvbmV9ICAgID0gJFNlbGYtPntVc2VyVGltZVpvbmV9IHx8IDA7CiAgICAkU2VsZi0+e1RpbWVTZWNEaWZmfSA9ICRTZWxmLT57VGltZVpvbmV9ICogMzYwMDsgICAgICMgNjAgKiA2MAoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmFtZXMgb2YgYWxsIHBhcmFtZXRlcnMKICAgIG15IEBQYXJhbU5hbWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBQQVJBTU5BTUU6CiAgICBmb3IgbXkgJEtleSAoQFBhcmFtTmFtZXMpIHsKCiAgICAgICAgIyBza2lwIHRoZSBBY3Rpb24gcGFyYW1ldGVyLCBpdCdzIGdpdmluZyBCdWlsZERhdGVTZWxlY3Rpb24gcHJvYmxlbXMgZm9yIHNvbWUgcmVhc29uCiAgICAgICAgbmV4dCBQQVJBTU5BTUUgaWYgJEtleSBlcSAnQWN0aW9uJzsKCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkUGx1Z2luT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwoKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSggRGF0YSA9PiBbXSApOwoKICAgIG15ICVQZXJtaXNzaW9uTGV2ZWwgPSAoCiAgICAgICAgJ3JvJyAgICAgICAgPT4gMSwKICAgICAgICAnbW92ZV9pbnRvJyA9PiAyLAogICAgICAgICdjcmVhdGUnICAgID0+IDMsCiAgICAgICAgJ25vdGUnICAgICAgPT4gNCwKICAgICAgICAnb3duZXInICAgICA9PiA1LAogICAgICAgICdwcmlvcml0eScgID0+IDYsCiAgICAgICAgJ3J3JyAgICAgICAgPT4gNywKICAgICk7CgogICAgbXkgJFBlcm1pc3Npb25zID0gJ3J3JzsKCiAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjawogICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZWRpdCBtYXNrCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdE1hc2snICkgewoKICAgICAgICAjIGdldCBhbGwgdXNlcidzIHZhbGlkIGNhbGVuZGFycwogICAgICAgIG15ICRWYWxpZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgICAgICk7CiAgICAgICAgbXkgQENhbGVuZGFycyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICApOwoKICAgICAgICAjIHRyYW5zZm9ybSBkYXRhIGZvciBzZWxlY3QgYm94CiAgICAgICAgbXkgQENhbGVuZGFyRGF0YSA9IG1hcCB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXy0+e0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgIH0KICAgICAgICB9IEBDYWxlbmRhcnM7CgogICAgICAgICMgdHJhbnNmb3JtIGRhdGEgZm9yIElEIGxvb2t1cAogICAgICAgIG15ICVDYWxlbmRhckxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57Q2FsZW5kYXJJRH0gPT4gJF8tPntDYWxlbmRhck5hbWV9CiAgICAgICAgfSBAQ2FsZW5kYXJzOwoKICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJEYXRhKSB7CgogICAgICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgICAgIG15ICRDYWxlbmRhclBlcm1pc3Npb24gPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57S2V5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkxldmVseyRDYWxlbmRhclBlcm1pc3Npb259IDwgMyApIHsKCiAgICAgICAgICAgICAgICAjIHBlcm1pc3Npb25zIDwgY3JlYXRlCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXItPntEaXNhYmxlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSB5ZWFyIGJvdW5kYXJpZXMKICAgICAgICBteSAoICVZZWFyUGVyaW9kUGFzdCwgJVllYXJQZXJpb2RGdXR1cmUgKTsKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyAoU3RhcnQgRW5kIFJlY3VycmVuY2VVbnRpbCkpIHsKICAgICAgICAgICAgJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gPSAkWWVhclBlcmlvZEZ1dHVyZXskRmllbGR9ID0gNTsKICAgICAgICB9CgogICAgICAgICMgZG8gbm90IHVzZSBkYXRlIHNlbGVjdGlvbiB0aW1lIHpvbmUgY2FsY3VsYXRpb24gYnkgZGVmYXVsdAogICAgICAgIG15ICRPdmVycmlkZVRpbWVab25lID0gMTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50OwogICAgICAgIGlmICggJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG5vbi1leGlzdGVudCBhcHBvaW50bWVudAogICAgICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXNlIHRpbWUgem9uZSBjYWxjdWxhdGlvbiBpZiBlZGl0aW5nIGV4aXN0aW5nIGFwcG9pbnRtZW50cwogICAgICAgICAgICAjIGJ1dCBvbmx5IGlmIG5vdCBkZWFsaW5nIHdpdGggYW4gYWxsIGRheSBhcHBvaW50bWVudAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRPdmVycmlkZVRpbWVab25lID0gJEFwcG9pbnRtZW50e0FsbERheX0gfHwgMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICAkUGVybWlzc2lvbnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBzdGFydCB0aW1lIGNvbXBvbmVudHMKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIG15ICRTdGFydFNlY29uZCwgJEFwcG9pbnRtZW50e1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydEhvdXJ9LCAkQXBwb2ludG1lbnR7U3RhcnREYXl9LCAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSwgJEFwcG9pbnRtZW50e1N0YXJ0V2Vla0RheX0KICAgICAgICAgICAgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCggU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICk7CgogICAgICAgICAgICAjIGdldCBlbmQgdGltZSBjb21wb25lbnRzCiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZW5kIHRpbWVzIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBhcmUgaW5jbHVzaXZlLCBzdWJ0cmFjdCB3aG9sZSBkYXkKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICRFbmRUaW1lIC09IDg2NDAwOwogICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgPSAkU3RhcnRUaW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBteSAkRW5kU2Vjb25kLCAkQXBwb2ludG1lbnR7RW5kTWludXRlfSwgJEFwcG9pbnRtZW50e0VuZEhvdXJ9LCAkQXBwb2ludG1lbnR7RW5kRGF5fSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNb250aH0sICRBcHBvaW50bWVudHtFbmRZZWFyfQogICAgICAgICAgICApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KCBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lICk7CgogICAgICAgICAgICAjIGdldCByZWN1cnJlbmNlIHVudGlsIGNvbXBvbmVudHMKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWwgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbFNlY29uZCwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbE1pbnV0ZX0sICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsRGF5fSwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbE1vbnRofSwKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsWWVhcn0KICAgICAgICAgICAgICAgICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoIFN5c3RlbVRpbWUgPT4gJFJlY3VycmVuY2VVbnRpbCApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlY2FsY3VsYXRlIHllYXIgYm91bmRhcmllcwogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnQgRW5kIFJlY3VycmVuY2VVbnRpbCkpIHsKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50eyIke0ZpZWxkfVllYXIifSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkRGlmZiA9ICRBcHBvaW50bWVudHsiJHtGaWVsZH1ZZWFyIn0gLSAkWWVhcjsKICAgICAgICAgICAgICAgICAgICBpZiAoICREaWZmID4gMCAmJiBhYnMgJERpZmYgPiAkWWVhclBlcmlvZEZ1dHVyZXskRmllbGR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkWWVhclBlcmlvZEZ1dHVyZXskRmllbGR9ID0gYWJzICREaWZmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREaWZmIDwgMCAmJiBhYnMgJERpZmYgPiAkWWVhclBlcmlvZFBhc3R7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gPSBhYnMgJERpZmY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewogICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VUeXBlID0gJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSB8fCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9OwoKICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmVuY2VUeXBlIGVxICdDdXN0b21XZWVrbHknICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkRGF5T2Zmc2V0ID0gJFNlbGYtPl9EYXlPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtEYXlzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RGF5c30gPSAkR2V0UGFyYW17RGF5c307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSBARGF5cyA9IEB7ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXNwbGF5IHNlbGVjdGVkIGRheXMgYWNjb3JkaW5nIHRvIHVzZXIgdGltZXpvbmUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCREYXlPZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGF5IChARGF5cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXkgKz0gJERheU9mZnNldDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF5ID09IDggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0RheXN9ID0gam9pbiggIiwiLCBARGF5cyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJlY3VycmVuY2VUeXBlIGVxICdDdXN0b21Nb250aGx5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERheU9mZnNldCA9ICRTZWxmLT5fRGF5T2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17TW9udGhEYXlzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhEYXlzfSA9ICRHZXRQYXJhbXtNb250aERheXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQE1vbnRoRGF5cyA9IEB7ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXNwbGF5IHNlbGVjdGVkIGRheXMgYWNjb3JkaW5nIHRvIHVzZXIgdGltZXpvbmUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCREYXlPZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTW9udGhEYXkgKEBNb250aERheXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTW9udGhEYXkgKz0gJERheU9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTW9udGhEYXkgPSAxIGlmICREYXkgPT0gMzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoRGF5c30gPSBqb2luKCAiLCIsIEBNb250aERheXMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERheU9mZnNldCA9ICRTZWxmLT5fRGF5T2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17TW9udGhzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhzfSA9ICRHZXRQYXJhbXtNb250aHN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQE1vbnRocyA9IEB7ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhzfSA9IGpvaW4oICIsIiwgQE1vbnRocyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBkZWFsaW5nIHdpdGggdGlja2V0IGFwcG9pbnRtZW50LgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VGlja2V0SUR9ID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFRpY2tldElEKAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkUnVsZSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRSdWxlR2V0KAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBHZXQgZGF0ZSB0eXBlcyBmcm9tIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZS4KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoU3RhcnREYXRlIEVuZERhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSdWxlLT57JFR5cGV9IGVxICdGaXJzdFJlc3BvbnNlVGltZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRSdWxlLT57JFR5cGV9IGVxICdVcGRhdGVUaW1lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFJ1bGUtPnskVHlwZX0gZXEgJ1NvbHV0aW9uVGltZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlYWRPbmx5U3RhcnR9ICAgID0gMSBpZiAkVHlwZSBlcSAnU3RhcnREYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seUR1cmF0aW9ufSA9IDEgaWYgJFR5cGUgZXEgJ0VuZERhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFJ1bGUtPnskVHlwZX0gPX4gL15QbHVzX1swLTldKyQvICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlYWRPbmx5RHVyYXRpb259ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VsZWN0ZWQgdGltZXN0YW1wCiAgICAgICAgbXkgJFNlbGVjdGVkVGltZXN0YW1wID0gc3ByaW50ZigKICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDAwOjAwOjAwIiwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fQogICAgICAgICk7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgZGF5CiAgICAgICAgbXkgJFNlbGVjdGVkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRTZWxlY3RlZFRpbWVzdGFtcCwKICAgICAgICApOwoKICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGVjdGVkU3lzdGVtVGltZSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB3ZWVrIGRheSBpZiBub3Qgc2V0CiAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50e0RheXN9ICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnR7RGF5c30gPSAkRGF0ZUluZm9bNl07CiAgICAgICAgfQoKICAgICAgICAjIHNldCBtb250aCBkYXkgaWYgbm90IHNldAogICAgICAgIGlmICggISRBcHBvaW50bWVudHtNb250aERheXN9ICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhEYXlzfSA9ICREYXRlSW5mb1szXTsKICAgICAgICB9CgogICAgICAgICMgc2V0IG1vbnRoIGlmIG5vdCBzZXQKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7TW9udGhzfSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSAkRGF0ZUluZm9bNF07CiAgICAgICAgfQoKICAgICAgICAjIGNhbGVuZGFyIElEIHNlbGVjdGlvbgogICAgICAgIG15ICRDYWxlbmRhcklEID0gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9IC8vICRHZXRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAgICAgIyBjYWxlbmRhciBuYW1lCiAgICAgICAgaWYgKCRDYWxlbmRhcklEKSB7CiAgICAgICAgICAgICRQYXJhbXtDYWxlbmRhck5hbWV9ID0gJENhbGVuZGFyTG9va3VweyRDYWxlbmRhcklEfTsKICAgICAgICB9CgogICAgICAgICMgY2FsZW5kYXIgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte0NhbGVuZGFySURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBDYWxlbmRhckRhdGEsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDYWxlbmRhcklEJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhbGwgZGF5CiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17QWxsRGF5fSB8fAogICAgICAgICAgICAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSAmJiAkQXBwb2ludG1lbnR7QWxsRGF5fSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlTdHJpbmd9ICA9IFRyYW5zbGF0YWJsZSgnWWVzJyk7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlDaGVja2VkfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CgogICAgICAgICAgICAjIHN0YXJ0IGRhdGUKICAgICAgICAgICAgJFBhcmFte1N0YXJ0RGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAvLyAkR2V0UGFyYW17U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZW5kIGRhdGUKICAgICAgICAgICAgJFBhcmFte0VuZERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kWWVhcn0gIC8vICRHZXRQYXJhbXtFbmRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNb250aH0gLy8gJEdldFBhcmFte0VuZE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmREYXl9ICAgLy8gJEdldFBhcmFte0VuZERheX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17QWxsRGF5U3RyaW5nfSAgPSBUcmFuc2xhdGFibGUoJ05vJyk7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlDaGVja2VkfSA9ICcnOwoKICAgICAgICAgICAgIyBzdGFydCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtTdGFydERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAgLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgICAvLyAkR2V0UGFyYW17U3RhcnREYXl9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0SG91cn0gICAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZW5kIGRhdGUKICAgICAgICAgICAgJFBhcmFte0VuZERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZFllYXJ9ICAgLy8gJEdldFBhcmFte0VuZFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZE1vbnRofSAgLy8gJEdldFBhcmFte0VuZE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmREYXl9ICAgIC8vICRHZXRQYXJhbXtFbmREYXl9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZEhvdXJ9ICAgLy8gJEdldFBhcmFte0VuZEhvdXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZE1pbnV0ZX0gLy8gJEdldFBhcmFte0VuZE1pbnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXJ0RGF0ZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgU3RhcnRIb3VyICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtTdGFydEhvdXJ9IC8vICRHZXRQYXJhbXtTdGFydEhvdXJ9LAogICAgICAgICAgICBTdGFydE1pbnV0ZSAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0TWludXRlfSAvLyAkR2V0UGFyYW17U3RhcnRNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBWYWxpZGF0ZURhdGVCZWZvcmVQcmVmaXggPT4gJ0VuZCcsCiAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1N0YXJ0fSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1N0YXJ0fSwKICAgICAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSAgICAgICAgID0+ICRPdmVycmlkZVRpbWVab25lLAogICAgICAgICk7CgogICAgICAgICMgZW5kIGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte0VuZERhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgPT4gJ0VuZCcsCiAgICAgICAgICAgIEVuZEhvdXIgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtFbmRIb3VyfSAvLyAkR2V0UGFyYW17RW5kSG91cn0sCiAgICAgICAgICAgIEVuZE1pbnV0ZSAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtFbmRNaW51dGV9IC8vICRHZXRQYXJhbXtFbmRNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ID0+ICdTdGFydCcsCiAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtFbmR9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtFbmR9LAogICAgICAgICAgICBPdmVycmlkZVRpbWVab25lICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBtYWluIG9iamVjdAogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsIFNpbGVudCA9PiAxICkgKSB7CgogICAgICAgICAgICBteSAkVGVhbUlEcyA9ICRBcHBvaW50bWVudHtUZWFtSUR9OwogICAgICAgICAgICBpZiAoICEkVGVhbUlEcyApIHsKICAgICAgICAgICAgICAgIG15IEBUZWFtSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RlYW1JRFtdJyApOwogICAgICAgICAgICAgICAgJFRlYW1JRHMgPSBcQFRlYW1JRHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRSZXNvdXJjZUlEcyA9ICRBcHBvaW50bWVudHtSZXNvdXJjZUlEfTsKICAgICAgICAgICAgaWYgKCAhJFJlc291cmNlSURzICkgewogICAgICAgICAgICAgICAgbXkgQFJlc291cmNlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgICAgICRSZXNvdXJjZUlEcyA9IFxAUmVzb3VyY2VJRHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CiAgICAgICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgICAgICMgZ2V0IGFsbG93ZWQgdGVhbSBsaXN0IGZvciBjdXJyZW50IHVzZXIKICAgICAgICAgICAgbXkgJVRlYW1MaXN0ID0gJFRlYW1PYmplY3QtPkFsbG93ZWRUZWFtTGlzdCgKICAgICAgICAgICAgICAgIFByZXZlbnRFbXB0eSA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGVhbSBuYW1lcwogICAgICAgICAgICBteSBAVGVhbU5hbWVzOwogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7JFRlYW1JRHN9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAVGVhbU5hbWVzLCAkVGVhbUxpc3R7JFRlYW1JRH0gaWYgJFRlYW1MaXN0eyRUZWFtSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2NhbGFyIEBUZWFtTmFtZXMgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VGVhbU5hbWVzfSA9IGpvaW4oICc8YnI+JywgQFRlYW1OYW1lcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1RlYW1OYW1lc30gPSAkU2VsZi0+e0VtcHR5U3RyaW5nfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0ZWFtIGxpc3Qgc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtUZWFtSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVGVhbUxpc3QsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlYW1JRHMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RlYW1JRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggc2VsZWN0ZWQgdGVhbXMKICAgICAgICAgICAgbXkgJVRlYW1Vc2VyTGlzdEFsbDsKICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7JFRlYW1JRHN9ICkgewogICAgICAgICAgICAgICAgbmV4dCBURUFNSUQgaWYgISRUZWFtSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB0ZWFtIG1lbWJlcnMKICAgICAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVRlYW1Vc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGVhbVVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlVGVhbVVzZXJMaXN0QWxsID0gKCAlVGVhbVVzZXJMaXN0QWxsLCAlVGVhbVVzZXJMaXN0ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVzb3VyY2UgbmFtZXMKICAgICAgICAgICAgbXkgQFJlc291cmNlTmFtZXM7CiAgICAgICAgICAgIGZvciBteSAkUmVzb3VyY2VJRCAoIEB7JFJlc291cmNlSURzfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlc291cmNlTmFtZXMsICRUZWFtVXNlckxpc3RBbGx7JFJlc291cmNlSUR9IGlmICRUZWFtVXNlckxpc3RBbGx7JFJlc291cmNlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2NhbGFyIEBSZXNvdXJjZU5hbWVzICkgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc291cmNlTmFtZXN9ID0gam9pbiggJzxicj4nLCBAUmVzb3VyY2VOYW1lcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc291cmNlTmFtZXN9ID0gJFNlbGYtPntFbXB0eVN0cmluZ307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGVhbSB1c2VyIGxpc3Qgc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZUlEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVRlYW1Vc2VyTGlzdEFsbCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUmVzb3VyY2VJRHMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Jlc291cmNlSUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlICAgICAgID0gMDsKICAgICAgICBteSAkU2VsZWN0ZWRSZWN1cnJlbmNlQ3VzdG9tVHlwZSA9ICdDdXN0b21EYWlseSc7ICAgICMgZGVmYXVsdAoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewoKICAgICAgICAgICAgIyBmcm9tIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlID0gJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSB8fCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9OwogICAgICAgICAgICBpZiAoICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlID1+IC9DdXN0b20vICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZTsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlICAgICAgID0gJ0N1c3RvbSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVjdXJyZW5jZSB0eXBlCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdOZXZlcicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnRGFpbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBEYXknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1dlZWtseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0V2ZXJ5IFdlZWsnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ01vbnRobHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBNb250aCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnWWVhcmx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgWWVhcicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlUmVjdXJyZW5jZVR5cGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBSZWN1cnJlbmNlVHlwZXM7CiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VWYWx1ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICRSZWN1cnJlbmNlVHlwZUxvb2t1cHskU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIHR5cGUgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBSZWN1cnJlbmNlVHlwZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZWN1cnJlbmNlVHlwZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBjdXN0b20gdHlwZQogICAgICAgIG15IEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21EYWlseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0RhaWx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21XZWVrbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdXZWVrbHknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbU1vbnRobHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdNb250aGx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21ZZWFybHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdZZWFybHknKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVSZWN1cnJlbmNlQ3VzdG9tVHlwZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFJlY3VycmVuY2VDdXN0b21UeXBlczsKICAgICAgICBteSAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAkUmVjdXJyZW5jZUN1c3RvbVR5cGVMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgIGxjICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSwKICAgICAgICApIGlmICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAmJiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tJzsKCiAgICAgICAgIyByZWN1cnJlbmNlIGN1c3RvbSB0eXBlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcQFJlY3VycmVuY2VDdXN0b21UeXBlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VsZWN0ZWRSZWN1cnJlbmNlQ3VzdG9tVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjdXJyZW5jZUN1c3RvbVR5cGUnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBpbnRlcnZhbAogICAgICAgIG15ICRTZWxlY3RlZEludGVydmFsID0gJEdldFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0gfHwgMTsKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9ICkgewogICAgICAgICAgICBteSAlUmVjdXJyZW5jZUludGVydmFsTG9va3VwID0gKAogICAgICAgICAgICAgICAgJ0N1c3RvbURhaWx5JyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ2RheShzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbVdlZWtseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd3ZWVrKHMpJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnQ3VzdG9tTW9udGhseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdtb250aChzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbVllYXJseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd5ZWFyKHMpJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAmJiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZXZlcnknKQogICAgICAgICAgICAgICAgICAgIC4gJyAnIC4gJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0gLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRSZWN1cnJlbmNlSW50ZXJ2YWxMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpbnRlcnZhbCBzZWxlY3Rpb24gKDEtMzEpCiAgICAgICAgbXkgQFJlY3VycmVuY2VDdXN0b21JbnRlcnZhbDsKICAgICAgICBmb3IgKCBteSAkRGF5TnVtYmVyID0gMTsgJERheU51bWJlciA8IDMyOyAkRGF5TnVtYmVyKysgKSB7CiAgICAgICAgICAgIHB1c2ggQFJlY3VycmVuY2VDdXN0b21JbnRlcnZhbCwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJERheU51bWJlciwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICREYXlOdW1iZXIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWxTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWwsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGVjdGVkSW50ZXJ2YWwsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY3VycmVuY2VJbnRlcnZhbCcsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIGxpbWl0CiAgICAgICAgbXkgJFJlY3VycmVuY2VMaW1pdCA9IDE7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUNvdW50fSApIHsKICAgICAgICAgICAgJFJlY3VycmVuY2VMaW1pdCA9IDI7CgogICAgICAgICAgICBpZiAoJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ2ZvciAlcyB0aW1lKHMpJywgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgbGltaXQgc3RyaW5nCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VMaW1pdFN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ3VudGlsIC4uLicpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnZm9yIC4uLiB0aW1lKHMpJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlY3VycmVuY2VMaW1pdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZWN1cnJlbmNlTGltaXQnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsRGlmZlRpbWUgPSAwOwogICAgICAgIGlmICggISRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAgICAgIyBnZXQgY3VycmVudCBhbmQgc3RhcnQgdGltZSBmb3IgZGlmZmVyZW5jZQogICAgICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFllYXIgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgTW9udGggID0+ICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAgLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgID0+ICRBcHBvaW50bWVudHtTdGFydERheX0gICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgIEhvdXIgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSAgIC8vICRHZXRQYXJhbXtTdGFydEhvdXJ9LAogICAgICAgICAgICAgICAgTWludXRlID0+ICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsRGlmZlRpbWUgPSAkU3RhcnRUaW1lIC0gJFN5c3RlbVRpbWUgKyA2MCAqIDYwICogMjQgKiAzOyAgICAjIHN0YXJ0ICszIGRheXMKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsWWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsTW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbERheX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ3VudGlsICVzJywgJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgdW50aWwgZGF0ZSBzdHJpbmcKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgID0+ICdSZWN1cnJlbmNlVW50aWwnLAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICAgICAgRGlmZlRpbWUgICAgICAgICAgICAgICAgPT4gJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lLAogICAgICAgICAgICBWYWxpZGF0ZURhdGVBZnRlclByZWZpeCA9PiAnU3RhcnQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSAgICAgICAgPT4gJE92ZXJyaWRlVGltZVpvbmUsCiAgICAgICAgKTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgICAgICBteSBATm90aWZpY2F0aW9uVGVtcGxhdGVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05vIG5vdGlmaWNhdGlvbicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnU3RhcnQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzMwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgNSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnOTAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAxNSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMTgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMzAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzM2MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgaG91cihzKSBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc3MjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMiApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNDMyMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgaG91cihzKSBiZWZvcmUnLCAxMiApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnODY0MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgZGF5KHMpIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzE3MjgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBkYXkocykgYmVmb3JlJywgMiApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNjA0ODAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIHdlZWsgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3VzdG9tJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlTm90aWZpY2F0aW9uVGVtcGxhdGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25UZW1wbGF0ZXM7CiAgICAgICAgbXkgJFNlbGVjdGVkTm90aWZpY2F0aW9uVGVtcGxhdGUgPSAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uVGVtcGxhdGV9IHx8ICcwJzsKICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uVmFsdWV9ID0gJE5vdGlmaWNhdGlvblRlbXBsYXRlTG9va3VweyRTZWxlY3RlZE5vdGlmaWNhdGlvblRlbXBsYXRlfTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQE5vdGlmaWNhdGlvblRlbXBsYXRlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZE5vdGlmaWNhdGlvblRlbXBsYXRlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05vdGlmaWNhdGlvblRlbXBsYXRlJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gY3VzdG9tIHVuaXRzCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ21pbnV0ZShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnaG91cnMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdob3VyKHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdkYXlzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZGF5KHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlTm90aWZpY2F0aW9uQ3VzdG9tVW5pdExvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQgPSAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fSB8fCAnbWludXRlcyc7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cyBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBOb3RpZmljYXRpb25DdXN0b21Vbml0cywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0JywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gY3VzdG9tIHVuaXRzIHBvaW50IG9mIHRpbWUKICAgICAgICBteSBATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZSA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWU7CiAgICAgICAgbXkgJFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9CiAgICAgICAgICAgIHx8ICdiZWZvcmVzdGFydCc7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkYXRlIHVuaXRzIGZvciB0aGUgY3VzdG9tIGRhdGUgc2VsZWN0aW9uCiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApOwogICAgICAgIGlmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApIHsKCiAgICAgICAgICAgICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSBkYXRlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheSAgICA9PiAkRGF5LAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXIgICA9PiAkSG91ciwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGUgPT4gJE1pbnV0ZSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7U3RhcnR9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICAgICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtTdGFydH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHJhZGlvIGJ1dHRvbiBmb3IgY3VzdG9tIGRhdGUgdGltZSBhbmQgcmVsYXRpdmUgaW5wdXQKICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tfSB8fD0gJyc7CgogICAgICAgIGlmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXRSYWRpb30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSBzdHJpbmcgdmFsdWUKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25WYWx1ZX0gLj0gJywgJyAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IHx8PSAwOwogICAgICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9CiAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICROb3RpZmljYXRpb25DdXN0b21Vbml0TG9va3VweyRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXR9CiAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXB7JFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGx1Z2luIGxpc3QKICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0gPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaXN0KCk7CgogICAgICAgICMgbmV3IGFwcG9pbnRtZW50IHBsdWdpbiBzZWFyY2gKICAgICAgICBpZiAoICRHZXRQYXJhbXtQbHVnaW5LZXl9ICYmICggJEdldFBhcmFte1NlYXJjaH0gfHwgJEdldFBhcmFte09iamVjdElEfSApICkgewoKICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJEdldFBhcmFte1BsdWdpbktleX0gfSBrZXlzICV7ICRQYXJhbXtQbHVnaW5MaXN0fSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2VhcmNoIHVzaW5nIHBsdWdpbgogICAgICAgICAgICAgICAgbXkgJFJlc3VsdExpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5TZWFyY2goCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+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+e1VzZXJJRH07CgogICAgICAgICMgR2V0IHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICBteSBAUGx1Z2luUGFyYW1zID0gZ3JlcCB7ICRfID1+IC9eUGx1Z2luXy8gfSBrZXlzICVHZXRQYXJhbTsKCiAgICAgICAgaWYgKCVBcHBvaW50bWVudCkgewoKICAgICAgICAgICAgIyBDb250aW51ZSBvbmx5IGlmIGNvbWluZyBmcm9tIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICMgICAodGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVyKS4KICAgICAgICAgICAgaWYgKEBQbHVnaW5QYXJhbXMpIHsKCiAgICAgICAgICAgICAgICAjIEdldCBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMgYmVmb3JlIHRoZSB1cGRhdGUuCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkXy0+e1BhcmVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkXy0+e1BhcmVudElEfSBlcSAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9IEBDYWxlbmRhckFwcG9pbnRtZW50czsKCiAgICAgICAgICAgICAgICAjIFJlbW92ZSBhbGwgZXhpc3RpbmcgbGlua3MuCiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTGlua3MgY291bGQgbm90IGJlIGRlbGV0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gPyAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gOiAkU3VjY2VzczsKCiAgICAgICAgaWYgKCRBcHBvaW50bWVudElEKSB7CgogICAgICAgICAgICAjIENvbnRpbnVlIG9ubHkgaWYgY29taW5nIGZyb20gZWRpdCBzY3JlZW4KICAgICAgICAgICAgIyAgICh0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGFzc2VkIHBsdWdpbiBwYXJhbWV0ZXIpLgogICAgICAgICAgICBpZiAoQFBsdWdpblBhcmFtcykgewoKICAgICAgICAgICAgICAgICMgR2V0IGZyZXNoIGFwcG9pbnRtZW50IGRhdGEuCiAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUHJvY2VzcyBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMuCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoJEFwcG9pbnRtZW50SUQpOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzIGFzIHdlbGwuCiAgICAgICAgICAgICAgICBwdXNoIEBSZWxhdGVkQXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgJF8tPntBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBncmVwIHsKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudElECiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBQcm9jZXNzIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luUGFyYW0gKEBQbHVnaW5QYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkUGx1Z2luRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkR2V0UGFyYW17JFBsdWdpblBhcmFtfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRQbHVnaW5LZXkgPSAkUGx1Z2luUGFyYW07CiAgICAgICAgICAgICAgICAgICAgJFBsdWdpbktleSA9fiBzL15QbHVnaW5fLy87CgogICAgICAgICAgICAgICAgICAgICMgRXhlY3V0ZSBsaW5rIGFkZCBtZXRob2Qgb2YgdGhlIHBsdWdpbi4KICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkUGx1Z2luRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggQHskUGx1Z2luRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGluayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzID8gMSA6IDAsCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZUFwcG9pbnRtZW50JyApIHsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gMDsKICAgICAgICAgICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICAgICAgICAgICMgUHJldmVudCBkZWxldGluZyB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBHZXQgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzIGJlZm9yZSB0aGUgZGVsZXRpb24uCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkXy0+e1BhcmVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkXy0+e1BhcmVudElEfSBlcSAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9IEBDYWxlbmRhckFwcG9pbnRtZW50czsKCiAgICAgICAgICAgICAgICAjIFJlbW92ZSBhbGwgZXhpc3RpbmcgbGlua3MuCiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTGlua3MgY291bGQgbm90IGJlIGRlbGV0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbnMhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgID0+ICRFcnJvciwKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBkYXRlUHJlZmVyZW5jZXMnICkgewoKICAgICAgICBteSAkU3VjY2VzcyA9IDA7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAmJiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RGVmYXVsdFZpZXd9IHx8ICRHZXRQYXJhbXtDYWxlbmRhclNlbGVjdGlvbn0KICAgICAgICAgICAgICAgIHx8ICggJEdldFBhcmFte1Nob3duUmVzb3VyY2VzfSAmJiAkR2V0UGFyYW17VGVhbUlEfSApCiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17U2hvd25BcHBvaW50bWVudHN9CiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXk7CiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gJyc7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZWZhdWx0Vmlld30gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdEZWZhdWx0Vmlldyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Q2FsZW5kYXJTZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgPSAnQ2FsZW5kYXJTZWxlY3Rpb24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1Nob3duUmVzb3VyY2VzfSAmJiAkR2V0UGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ICAgICAgID0gJ1Nob3duUmVzb3VyY2VzJzsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gIi0kR2V0UGFyYW17VGVhbUlEfSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17U2hvd25BcHBvaW50bWVudHN9ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgPSAnU2hvd25BcHBvaW50bWVudHMnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXInIC4gJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAuICRQcmVmZXJlbmNlS2V5IC4gJFByZWZlcmVuY2VLZXlTdWZmaXgsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJEdldFBhcmFteyRQcmVmZXJlbmNlS2V5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtPdmVydmlld1NjcmVlbn0gJiYgJEdldFBhcmFte1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3N9ICkgewogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleTsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3N9IGVxICdTaG93blJlc291cmNlcycgJiYgJEdldFBhcmFte1RlYW1JRH0gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSAgICAgICA9ICdTaG93blJlc291cmNlcyc7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleVN1ZmZpeCA9ICItJEdldFBhcmFte1RlYW1JRH0iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJsYW5rIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcicgLiAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59IC4gJFByZWZlcmVuY2VLZXkgLiAkUHJlZmVyZW5jZUtleVN1ZmZpeCwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlYW0gbGlzdCBzZWxlY3Rpb24gdXBkYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVhbVVzZXJMaXN0JyApIHsKICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICBteSAlVGVhbVVzZXJMaXN0QWxsOwoKICAgICAgICAjIENoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQuCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAgICAgbXkgJFRlYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nKTsKICAgICAgICAgICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoQFRlYW1JRHMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVBTUlEIGlmICEkVGVhbUlEOwoKICAgICAgICAgICAgICAgICMgZ2V0IGxpc3Qgb2YgdGVhbSBtZW1iZXJzCiAgICAgICAgICAgICAgICBteSAlVGVhbVVzZXJMaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1Vc2VyTGlzdCgKICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVUZWFtVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFRlYW1Vc2VyTGlzdHskVXNlcklEfSA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJVRlYW1Vc2VyTGlzdEFsbCA9ICggJVRlYW1Vc2VyTGlzdEFsbCwgJVRlYW1Vc2VyTGlzdCApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlYW1Vc2VyTGlzdCA9PiBcJVRlYW1Vc2VyTGlzdEFsbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKc3ViIF9EYXlPZmZzZXRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGNvbnZlcnQgdGltZXN0YW1wIHRvIHVuaXggdGltZQogICAgbXkgJE9yaWdpbmFsVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1RpbWV9LAogICAgKTsKCiAgICAjIGdldCBvcmlnaW5hbCBkYXRlIGluZm8KICAgIG15IEBPcmlnaW5hbERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgIFN5c3RlbVRpbWUgPT4gJE9yaWdpbmFsVGltZVN5c3RlbSwKICAgICk7CgogICAgIyBjYWxjdWxhdGUgZGVzdGluYXRpb24gdGltZSAoYWNjb3JkaW5nIHRvIHVzZXIgdGltZXpvbmUpCiAgICBteSAkRGVzdGluYXRpb25UaW1lU3lzdGVtID0gJE9yaWdpbmFsVGltZVN5c3RlbSArICRTZWxmLT57VGltZVNlY0RpZmZ9OwoKICAgICMgZ2V0IGRlc3RpbmF0aW9uIGRhdGUgaW5mbwogICAgbXkgQERlc3RpbmF0aW9uRGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkRGVzdGluYXRpb25UaW1lU3lzdGVtLAogICAgKTsKCiAgICAjIGNvbXBhcmUgZGF5cyAtIGFycmF5cyBjb250YWlucyBmb2xsb3dpbmcgdmFsdWVzOiBTZWNvbmQsIE1pbnV0ZSwgSG91ciwgRGF5LCBNb250aCwgWWVhciBhbmQgRGF5T2ZXZWVrCiAgICBpZiAoICRPcmlnaW5hbERhdGVJbmZvWzNdID09ICREZXN0aW5hdGlvbkRhdGVJbmZvWzNdICkgewoKICAgICAgICAjIHNhbWUgZGF5CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBlbHNpZiAoICRPcmlnaW5hbFRpbWVTeXN0ZW0gPiAkRGVzdGluYXRpb25UaW1lU3lzdGVtICkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudEltcG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydCcgKSB7CgogICAgICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAgICAgbXkgJEZvcm1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICkgfHwgJyc7CgogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCkgaWYgISRGb3JtSUQ7CgogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAiRmlsZVVwbG9hZCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAgICAgbXkgJFVwZGF0ZUV4aXN0aW5nID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VwZGF0ZUV4aXN0aW5nQXBwb2ludG1lbnRzJyApIHx8ICcnOwogICAgICAgIG15ICRDYWxlbmRhcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhbGVuZGFySUQnICkgfHwgJyc7CgogICAgICAgIG15ICVFcnJvcnM7CgogICAgICAgIGlmICggISRDYWxlbmRhcklEICkgewogICAgICAgICAgICAkRXJyb3Jze0NhbGVuZGFySURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgZmlsZSBpbiB1cGxvYWQgY2FjaGUKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIG15ICRBZGRlZCA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiBmaWxlIGdvdCBub3QgYWRkZWQgdG8gc3RvcmFnZQogICAgICAgICAgICAjIChlLiBnLiBiZWNhdXNlIG9mIDEgTUIgbWF4X2FsbG93ZWRfcGFja2V0IE15U1FMIHByb2JsZW0pCiAgICAgICAgICAgIGlmICggISRBZGRlZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbnRlbnQgZnJvbSB1cGxvYWQgY2FjaGUKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggIUBBdHRhY2htZW50RGF0YSB8fCAoICRBdHRhY2htZW50RGF0YVswXSAmJiAhJXsgJEF0dGFjaG1lbnREYXRhWzBdIH0gKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnN7RmlsZVVwbG9hZEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiA9ICV7ICRBdHRhY2htZW50RGF0YVswXSB9OwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBlbXB0eQogICAgICAgIGlmICggISRVcGxvYWRTdHVmZntDb250ZW50fSApIHsKICAgICAgICAgICAgJEVycm9yc3tGaWxlVXBsb2FkSW52YWxpZH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcnMpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgICAgICAlRXJyb3JzLAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVDYWxlbmRhcjsKCiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgICAgIGlmICgkQ2FsZW5kYXJJRCkgewogICAgICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBjYWxlbmRhciBwZXJtaXNzaW9ucwogICAgICAgIGlmICggISVDYWxlbmRhciApIHsKCiAgICAgICAgICAgICMgbm8gcGVybWlzc2lvbnMKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9ucycpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9ucyBjaGVjawogICAgICAgIG15ICRQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQZXJtaXNzaW9uIG5lICdjcmVhdGUnICYmICRQZXJtaXNzaW9uIG5lICdydycgKSB7CgogICAgICAgICAgICAjIG5vIHBlcm1pc3Npb25zIHRvIGltcG9ydCB0byB0aGUgZXhpc3RpbmcgY2FsZW5kYXIKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9ucycpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJENvdW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwnKS0+SW1wb3J0KAogICAgICAgICAgICBDYWxlbmRhcklEICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIElDYWwgICAgICAgICAgID0+ICRVcGxvYWRTdHVmZntDb250ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBVcGRhdGVFeGlzdGluZyA9PiAkVXBkYXRlRXhpc3RpbmcsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJENvdW50ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgSW1wb3J0IG9rCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZTtJbXBvcnRBcHBvaW50bWVudHNTdWNjZXNzPTE7Q291bnQ9JHtDb3VudH07TmFtZT0iCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRDYWxlbmRhcntDYWxlbmRhck5hbWV9ICksCiAgICAgICAgKTsKCiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9PdmVydmlldygpOwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+X01hc2soJVBhcmFtKTsKfQoKc3ViIF9PdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBHZXQgdXNlcidzIHBlcm1pc3Npb25zIHRvIGFzc29jaWF0ZWQgbW9kdWxlcyB3aGljaCBhcmUgZGlzcGxheWVkIGFzIGxpbmtzLgogICAgZm9yIG15ICRNb2R1bGUgKHF3KEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSkpIHsKICAgICAgICBteSAkTW9kdWxlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykKICAgICAgICAgICAgLT57JE1vZHVsZX0tPntHcm91cH0gLy8gW107CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRNb2R1bGVHcm91cHMpICkgewogICAgICAgICAgICBNT0RVTEVfR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkTW9kdWxlR3JvdXAgKCBAeyRNb2R1bGVHcm91cHN9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57IlVzZXJJc0dyb3VwWyRNb2R1bGVHcm91cF0ifSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgTU9EVUxFX0dST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFsd2F5cyBhbGxvdyBsaW5rcyBpZiBubyBncm91cHMgYXJlIHNwZWNpZmllZC4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVBlcm1pc3Npb25zfS0+eyRNb2R1bGV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1RpdGxlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiSW1wb3J0IEFwcG9pbnRtZW50cyIpOwogICAgJFBhcmFte0NhbGVuZGFySURJbnZhbGlkfSAvLz0gJyc7CgogICAgbXkgQENhbGVuZGFyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckxpc3QoCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgUGVybWlzc2lvbiA9PiAnY3JlYXRlJywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICApOwoKICAgIG15IEBDYWxlbmRhckRhdGEgPSBtYXAgewogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJF8tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVmFsdWUgPT4gJF8tPntDYWxlbmRhck5hbWV9LAogICAgICAgIH0KICAgIH0gc29ydCB7ICRhLT57Q2FsZW5kYXJOYW1lfSBjbXAgJGItPntDYWxlbmRhck5hbWV9IH0gQENhbGVuZGFyTGlzdDsKCiAgICAkUGFyYW17Q2FsZW5kYXJ9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFxAQ2FsZW5kYXJEYXRhLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2FsZW5kYXJJRCcsCiAgICAgICAgSUQgICAgICAgICAgID0+ICdDYWxlbmRhcklEJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gJFBhcmFte0NhbGVuZGFySURJbnZhbGlkfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBUaXRsZSAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJDYWxlbmRhciIpLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0gfHwgJycsCiAgICApOwoKICAgICMgZ2V0IEZvcm1JRCBmcm9tIHBhcmFtcwogICAgJFBhcmFte0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApIHx8ICcnOwoKICAgICMgZ2VuZXJhdGUgRm9ybUlEIGlmIGVtcHR5CiAgICAkUGFyYW17Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpIGlmICEkUGFyYW17Rm9ybUlEfTsKCiAgICByZXR1cm4gJFNlbGYtPl9NYXNrKCVQYXJhbSk7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgcGFnZQogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50QXBwb2ludG1lbnRJbXBvcnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudExpc3Q7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IHRpbWUgem9uZSBvZmZzZXQKICAgICRTZWxmLT57VGltZVpvbmV9ICAgID0gJFNlbGYtPntVc2VyVGltZVpvbmV9IHx8IDA7CiAgICAkU2VsZi0+e1RpbWVTZWNEaWZmfSA9ICRTZWxmLT57VGltZVpvbmV9ICogMzYwMDsgICAgICMgNjAgKiA2MAoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmFtZXMgb2YgYWxsIHBhcmFtZXRlcnMKICAgIG15IEBQYXJhbU5hbWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CgogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKEBQYXJhbU5hbWVzKSB7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXBwb2ludG1lbnRJRHMnOwogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJFBsdWdpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKTsKCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gW10gKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgIyBjaGVjayByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGlzdEFwcG9pbnRtZW50cycgKSB7CgogICAgICAgIGlmICggJEdldFBhcmFte0NhbGVuZGFySUR9ICkgewoKICAgICAgICAgICAgIyBhcHBlbmQgbWlkbmlnaHQgdG8gdGhlIHRpbWVzdGFtcHMKICAgICAgICAgICAgZm9yIG15ICRUaW1lc3RhbXAgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JFRpbWVzdGFtcH0gJiYgISggJEdldFBhcmFteyRUaW1lc3RhbXB9ID1+IC9cc1xkezJ9OlxkezJ9OlxkezJ9JC8gKSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFRpbWVzdGFtcH0gPSAkR2V0UGFyYW17JFRpbWVzdGFtcH0gLiAnIDAwOjAwOjAwJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHRvIGxvY2FsIHRpbWUKICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKICAgICAgICAgICAgJEVuZFRpbWUgICAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVzZXQgZW1wdHkgcGFyYW1ldGVycwogICAgICAgICAgICBmb3IgbXkgJFBhcmFtICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskUGFyYW19ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gdW5kZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ28gdGhyb3VnaCBhbGwgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBub3RpZmljYXRpb24gZGF0ZQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICEkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfQogICAgICAgICAgICAgICAgICAgIHx8ICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9IGVxICcwMDAwLTAwLTAwIDAwOjAwOjAwJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHN5c3RlbSB0aW1lcwogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2F2ZSB0aW1lIHN0YW1wcyBmb3IgZGlzcGxheSBiZWZvcmUgY2FsY3VsYXRpb24KICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0RGF0ZX0gPSAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9OwogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gICA9ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9OwoKICAgICAgICAgICAgICAgICMgZW5kIHRpbWVzIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBhcmUgaW5jbHVzaXZlLCBzdWJ0cmFjdCB3aG9sZSBkYXkKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSA4NjQwMDsKICAgICAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgPSAkU3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgbG9jYWwgdGltZXMgZm9yIGNvbnRyb2wKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTdGFydFRpbWUgKz0gJFNlbGYtPntUaW1lU2VjRGlmZn07CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgKz0gJFNlbGYtPntUaW1lU2VjRGlmZn07CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9ybWF0dGVkIGRhdGUvdGltZSBzdHJpbmdzIHVzZWQgaW4gZGlzcGxheQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnREYXRlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3RhcnREYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcgLiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gPyAnU2hvcnQnIDogJycgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSwKICAgICAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcgLiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gPyAnU2hvcnQnIDogJycgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGluY2x1ZGUgcmVzb3VyY2UgZGF0YQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57VGVhbU5hbWV9ICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1Jlc291cmNlTmFtZXN9ID0gJyc7CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLAogICAgICAgICAgICAgICAgICAgICAgICBTaWxlbnQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRlYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQFRlYW1OYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7ICRBcHBvaW50bWVudC0+e1RlYW1JRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVEVBTUlEIGlmICEkVGVhbUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVRlYW0gPSAkVGVhbU9iamVjdC0+VGVhbUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgJFRlYW17TmFtZX0gaWYgJVRlYW07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ1bmNhdGUgbW9yZSB0aGFuIHRocmVlIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUZWFtQ291bnQgPSBzY2FsYXIgQFRlYW1OYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGVhbUNvdW50ID4gNCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZSBAVGVhbU5hbWVzLCAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAVGVhbU5hbWVzLCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICcrJWQgbW9yZScsICRUZWFtQ291bnQgLSAzICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1RlYW1OYW1lc30gPSBqb2luKCAnXG4nLCBAVGVhbU5hbWVzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57UmVzb3VyY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQFJlc291cmNlTmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUmVzb3VyY2VJRCAoIEB7ICRBcHBvaW50bWVudC0+e1Jlc291cmNlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFJFU09VUkNFSUQgaWYgISRSZXNvdXJjZUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRSZXNvdXJjZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFJlc291cmNlTmFtZXMsICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ1bmNhdGUgbW9yZSB0aGFuIHRocmVlIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRSZXNvdXJjZUNvdW50ID0gc2NhbGFyIEBSZXNvdXJjZU5hbWVzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXNvdXJjZUNvdW50ID4gNCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZSBAUmVzb3VyY2VOYW1lcywgMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFJlc291cmNlTmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnKyVkIG1vcmUnLCAkUmVzb3VyY2VDb3VudCAtIDMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57UmVzb3VyY2VOYW1lc30gPSBqb2luKCAnXG4nLCBAUmVzb3VyY2VOYW1lcyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGluY2x1ZGUgcGx1Z2luIChsaW5rKSBkYXRhCiAgICAgICAgICAgICAgICBteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luS2V5ICggc29ydCBrZXlzICV7JFBsdWdpbkxpc3R9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgQExpbmtBcnJheTsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQExpbmtBcnJheSwgJExpbmtMaXN0LT57JExpbmtJRH0tPntMaW5rTmFtZX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHRydW5jYXRlIG1vcmUgdGhhbiB0aHJlZSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgIG15ICRMaW5rQ291bnQgPSBzY2FsYXIgQExpbmtBcnJheTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRMaW5rQ291bnQgPiA0ICkgewogICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2UgQExpbmtBcnJheSwgMzsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATGlua0FycmF5LCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICcrJWQgbW9yZScsICRMaW5rQ291bnQgLSAzICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntQbHVnaW5EYXRhfS0+eyRQbHVnaW5LZXl9ID0gam9pbiggJ1xuJywgQExpbmtBcnJheSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZGVhbGluZyB3aXRoIHRpY2tldCBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFJ1bGUgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnQtPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUnVsZUlEICAgICA9PiAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdHlwZXMgZnJvbSB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUKICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRSdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57VGlja2V0QXBwb2ludG1lbnRTdGFydERhdGV9ID0gJFJ1bGUtPntTdGFydERhdGV9OwogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudEVuZERhdGV9ICAgPSAkUnVsZS0+e0VuZERhdGV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICgKICAgICAgICAgICAgICAgICAgICBcQEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBcHBvaW50bWVudERheXMnICkgewoKICAgICAgICAjIGFwcGVuZCBtaWRuaWdodCB0byB0aGUgdGltZXN0YW1wcwogICAgICAgIGZvciBteSAkVGltZXN0YW1wIChxdyhTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JFRpbWVzdGFtcH0gJiYgISggJEdldFBhcmFteyRUaW1lc3RhbXB9ID1+IC9cc1xkezJ9OlxkezJ9OlxkezJ9JC8gKSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskVGltZXN0YW1wfSA9ICRHZXRQYXJhbXskVGltZXN0YW1wfSAuICcgMDA6MDA6MDAnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlc2V0IGVtcHR5IHBhcmFtZXRlcnMKICAgICAgICBmb3IgbXkgJFBhcmFtICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyRQYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQXBwb2ludG1lbnREYXlzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERheXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+ICgKICAgICAgICAgICAgICAgIFwlQXBwb2ludG1lbnREYXlzLAogICAgICAgICAgICApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudFBsdWdpblNlYXJjaDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5lZWRlZCBwYXJhbXMKICAgIG15ICRTZWFyY2ggICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVybScgKSB8fCAnJzsKICAgIG15ICRQbHVnaW5LZXkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUGx1Z2luS2V5JyApOwogICAgbXkgJE1heFJlc3VsdHMgPSBpbnQoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdNYXhSZXN1bHRzJyApIHx8IDIwICk7CgogICAgIyB3b3JrYXJvdW5kLCBhbGwgYXV0byBjb21wbGV0aW9uIHJlcXVlc3RzIGdldCBwb3N0ZWQgYnkgdXRmOCBhbnl3YXkKICAgICMgY29udmVydCBhbnkgdG8gOGJpdCBzdHJpbmcgaWYgYXBwbGljYXRpb24gaXMgbm90IHJ1bm5pbmcgaW4gdXRmOAogICAgJFNlYXJjaCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+Q29udmVydDJDaGFyc2V0SW50ZXJuYWwoCiAgICAgICAgVGV4dCA9PiAkU2VhcmNoLAogICAgICAgIEZyb20gPT4gJ3V0Zi04JywKICAgICk7CgogICAgbXkgJFJlc3VsdExpc3Q7CgogICAgaWYgKCRQbHVnaW5LZXkpIHsKCiAgICAgICAgIyBnZXQgcGx1Z2luIG9iamVjdAogICAgICAgIG15ICRQbHVnaW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwoKICAgICAgICAkUmVzdWx0TGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpblNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoICAgID0+ICRTZWFyY2gsCiAgICAgICAgICAgIFBsdWdpbktleSA9PiAkUGx1Z2luS2V5LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBkYXRhCiAgICBteSBARGF0YTsKICAgIG15ICRNYXhSZXN1bHRDb3VudCA9ICRNYXhSZXN1bHRzOwoKICAgIE9CSkVDVElEOgogICAgZm9yIG15ICRPYmplY3RJRCAoCiAgICAgICAgc29ydCB7ICRSZXN1bHRMaXN0LT57JGF9IGNtcCAkUmVzdWx0TGlzdC0+eyRifSB9CiAgICAgICAga2V5cyAleyRSZXN1bHRMaXN0fQogICAgICAgICkKICAgIHsKICAgICAgICBwdXNoIEBEYXRhLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgVmFsdWUgPT4gJFJlc3VsdExpc3QtPnskT2JqZWN0SUR9LAogICAgICAgIH07CgogICAgICAgICRNYXhSZXN1bHRDb3VudC0tOwogICAgICAgIGxhc3QgT0JKRUNUSUQgaWYgJE1heFJlc3VsdENvdW50IDw9IDA7CiAgICB9CgogICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgIERhdGEgPT4gXEBEYXRhIHx8IHt9LAogICAgKTsKCiAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6UHVibGljQ2FsZW5kYXI7CgojdXNlIENHSTo6QXV0aDo6QmFzaWM7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNSU1FOjpCYXNlNjQgcXcoKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUdldFBhcmFtOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFVzZXIgVG9rZW4pKSB7CiAgICAgICAgJEdldFBhcmFteyROZWVkZWR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJE5lZWRlZCApOwogICAgICAgIGlmICggISRHZXRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05vICVzIScsICROZWVkZWQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdXNlcgogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VyICA9PiAkR2V0UGFyYW17VXNlcn0sCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHN1Y2ggdXNlciEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgIyBnZXQgY2FsZW5kYXIKICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICElQ2FsZW5kYXIgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRDYWxlbmRhcntWYWxpZElEfSAhPSAxICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBjYWxlbmRhciEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBhY2Nlc3MgdG9rZW4KICAgIG15ICRBY2Nlc3NUb2tlbiA9ICRDYWxlbmRhck9iamVjdC0+R2V0QWNjZXNzVG9rZW4oCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlckxvZ2luICA9PiAkR2V0UGFyYW17VXNlcn0sCiAgICApOwoKICAgIGlmICggJEFjY2Vzc1Rva2VuIG5lICRHZXRQYXJhbXtUb2tlbn0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdJbnZhbGlkIFVSTCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaUNhbGVuZGFyIHN0cmluZwogICAgbXkgJElDYWxTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV4cG9ydDo6SUNhbCcpLT5FeHBvcnQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkSUNhbFN0cmluZyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgdGhlIGZpbGUgbmFtZQogICAgbXkgJEZpbGVuYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RmlsZW5hbWVDbGVhblVwKAogICAgICAgIEZpbGVuYW1lID0+ICIkQ2FsZW5kYXJ7Q2FsZW5kYXJOYW1lfS5pY3MiLAogICAgICAgIFR5cGUgICAgID0+ICdBdHRhY2htZW50JywKICAgICk7CgogICAgIyBzZW5kIGlDYWwgcmVzcG9uc2UKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2NhbGVuZGFyJywKICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJElDYWxTdHJpbmcsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SlNPTicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBsaW5rIG9iamVjdCAoYXBwb2ludG1lbnQpLgoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudC0+bmV3KAogICAgICAgIFVzZXJMYW5ndWFnZSA9PiAnZW4nLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJMYW5ndWFnZSBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfSB8fCBkaWUgIkdvdCBubyAkTmVlZGVkISI7CiAgICB9CgogICAgIyBjcmVhdGUgb3VyIG93biBMYXlvdXRPYmplY3QgaW5zdGFuY2UgdG8gYXZvaWQgYmxvY2sgZGF0YSBjb2xsaXNpb25zIHdpdGggdGhlIG1haW4gcGFnZQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKICAgICRTZWxmLT57T2JqZWN0RGF0YX0gPSB7CiAgICAgICAgT2JqZWN0ICAgICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFJlYWxuYW1lICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBPYmplY3ROYW1lID0+ICdTb3VyY2VPYmplY3RJRCcsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGFibGVDcmVhdGVDb21wbGV4KCkKCnJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBibG9jayBkYXRhCgpSZXR1cm4KCiAgICAlQmxvY2tEYXRhID0gKAogICAgICAgIHsKICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAnU291cmNlT2JqZWN0SUQnLAogICAgICAgICAgICBPYmplY3RJRCAgID0+IDEsCiAgICAgICAgICAgIE9iamVjdCAgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgQmxvY2tuYW1lICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgICAgICBIZWFkbGluZSAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUaXRsZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnU3RhcnQgVGltZScsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0VuZCBUaW1lJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDE1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEl0ZW1MaXN0ID0+IFsKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdBcHBvaW50bWVudCB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdBcHBvaW50bWVudCBkZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAxNi0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAxNi0wMS0wMSAxMzowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgQEJsb2NrRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5UYWJsZUNyZWF0ZUNvbXBsZXgoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlQ29tcGxleCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfHwgcmVmICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE9iamVjdExpbmtMaXN0V2l0aERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjb252ZXJ0IHRoZSBsaXN0CiAgICBteSAlTGlua0xpc3Q7CiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoIHNvcnQga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAkTGlua0xpc3R7JEFwcG9pbnRtZW50SUR9LT57RGF0YX0gPSAkRGlyZWN0aW9uTGlzdC0+eyRBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29tcGxleFRhYmxlRGF0YSA9ICRDb25maWdPYmplY3QtPkdldCgiTGlua09iamVjdDo6Q29tcGxleFRhYmxlIik7CiAgICBteSAkRGVmYXVsdENvbHVtbnM7CiAgICBpZiAoCiAgICAgICAgJENvbXBsZXhUYWJsZURhdGEKICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQ29tcGxleFRhYmxlRGF0YSkKICAgICAgICAmJiAkQ29tcGxleFRhYmxlRGF0YS0+e0FwcG9pbnRtZW50fQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQ29tcGxleFRhYmxlRGF0YS0+e0FwcG9pbnRtZW50fSApCiAgICAgICAgKQogICAgewogICAgICAgICREZWZhdWx0Q29sdW1ucyA9ICRDb21wbGV4VGFibGVEYXRhLT57IkFwcG9pbnRtZW50In0tPnsiRGVmYXVsdENvbHVtbnMifTsKICAgIH0KCiAgICBteSBAVGltZUxvbmdUeXBlcyA9ICgKICAgICAgICAiQ3JlYXRlZCIsCiAgICAgICAgIkNoYW5nZWQiLAogICAgICAgICJTdGFydFRpbWUiLAogICAgICAgICJFbmRUaW1lIiwKICAgICAgICAiTm90aWZpY2F0aW9uVGltZSIsCiAgICApOwoKICAgICMgZGVmaW5lIHRoZSBibG9jayBkYXRhCiAgICBteSBASGVhZGxpbmUgPSAoCiAgICAgICAgewogICAgICAgICAgICBDb250ZW50ID0+ICdUaXRsZScsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgbG9hZCB1c2VyIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJERlZmF1bHRDb2x1bW5zIHx8ICFJc0hhc2hSZWZXaXRoRGF0YSgkRGVmYXVsdENvbHVtbnMpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWlzc2luZyBjb25maWd1cmF0aW9uIGZvciBMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUjIyNBcHBvaW50bWVudCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgR2V0IGRlZmF1bHQgY29sdW1uIHByaW9yaXR5IGZyb20gU3lzQ29uZmlnCiAgICAjIEVhY2ggY29sdW1uIGluIHRhYmxlIChUaXRsZSwgU3RhcnRUaW1lLCBFbmRUaW1lLC4uLikgaGFzIGRlZmluZWQgUHJpb3JpdHkgaW4gU3lzQ29uZmlnLgogICAgIyBTeXN0ZW0gdXNlIHRoaXMgcHJpb3JpdHkgdG8gc29ydCBjb2x1bW5zLCBpZiB1c2VyIGRvZXNuJ3QgaGF2ZSBvd24gc2V0dGluZ3MuCiAgICBteSAlU29ydE9yZGVyOwoKICAgIGlmICgKICAgICAgICAkQ29tcGxleFRhYmxlRGF0YS0+eyJBcHBvaW50bWVudCJ9LT57IlByaW9yaXR5In0KICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJENvbXBsZXhUYWJsZURhdGEtPnsiQXBwb2ludG1lbnQifS0+eyJQcmlvcml0eSJ9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJVNvcnRPcmRlciA9ICV7ICRDb21wbGV4VGFibGVEYXRhLT57IkFwcG9pbnRtZW50In0tPnsiUHJpb3JpdHkifSB9OwogICAgfQoKICAgIG15ICVVc2VyQ29sdW1ucyA9ICV7JERlZmF1bHRDb2x1bW5zfTsKCiAgICBpZiAoICRQcmVmZXJlbmNlc3snTGlua09iamVjdDo6Q29tcGxleFRhYmxlLUFwcG9pbnRtZW50J30gKSB7CiAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwoKICAgICAgICBteSAkQ29sdW1uc0VuYWJsZWQgPSAkSlNPTk9iamVjdC0+RGVjb2RlKAogICAgICAgICAgICBEYXRhID0+ICRQcmVmZXJlbmNlc3snTGlua09iamVjdDo6Q29tcGxleFRhYmxlLUFwcG9pbnRtZW50J30sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29sdW1uc0VuYWJsZWQKICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoJENvbHVtbnNFbmFibGVkKQogICAgICAgICAgICAmJiAkQ29sdW1uc0VuYWJsZWQtPntPcmRlcn0KICAgICAgICAgICAgJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkQ29sdW1uc0VuYWJsZWQtPntPcmRlcn0gKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIENsZWFyIHNvcnQgb3JkZXIKICAgICAgICAgICAgJVNvcnRPcmRlciA9ICgpOwoKICAgICAgICAgICAgREVGQVVMVENPTFVNTjoKICAgICAgICAgICAgZm9yIG15ICREZWZhdWx0Q29sdW1uICggc29ydCBrZXlzICVVc2VyQ29sdW1ucyApIHsKICAgICAgICAgICAgICAgIG15ICRJbmRleCA9IDA7CgogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VyU2V0dGluZyAoIEB7ICRDb2x1bW5zRW5hYmxlZC0+e09yZGVyfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIGlmICggJERlZmF1bHRDb2x1bW4gZXEgJFVzZXJTZXR0aW5nICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckNvbHVtbnN7JERlZmF1bHRDb2x1bW59ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgJFNvcnRPcmRlcnskRGVmYXVsdENvbHVtbn0gICA9ICRJbmRleDsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgREVGQVVMVENPTFVNTjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBub3QgZm91bmQsIG1lYW5zIHVzZXIgY2hvc2UgdG8gaGlkZSB0aGlzIGl0ZW0KICAgICAgICAgICAgICAgIGlmICggJFVzZXJDb2x1bW5zeyREZWZhdWx0Q29sdW1ufSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRVc2VyQ29sdW1uc3skRGVmYXVsdENvbHVtbn0gPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISRTb3J0T3JkZXJ7JERlZmF1bHRDb2x1bW59ICkgewogICAgICAgICAgICAgICAgICAgICRTb3J0T3JkZXJ7JERlZmF1bHRDb2x1bW59ID0gMDsgICAgIyBTZXQgMCwgaXQgc3lzdGVtIHdpbGwgaGlkZSB0aGlzIGl0ZW0gYW55d2F5cwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgIyB1c2VyIGhhcyBubyBvd24gc2V0dGluZ3MKICAgICAgICBmb3IgbXkgJENvbHVtbiAoIHNvcnQga2V5cyAlVXNlckNvbHVtbnMgKSB7CiAgICAgICAgICAgIGlmICggISRTb3J0T3JkZXJ7JENvbHVtbn0gKSB7CiAgICAgICAgICAgICAgICAkU29ydE9yZGVyeyRDb2x1bW59ID0gMDsgICAgICAgICAgICAgICAjIFNldCAwLCBpdCBzeXN0ZW0gd2lsbCBoaWRlIHRoaXMgaXRlbSBhbnl3YXlzCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBEZWZpbmUgSGVhZGxpbmUgY29sdW1ucwoKICAgICMgU29ydAogICAgbXkgQEFsbENvbHVtbnM7CiAgICBDT0xVTU46CiAgICBmb3IgbXkgJENvbHVtbiAoIHNvcnQgeyAkU29ydE9yZGVyeyRhfSA8PT4gJFNvcnRPcmRlcnskYn0gfSBrZXlzICVVc2VyQ29sdW1ucyApIHsKCiAgICAgICAgbXkgJENvbHVtblRyYW5zbGF0ZSA9ICRDb2x1bW47CiAgICAgICAgaWYgKCAkQ29sdW1uIGVxICdDYWxlbmRhck5hbWUnICkgewogICAgICAgICAgICAkQ29sdW1uVHJhbnNsYXRlID0gVHJhbnNsYXRhYmxlKCdDYWxlbmRhciBuYW1lJyk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnU3RhcnRUaW1lJyApIHsKICAgICAgICAgICAgJENvbHVtblRyYW5zbGF0ZSA9IFRyYW5zbGF0YWJsZSgnU3RhcnQgZGF0ZScpOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0VuZFRpbWUnICkgewogICAgICAgICAgICAkQ29sdW1uVHJhbnNsYXRlID0gVHJhbnNsYXRhYmxlKCdFbmQgZGF0ZScpOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ05vdGlmaWNhdGlvblRpbWUnICkgewogICAgICAgICAgICAkQ29sdW1uVHJhbnNsYXRlID0gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24nKTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQEFsbENvbHVtbnMsIHsKICAgICAgICAgICAgQ29sdW1uTmFtZSAgICAgID0+ICRDb2x1bW4sCiAgICAgICAgICAgIENvbHVtblRyYW5zbGF0ZSA9PiAkQ29sdW1uVHJhbnNsYXRlLAogICAgICAgIH07CgogICAgICAgIG5leHQgQ09MVU1OIGlmICRDb2x1bW4gZXEgJ1RpdGxlJzsgICAgIyBBbHdheXMgcHJlc2VudCwgYWxyZWFkeSBhZGRlZC4KCiAgICAgICAgIyBpZiBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICBpZiAoICRVc2VyQ29sdW1uc3skQ29sdW1ufSA9PSAyICkgewoKICAgICAgICAgICAgIyBhcHBvaW50bWVudCBmaWVsZHMKICAgICAgICAgICAgbXkgJENvbHVtbk5hbWUgPSAkQ29sdW1uVHJhbnNsYXRlOwoKICAgICAgICAgICAgcHVzaCBASGVhZGxpbmUsIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbHVtbk5hbWUsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRoZSBpdGVtIGxpc3QgKHRhYmxlIGNvbnRlbnQpCiAgICBteSBASXRlbUxpc3Q7CgogICAgQVBQT0lOVE1FTlRJRDoKICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoCiAgICAgICAgc29ydCB7ICRMaW5rTGlzdHskYX17RGF0YX0tPntBcHBvaW50bWVudElEfSA8PT4gJExpbmtMaXN0eyRifXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9IH0KICAgICAgICBrZXlzICVMaW5rTGlzdAogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgISRBcHBvaW50bWVudElEOwoKICAgICAgICAjIGV4dHJhY3QgYXBwb2ludG1lbnQgYW5kIGNhbGVuZGFyIGRhdGEKICAgICAgICBteSAkQXBwb2ludG1lbnQgPSAkTGlua0xpc3R7JEFwcG9pbnRtZW50SUR9e0RhdGF9OwogICAgICAgIG15ICVDYWxlbmRhciAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnQtPntDYWxlbmRhcklEfSwKICAgICAgICApOwoKICAgICAgICAjIFRpdGxlIGJlIHByZXNlbnQgKHNpbmNlIGl0IGNvbnRhaW5zIG1hc3RlciBsaW5rIHRvIHRoZSBhcHBvaW50bWVudCkKICAgICAgICBteSBASXRlbUNvbHVtbnMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgS2V5ICAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEFwcG9pbnRtZW50LT57VGl0bGV9LAogICAgICAgICAgICAgICAgTGluayAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0nCiAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFNvcnQKICAgICAgICBDT0xVTU46CiAgICAgICAgZm9yIG15ICRDb2x1bW4gKCBzb3J0IHsgJFNvcnRPcmRlcnskYX0gPD0+ICRTb3J0T3JkZXJ7JGJ9IH0ga2V5cyAlVXNlckNvbHVtbnMgKSB7CgogICAgICAgICAgICBuZXh0IENPTFVNTiBpZiAkQ29sdW1uIGVxICdUaXRsZSc7ICAgICMgQWx3YXlzIHByZXNlbnQsIGFscmVhZHkgYWRkZWQuCgogICAgICAgICAgICAjIGlmIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoICRVc2VyQ29sdW1uc3skQ29sdW1ufSA9PSAyICkgewoKICAgICAgICAgICAgICAgIG15ICVIYXNoOwogICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJENvbHVtbiB9IEBUaW1lTG9uZ1R5cGVzICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydUeXBlJ30gPSAnVGltZUxvbmcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J1R5cGUnfSA9ICdUZXh0JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRDb2x1bW4gZXEgJ05vdGlmaWNhdGlvblRpbWUnICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydDb250ZW50J30gPSAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnQ3JlYXRlZCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRBcHBvaW50bWVudC0+e0NyZWF0ZVRpbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdDaGFuZ2VkJyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnQ29udGVudCd9ID0gJEFwcG9pbnRtZW50LT57Q2hhbmdlVGltZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0NhbGVuZGFyTmFtZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRDYWxlbmRhcntDYWxlbmRhck5hbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRBcHBvaW50bWVudC0+eyRDb2x1bW59OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1Db2x1bW5zLCBcJUhhc2g7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcQEl0ZW1Db2x1bW5zOwogICAgfQoKICAgIHJldHVybiBpZiAhQEl0ZW1MaXN0OwoKICAgIG15ICVCbG9jayA9ICgKICAgICAgICBPYmplY3QgICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9LAogICAgICAgIEJsb2NrbmFtZSAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e1JlYWxuYW1lfSwKICAgICAgICBPYmplY3ROYW1lID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3ROYW1lfSwKICAgICAgICBPYmplY3RJRCAgID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgSGVhZGxpbmUgICA9PiBcQEhlYWRsaW5lLAogICAgICAgIEl0ZW1MaXN0ICAgPT4gXEBJdGVtTGlzdCwKICAgICAgICBBbGxDb2x1bW5zID0+IFxAQWxsQ29sdW1ucywKICAgICk7CgogICAgcmV0dXJuICggXCVCbG9jayApOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50ID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdBOjEnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ1RpdGxlIG9mIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgJUxpbmtPdXRwdXREYXRhID0gJEJhY2tlbmRPYmplY3QtPlRhYmxlQ3JlYXRlU2ltcGxlKAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZVNpbXBsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfHwgcmVmICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE9iamVjdExpbmtMaXN0V2l0aERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTGlua091dHB1dERhdGE7CiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIG15IEBJdGVtTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEICgKICAgICAgICAgICAgICAgIHNvcnQgewogICAgICAgICAgICAgICAgICAgIGxjICREaXJlY3Rpb25MaXN0LT57JGF9LT57TmFtZVNob3J0fSBjbXAgbGMgJERpcmVjdGlvbkxpc3QtPnskYn0tPntOYW1lU2hvcnR9CiAgICAgICAgICAgICAgICB9IGtleXMgJXskRGlyZWN0aW9uTGlzdH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBhcHBvaW50bWVudCBkYXRhCiAgICAgICAgICAgICAgICBteSAkQXBwb2ludG1lbnQgPSAkRGlyZWN0aW9uTGlzdC0+eyRBcHBvaW50bWVudElEfTsKCiAgICAgICAgICAgICAgICAjIGRlZmluZSBpdGVtIGRhdGEKICAgICAgICAgICAgICAgIG15ICVJdGVtID0gKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gIkE6JEFwcG9pbnRtZW50SUQiLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gVHJhbnNsYXRhYmxlKCdBcHBvaW50bWVudCcpLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcJUl0ZW07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGl0ZW0gbGlzdCB0byBsaW5rIG91dHB1dCBkYXRhCiAgICAgICAgICAgICRMaW5rT3V0cHV0RGF0YXsgJExpbmtUeXBlIC4gJzo6JyAuICREaXJlY3Rpb24gfS0+e0FwcG9pbnRtZW50fSA9IFxASXRlbUxpc3Q7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlTGlua091dHB1dERhdGE7Cn0KCj1pdGVtIENvbnRlbnRTdHJpbmdDcmVhdGUoKQoKcmV0dXJuIGEgb3V0cHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5Db250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgIENvbnRlbnREYXRhID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDb250ZW50U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb250ZW50RGF0YX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbnRlbnREYXRhIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIFNlbGVjdGFibGVPYmplY3RMaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VsZWN0YWJsZSBvYmplY3RzCgpSZXR1cm4KCiAgICBAU2VsZWN0YWJsZU9iamVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgICAgICBWYWx1ZSA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIH0sCiAgICApOwoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICRCYWNrZW5kT2JqZWN0LT5TZWxlY3RhYmxlT2JqZWN0TGlzdCgKICAgICAgICBTZWxlY3RlZCA9PiAkSWRlbnRpZmllciwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBTZWxlY3RhYmxlT2JqZWN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxlY3RlZDsKICAgIGlmICggJFBhcmFte1NlbGVjdGVkfSAmJiAkUGFyYW17U2VsZWN0ZWR9IGVxICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9ICkgewogICAgICAgICRTZWxlY3RlZCA9IDE7CiAgICB9CgogICAgIyBvYmplY3Qgc2VsZWN0IGxpc3QKICAgIG15IEBPYmplY3RTZWxlY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgICAgIFNlbGVjdGVkID0+ICRTZWxlY3RlZCwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQE9iamVjdFNlbGVjdExpc3Q7Cn0KCj1pdGVtIFNlYXJjaE9wdGlvbkxpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBzZWFyY2ggb3B0aW9ucwoKUmV0dXJuCgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0FwcG9pbnRtZW50VGl0bGUnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJzEyMzQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0FwcG9pbnRtZW50RGVzY3JpcHRpb24nLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJ0JsYUJsYScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQXBwb2ludG1lbnRDYWxlbmRhcklEJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDYWxlbmRhcicsCiAgICAgICAgICAgIElucHV0U3RyZyA9PiAkRm9ybVN0cmluZywKICAgICAgICAgICAgRm9ybURhdGEgID0+ICdDYWxlbmRhcjEnLAogICAgICAgIH0sCiAgICApOwoKICAgIEBTZWFyY2hPcHRpb25MaXN0ID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaE9wdGlvbkxpc3QoCiAgICAgICAgU3ViT2JqZWN0ID0+ICdCbGEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaE9wdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1Ib29rID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6Okhvb2snKSB8fCAnVGlja2V0Iyc7CgogICAgIyBzZWFyY2ggb3B0aW9uIGxpc3QKICAgIG15IEBTZWFyY2hPcHRpb25MaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnQXBwb2ludG1lbnRUaXRsZScsCiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdUaXRsZScpLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnQXBwb2ludG1lbnREZXNjcmlwdGlvbicsCiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdEZXNjcmlwdGlvbicpLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnQXBwb2ludG1lbnRDYWxlbmRhcklEJywKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0NhbGVuZGFyJyksCiAgICAgICAgICAgIFR5cGUgPT4gJ0xpc3QnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvcm1rZXkKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewogICAgICAgICRSb3ctPntGb3JtS2V5fSA9ICdTRUFSQ0g6OicgLiAkUm93LT57S2V5fTsKICAgIH0KCiAgICAjIGFkZCBmb3JtIGRhdGEgYW5kIGlucHV0IHN0cmluZwogICAgUk9XOgogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CgogICAgICAgIG5leHQgUk9XIGlmICRSb3ctPntUeXBlfSBlcSAnSGlkZGVuJzsKCiAgICAgICAgIyBQcmVwYXJlIHRleHQgaW5wdXQgZmllbGRzLgogICAgICAgIGlmICggJFJvdy0+e1R5cGV9IGVxICdUZXh0JyApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJFJvdy0+e0Zvcm1LZXl9ICk7CgogICAgICAgICAgICAjIHBhcnNlIHRoZSBpbnB1dCB0ZXh0IGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnB1dFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFJvdy0+e0Zvcm1LZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRSb3ctPntGb3JtRGF0YX0gfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIGlucHV0IHN0cmluZwogICAgICAgICAgICAkUm93LT57SW5wdXRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdMaW5rT2JqZWN0JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUHJlcGFyZSBkcm9wIGRvd24gbGlzdHMuCiAgICAgICAgZWxzaWYgKCAkUm93LT57VHlwZX0gZXEgJ0xpc3QnICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgIG15IEBGb3JtRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0QXJyYXkoIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwogICAgICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gXEBGb3JtRGF0YTsKCiAgICAgICAgICAgIGlmICggJFJvdy0+e0tleX0gZXEgJ0FwcG9pbnRtZW50Q2FsZW5kYXJJRCcgKSB7CiAgICAgICAgICAgICAgICBteSBAQ2FsZW5kYXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyTGlzdCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+ICdydycsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSBAQ2FsZW5kYXJEYXRhID0gbWFwIHsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfLT57Q2FsZW5kYXJOYW1lfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHNvcnQgeyAkYS0+e0NhbGVuZGFyTmFtZX0gY21wICRiLT57Q2FsZW5kYXJOYW1lfSB9IEBDYWxlbmRhckxpc3Q7CgogICAgICAgICAgICAgICAgJFJvdy0+e0lucHV0U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBDYWxlbmRhckRhdGEsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkUm93LT57Rm9ybUtleX0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUm93LT57Rm9ybURhdGF9LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEBTZWFyY2hPcHRpb25MaXN0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlczo6QXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgYWxsIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnRzCiAgICBteSAkVHJhbnNwb3J0Q29uZmlnUmF3ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0JykgfHwge307CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIHNraXAgYWxsIG5vbiBleGVjdXRhYmxlIHRyYW5zcG9ydHMKICAgIFRSQU5TUE9SVDoKICAgIGZvciBteSAkVHJhbnNwb3J0TmFtZSAoIHNvcnQga2V5cyAleyRUcmFuc3BvcnRDb25maWdSYXd9ICkgewoKICAgICAgICAjIGRpc2NhcmQgbm9uIGF2YWlsYWJsZSB0cmFuc3BvcnRzCiAgICAgICAgbXkgJFRyYW5zcG9ydExvYWRlZCA9ICRNYWluT2JqZWN0LT5SZXF1aXJlKAogICAgICAgICAgICAkVHJhbnNwb3J0Q29uZmlnUmF3LT57JFRyYW5zcG9ydE5hbWV9LT57TW9kdWxlfSwKICAgICAgICAgICAgU2lsZW50ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIHRyYW5zcG9ydAogICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICEkVHJhbnNwb3J0TG9hZGVkOwoKICAgICAgICAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30tPnskVHJhbnNwb3J0TmFtZX0gPSAkVHJhbnNwb3J0Q29uZmlnUmF3LT57JFRyYW5zcG9ydE5hbWV9OwogICAgfQoKICAgICMgZ2V0IE5vdGlmaWNhdGlvbkV2ZW50IG9iamVjdAogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50Jyk7CgogICAgbXkgJU5vdGlmaWNhdGlvbkxpc3QgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoIFR5cGUgPT4gJ0FwcG9pbnRtZW50JyApOwoKICAgIG15ICROb3RpZmljYXRpb25Db25maWcKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6OkFkbWluOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgIE5PVElGSUNBVElPTjoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKCBzb3J0IGtleXMgJU5vdGlmaWNhdGlvbkxpc3QgKSB7CgogICAgICAgICMgZ2V0IG5vdGlmaWNhdGlvbiBkZXRhaWxzCiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbiA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBJRCA9PiAkTm90aWZpY2F0aW9uSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNjYXJkIGludmFsaWQgbm90aWZpY2F0aW9ucwogICAgICAgIG15IEBWYWxpZElEcyA9ICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKTsKICAgICAgICBuZXh0IE5PVElGSUNBVElPTiBpZiAhZ3JlcCB7ICROb3RpZmljYXRpb257VmFsaWRJRH0gPT0gJF8gfSBAVmFsaWRJRHM7CgogICAgICAgICMgZGlzY2FyZCBhbGwgbm9uIGN1c3RvbWl6YWJsZSBub3RpZmljYXRpb25zCiAgICAgICAgbmV4dCBOT1RJRklDQVRJT04gaWYgISROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9OwogICAgICAgIG5leHQgTk9USUZJQ0FUSU9OIGlmICEkTm90aWZpY2F0aW9ue0RhdGF9LT57VmlzaWJsZUZvckFnZW50fS0+WzBdOwoKICAgICAgICAjIHJlbWVtYmVyIG5vdGlmaWNhdGlvbiBkYXRhCiAgICAgICAgJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH0gPSBcJU5vdGlmaWNhdGlvbjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQYXJhbSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBQYXJhbXM7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIHByaW50IHRhYmxlIGhlYWRlcgogICAgZm9yIG15ICROYW1lICgKICAgICAgICBzb3J0IHsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JGF9LT57UHJpb30gPD0+ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfS0+eyRifS0+e1ByaW99IH0KICAgICAgICBrZXlzICV7ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfSB9CiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkVHJhbnNwb3J0Q29uZmlnID0gJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JE5hbWV9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lID0+ICRUcmFuc3BvcnRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIFRyYW5zcG9ydEljb24gPT4gJFRyYW5zcG9ydENvbmZpZy0+e0ljb259LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdGFibGUgYm9keQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0gKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbFNwYW4gPT4gKCBzY2FsYXIga2V5cyAleyAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30gfSApICsgMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IHRoZSB1c2VyIHByZWZlcmVuY2VzICh0aGlzIG5lZWRzIHRvIGJlIGRvbmUgb25seSBvbmNlKQogICAgICAgIG15ICRVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtVc2VyRGF0YX0tPntBcHBvaW50bWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydH0sCiAgICAgICAgKTsKCiAgICAgICAgTk9USUZJQ0FUSU9OOgogICAgICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKAogICAgICAgICAgICBzb3J0IHsgJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyRhfS0+e05hbWV9IGNtcCAkU2VsZi0+e05vdGlmaWNhdGlvbkxpc3R9LT57JGJ9LT57TmFtZX0gfQogICAgICAgICAgICBrZXlzICV7ICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0gfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbmV4dCBOT1RJRklDQVRJT04gaWYgISRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0tPnskTm90aWZpY2F0aW9uSUR9OwoKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0tPnskTm90aWZpY2F0aW9uSUR9OwoKICAgICAgICAgICAgIyBmaWxsIG5vdGlmaWNhdGlvbiBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCb2R5Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk5hbWUgID0+ICROb3RpZmljYXRpb24tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UaXRsZSA9PiAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntWaXNpYmxlRm9yQWdlbnRUb29sdGlwfS0+WzBdIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFZpc2libGVGb3JBZ2VudCAgID0+ICROb3RpZmljYXRpb24tPntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgICAgIGZvciBteSAkVHJhbnNwb3J0TmFtZSAoCiAgICAgICAgICAgICAgICBzb3J0IHsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JGF9LT57UHJpb30gPD0+ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfS0+eyRifS0+e1ByaW99IH0KICAgICAgICAgICAgICAgIGtleXMgJXsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG15ICRJZGVudGlmaWVyID0gIk5vdGlmaWNhdGlvbi0kTm90aWZpY2F0aW9uSUQtJFRyYW5zcG9ydE5hbWUiOwoKICAgICAgICAgICAgICAgIG15ICRUcmFuc3BvcnRFbmFibGVkID0gZ3JlcCB7ICRfIGVxICRUcmFuc3BvcnROYW1lIH0gQHsgJE5vdGlmaWNhdGlvbi0+e0RhdGF9LT57VHJhbnNwb3J0c30gfTsKCiAgICAgICAgICAgICAgICBteSAkQWdlbnRFbmFibGVkQnlEZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgPSBncmVwIHsgJF8gZXEgJFRyYW5zcG9ydE5hbWUgfSBAeyAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntBZ2VudEVuYWJsZWRCeURlZmF1bHR9IH07CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBwcmVmZXJlbmNlIGZvciB0aGlzIHRyYW5zcG9ydCBhbmQgbm90aWZpY2F0aW9uIG9yIGZhbGwgYmFjayB0bwogICAgICAgICAgICAgICAgIyAgIG5vdGlmaWNhdGlvbiBkZWZhdWx0IGlmIHRoZXJlIGlzIG5vIHVzZXIgcHJlZmVyZW5jZQogICAgICAgICAgICAgICAgbXkgJFVzZSA9ICRVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0LT57JElkZW50aWZpZXJ9IC8vICRBZ2VudEVuYWJsZWRCeURlZmF1bHQ7CgogICAgICAgICAgICAgICAgbXkgJENoZWNrZWQgICAgID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICAgICAgICAgIG15ICRIaWRkZW5WYWx1ZSA9IDE7CiAgICAgICAgICAgICAgICBpZiAoICEkVXNlICkgewogICAgICAgICAgICAgICAgICAgICRDaGVja2VkICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICRIaWRkZW5WYWx1ZSA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmaWxsIGVhY2ggdHJhbnNwb3J0IGNvbHVtbgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQm9keVRyYW5zcG9ydENvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJFRyYW5zcG9ydEVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQm9keVRyYW5zcG9ydENvbHVtbkVuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk5hbWUgPT4gJE5vdGlmaWNhdGlvbi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0TmFtZSAgICA9PiAkVHJhbnNwb3J0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgICAgICAgPT4gJElkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VkICAgICAgICAgID0+ICRDaGVja2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkZGVuVmFsdWUgICAgICA9PiAkSGlkZGVuVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdlbmVyYXRlIEhUTUwKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQcmVmZXJlbmNlc05vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSByZXR1cm4gc3RydWN0dXJlIGZvciBnZW5lcmljICJPcHRpb24iIGJsb2NrIGluIEFnZW50UHJlZmVyZW5jZXMKICAgIHB1c2goCiAgICAgICAgQFBhcmFtcywKICAgICAgICB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQmxvY2sgPT4gJ1Jhd0hUTUwnLAogICAgICAgICAgICBIVE1MICA9PiAkT3V0cHV0LAogICAgICAgICAgICBOYW1lICA9PiAnTm90aWZpY2F0aW9uRXZlbnRUcmFuc3BvcnQnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAUGFyYW1zOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQElkZW50aWZpZXJMaXN0OwogICAgbXkgQE1hbmRhdG9yeU5vdGlmaWNhdGlvbklEczsKCiAgICBOT1RJRklDQVRJT046CiAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbklEICggc29ydCBrZXlzICV7ICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0gfSApIHsKCiAgICAgICAgbmV4dCBOT1RJRklDQVRJT04gaWYgISRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0tPnskTm90aWZpY2F0aW9uSUR9OwoKICAgICAgICBteSAkTm90aWZpY2F0aW9uICAgICAgICAgID0gJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH07CiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbk1hbmRhdG9yeSA9IDA7CiAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9ICYmICROb3RpZmljYXRpb24tPntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXSA9PSAyICkgewogICAgICAgICAgICAkTm90aWZpY2F0aW9uTWFuZGF0b3J5ID0gMTsKICAgICAgICAgICAgcHVzaCBATWFuZGF0b3J5Tm90aWZpY2F0aW9uSURzLCAkTm90aWZpY2F0aW9uSUQ7CiAgICAgICAgfQoKICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgZm9yIG15ICRUcmFuc3BvcnROYW1lICggc29ydCBrZXlzICV7ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfSB9ICkgewogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhZ3JlcCB7ICRfIGVxICRUcmFuc3BvcnROYW1lIH0gQHsgJE5vdGlmaWNhdGlvbi0+e0RhdGF9LT57VHJhbnNwb3J0c30gfTsKICAgICAgICAgICAgcHVzaCBASWRlbnRpZmllckxpc3QsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICJOb3RpZmljYXRpb24tJE5vdGlmaWNhdGlvbklELSRUcmFuc3BvcnROYW1lIiwKICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbklEID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICAgICAgICAgIElzTWFuZGF0b3J5ICAgID0+ICROb3RpZmljYXRpb25NYW5kYXRvcnksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFVzZXJPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAlVXNlck5vdGlmaWNhdGlvblRyYW5zcG9ydDsKICAgIG15ICVNYW5kYXRvcnlGdWxmaWxsZWQ7CiAgICBmb3IgbXkgJElkZW50aWZpZXIgKEBJZGVudGlmaWVyTGlzdCkgewogICAgICAgICRVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0eyAkSWRlbnRpZmllci0+e05hbWV9IH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkSWRlbnRpZmllci0+e05hbWV9ICkgfHwgMDsKCiAgICAgICAgIyBjaGVjayBpZiB0aGlzIGlzIGEgbWFuZGF0b3J5IG5vdGlmaWNhdGlvbiBhbmQgdGhpcyB0cmFuc3BvcnQgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICRVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0eyAkSWRlbnRpZmllci0+e05hbWV9IH0gPT0gMSApIHsKICAgICAgICAgICAgJE1hbmRhdG9yeUZ1bGZpbGxlZHsgJElkZW50aWZpZXItPntOb3RpZmljYXRpb25JRH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBub3cgY2hlY2sgaWYgdGhlcmUgYXJlIG5vdGlmaWNhdGlvbnMgZm9yIHdoaWNoIG5vIHRyYW5zcG9ydCBoYXMgYmVlbiBzZWxlY3RlZAogICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoQE1hbmRhdG9yeU5vdGlmaWNhdGlvbklEcykgewogICAgICAgIGlmICggJE1hbmRhdG9yeUZ1bGZpbGxlZHskTm90aWZpY2F0aW9uSUR9ICE9IDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57RXJyb3J9ID0gVHJhbnNsYXRhYmxlKAogICAgICAgICAgICAgICAgIlBsZWFzZSBtYWtlIHN1cmUgeW91J3ZlIGNob3NlbiBhdCBsZWFzdCBvbmUgdHJhbnNwb3J0IG1ldGhvZCBmb3IgbWFuZGF0b3J5IG5vdGlmaWNhdGlvbnMuIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkVuY29kZSgKICAgICAgICBEYXRhID0+IFwlVXNlck5vdGlmaWNhdGlvblRyYW5zcG9ydCwKICAgICk7CgogICAgIyB1cGRhdGUgdXNlciBwcmVmZXJlbmNlcwogICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdEZW1vU3lzdGVtJykgKSB7CiAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJEYXRhfS0+e1VzZXJJRH0sCiAgICAgICAgICAgIEtleSAgICA9PiAnQXBwb2ludG1lbnROb3RpZmljYXRpb25UcmFuc3BvcnQnLAogICAgICAgICAgICBWYWx1ZSAgPT4gJFZhbHVlIC8vICcnLAogICAgICAgICk7CiAgICB9CgogICAgJFNlbGYtPntNZXNzYWdlfSA9IFRyYW5zbGF0YWJsZSgnUHJlZmVyZW5jZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJyk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0Vycm9yfSB8fCAnJzsKfQoKc3ViIE1lc3NhZ2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntNZXNzYWdlfSB8fCAnJzsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIFRoaXMgaXMgYSBkdW1teSB0ZW1wbGF0ZSBmaWxlIGZvciB3b3JrYXJvdW5kIG9mIGJ1ZyMxMjM4NzoKIyBTZWUgaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM4NyBmb3IgZGV0YWlscy4KClslIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgcmVtaW5kZXIgbm90aWZpY2F0aW9uIikgfCBodG1sICVdClslIFRyYW5zbGF0ZSgiWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4iKSB8IGh0bWwgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8bGFiZWwgZm9yPSJSZWNpcGllbnRFbWFpbCI+WyUgVHJhbnNsYXRlKCJBZGRpdGlvbmFsIHJlY2lwaWVudCBlbWFpbCBhZGRyZXNzZXMiKSB8IGh0bWwgJV06IDwvbGFiZWw+CjxkaXYgY2xhc3M9IkZpZWxkIj4KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJSZWNpcGllbnRFbWFpbCIgaWQ9IlJlY2lwaWVudEVtYWlsIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfTWF4TGVuZ3RoIFslIERhdGEuUmVjaXBpZW50RW1haWxTZXJ2ZXJFcnJvciB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlJlY2lwaWVudEVtYWlsIHwgaHRtbCAlXSIgZGF0YS1tYXhsZW5ndGg9IjIwMCIvPgogICAgPGRpdiBpZD0iUmVjaXBpZW50RW1haWxFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBtdXN0IGhhdmUgbGVzcyB0aGVuIDIwMCBjaGFyYWN0ZXJzLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgIDxkaXYgaWQ9IlJlY2lwaWVudEVtYWlsU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgbXVzdCBoYXZlIGxlc3MgdGhlbiAyMDAgY2hhcmFjdGVycy4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8bGFiZWwgZm9yPSJUcmFuc3BvcnRFbWFpbFRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIkVtYWlsIHRlbXBsYXRlIikgfCBodG1sICVdOiA8L2xhYmVsPgo8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICBbJSBEYXRhLlRyYW5zcG9ydEVtYWlsVGVtcGxhdGVTdHJnICVdCiAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJVc2UgdGhpcyB0ZW1wbGF0ZSB0byBnZW5lcmF0ZSB0aGUgY29tcGxldGUgZW1haWwgKG9ubHkgZm9yIEhUTUwgZW1haWxzKS4iKSB8IGh0bWwgJV08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBTRVQgT1RSU0J1c2luZXNzTGFiZWwgPSAnPHN0cm9uZz5PVFJTIEJ1c2luZXNzIFNvbHV0aW9uPC9zdHJvbmc+4oSiJyAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXciKSAlXQo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249QWRkIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIG5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Ob3RpZmljYXRpb25FeHBvcnQiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWRvd25sb2FkIj48L2k+WyUgVHJhbnNsYXRlKCJFeHBvcnQgTm90aWZpY2F0aW9ucyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25JbXBvcnQiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDb25maWd1cmF0aW9uIEltcG9ydCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0IFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ik5vdGlmaWNhdGlvbkltcG9ydCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iRmlsZVVwbG9hZCIgaWQ9IkZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjE4IiBjbGFzcz0iRml4ZWQgVzEwMHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuRmlsZVVwbG9hZEludmFsaWQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmlsZVVwbG9hZFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iU2VwYXJhdGVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMiIG5hbWU9Ik92ZXJ3cml0ZUV4aXN0aW5nTm90aWZpY2F0aW9ucyIgdmFsdWU9IjEiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT3ZlcndyaXRlRXhpc3RpbmdOb3RpZmljYXRpb25zIj5bJSBUcmFuc2xhdGUoIk92ZXJ3cml0ZSBleGlzdGluZyBub3RpZmljYXRpb25zPyIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlVwbG9hZCBOb3RpZmljYXRpb24gY29uZmlndXJhdGlvbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPlslIFRyYW5zbGF0ZSgiSW1wb3J0IE5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25JbXBvcnQiKSAlXQogICAgPC9kaXY+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxpc3QiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiRXhwb3J0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIFcxMHBjIj5bJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSZXN1bHRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgWyUgSUYgRGF0YS5WYWxpZElEICE9IDElXWNsYXNzPSJJbnZhbGlkIlslIEVORCAlXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249Q2hhbmdlO0lEPVslIERhdGEuSUQgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHRpdGxlPSJbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdIj5bJSBEYXRhLkNvbW1lbnQgfCB0cnVuY2F0ZSgyNikgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkNoYW5nZVRpbWUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPU5vdGlmaWNhdGlvbkV4cG9ydDtJRD1bJSBEYXRhLklEIHwgdXJpICVdO1slIEVudigiQ2hhbGxlbmdlVG9rZW5QYXJhbSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWRvd25sb2FkIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiRXhwb3J0IikgfCBodG1sICVdPC9zcGFuPjwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Ob3RpZmljYXRpb25Db3B5O0lEPVslIERhdGEuSUQgfCB1cmkgJV07WyUgRW52KCJDaGFsbGVuZ2VUb2tlblBhcmFtIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY29weSI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3NwYW4+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IlRyYXNoQ2FuIE5vdGlmaWNhdGlvbkRlbGV0ZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPURlbGV0ZTtJRD1bJSBEYXRhLklEIHwgdXJpICVdO1slIEVudigiQ2hhbGxlbmdlVG9rZW5QYXJhbSIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIHRoaXMgbm90aWZpY2F0aW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcuTm90aWZpY2F0aW9uRGVsZXRlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKCiAgICBpZiAod2luZG93LmNvbmZpcm0oWyUgVHJhbnNsYXRlKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgbm90aWZpY2F0aW9uPyIpIHwgSlNPTiAlXSkpIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkKHRoaXMpLmF0dHIoJ2hyZWYnKTsKICAgIH0KCiAgICAvLyBkb24ndCBpbnRlcmZlcmUgd2l0aCBNYXN0ZXJBY3Rpb24KICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIHJldHVybiBmYWxzZTsKfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1VwZGF0ZSIpICVdCgogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUiIG5hbWU9ImNvbXBvc2UiIGlkPSJOb3RpZmljYXRpb25FdmVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCBOb3RpZmljYXRpb24iKSB8IGh0bWwgJV08L2gyPgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQWRkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRWRpdCBOb3RpZmljYXRpb24iKSB8IGh0bWwgJV08L2gyPgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpb24gfCB1cmkgJV1BY3Rpb24iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJRCIgdmFsdWU9IlslIERhdGEuSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmFtZSIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgaWQ9Ik5hbWUiIHZhbHVlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5OYW1lU2VydmVyRXJyb3IgJV0iIG1heGxlbmd0aD0iMjAwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tZW50Ij5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiBpZD0iQ29tbWVudCIgdmFsdWU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIyNTAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWaXNpYmxlRm9yQWdlbnQiPlslIFRyYW5zbGF0ZSgiU2hvdyBpbiBhZ2VudCBwcmVmZXJlbmNlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WaXNpYmxlRm9yQWdlbnRTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWaXNpYmxlRm9yQWdlbnRUb29sdGlwIj5bJSBUcmFuc2xhdGUoIkFnZW50IHByZWZlcmVuY2VzIHRvb2x0aXAiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJWaXNpYmxlRm9yQWdlbnRUb29sdGlwIiBpZD0iVmlzaWJsZUZvckFnZW50VG9vbHRpcCIgY2xhc3M9Ilc1MHBjIiB2YWx1ZT0iWyUgRGF0YS5WaXNpYmxlRm9yQWdlbnRUb29sdGlwIHwgaHRtbCAlXSIgWyUgRGF0YS5WaXNpYmxlRm9yQWdlbnRUb29sdGlwUmVhZG9ubHkgJV0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiVGhpcyBtZXNzYWdlIHdpbGwgYmUgc2hvd24gb24gdGhlIGFnZW50IHByZWZlcmVuY2VzIHNjcmVlbiBhcyBhIHRvb2x0aXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIHRoaXMgd2lkZ2V0IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFdmVudHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRXZlbnRzIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkV2ZW50IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkV2ZW50c1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkV2ZW50c0Vycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRXZlbnRzU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCBDb2xsYXBzZWQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIHRoaXMgd2lkZ2V0IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCBGaWx0ZXIiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdVcGRhdGVUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHlwZUlEIj5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1VwZGF0ZVR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGl0bGUiPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgaWQ9IlRpdGxlIiBjbGFzcz0iVzc1cGMiIHZhbHVlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTG9jYXRpb24iPlslIFRyYW5zbGF0ZSgiTG9jYXRpb24iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJMb2NhdGlvbiIgaWQ9IkxvY2F0aW9uIiBjbGFzcz0iVzc1cGMiIHZhbHVlPSJbJSBEYXRhLkxvY2F0aW9uIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdVcGRhdGVUZWFtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVhbUlEIj5bJSBUcmFuc2xhdGUoIlRlYW0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGVhbVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3VXBkYXRlVGVhbSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXNvdXJjZUlEIj5bJSBUcmFuc2xhdGUoIlJlc291cmNlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc291cmNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIHRoaXMgd2lkZ2V0IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJSZWNpcGllbnRzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlY2lwaWVudHMiPlslIFRyYW5zbGF0ZSgiU2VuZCB0byIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZWNpcGllbnRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50QWdlbnRzIj5bJSBUcmFuc2xhdGUoIlNlbmQgdG8gdGhlc2UgYWdlbnRzIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY2lwaWVudEFnZW50c1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlY2lwaWVudEdyb3VwcyI+WyUgVHJhbnNsYXRlKCJTZW5kIHRvIGFsbCBncm91cCBtZW1iZXJzIChhZ2VudHMgb25seSkiKSB8IGh0bWwgJV06IDwvbGFiZWw+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==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCjxkaXYgY2xhc3M9Ik92ZXJ2aWV3Qm94IEFSSUFSb2xlTWFpbiBbJSBEYXRhLlZpZXcgfCBodG1sICVdIj4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkFnZW5kYSBPdmVydmlldyIpIHwgaHRtbCAlXTwvaDE+CgogICAgPGRpdiBjbGFzcz0iT3ZlcnZpZXdDb250cm9sIiBpZD0iT3ZlcnZpZXdDb250cm9sIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250cm9sUm93Ij4KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVyIikgJV0KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iVGFicyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkFjdGl2ZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtTdGFydD1bJSBEYXRhLlN0YXJ0IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtGaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV07U3RhcnQ9WyUgRGF0YS5TdGFydCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW0iKSAlXQogICAgICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVyIikgJV0KCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQnV0dG9ucyBIZWFkZXJMZWZ0Ij4KWyUgSUYgRGF0YS5Nb2R1bGVQZXJtaXNzaW9ucy5BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UgJV0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO1N1YmFjdGlvbj1PdmVydmlldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhbGVuZGFyLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJNYW5hZ2UgQ2FsZW5kYXJzIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQXBwb2ludG1lbnRDcmVhdGVCdXR0b24iIGhyZWY9IiMiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPiBbJSBUcmFuc2xhdGUoIkFkZCBBcHBvaW50bWVudCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkJ1dHRvbnMgSGVhZGVyUmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJUb2RheSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07RmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdO1N0YXJ0PVslIERhdGEuU3RhcnQgfCB1cmkgJV07SnVtcD1QcmV2IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmEgZmEtY2hldnJvbi1sZWZ0Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtTdGFydD1bJSBEYXRhLlN0YXJ0IHwgdXJpICVdO0p1bXA9TmV4dCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZhIGZhLWNoZXZyb24tcmlnaHQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlckNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIERhdGEuSGVhZGVyVGl0bGUgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJXZWVrTnVtYmVyIj5bJSBEYXRhLkhlYWRlclRpdGxlQ1cgfCBodG1sICVdPC9zcGFuPjwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJPdmVydmlld0JvZHkiIGNsYXNzPSJPdmVydmlldyBUaWNrZXRMaXN0Ij4KICAgIDx0YWJsZSBjbGFzcz0iVGFibGVTbWFsbCBOb0NlbGxzcGFjaW5nIj4KICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNvbG9yIikgfCBodG1sICVdIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGE+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiU3RhcnQgZGF0ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIkVuZCBkYXRlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIgVzEwcGMiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiQWxsLWRheSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIFcxMHBjIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIlJlcGVhdCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwb2ludG1lbnRHcm91cCIpICVdCiAgICAgICAgPHRib2R5PgogICAgICAgICAgICA8dHIgY2xhc3M9IkRhdGVEaXZpZGVyIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI4Ij5bJSBEYXRhLkN1cnJlbnREYXkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3Rib2R5PgogICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwb2ludG1lbnRBY3Rpb25Sb3ciKSAlXQogICAgICAgICAgICA8dHIgaWQ9IkFwcG9pbnRtZW50SURfWyUgRGF0YS5BcHBvaW50bWVudElEIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkZsYWdzIENlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCIgdGl0bGU9IlslIERhdGEuQ2FsZW5kYXJEYXRhLiR7RGF0YS5DYWxlbmRhcklEfS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNhbGVuZGFyQ29sb3IiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBbJSBEYXRhLkNhbGVuZGFyRGF0YS4ke0RhdGEuQ2FsZW5kYXJJRH0uQ29sb3IgfCBodG1sICVdOyI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNhbGVuZGFyRGF0YS4ke0RhdGEuQ2FsZW5kYXJJRH0uQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJEYXRhLiR7RGF0YS5DYWxlbmRhcklEfS5DYWxlbmRhck5hbWUgfCB0cnVuY2F0ZSgyMSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIiBkYXRhLWFwcG9pbnRtZW50LWlkPSJbJSBEYXRhLkFwcG9pbnRtZW50SUQgfCBodG1sICVdIiBocmVmPSIjIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgdHJ1bmNhdGUoMzYpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFydERhdGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuRW5kRGF0ZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5BbGxEYXkgPT0gMSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlllcyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlJlY3VycmluZyA9PSAxICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiWWVzIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuTm90aWZpY2F0aW9uRGF0ZSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5vdGlmaWNhdGlvbkRhdGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXBwb2ludG1lbnRBY3Rpb25Sb3ciKSAlXQogICAgICAgIDwvdGJvZHk+ClslIFJlbmRlckJsb2NrRW5kKCJBcHBvaW50bWVudEdyb3VwIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwb2ludG1lbnROb0RhdGFSb3ciKSAlXQogICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjgiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90Ym9keT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFwcG9pbnRtZW50Tm9EYXRhUm93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXJzTm90Rm91bmQiKSAlXQogICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjgiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3Rib2R5PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJzTm90Rm91bmQiKSAlXQogICAgPC90YWJsZT4KPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNMb2FkaW5nJywgWyUgVHJhbnNsYXRlKCJMb2FkaW5nLi4uIikgfCBKU09OICVdKTsKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyQWdlbmRhT3ZlcnZpZXcnLCB0cnVlKTsKCnZhciBQYXJhbXMgPSB7CiAgICBEaWFsb2dUZXh0OiB7CiAgICAgICAgRWRpdFRpdGxlOiBbJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VUaXRsZTogWyUgVHJhbnNsYXRlKCJUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VUZXh0OiBbJSBUcmFuc2xhdGUoIldvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlQWxsOiBbJSBUcmFuc2xhdGUoIkFsbCBvY2N1cnJlbmNlcyIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlSnVzdFRoaXM6IFslIFRyYW5zbGF0ZSgiSnVzdCB0aGlzIG9jY3VycmVuY2UiKSB8IEpTT04gJV0KICAgIH0sCiAgICBDYWxsYmFja3M6IHsKICAgICAgICBFZGl0QWN0aW9uOiBbJSBEYXRhLkVkaXRBY3Rpb24gfCBKU09OICVdLAogICAgICAgIEVkaXRNYXNrU3ViYWN0aW9uOiBbJSBEYXRhLkVkaXRNYXNrU3ViYWN0aW9uIHwgSlNPTiAlXQogICAgfQp9OwoKJCgnI0FwcG9pbnRtZW50Q3JlYXRlQnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIHsKICAgICAgICBTdGFydDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KFslIERhdGEuU3RhcnQgfCBKU09OICVdKS5hZGQoMSwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpLAogICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KFslIERhdGEuU3RhcnQgfCBKU09OICVdKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpLAogICAgfSk7CgogICAgcmV0dXJuIGZhbHNlOwp9KTsKJCgnLk1hc3RlckFjdGlvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICB2YXIgJE1hc3RlckFjdGlvbkxpbmsgPSAkKHRoaXMpLmZpbmQoJy5NYXN0ZXJBY3Rpb25MaW5rJyksCiAgICAgICAgQXBwb2ludG1lbnRJRCA9ICRNYXN0ZXJBY3Rpb25MaW5rLmRhdGEoJ2FwcG9pbnRtZW50SWQnKTsKCiAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuT3BlbkVkaXREaWFsb2coUGFyYW1zLCB7CiAgICAgICAgQ2FsRXZlbnQ6IHsKICAgICAgICAgICAgaWQ6IEFwcG9pbnRtZW50SUQKICAgICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gZmFsc2U7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KCiAgICA8aDEgY2xhc3M9IkhlYWRlciI+WyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCBJbXBvcnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBJRiBEYXRhLk1vZHVsZVBlcm1pc3Npb25zLkFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSAlXQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJCYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWxlZnQiPjwvaT5bJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlVwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0ICdjcmVhdGUnIHBlcm1pc3Npb25zLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJJbXBvcnQgQXBwb2ludG1lbnRzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkltcG9ydCIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRmlsZVVwbG9hZCIgY2xhc3M9Ik1hbmRhdG9yeSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlVwbG9hZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iRmlsZVVwbG9hZCIgaWQ9IkZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjE4IiBjbGFzcz0iRml4ZWQgVzEwMHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuRmlsZVVwbG9hZEludmFsaWQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmlsZVVwbG9hZFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIiBjbGFzcz0iTWFuZGF0b3J5Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DYWxlbmRhciAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVXBkYXRlRXhpc3RpbmdBcHBvaW50bWVudHMiPlslIFRyYW5zbGF0ZSgiVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8iKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJVcGRhdGVFeGlzdGluZ0FwcG9pbnRtZW50cyIgaWQ9IlVwZGF0ZUV4aXN0aW5nQXBwb2ludG1lbnRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiVXBsb2FkIGNhbGVuZGFyIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkltcG9ydCBhcHBvaW50bWVudHMiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KCiAgICA8aDEgY2xhc3M9IkhlYWRlciI+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KWyUgSUYgRW52KCJTdWJhY3Rpb24iKSA9PSAiT3ZlcnZpZXciICVdClslIElGIERhdGEuTW9kdWxlUGVybWlzc2lvbnMuQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJCYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR28gYmFjayIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gYmFjayIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIEVORCAlXQpbJSBFTFNJRiBFbnYoIlN1YmFjdGlvbiIpICE9ICIiICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQmFjayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJHbyBiYWNrIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1sZWZ0Ij48L2k+WyUgVHJhbnNsYXRlKCJHbyBiYWNrIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRUxTRSAlXQpbJSBJRiBEYXRhLk1vZHVsZVBlcm1pc3Npb25zLkFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3ICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iT3ZlcnZpZXciIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDYWxlbmRhciBPdmVydmlldyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXIiPjwvaT5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIE92ZXJ2aWV3IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRU5EICVdClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNYWluQWN0aW9ucyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQWRkIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO1N1YmFjdGlvbj1OZXciIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBDYWxlbmRhciIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT5bJSBUcmFuc2xhdGUoIkFkZCBDYWxlbmRhciIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIElGIERhdGEuTW9kdWxlUGVybWlzc2lvbnMuQWdlbnRBcHBvaW50bWVudEltcG9ydCAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KWyUgSUYgRGF0YS5WYWxpZENvdW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJJbXBvcnRBcHBvaW50bWVudHMiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50SW1wb3J0IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkltcG9ydCBBcHBvaW50bWVudHMiKSB8IGh0bWwgJV0iPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJJbXBvcnRBcHBvaW50bWVudHMiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciBEaXNhYmxlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSW1wb3J0IEFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXSI+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPlslIFRyYW5zbGF0ZSgiSW1wb3J0IEFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiTWFpbkFjdGlvbnMiKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+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+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KIyBVc2UgYW1wZXJzYW5kcyAoJikgaW5zdGVhZCBvZiBzZW1pY29sb25zICg7KSBmb3IgVVJMIHBhcmFtZXRlciBkZWxpbWl0ZXIuIFRoaXMgaGFzIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggZGlmZmVyZW50CiMgICBjYWxlbmRhciBpbXBsZW1lbnRhdGlvbnMgYW5kIHdpbGwgcHJldmVudCB0aGVtIGZyb20gcmUtZW5jb2RpbmcgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgZXNzZW50aWFsbHkgc3RyaXAgdGhlIGRhdGEuCiMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjY2NyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iRG93bmxvYWRMaW5rIiBocmVmPSJbJSBDb25maWcoIkh0dHBUeXBlIikgJV06Ly9bJSBDb25maWcoIkZRRE4iKSAlXS9bJSBDb25maWcoIlNjcmlwdEFsaWFzIikgJV1wdWJsaWMucGw/QWN0aW9uPVB1YmxpY0NhbGVuZGFyJkNhbGVuZGFySUQ9WyUgRGF0YS5DYWxlbmRhcklEIHwgdXJpICVdJlVzZXI9WyUgRW52KCJVc2VyTG9naW4iKSB8IHVyaSAlXSZUb2tlbj1bJSBEYXRhLkFjY2Vzc1Rva2VuIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEb3dubG9hZCBjYWxlbmRhciIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jbG91ZC1kb3dubG9hZCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEb3dubG9hZCBjYWxlbmRhciIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IklubGluZUJ1dHRvbiBDb3B5VG9DbGlwYm9hcmQiIGRhdGEtY2xpcGJvYXJkLXRleHQ9IlslIENvbmZpZygiSHR0cFR5cGUiKSAlXTovL1slIENvbmZpZygiRlFETiIpICVdL1slIENvbmZpZygiU2NyaXB0QWxpYXMiKSAlXXB1YmxpYy5wbD9BY3Rpb249UHVibGljQ2FsZW5kYXImQ2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV0mVXNlcj1bJSBFbnYoIlVzZXJMb2dpbiIpIHwgdXJpICVdJlRva2VuPVslIERhdGEuQWNjZXNzVG9rZW4gfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNvcHkgcHVibGljIGNhbGVuZGFyIFVSTCIpIHwgaHRtbCAlXSI+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+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKENvbmZpZygiQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbSIpLiR7RGF0YS5QYXJhbU5hbWV9KSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlBhcmFtU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUGFyYW1TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iU2VhcmNoUGFyYW1fWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdX1slIERhdGEuUGFyYW1OYW1lIHwgaHRtbCAlXSIgbmFtZT0iU2VhcmNoUGFyYW1fWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdX1slIERhdGEuUGFyYW1OYW1lIHwgaHRtbCAlXSIgZGF0YS1wYXJhbT0iWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdIiB0eXBlPSJ0ZXh0IiBjbGFzcz0iU2VhcmNoUGFyYW0gVmFsaWRhdGVfUmVxdWlyZWQgVzI1cGMiIHZhbHVlPSJbJSBEYXRhLlBhcmFtVmFsdWUgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VhcmNoUGFyYW1fWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdX1slIERhdGEuUGFyYW1OYW1lIHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudFJ1bGVTZWFyY2hQYXJhbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50UnVsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkRlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IkFkZFJ1bGVCdXR0b24iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBZGQgUnVsZSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSAiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHZhbHVlPSJTYXZlIiB0eXBlPSJzdWJtaXQiIGlkPSJTdWJtaXQiIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGlkPSJUaWNrZXRBcHBvaW50bWVudFJ1bGVzVGVtcGxhdGUiIGNsYXNzPSJIaWRkZW4iPgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgIDxsZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUnVsZSIpIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iUnVsZU51bWJlciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvbGVnZW5kPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhcnREYXRlIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN0YXJ0IGRhdGUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhcnREYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJFbmREYXRlIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkVuZCBkYXRlIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkVuZERhdGVTdHJnICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJRdWV1ZUlEIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUXVldWVzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlF1ZXVlSURTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUXVldWVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VhcmNoUGFyYW1zIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlYXJjaCBhdHRyaWJ1dGVzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNlYXJjaFBhcmFtc0NvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZWFyY2hQYXJhbXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFkZEJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQWRkIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IlRpY2tldEFwcG9pbnRtZW50U2VhcmNoUGFyYW1UZW1wbGF0ZSIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZWFyY2hQYXJhbSIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlNlYXJjaFBhcmFtVXNlciAlXQogICAgICAgICAgICAgICAgPGlucHV0IGlkPSJTZWFyY2hQYXJhbSIgbmFtZT0iU2VhcmNoUGFyYW0iIHR5cGU9InRleHQiIGNsYXNzPSJWYWxpZGF0ZV9SZXF1aXJlZCIgLz4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlYXJjaFBhcmFtRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZS5Jbml0VGlja2V0QXBwb2ludG1lbnRzKFslIERhdGEuUnVsZUNvdW50IHwgSlNPTiAlXSk7ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEFwcG9pbnRtZW50UnVsZUluaXQiKSAlXQpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlLkluaXRUaWNrZXRBcHBvaW50bWVudFJ1bGUoWyUgRGF0YS5SdWxlSUQgfCBKU09OICVdLCAkKCcjUnVsZV8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoWyUgRGF0YS5SdWxlSUQgfCBKU09OICVdKSkpOwpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QXBwb2ludG1lbnRSdWxlSW5pdCIpICVdCiQoJ2lucHV0I0NvbG9yJykuc3BlY3RydW0oewogICAgY29sb3I6IFslIERhdGEuQ29sb3IgfCBKU09OICVdLAogICAgY29udGFpbmVyQ2xhc3NOYW1lOiAnQ29sb3JQYWxldHRlQ29udGFpbmVyJywKICAgIGhpZGVBZnRlclBhbGV0dGVTZWxlY3Q6IHRydWUsCiAgICBwcmVmZXJyZWRGb3JtYXQ6ICdoZXgnLAogICAgcmVwbGFjZXJDbGFzc05hbWU6ICdDb2xvclBhbGV0dGVCdXR0b24nLAogICAgc2hvd0lucHV0OiB0cnVlLAogICAgc2hvd1BhbGV0dGU6IHRydWUsCiAgICBzaG93UGFsZXR0ZU9ubHk6IHRydWUsCiAgICBzaG93U2VsZWN0aW9uUGFsZXR0ZTogZmFsc2UsCiAgICB0b2dnbGVQYWxldHRlT25seTogdHJ1ZSwKICAgIHRvZ2dsZVBhbGV0dGVNb3JlVGV4dDogWyUgVHJhbnNsYXRlKCJNb3JlIikgfCBKU09OICVdLAogICAgdG9nZ2xlUGFsZXR0ZUxlc3NUZXh0OiBbJSBUcmFuc2xhdGUoIkxlc3MiKSB8IEpTT04gJV0sCiAgICBjaG9vc2VUZXh0OiBbJSBUcmFuc2xhdGUoIkNvbmZpcm0iKSB8IEpTT04gJV0sCiAgICBjYW5jZWxUZXh0OiBbJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgSlNPTiAlXSwKICAgIHBhbGV0dGU6IFsKICAgICAgICAnWyUgRGF0YS5Db2xvclBhbGV0dGUuam9pbigiJywnIikgJV0nCiAgICBdCn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyRWRpdCIpICVdCiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIE92ZXJ2aWV3IikgfCBodG1sICVdPC9oMT4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBFbnYoIlVzZXJDaGFsbGVuZ2VUb2tlbiIpICVdIiBuYW1lPSJDaGFsbGVuZ2VUb2tlbiIgaWQ9IkNoYWxsZW5nZVRva2VuIiAvPgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBJRiBEYXRhLk1vZHVsZVBlcm1pc3Npb25zLkFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXT9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO1N1YmFjdGlvbj1PdmVydmlldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYWxlbmRhci1vIj48L2k+WyUgVHJhbnNsYXRlKCJNYW5hZ2UgQ2FsZW5kYXJzIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIgaHJlZj0iIyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgbmV3IEFwcG9pbnRtZW50IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIEFwcG9pbnRtZW50IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhcldpZGdldCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFycyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyQ2FsZW5kYXJzIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlckNhbGVuZGFycyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBjYWxlbmRhcnMiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUgU3BhY2luZ1RvcFNtYWxsIiBpZD0iQ2FsZW5kYXJzIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzEwcGMiPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcxMHBjIj48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJVUkwiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhclN3aXRjaCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iQ2FsZW5kYXJTd2l0Y2giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IkNhbGVuZGFyWyUgRGF0YS5DYWxlbmRhcklEIHwgaHRtbCAlXSIgbmFtZT0iQ2FsZW5kYXJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIiBkYXRhLWlkPSJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIiBbJSBEYXRhLkNoZWNrZWQgJV0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iRmxhZ3MgQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhclslIERhdGEuQ2FsZW5kYXJJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIiB0aXRsZT0iWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDYWxlbmRhckNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogWyUgRGF0YS5Db2xvciB8IGh0bWwgJV07Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFyWyUgRGF0YS5DYWxlbmRhcklEIHwgaHRtbCAlXSIgdGl0bGU9IlslIERhdGEuQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJOYW1lIHwgdHJ1bmNhdGUoMjEpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgojIFVzZSBhbXBlcnNhbmRzICgmKSBpbnN0ZWFkIG9mIHNlbWljb2xvbnMgKDspIGZvciBVUkwgcGFyYW1ldGVyIGRlbGltaXRlci4gVGhpcyBoYXMgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBkaWZmZXJlbnQKIyAgIGNhbGVuZGFyIGltcGxlbWVudGF0aW9ucyBhbmQgd2lsbCBwcmV2ZW50IHRoZW0gZnJvbSByZS1lbmNvZGluZyB0aGUgcXVlcnkgc3RyaW5nIGFuZCBlc3NlbnRpYWxseSBzdHJpcCB0aGUgZGF0YS4KIyAgIFBsZWFzZSBzZWUgYnVnIzEyNjY3IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDb3B5VG9DbGlwYm9hcmQgSW5saW5lQnV0dG9uIiBkYXRhLWNsaXBib2FyZC10ZXh0PSJbJSBDb25maWcoIkh0dHBUeXBlIikgJV06Ly9bJSBDb25maWcoIkZRRE4iKSAlXS9bJSBDb25maWcoIlNjcmlwdEFsaWFzIikgJV1wdWJsaWMucGw/QWN0aW9uPVB1YmxpY0NhbGVuZGFyJkNhbGVuZGFySUQ9WyUgRGF0YS5DYWxlbmRhcklEIHwgdXJpICVdJlVzZXI9WyUgRW52KCJVc2VyTG9naW4iKSB8IHVyaSAlXSZUb2tlbj1bJSBEYXRhLkFjY2Vzc1Rva2VuIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2xpcGJvYXJkIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNvcHkgcHVibGljIGNhbGVuZGFyIFVSTCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJTd2l0Y2giKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkZpbHRlck1lc3NhZ2UgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij5bJSBUcmFuc2xhdGUoIk5vIG1hdGNoZXMgZm91bmQuIikgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCcjRmlsdGVyQ2FsZW5kYXJzJyksICQoJyNDYWxlbmRhcnMnKSk7CgogICAgdmFyIENsaXBib2FyZEpTID0gbmV3IENsaXBib2FyZCgnLkNvcHlUb0NsaXBib2FyZCcpOwogICAgQ2xpcGJvYXJkSlMub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmhpZGUoKQogICAgICAgICAgICAuZmFkZUluKCk7CiAgICAgICAgRXZlbnQuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH0pOwoKICAgIENsaXBib2FyZEpTLm9uKCdlcnJvcicsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuSW5pdFRvb2x0aXAoJChFdmVudC50cmlnZ2VyKSwgJ1ByZXNzIEN0cmwrQyAoQ21kK0MpIHRvIGNvcHkgdG8gY2xpcGJvYXJkJyk7CiAgICAgICAgJChFdmVudC50cmlnZ2VyKS5mb2N1cygpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJXaWRnZXQiKSAlXQogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIENhbGVuZGFyV2lkZ2V0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvbk1lbnUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBTZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJDYWxlbmRhclNldHRpbmdzQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXR0aW5ncyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY29nIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vQ2FsZW5kYXIiKSAlXQogICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9DYWxlbmRhciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhckRpdiIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogWyUgRGF0YS5DYWxlbmRhcldpZHRoIHwgaHRtbCAlXSU7IG1hcmdpbjogMCBhdXRvOyB6LWluZGV4OiAxMDsiIGlkPSJjYWxlbmRhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhckRpdiIpICVdCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zTG9hZGluZycsIFslIFRyYW5zbGF0ZSgiTG9hZGluZy4uLiIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1Rvb01hbnlDYWxlbmRhcnNIZWFkbGluZScsIFslIFRyYW5zbGF0ZSgiVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1Rvb01hbnlDYWxlbmRhcnNUZXh0JywgWyUgVHJhbnNsYXRlKCJQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uIikgfCBKU09OICVdKTsKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zWWVzJywgWyUgVHJhbnNsYXRlKCJZZXMiKSB8IEpTT04gJV0pOwpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNTZXR0aW5ncycsIFslIFRyYW5zbGF0ZSgiU2V0dGluZ3MiKSB8IEpTT04gJV0pOwpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNTYXZlJywgWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBKU09OICVdKTsKCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5Jbml0KHsKICAgIENoYWxsZW5nZVRva2VuOiAkKCIjQ2hhbGxlbmdlVG9rZW4iKS52YWwoKSwKICAgIEFsbERheVRleHQ6IFslIFRyYW5zbGF0ZSgiQWxsLWRheSIpIHwgSlNPTiAlXSwKICAgIElzUlRMOiBbJSBEYXRhLklzUlRMTGFuZ3VhZ2UgJV0sCiAgICBFdmVudExpbWl0VGV4dDogWyUgVHJhbnNsYXRlKCJtb3JlIikgfCBKU09OICVdLAogICAgTW9udGhOYW1lczogWwogICAgICAgIFslIFRyYW5zbGF0ZSgiSmFudWFyeSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkZlYnJ1YXJ5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTWFyY2giKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJBcHJpbCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1heV9sb25nIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiSnVuZSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkp1bHkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJBdWd1c3QiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTZXB0ZW1iZXIiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJPY3RvYmVyIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTm92ZW1iZXIiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJEZWNlbWJlciIpIHwgSlNPTiAlXQogICAgXSwKICAgIE1vbnRoTmFtZXNTaG9ydDogWwogICAgICAgIFslIFRyYW5zbGF0ZSgiSmFuIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRmViIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTWFyIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiQXByIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTWF5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiSnVuIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiSnVsIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiQXVnIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiU2VwIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiT2N0IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTm92IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRGVjIikgfCBKU09OICVdCiAgICBdLAogICAgRGF5TmFtZXM6IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIlN1bmRheSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1vbmRheSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlR1ZXNkYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJXZWRuZXNkYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJUaHVyc2RheSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkZyaWRheSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlNhdHVyZGF5IikgfCBKU09OICVdCiAgICBdLAogICAgRGF5TmFtZXNTaG9ydDogWwogICAgICAgIFslIFRyYW5zbGF0ZSgiU3VuIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTW9uIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVHVlIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiV2VkIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVGh1IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRnJpIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiU2F0IikgfCBKU09OICVdCiAgICBdLAogICAgRGF5TmFtZXNNaW46IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIlN1IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiTW8iKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJUdSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIldlIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVGgiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJGciIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlNhIikgfCBKU09OICVdCiAgICBdLAogICAgQnV0dG9uVGV4dDogewogICAgICAgIHRvZGF5OiBbJSBUcmFuc2xhdGUoIlRvZGF5IikgfCBKU09OICVdLAogICAgICAgIG1vbnRoOiBbJSBUcmFuc2xhdGUoIk1vbnRoIikgfCBKU09OICVdLAogICAgICAgIHdlZWs6IFslIFRyYW5zbGF0ZSgiV2VlayIpIHwgSlNPTiAlXSwKICAgICAgICBkYXk6IFslIFRyYW5zbGF0ZSgiRGF5IikgfCBKU09OICVdLAogICAgICAgIHRpbWVsaW5lTW9udGg6IFslIFRyYW5zbGF0ZSgiVGltZWxpbmUgTW9udGgiKSB8IEpTT04gJV0sCiAgICAgICAgdGltZWxpbmVXZWVrOiBbJSBUcmFuc2xhdGUoIlRpbWVsaW5lIFdlZWsiKSB8IEpTT04gJV0sCiAgICAgICAgdGltZWxpbmVEYXk6IFslIFRyYW5zbGF0ZSgiVGltZWxpbmUgRGF5IikgfCBKU09OICVdLAogICAgICAgIGp1bXA6WyUgVHJhbnNsYXRlKCJKdW1wIikgfCBKU09OICVdLAogICAgICAgIHByZXZEYXRlcGlja2VyOiBbJSBUcmFuc2xhdGUoIlByZXZpb3VzIikgfCBKU09OICVdLAogICAgICAgIG5leHREYXRlcGlja2VyOiBbJSBUcmFuc2xhdGUoIk5leHQiKSB8IEpTT04gJV0KICAgIH0sCiAgICBGaXJzdERheTogWyUgRGF0YS5GaXJzdERheSB8IGh0bWwgJV0sCiAgICBEZWZhdWx0VmlldzogWyUgRGF0YS5EZWZhdWx0VmlldyB8IEpTT04gJV0sCiAgICBIZWFkZXI6IHsKICAgICAgICBsZWZ0OiAnbW9udGgsYWdlbmRhV2VlayxhZ2VuZGFEYXkgdGltZWxpbmVNb250aCx0aW1lbGluZVdlZWssdGltZWxpbmVEYXknLAogICAgICAgIGNlbnRlcjogJ3RpdGxlJywKICAgICAgICByaWdodDogJ2p1bXAsdG9kYXkgcHJldixuZXh0JwogICAgfSwKICAgIERpYWxvZ1RleHQ6IHsKICAgICAgICBFZGl0VGl0bGU6IFslIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQiKSB8IEpTT04gJV0sCiAgICAgICAgT2NjdXJyZW5jZVRpdGxlOiBbJSBUcmFuc2xhdGUoIlRoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQiKSB8IEpTT04gJV0sCiAgICAgICAgT2NjdXJyZW5jZVRleHQ6IFslIFRyYW5zbGF0ZSgiV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VBbGw6IFslIFRyYW5zbGF0ZSgiQWxsIG9jY3VycmVuY2VzIikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VKdXN0VGhpczogWyUgVHJhbnNsYXRlKCJKdXN0IHRoaXMgb2NjdXJyZW5jZSIpIHwgSlNPTiAlXSwKICAgICAgICBDbG9zZTogWyUgVHJhbnNsYXRlKCJDbG9zZSIpIHwgSlNPTiAlXSwKICAgICAgICBEaXNtaXNzOiBbJSBUcmFuc2xhdGUoIkRpc21pc3MiKSB8IEpTT04gJV0KICAgIH0sCiAgICBPdmVydmlld1NjcmVlbjogJ0NhbGVuZGFyT3ZlcnZpZXcnLAogICAgQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbjogJ0NhbGVuZGFyU2V0dGluZ3NCdXR0b24nLAogICAgQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lcjogJ0NhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXInLAogICAgQ2FsZW5kYXJTZXR0aW5nc1Nob3c6IFslIERhdGEuQ2FsZW5kYXJTZXR0aW5nc1Nob3cgfCBKU09OICVdLAogICAgVGlja2V0QXBwb2ludG1lbnRNYXJrczogewpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudE1hcmsiKSAlXQogICAgICAgIFslIERhdGEuQXBwb2ludG1lbnRUeXBlICVdOiBbJSBEYXRhLkFwcG9pbnRtZW50TWFyayB8IEpTT04gJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnRNYXJrQ29tbWEiKSAlXQogICAgICAgICwKWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50TWFya0NvbW1hIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50TWFyayIpICVdCiAgICB9LAogICAgQ2FsbGJhY2tzOiB7CiAgICAgICAgRWRpdEFjdGlvbjogWyUgRGF0YS5FZGl0QWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBFZGl0TWFza1N1YmFjdGlvbjogWyUgRGF0YS5FZGl0TWFza1N1YmFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgRWRpdFN1YmFjdGlvbjogWyUgRGF0YS5FZGl0U3ViYWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBBZGRTdWJhY3Rpb246IFslIERhdGEuQWRkU3ViYWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBQcmVmU3ViYWN0aW9uOiBbJSBEYXRhLlByZWZTdWJhY3Rpb24gfCBKU09OICVdLAogICAgICAgIExpc3RBY3Rpb246IFslIERhdGEuTGlzdEFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgRGF5c1N1YmFjdG9uOiBbJSBEYXRhLkRheXNTdWJhY3Rpb24gfCBKU09OICVdCiAgICB9LAogICAgQXBwb2ludG1lbnQ6IHsKICAgICAgICBBcHBvaW50bWVudENyZWF0ZTogWyUgRGF0YS5BcHBvaW50bWVudENyZWF0ZSB8fCAibnVsbCIgJV0sCiAgICAgICAgQXBwb2ludG1lbnRJRDogWyUgRGF0YS5BcHBvaW50bWVudElEIHwgSlNPTiAlXSwKICAgICAgICBBcHBvaW50bWVudENyZWF0ZUJ1dHRvbjogJ0FwcG9pbnRtZW50Q3JlYXRlQnV0dG9uJwogICAgfSwKICAgIENhbGVuZGFyczogewogICAgICAgIFNvdXJjZXM6IHsKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXJTb3VyY2UiKSAlXQogICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFySUQgfCBKU09OICVdOiB7CiAgICAgICAgICAgICAgICB1cmw6IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoIiNDaGFsbGVuZ2VUb2tlbiIpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRMaXN0JywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdMaXN0QXBwb2ludG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEOiBbJSBEYXRhLkNhbGVuZGFySUQgfCBKU09OICVdLAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlSUQ6IFslIERhdGEuUmVzb3VyY2VJRCB8IEpTT04gJV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb2xvcjogWyUgRGF0YS5Db2xvciB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IFslIERhdGEuVGV4dENvbG9yIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjIpJywKICAgICAgICAgICAgICAgIHN0YXJ0UGFyYW06ICdTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgZW5kUGFyYW06ICdFbmRUaW1lJywKCiAgICAgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciByZW1vdmVFdmVudFNvdXJjZQogICAgICAgICAgICAgICAgZ29vZ2xlQ2FsZW5kYXJJZDogWyUgRGF0YS5DYWxlbmRhcklEIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIGV2ZW50RGF0YVRyYW5zZm9ybTogZnVuY3Rpb24oQXBwb2ludG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFRpY2tldEFwcG9pbnRtZW50Tm9EcmFnID0gewpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudE5vRHJhZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQXBwb2ludG1lbnRUeXBlICVdOiBwYXJzZUludChbJSBEYXRhLk5vRHJhZyB8IEpTT04gJV0sIDEwKSA/IHRydWUgOiBmYWxzZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudE5vRHJhZ0NvbW1hIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgLApbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QXBwb2ludG1lbnROb0RyYWdDb21tYSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudE5vRHJhZyIpICVdCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IEFwcG9pbnRtZW50RGF0YS5BcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZDogQXBwb2ludG1lbnREYXRhLlBhcmVudElELAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogQXBwb2ludG1lbnREYXRhLlN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBBcHBvaW50bWVudERhdGEuU3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IEFwcG9pbnRtZW50RGF0YS5FbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBBcHBvaW50bWVudERhdGEuRW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEFwcG9pbnRtZW50RGF0YS5UaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IEFwcG9pbnRtZW50RGF0YS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IEFwcG9pbnRtZW50RGF0YS5Mb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJJZDogQXBwb2ludG1lbnREYXRhLkNhbGVuZGFySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheTogcGFyc2VJbnQoQXBwb2ludG1lbnREYXRhLkFsbERheSwgMTApID8gdHJ1ZSA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJpbmc6IHBhcnNlSW50KEFwcG9pbnRtZW50RGF0YS5SZWN1cnJpbmcsIDEwKSA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbUlkczogQXBwb2ludG1lbnREYXRhLlRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbU5hbWVzOiBBcHBvaW50bWVudERhdGEuVGVhbU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUlkczogQXBwb2ludG1lbnREYXRhLlJlc291cmNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZXM6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5EYXRhOiBBcHBvaW50bWVudERhdGEuUGx1Z2luRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJOYW1lOiBbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQ29sb3I6IFslIERhdGEuQ29sb3IgfCBKU09OICVdLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb246IEFwcG9pbnRtZW50RGF0YS5Ob3RpZmljYXRpb25EYXRlLmxlbmd0aCA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRGF0ZTogQXBwb2ludG1lbnREYXRhLk5vdGlmaWNhdGlvbkRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldEFwcG9pbnRtZW50VHlwZTogQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydEVkaXRhYmxlOiBUaWNrZXRBcHBvaW50bWVudE5vRHJhZ1tBcHBvaW50bWVudERhdGEuVGlja2V0QXBwb2ludG1lbnRTdGFydERhdGVdID8gZmFsc2UgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbkVkaXRhYmxlOiB0eXBlb2YgQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50RW5kRGF0ZSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBUaWNrZXRBcHBvaW50bWVudE5vRHJhZ1tBcHBvaW50bWVudERhdGEuVGlja2V0QXBwb2ludG1lbnRFbmREYXRlXSAhPT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyU291cmNlQ29tbWEiKSAlXQogICAgICAgICAgICAsClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhclNvdXJjZUNvbW1hIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyU291cmNlIikgJV0KICAgICAgICB9LAogICAgICAgIFN3aXRjaGVzOiAkKCcuQ2FsZW5kYXJTd2l0Y2ggaW5wdXRbdHlwZT0iY2hlY2tib3giXScpLAogICAgICAgIExpbWl0OiBbJSBDb25maWcoIkFwcG9pbnRtZW50Q2FsZW5kYXI6OkNhbGVuZGFyTGltaXRPdmVydmlldyIpIHx8IDEwICVdCiAgICB9LAogICAgV29ya2luZ0hvdXJzOiBbClslIFJlbmRlckJsb2NrU3RhcnQoIldvcmtpbmdIb3VycyIpICVdCiAgICAgICAgewogICAgICAgICAgICBpZDogJ3dvcmtpbmdIb3VycycsCiAgICAgICAgICAgIHN0YXJ0OiBbJSBEYXRhLlN0YXJ0VGltZSB8IEpTT04gJV0sCiAgICAgICAgICAgIGVuZDogWyUgRGF0YS5FbmRUaW1lIHwgSlNPTiAlXSwKICAgICAgICAgICAgY29sb3I6ICcjRDdEN0Q3JywKICAgICAgICAgICAgcmVuZGVyaW5nOiAnaW52ZXJzZS1iYWNrZ3JvdW5kJywKICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlLAogICAgICAgICAgICBkb3c6IFslIERhdGEuRG9XICVdCiAgICAgICAgfQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JraW5nSG91cnNDb21tYSIpICVdCiAgICAgICAgLApbJSBSZW5kZXJCbG9ja0VuZCgiV29ya2luZ0hvdXJzQ29tbWEiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiV29ya2luZ0hvdXJzIikgJV0KICAgIF0KfSk7CgovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgPGRpdiBpZD0iQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lciIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgPGZvcm0gaWQ9IkNvbnRleHRTZXR0aW5nc0RpYWxvZ0NhbGVuZGFyT3ZlcnZpZXciIGNsYXNzPSIiPgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2hvd25BcHBvaW50bWVudHMiPlslIFRyYW5zbGF0ZSgiU2hvdyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2hvd25BcHBvaW50bWVudHNTdHJpbmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9IkFwcG9pbnRtZW50VG9vbHRpcFRlbXBsYXRlIiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJJY29ucyI+PC9kaXY+CiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFzaWMgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JXRpdGxlJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVkZXNjcmlwdGlvbiU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lbG9jYXRpb24lPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMb2NhdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNhbGVuZGFyQ29sb3IiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAlY2FsZW5kYXJDb2xvciU7Ij48L3NwYW4+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAlY2FsZW5kYXJOYW1lJQogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sdGlwVGVtcGxhdGVSZXNvdXJjZSIpICVdCiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVzb3VyY2UiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JXRlYW1OYW1lcyU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlYW0iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVyZXNvdXJjZU5hbWVzJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWdlbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrRW5kKCJUb29sdGlwVGVtcGxhdGVSZXNvdXJjZSIpICVdCiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiRGF0ZS9UaW1lIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVzdGFydERhdGUlPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTdGFydCBkYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lZW5kRGF0ZSU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkVuZCBkYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lYWxsRGF5JTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWxsLWRheSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JXJlY3VycmluZyU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlJlcGVhdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KWyUgSUYgRGF0YS5QbHVnaW5MaXN0ICVdCiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTGluayIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KWyUgRk9SRUFDSCBQbHVnaW5LZXkgSU4gRGF0YS5QbHVnaW5MaXN0LmtleXMgJV0KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lWyUgUGx1Z2luS2V5ICVdJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLlBsdWdpbkxpc3QuJFBsdWdpbktleS5QbHVnaW5OYW1lKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBFTkQgJV0KICAgICAgICA8ZmllbGRzZXQ+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJOb3RpZmljYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JW5vdGlmaWNhdGlvbkRhdGUlPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJOb3RpZmljYXRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+CiAgICA8L2Rpdj4KCjwvZGl2Pgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBTRVQgT1RSU0J1c2luZXNzTGFiZWwgPSAnPHN0cm9uZz5PVFJTIEJ1c2luZXNzIFNvbHV0aW9uPC9zdHJvbmc+4oSiJyAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRWRpdE1hc2siKSAlXQo8ZGl2IGNsYXNzPSJJbm5lckNvbnRlbnQiPgogICAgPGZvcm0gaWQ9IkVkaXRBcHBvaW50bWVudEZvcm0iIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkNoYWxsZW5nZVRva2VuIiBuYW1lPSJDaGFsbGVuZ2VUb2tlbiIgdmFsdWU9IlslIEVudigiVXNlckNoYWxsZW5nZVRva2VuIikgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkFjdGlvbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iU3ViYWN0aW9uIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJFZGl0QXBwb2ludG1lbnQiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXBwb2ludG1lbnRJRCIgbmFtZT0iQXBwb2ludG1lbnRJRCIgdmFsdWU9IlslIERhdGEuQXBwb2ludG1lbnRJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUmVjdXJyaW5nIiBuYW1lPSJSZWN1cnJpbmciIHZhbHVlPSJbJSBEYXRhLlJlY3VycmluZyB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUmVjdXJyZW5jZURheXMiIG5hbWU9IlJlY3VycmVuY2VEYXlzIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJlbmNlRGF5cyB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUmVjdXJyZW5jZU1vbnRocyIgbmFtZT0iUmVjdXJyZW5jZU1vbnRocyIgdmFsdWU9IlslIERhdGEuUmVjdXJyZW5jZU1vbnRocyB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUmVjdXJyZW5jZU1vbnRoRGF5cyIgbmFtZT0iUmVjdXJyZW5jZU1vbnRoRGF5cyIgdmFsdWU9IlslIERhdGEuUmVjdXJyZW5jZU1vbnRoRGF5cyB8IGh0bWwgJV0iLz4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJCYXNpYyBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGl0bGUiWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXSBjbGFzcz0iTWFuZGF0b3J5IlslIEVORCAlXT5bJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgRU5EICVdWyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJUaXRsZSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9wPgpbJSBFTFNFICVdClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpdGxlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGl0bGUiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgLz4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlc2NyaXB0aW9uIj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iRGVzY3JpcHRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkRlc2NyaXB0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iRGVzY3JpcHRpb24iIG5hbWU9IkRlc2NyaXB0aW9uIiBjbGFzcz0iVzc1cGMiIHJvd3M9IjQiPlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdPC90ZXh0YXJlYT4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxvY2F0aW9uIj5bJSBUcmFuc2xhdGUoIkxvY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTG9jYXRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkxvY2F0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iTG9jYXRpb24iIG5hbWU9IkxvY2F0aW9uIiB2YWx1ZT0iWyUgRGF0YS5Mb2NhdGlvbiB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgLz4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxvY2F0aW9uTGluayIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iTG9jYXRpb25MaW5rIEhpZGRlbiBbJSBEYXRhLkNTU0NsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5VUkwgfCBodG1sICVdWyUgRGF0YS5Mb2NhdGlvbiB8IHVyaSAlXSIgZGF0YS1iYXNlLXVybD0iWyUgRGF0YS5VUkwgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVGV4dCkgfCBodG1sICVdIiB0YXJnZXQ9IlslIERhdGEuVGFyZ2V0IHwgaHRtbCAlXSI+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
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFZGl0TWFzayIpICVdCgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdE1hc2siKSAlXQo8cD5UZXN0PC9wPgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpEYXNoYm9hcmQ6OkFwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBwYXJhbWV0ZXJzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnIE5hbWUgVXNlcklEKSkgewogICAgICAgIGRpZSAiR290IG5vICROZWVkZWQhIiBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgY3VycmVudCBmaWx0ZXIKICAgIG15ICROYW1lICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOYW1lJyApIHx8ICcnOwogICAgbXkgJFByZWZlcmVuY2VzS2V5ID0gJ0Rhc2hib2FyZENhbGVuZGFyQXBwb2ludG1lbnRGaWx0ZXInIC4gJFNlbGYtPntOYW1lfTsKICAgIGlmICggJFNlbGYtPntOYW1lfSBlcSAkTmFtZSApIHsKICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICcnOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgcmVtZW1iZXIgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57RmlsdGVyfSApIHsKCiAgICAgICAgIyB1cGRhdGUgc2Vzc2lvbgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAkUHJlZmVyZW5jZXNLZXksCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlbW9TeXN0ZW0nKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRQcmVmZXJlbmNlc0tleSwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgZmlsdGVyIGlmIG5vdCBzZXQgeWV0CiAgICBpZiAoICEkU2VsZi0+e0ZpbHRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFNlbGYtPnskUHJlZmVyZW5jZXNLZXl9IHx8ICRTZWxmLT57Q29uZmlnfS0+e0ZpbHRlcn0gfHwgJ1RvZGF5JzsKICAgIH0KCiAgICAjIHNldHVwIHRoZSBwcmVmcmVuY2VzIGtleXMKICAgICRTZWxmLT57UHJlZktleVNob3dufSAgID0gJ0FwcG9pbnRtZW50RGFzaGJvYXJkUHJlZicgLiAkU2VsZi0+e05hbWV9IC4gJy1TaG93bic7CiAgICAkU2VsZi0+e1ByZWZLZXlSZWZyZXNofSA9ICdBcHBvaW50bWVudERhc2hib2FyZFByZWYnIC4gJFNlbGYtPntOYW1lfSAuICctUmVmcmVzaCc7CgogICAgJFNlbGYtPntQYWdlU2hvd259ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT57ICRTZWxmLT57UHJlZktleVNob3dufSB9CiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57TGltaXR9IHx8IDEwOwoKICAgICRTZWxmLT57UGFnZVJlZnJlc2h9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT57ICRTZWxmLT57UHJlZktleVJlZnJlc2h9IH0KICAgICAgICB8fCAxOwoKICAgICRTZWxmLT57U3RhcnRIaXR9ID0gaW50KCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhcnRIaXQnICkgfHwgMSApOwoKICAgICRTZWxmLT57Q2FjaGVLZXl9ID0gJFNlbGYtPntOYW1lfSAuICc6Oic7CgogICAgIyBnZXQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZ1bGwgbmFtZSBvcmRlciBmb3IgdXNlciBuYW1lcwogICAgIyBhbmQgYXBwZW5kIGl0IHRvIHRoZSBjYWNoZSBrZXkgdG8gbWFrZSBzdXJlLCB0aGF0IHRoZQogICAgIyBjb3JyZWN0IGRhdGEgd2lsbCBiZSBkaXNwbGF5ZWQgZXZlcnkgdGltZQogICAgbXkgJEZpcnN0bmFtZUxhc3ROYW1lT3JkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZpcnN0bmFtZUxhc3RuYW1lT3JkZXInKSB8fCAwOwogICAgJFNlbGYtPntDYWNoZUtleX0gLj0gJzo6JyAuICRGaXJzdG5hbWVMYXN0TmFtZU9yZGVyOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIERlc2MgID0+IFRyYW5zbGF0YWJsZSgnU2hvd24nKSwKICAgICAgICAgICAgTmFtZSAgPT4gJFNlbGYtPntQcmVmS2V5U2hvd259LAogICAgICAgICAgICBCbG9jayA9PiAnT3B0aW9uJywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgNSAgPT4gJyA1JywKICAgICAgICAgICAgICAgIDEwID0+ICcxMCcsCiAgICAgICAgICAgICAgICAxNSA9PiAnMTUnLAogICAgICAgICAgICAgICAgMjAgPT4gJzIwJywKICAgICAgICAgICAgICAgIDI1ID0+ICcyNScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZWxmLT57UGFnZVNob3dufSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzYyAgPT4gVHJhbnNsYXRhYmxlKCdSZWZyZXNoIChtaW51dGVzKScpLAogICAgICAgICAgICBOYW1lICA9PiAkU2VsZi0+e1ByZWZLZXlSZWZyZXNofSwKICAgICAgICAgICAgQmxvY2sgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIDAgID0+IFRyYW5zbGF0YWJsZSgnb2ZmJyksCiAgICAgICAgICAgICAgICAxICA9PiAnMScsCiAgICAgICAgICAgICAgICAyICA9PiAnMicsCiAgICAgICAgICAgICAgICA1ICA9PiAnNScsCiAgICAgICAgICAgICAgICA3ICA9PiAnNycsCiAgICAgICAgICAgICAgICAxMCA9PiAnMTAnLAogICAgICAgICAgICAgICAgMTUgPT4gJzE1JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNlbGYtPntQYWdlUmVmcmVzaH0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBQYXJhbXM7Cn0KCnN1YiBDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gKAogICAgICAgICV7ICRTZWxmLT57Q29uZmlnfSB9LAoKICAgICAgICBDYW5SZWZyZXNoID0+IDEsCgogICAgICAgICMgcmVtZW1iZXIsIGRvIG5vdCBhbGxvdyB0byB1c2UgcGFnZSBjYWNoZQogICAgICAgICMgKGl0J3Mgbm90IHdvcmtpbmcgYmVjYXVzZSBvZiBpbnRlcm5hbCBmaWx0ZXIpCiAgICAgICAgQ2FjaGVLZXkgPT4gdW5kZWYsCiAgICAgICAgQ2FjaGVUVEwgPT4gdW5kZWYsCiAgICApOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIHNldHRpbmdzCiAgICBteSAkSWRsZU1pbnV0ZXMgPSAkU2VsZi0+e0NvbmZpZ30tPntJZGxlTWludXRlc30gfHwgNjA7CiAgICBteSAkU29ydEJ5ICAgICAgPSAkU2VsZi0+e0NvbmZpZ30tPntTb3J0Qnl9ICAgICAgfHwgJ1VzZXJGdWxsbmFtZSc7CgogICAgIyBnZXQgYSBsaXN0IG9mIGF0IGxlYXN0IHJlYWRhYmxlIGNhbGVuZGFycwogICAgbXkgQENhbGVuZGFyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckxpc3QoCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgKTsKCiAgICAjIGNvbGxlY3QgY2FsZW5kYXIgYW5kIGFwcG9pbnRtZW50IGRhdGEKICAgICMgc2VwYXJhdGUgYXBwb2ludG1lbnRzIHRvIHRvZGF5LCB0b21vcnJvdwogICAgIyBhbmQgdGhlIG5leHQgZml2ZSBkYXlzIChzb29uKQogICAgbXkgJUNhbGVuZGFyczsKICAgIG15ICVBcHBvaW50bWVudHM7CiAgICBteSAlQXBwb2ludG1lbnRzQ291bnQ7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5Q2FsZW5kYXJzICAgICAgICAgPSAkU2VsZi0+e0NhY2hlS2V5fSAuICRTZWxmLT57VXNlcklEfSAuICc6OkNhbGVuZGFycyc7CiAgICBteSAkQ2FjaGVLZXlBcHBvaW50bWVudHMgICAgICA9ICRTZWxmLT57Q2FjaGVLZXl9IC4gJFNlbGYtPntVc2VySUR9IC4gJzo6QXBwb2ludG1lbnRzOjonIC4gJFNlbGYtPntGaWx0ZXJ9OwogICAgbXkgJENhY2hlS2V5QXBwb2ludG1lbnRzQ291bnQgPSAkU2VsZi0+e0NhY2hlS2V5fSAuICRTZWxmLT57VXNlcklEfSAuICc6OkFwcG9pbnRtZW50c0NvdW50JzsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGdldCBjYWNoZWQgZGF0YQogICAgbXkgJERhdGFDYWxlbmRhcnMgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICdEYXNoYm9hcmQnLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5Q2FsZW5kYXJzLAogICAgKTsKICAgIG15ICREYXRhQXBwb2ludG1lbnRzID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnRGFzaGJvYXJkJywKICAgICAgICBLZXkgID0+ICRDYWNoZUtleUFwcG9pbnRtZW50cywKICAgICk7CiAgICBteSAkRGF0YUFwcG9pbnRtZW50c0NvdW50ID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnRGFzaGJvYXJkJywKICAgICAgICBLZXkgID0+ICRDYWNoZUtleUFwcG9pbnRtZW50c0NvdW50LAogICAgKTsKCiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgaWYgY2FjaGUgaXMgdXAtdG8tZGF0ZSwgdXNlIHRoZSBnaXZlbiBkYXRhCiAgICBpZiAoCiAgICAgICAgcmVmICREYXRhQ2FsZW5kYXJzIGVxICdIQVNIJwogICAgICAgICYmIHJlZiAkRGF0YUFwcG9pbnRtZW50cyBlcSAnSEFTSCcKICAgICAgICAmJiByZWYgJERhdGFBcHBvaW50bWVudHNDb3VudCBlcSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJUNhbGVuZGFycyAgICAgICAgID0gJXskRGF0YUNhbGVuZGFyc307CiAgICAgICAgJUFwcG9pbnRtZW50cyAgICAgID0gJXskRGF0YUFwcG9pbnRtZW50c307CiAgICAgICAgJUFwcG9pbnRtZW50c0NvdW50ID0gJXskRGF0YUFwcG9pbnRtZW50c0NvdW50fTsKICAgIH0KCiAgICAjIGNvbGxlY3QgdGhlIGRhdGEgYWdhaW4gaWYgbmVjZXNzYXJ5CiAgICBlbHNlIHsKCiAgICAgICAgQ0FMRU5EQVI6CiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFyTGlzdCkgewoKICAgICAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAhJENhbGVuZGFyOwogICAgICAgICAgICBuZXh0IENBTEVOREFSIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkQ2FsZW5kYXIpOwogICAgICAgICAgICBuZXh0IENBTEVOREFSIGlmICRDYWxlbmRhcnN7ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9IH07CgogICAgICAgICAgICAkQ2FsZW5kYXJzeyAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSB9ID0gJENhbGVuZGFyOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUgZm9yIGNhbGVuZGFycwogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRGFzaGJvYXJkJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5Q2FsZW5kYXJzLAogICAgICAgICAgICBWYWx1ZSA9PiBcJUNhbGVuZGFycywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDb25maWd9LT57Q2FjaGVUVExMb2NhbH0gKiA2MCwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgY2FsZW5kYXIgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgJUFwcG9pbnRtZW50c1Vuc29ydGVkOwoKICAgICAgICAjIGdldCBhIGxvY2FsIGFwcG9pbnRtZW50IG9iamVjdAogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAgICAgQ0FMRU5EQVJJRDoKICAgICAgICBmb3IgbXkgJENhbGVuZGFySUQgKCBzb3J0IGtleXMgJUNhbGVuZGFycyApIHsKCiAgICAgICAgICAgIG5leHQgQ0FMRU5EQVJJRCBpZiAhJENhbGVuZGFySUQ7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRUaW1lc3RhbXBHZXQoKSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDQUxFTkRBUklEIGlmICFJc0FycmF5UmVmV2l0aERhdGEoIFxAQXBwb2ludG1lbnRzICk7CgogICAgICAgICAgICBBUFBPSU5UTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewoKICAgICAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlQgaWYgISRBcHBvaW50bWVudDsKICAgICAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcHBvaW50bWVudCk7CgogICAgICAgICAgICAgICAgIyBzYXZlIHN5c3RlbSB0aW1lIG9mIFN0YXJ0VGltZQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57U3lzdGVtVGltZVN0YXJ0fSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzYXZlIGFwcG9pbnRtZW50IGluIG5ldyBoYXNoIGZvciBsYXRlciBzb3J0aW5nCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IH0gPSAkQXBwb2ludG1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGRhdGV0aW1lIHN0cmluZ3MgZm9yIHRoZSBkYXRlcyB3aXRoIHJlbGF0ZWQgb2Zmc2V0cwogICAgICAgICMgKHRvZGF5LCB0b21vcnJvdyBhbmQgc29vbiAtIHdoaWNoIG1lYW5zIHRoZSBuZXh0IDUgZGF5cwogICAgICAgICMgZXhjZXB0IHRvZGF5IGFuZCB0b21vcnJvdyBjb3VudGVkIGZyb20gY3VycmVudCB0aW1lc3RhbXApCiAgICAgICAgbXkgJURhdGVPZmZzZXQgPSAoCiAgICAgICAgICAgIFRvZGF5ICAgICA9PiAwLAogICAgICAgICAgICBUb21vcnJvdyAgPT4gODY0MDAsCiAgICAgICAgICAgIFBsdXNUd28gICA9PiAxNzI4MDAsCiAgICAgICAgICAgIFBsdXNUaHJlZSA9PiAyNTkyMDAsCiAgICAgICAgICAgIFBsdXNGb3VyICA9PiAzNDU2MDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJURhdGVzOwoKICAgICAgICAjIGdldCBjdXJyZW50IHRpbWVzdGFtcAogICAgICAgIG15ICRDdXJyZW50U3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKTsKCiAgICAgICAgZm9yIG15ICREYXRlT2Zmc2V0S2V5ICggc29ydCBrZXlzICVEYXRlT2Zmc2V0ICkgewoKICAgICAgICAgICAgIyBnZXQgZGF0ZSB1bml0cyB3aXRoIGN1cnJlbnQgb2Zmc2V0CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEN1cnJlbnRTeXN0ZW1UaW1lICsgJERhdGVPZmZzZXR7JERhdGVPZmZzZXRLZXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJERhdGVzeyREYXRlT2Zmc2V0S2V5fQogICAgICAgICAgICAgICAgPSBzcHJpbnRmKCAiJTAyZCIsICRZZWFyICkgLiAnLScgLiBzcHJpbnRmKCAiJTAyZCIsICRNb250aCApIC4gJy0nIC4gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgfQoKICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7VG9kYXl9ICAgID0gMDsKICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7VG9tb3Jyb3d9ID0gMDsKICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7U29vbn0gICAgID0gMDsKCiAgICAgICAgQVBQT0lOVE1FTlRJRDoKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKCBzb3J0IGtleXMgJUFwcG9pbnRtZW50c1Vuc29ydGVkICkgewoKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICEkQXBwb2ludG1lbnRJRDsKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJEFwcG9pbnRtZW50c1Vuc29ydGVkeyRBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgISRBcHBvaW50bWVudHNVbnNvcnRlZHskQXBwb2ludG1lbnRJRH0tPntTdGFydFRpbWV9OwoKICAgICAgICAgICAgIyBleHRyYWN0IGN1cnJlbnQgZGF0ZSAod2l0aG91dCB0aW1lKQogICAgICAgICAgICBteSAkU3RhcnREYXRlU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRCBpZiAhJFN0YXJ0RGF0ZVN5c3RlbVRpbWU7CgogICAgICAgICAgICBteSAoICRDU2Vjb25kLCAkQ01pbnV0ZSwgJENIb3VyLCAkQ0RheSwgJENNb250aCwgJENZZWFyLCAkQ0RheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnREYXRlU3lzdGVtVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdGFydERhdGUKICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwMmQiLCAkQ1llYXIgKSAuICctJyAuIHNwcmludGYoICIlMDJkIiwgJENNb250aCApIC4gJy0nIC4gc3ByaW50ZiggIiUwMmQiLCAkQ0RheSApOwoKICAgICAgICAgICAgIyB0b2RheQogICAgICAgICAgICBpZiAoICRTdGFydERhdGUgZXEgJERhdGVze1RvZGF5fSApIHsKCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7VG9kYXl9Kys7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0ZpbHRlcn0gZXEgJ1RvZGF5JyApIHsKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfSA9ICRBcHBvaW50bWVudHNVbnNvcnRlZHskQXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdG9tb3Jyb3cKICAgICAgICAgICAgZWxzaWYgKCAkU3RhcnREYXRlIGVxICREYXRlc3tUb21vcnJvd30gKSB7CgogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1RvbW9ycm93fSsrOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntGaWx0ZXJ9IGVxICdUb21vcnJvdycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNvb24KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJFN0YXJ0RGF0ZSBlcSAkRGF0ZXN7UGx1c1R3b30KICAgICAgICAgICAgICAgIHx8ICRTdGFydERhdGUgZXEgJERhdGVze1BsdXNUaHJlZX0KICAgICAgICAgICAgICAgIHx8ICRTdGFydERhdGUgZXEgJERhdGVze1BsdXNGb3VyfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzQ291bnR7U29vbn0rKzsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RmlsdGVyfSBlcSAnU29vbicgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjYWNoZSBmb3IgYXBwb2ludG1lbnRzCiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICdEYXNoYm9hcmQnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXlBcHBvaW50bWVudHMsCiAgICAgICAgICAgIFZhbHVlID0+IFwlQXBwb2ludG1lbnRzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntDYWNoZVRUTExvY2FsfSAqIDYwLAogICAgICAgICk7CgogICAgICAgICMgc2V0IGNhY2hlIGZvciBhcHBvaW50bWVudHMgY291bnQKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0Rhc2hib2FyZCcsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleUFwcG9pbnRtZW50c0NvdW50LAogICAgICAgICAgICBWYWx1ZSA9PiBcJUFwcG9pbnRtZW50c0NvdW50LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntDYWNoZVRUTExvY2FsfSAqIDYwLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSAkQXBwb2ludG1lbnRUYWJsZUJsb2NrID0gJ0NvbnRlbnRTbWFsbFRhYmxlJzsKCiAgICAjIHByZXBhcmUgYXBwb2ludG1lbnRzIHRhYmxlCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDb250ZW50U21hbGxUYWJsZScsCiAgICApOwoKICAgICMgZ2V0IHRpbWV6b25lIG9mZnNldCBmb3IgY3VycmVudCB1c2VyCiAgICBteSAkVGltZXpvbmVPZmZzZXRSYXcgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJFRpbWV6b25lT2Zmc2V0ID0gJFRpbWV6b25lT2Zmc2V0UmF3ICogNjAgKiA2MDsKCiAgICBteSAkQ291bnQgPSAwOwogICAgbXkgJFNob3duID0gMDsKCiAgICBBUFBPSU5UTUVOVElEOgogICAgZm9yIG15ICRBcHBvaW50bWVudElEICgKICAgICAgICBzb3J0IHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50c3skYX0tPntTeXN0ZW1UaW1lU3RhcnR9IDw9PiAkQXBwb2ludG1lbnRzeyRifS0+e1N5c3RlbVRpbWVTdGFydH0KICAgICAgICAgICAgICAgIHx8ICRBcHBvaW50bWVudHN7JGF9LT57QXBwb2ludG1lbnRJRH0gPD0+ICRBcHBvaW50bWVudHN7JGJ9LT57QXBwb2ludG1lbnRJRH0KICAgICAgICB9IGtleXMgJUFwcG9pbnRtZW50cwogICAgICAgICkKICAgIHsKICAgICAgICAjIHBhZ2luYXRpb24gaGFuZGxpbmcKICAgICAgICBsYXN0IEFQUE9JTlRNRU5USUQgaWYgJFNob3duID49ICRTZWxmLT57UGFnZVNob3dufTsKCiAgICAgICAgaWYgKCAoICRTZWxmLT57U3RhcnRIaXR9IC0gMSApID4gJENvdW50ICkgewogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN0YXJ0U3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57U3RhcnRUaW1lfSwKICAgICAgICApOwoKICAgICAgICBteSAoICRBU2Vjb25kLCAkQU1pbnV0ZSwgJEFIb3VyLCAkQURheSwgJEFNb250aCwgJEFZZWFyLCAkQURheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFN5c3RlbVRpbWUgKyAkVGltZXpvbmVPZmZzZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIGRhdGVzIGFuZCB0aW1lcwogICAgICAgIG15ICRTdGFydFRpbWUgICAgID0gc3ByaW50ZiggIiUwMmQiLCAkQUhvdXIgKSAuICc6JyAuIHNwcmludGYoICIlMDJkIiwgJEFNaW51dGUgKTsKICAgICAgICBteSAkU3RhcnRUaW1lTG9uZyA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgLT5Gb3JtYXRUaW1lU3RyaW5nKCAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e1N0YXJ0VGltZX0sICdEYXRlRm9ybWF0TG9uZycgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57VGl0bGV9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lTG9uZyA9PiAkU3RhcnRUaW1lTG9uZywKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICAgPT4gJENhbGVuZGFyc3sgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0tPntDYWxlbmRhcklEfSB9LT57Q29sb3J9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJOYW1lICA9PiAkQ2FsZW5kYXJzeyAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e0NhbGVuZGFySUR9IH0tPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgaW5jcmVhc2Ugc2hvd24gaXRlbSBjb3VudAogICAgICAgICRTaG93bisrOwogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUFwcG9pbnRtZW50cyApICkgewoKICAgICAgICAjIHNob3cgdXAgbWVzc2FnZSBmb3Igbm8gYXBwb2ludG1lbnRzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50Tm9uZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBjc3MgY2xhc3MKICAgIG15ICVTdW1tYXJ5OwogICAgJFN1bW1hcnl7ICRTZWxmLT57RmlsdGVyfSAuICc6OlNlbGVjdGVkJyB9ID0gJ1NlbGVjdGVkJzsKCiAgICAjIGZpbHRlciBiYXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50RmlsdGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXsgJFNlbGYtPntDb25maWd9IH0sCiAgICAgICAgICAgICVTdW1tYXJ5LAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZWxmLT57TmFtZX0sCiAgICAgICAgICAgIFRvZGF5Q291bnQgICAgPT4gJEFwcG9pbnRtZW50c0NvdW50e1RvZGF5fSwKICAgICAgICAgICAgVG9tb3Jyb3dDb3VudCA9PiAkQXBwb2ludG1lbnRzQ291bnR7VG9tb3Jyb3d9LAogICAgICAgICAgICBTb29uQ291bnQgICAgID0+ICRBcHBvaW50bWVudHNDb3VudHtTb29ufSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBwYWdlIG5hdiBiYXIKICAgIG15ICRUb3RhbCAgICA9ICRBcHBvaW50bWVudHNDb3VudHsgJFNlbGYtPntGaWx0ZXJ9IH0gfHwgMDsKICAgIG15ICRMaW5rUGFnZSA9ICdTdWJhY3Rpb249RWxlbWVudDtOYW1lPScgLiAkU2VsZi0+e05hbWV9IC4gJztGaWx0ZXI9JyAuICRTZWxmLT57RmlsdGVyfSAuICc7JzsKICAgIG15ICVQYWdlTmF2ICA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgU3RhcnRIaXQgICAgICAgPT4gJFNlbGYtPntTdGFydEhpdH0sCiAgICAgICAgUGFnZVNob3duICAgICAgPT4gJFNlbGYtPntQYWdlU2hvd259LAogICAgICAgIEFsbEhpdHMgICAgICAgID0+ICRUb3RhbCB8fCAxLAogICAgICAgIEFjdGlvbiAgICAgICAgID0+ICdBY3Rpb249JyAuICRMYXlvdXRPYmplY3QtPntBY3Rpb259LAogICAgICAgIExpbmsgICAgICAgICAgID0+ICRMaW5rUGFnZSwKICAgICAgICBXaW5kb3dTaXplICAgICA9PiA1LAogICAgICAgIEFKQVhSZXBsYWNlICAgID0+ICdEYXNoYm9hcmQnIC4gJFNlbGYtPntOYW1lfSwKICAgICAgICBJRFByZWZpeCAgICAgICA9PiAnRGFzaGJvYXJkJyAuICRTZWxmLT57TmFtZX0sCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0FKQVh9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDb250ZW50U21hbGxBcHBvaW50bWVudEZpbHRlck5hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICV7ICRTZWxmLT57Q29uZmlnfSB9LAogICAgICAgICAgICBOYW1lID0+ICRTZWxmLT57TmFtZX0sCiAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHJlZnJlc2ggdGltZQogICAgbXkgJFJlZnJlc2ggPSAkTGF5b3V0T2JqZWN0LT57ICRTZWxmLT57UHJlZktleVJlZnJlc2h9IH0gLy8gMTsKCiAgICBteSAkTmFtZUhUTUwgPSAkU2VsZi0+e05hbWV9OwogICAgJE5hbWVIVE1MID1+IHN7LX17X314bXNnOwoKICAgIG15ICRDb250ZW50ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAleyAkU2VsZi0+e0NvbmZpZ30gfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntOYW1lfSwKICAgICAgICAgICAgTmFtZUhUTUwgICAgPT4gJE5hbWVIVE1MLAogICAgICAgICAgICBSZWZyZXNoVGltZSA9PiAkUmVmcmVzaCAqIDYwLAogICAgICAgIH0sCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0FKQVh9LAogICAgKTsKCiAgICByZXR1cm4gJENvbnRlbnQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7U3ViYWN0aW9uPUFwcG9pbnRtZW50Q3JlYXRlIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPgogICAgPHNwYW4+CiAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIj48L2k+CiAgICAgICAgWyUgVHJhbnNsYXRlKCJOZXcgQXBwb2ludG1lbnQiKSB8IGh0bWwgJV0KICAgIDwvc3Bhbj4KPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnRGaWx0ZXIiKSAlXQo8ZGl2IGNsYXNzPSJEYXNoYm9hcmRBY3Rpb25zIj4KICAgIDx1bCBjbGFzcz0iQXBwb2ludG1lbnRGaWx0ZXIgVGFiIEFjdGlvbnMiPgogICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5pdGVtKCJUb2RheTo6U2VsZWN0ZWQiKSB8IGh0bWwgJV0iPjxhIGhyZWY9IiMiIGlkPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdVG9kYXkiIGNsYXNzPSJbJSBEYXRhLml0ZW0oIlRvZGF5OjpTZWxlY3RlZCIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9kYXkiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiVG9kYXkiKSB8IGh0bWwgJV0gKFslIERhdGEuVG9kYXlDb3VudCB8IGh0bWwgJV0pPC9hPjwvbGk+CiAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLml0ZW0oIlRvbW9ycm93OjpTZWxlY3RlZCIpIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1Ub21vcnJvdyIgY2xhc3M9IlslIERhdGEuaXRlbSgiVG9tb3Jyb3c6OlNlbGVjdGVkIikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb21vcnJvdyIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJUb21vcnJvdyIpIHwgaHRtbCAlXSAoWyUgRGF0YS5Ub21vcnJvd0NvdW50IHwgaHRtbCAlXSk8L2E+PC9saT4KICAgICAgICA8bGkgY2xhc3M9IlslIERhdGEuaXRlbSgiU29vbjo6U2VsZWN0ZWQiKSB8IGh0bWwgJV0iPjxhIGhyZWY9IiMiIGlkPSJEYXNoYm9hcmRbJSBEYXRhLk5hbWUgfCBodG1sICVdU29vbiIgY2xhc3M9IlslIERhdGEuaXRlbSgiU29vbjo6U2VsZWN0ZWQiKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNvb24iKSB8IGh0bWwgJV0gKFslIFRyYW5zbGF0ZSgiNSBkYXlzIikgfCBodG1sICVdKSI+WyUgVHJhbnNsYXRlKCJTb29uIikgfCBodG1sICVdIChbJSBEYXRhLlNvb25Db3VudCB8IGh0bWwgJV0pPC9hPjwvbGk+CiAgICA8L3VsPgo8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKCiAgICAvLyBsb2FkIGZpbHRlciBmb3IgdG9kYXkKICAgICQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSArICdUb2RheScpLnVuYmluZCgnY2xpY2snKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgICAgQ29yZS5BSkFYLkNvbnRlbnRVcGRhdGUoJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKSwgJ1slIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1FbGVtZW50O05hbWU9WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTtGaWx0ZXI9VG9kYXknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgLy8gbG9hZCBmaWx0ZXIgZm9yIHRvbW9ycm93CiAgICAkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykgKyAnVG9tb3Jyb3cnKS51bmJpbmQoJ2NsaWNrJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpewogICAgICAgIENvcmUuQUpBWC5Db250ZW50VXBkYXRlKCQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSksICdbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RWxlbWVudDtOYW1lPVslIERhdGEuTmFtZSB8IGh0bWwgJV07RmlsdGVyPVRvbW9ycm93JywgZnVuY3Rpb24gKCkgewogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwoKICAgIC8vIGxvYWQgZmlsdGVyIGZvciBzb29uCiAgICAkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykgKyAnU29vbicpLnVuYmluZCgnY2xpY2snKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgICAgQ29yZS5BSkFYLkNvbnRlbnRVcGRhdGUoJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKSwgJ1slIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1FbGVtZW50O05hbWU9WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTtGaWx0ZXI9U29vbicsIGZ1bmN0aW9uICgpIHsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50RmlsdGVyTmF2QmFyIikgJV0KPHNwYW4gY2xhc3M9IlNwYWNpbmdUb3AgUGFnaW5hdGlvbiI+CiAgICBbJSBEYXRhLlNpdGVOYXZCYXIgJV0KPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnRGaWx0ZXJOYXZCYXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50RmlsdGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbFRhYmxlIikgJV0KPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgPHRoZWFkPgogICAgICAgIDx0cj4KICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTRweDsiPjwvdGg+CiAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDE0cHg7Ij5bJSBUcmFuc2xhdGUoIlN0YXJ0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgIDwvdHI+CiAgICA8L3RoZWFkPgogICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U21hbGxBcHBvaW50bWVudFJvdyIpICVdCiAgICAgICAgPHRyIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgogICAgICAgICAgICA8dGQgY2xhc3M9IkZsYWdzIENlbnRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIiB0aXRsZT0iWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogWyUgRGF0YS5Db2xvciB8IGh0bWwgJV07IGJvcmRlcjogMXB4IHNvbGlkICNCQkI7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yNSk7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7Ij48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIHRpdGxlPSJbJSBEYXRhLlN0YXJ0VGltZUxvbmcgfCBodG1sICVdIj5bJSBEYXRhLlN0YXJ0VGltZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICA8dGQ+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9WyUgRGF0YS5BcHBvaW50bWVudElEIHwgdXJsICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxBcHBvaW50bWVudFJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50Tm9uZSIpICVdCiAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm5vbmUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnROb25lIikgJV0KICAgIDwvdGJvZHk+CjwvdGFibGU+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxUYWJsZSIpICVdCgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKJCgnLk1hc3RlckFjdGlvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICB2YXIgJE1hc3RlckFjdGlvbkxpbmsgPSAkKHRoaXMpLmZpbmQoJy5NYXN0ZXJBY3Rpb25MaW5rJyk7CiAgICAvLyBwcmV2ZW50IE1hc3RlckFjdGlvbiBvbiBEeW5hbWljIEZpZWxkcyBsaW5rcwogICAgaWYgKCQoRXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnRHluYW1pY0ZpZWxkTGluaycpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBvbmx5IGFjdCBpZiB0aGUgbGluayB3YXMgbm90IGNsaWNrZWQgZGlyZWN0bHkKICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgIGlmIChFdmVudC5jdHJsS2V5IHx8IEV2ZW50Lm1ldGFLZXkpIHsKICAgICAgICAgICAgd2luZG93Lm9wZW4oJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9KTsKCkNvcmUuQ29uZmlnLlNldCgnUmVmcmVzaFNlY29uZHNfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nLCBwYXJzZUludCgiWyUgRGF0YS5SZWZyZXNoVGltZSB8IGh0bWwgJV0iLCAxMCkgfHwgMCk7CmlmIChDb3JlLkNvbmZpZy5HZXQoJ1JlZnJlc2hTZWNvbmRzX1slIERhdGEuTmFtZUhUTUwgfCBodG1sICVdJykpIHsKICAgIENvcmUuQ29uZmlnLlNldCgnVGltZXJfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nLCB3aW5kb3cuc2V0VGltZW91dCgKICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpICsgJy1ib3gnKS5hZGRDbGFzcygnTG9hZGluZycpOwogICAgICAgICAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykpLCAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUVsZW1lbnQ7TmFtZT1bJSBEYXRhLk5hbWUgfCBodG1sICVdJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpICsgJy1ib3gnKS5yZW1vdmVDbGFzcygnTG9hZGluZycpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KENvcmUuQ29uZmlnLkdldCgnVGltZXJfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nKSk7CiAgICAgICAgfSwKICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ1JlZnJlc2hTZWNvbmRzX1slIERhdGEuTmFtZUhUTUwgfCBodG1sICVdJykgKiAxMDAwKQogICAgKTsKfQoKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBEaWdlc3Q6Ok1ENTsKdXNlIE1JTUU6OkJhc2U2NCAoKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSB2YXJzIHF3KEBJU0EpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyIC0gY2FsZW5kYXIgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBjYWxlbmRhciBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIEBJU0EgPSBxdygKICAgICAgICBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyCiAgICApOwoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgPT4gJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdDYWxlbmRhcic7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENhbGVuZGFyQ3JlYXRlKCkKCmNyZWF0ZXMgYSBuZXcgY2FsZW5kYXIgZm9yIGdpdmVuIHVzZXIuCgogICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICBDYWxlbmRhck5hbWUgICAgPT4gJ01lZXRpbmdzJywgICAgICAgICAgIyAocmVxdWlyZWQpIFBlcnNvbmFsIGNhbGVuZGFyIG5hbWUKICAgICAgICBHcm91cElEICAgICAgICAgPT4gMywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIEdyb3VwSUQKICAgICAgICBDb2xvciAgICAgICAgICAgPT4gJyNGRjc3MDAnLCAgICAgICAgICAgIyAocmVxdWlyZWQpIENvbG9yIGluIGhleGFkZWNpbWFsIFJHQiBub3RhdGlvbgogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiA0LCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklECgogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50cywgYXJyYXkgcmVmIG9mIGhhc2hlcwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdGFydERhdGUgPT4gJ0ZpcnN0UmVzcG9uc2UnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgID0+IFsgMiBdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAnVGhpcyBpcyBhIHRpdGxlJywKICAgICAgICAgICAgICAgICAgICBUeXBlcyA9PiAnVGhpcyBpcyBhIHR5cGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAoKICAgICAgICBWYWxpZElEID0+IDEsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWZhdWx0IGlzIDEuCiAgICApOwoKcmV0dXJucyBDYWxlbmRhciBoYXNoIGlmIHN1Y2Nlc3NmdWw6CiAgICAlQ2FsZW5kYXIgPSAoCiAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDIsCiAgICAgICAgR3JvdXBJRCAgICAgID0+IDMsCiAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICdNZWV0aW5ncycsCiAgICAgICAgQ3JlYXRlVGltZSAgID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICBDcmVhdGVCeSAgICAgPT4gNCwKICAgICAgICBDaGFuZ2VUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDg6MDA6MDAnLAogICAgICAgIENoYW5nZUJ5ICAgICA9PiA0LAogICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgKTsKCkV2ZW50czoKICAgIENhbGVuZGFyQ3JlYXRlCgo9Y3V0CgpzdWIgQ2FsZW5kYXJDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFyTmFtZSBHcm91cElEIENvbG9yIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNvbG9yCiAgICBpZiAoICEoICRQYXJhbXtDb2xvcn0gPX4gLyNbQS1GMC05XXszLDZ9L2kgKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvbG9yIG11c3QgYmUgaW4gaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uLCBlZy4gI0ZGRkZGRi4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgdGlja2V0IGFwcG9pbnRtZW50cwogICAgaWYgKCAhKCBzY2FsYXIgQHsgJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gLy8gW10gfSApICkgewogICAgICAgICRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9ID0gdW5kZWY7CiAgICB9CgogICAgIyBtYWtlIGl0IHVwcGVyY2FzZSBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kKICAgICRQYXJhbXtDb2xvcn0gPSB1YyAkUGFyYW17Q29sb3J9OwoKICAgIG15ICRWYWxpZElEID0gZGVmaW5lZCAkUGFyYW17VmFsaWRJRH0gPyAkUGFyYW17VmFsaWRJRH0gOiAxOwoKICAgIG15ICVDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJFBhcmFte0NhbGVuZGFyTmFtZX0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIGNhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJUNhbGVuZGFyKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cygkUGFyYW17Q2FsZW5kYXJOYW1lfSkhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNhbHQgc3RyaW5nCiAgICBteSAkU2FsdFN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgIExlbmd0aCA9PiA2NCwKICAgICk7CgogICAgIyBzZXJpYWxpemUgYW5kIGVuY29kZSB0aWNrZXQgYXBwb2ludG1lbnQgZGF0YQogICAgbXkgJFRpY2tldEFwcG9pbnRtZW50czsKICAgIGlmICggJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gKSB7CiAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30sCiAgICAgICAgKTsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCgkVGlja2V0QXBwb2ludG1lbnRzKTsKICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRzID0gTUlNRTo6QmFzZTY0OjplbmNvZGVfYmFzZTY0KCRUaWNrZXRBcHBvaW50bWVudHMpOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgSU5TRVJUIElOVE8gY2FsZW5kYXIKICAgICAgICAgICAgKGdyb3VwX2lkLCBuYW1lLCBzYWx0X3N0cmluZywgY29sb3IsIHRpY2tldF9hcHBvaW50bWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksCiAgICAgICAgICAgIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksIHZhbGlkX2lkKQogICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCA/KQogICAgJzsKCiAgICAjIGNyZWF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtHcm91cElEfSwgXCRQYXJhbXtDYWxlbmRhck5hbWV9LCBcJFNhbHRTdHJpbmcsIFwkUGFyYW17Q29sb3J9LAogICAgICAgICAgICBcJFRpY2tldEFwcG9pbnRtZW50cywgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkVmFsaWRJRAogICAgICAgIF0sCiAgICApOwoKICAgICVDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJFBhcmFte0NhbGVuZGFyTmFtZX0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIGlmICggISVDYWxlbmRhciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbGVuZGFyIG5vdCBmb3VuZCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjYWNoZSB2YWx1ZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+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+e1NlYXJjaFBhcmFtfSAvLyB7fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICgkRmlsdGVyZWQpIHsKCiAgICAgICAgICAgICAgICAjIHByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUKICAgICAgICAgICAgICAgICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NSdWxlKAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiBcJVRpY2tldEFwcG9pbnRtZW50VHlwZXMsCiAgICAgICAgICAgICAgICAgICAgUnVsZSAgICAgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGlja2V0IHdhcyBub3QgZm91bmQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgYW55IGV4aXN0aW5nIHRpY2tldCBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJFRpY2tldEFwcG9pbnRtZW50cy0+e1J1bGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWJ1ZycpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUHJvY2Vzc2VkIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIHRpY2tldCAkUGFyYW17VGlja2V0SUR9LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyKCkKCkhhbmRsZSB0aGUgYXV0b21hdGljIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIHRoZSBjYWxlbmRhci4KCiAgICBteSAlUmVzdWx0ID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcigKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICApOwoKUmV0dXJucyBsb2cgb2YgcHJvY2Vzc2VkIHRpY2tldHMgYW5kIHJ1bGVzOgoKJVJlc3VsdCA9ICgKICAgIFByb2Nlc3MgPT4gWwogICAgICAgIHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICAgICAgICAgUnVsZUlEICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gMiwKICAgICAgICAgICAgUnVsZUlEICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICB9LAogICAgXSwKICAgIENsZWFudXAgPT4gWwogICAgICAgIHsKICAgICAgICAgICAgUnVsZUlEICA9PiAnYjI3MmEwMzVlZDgyZDY1YTkyN2E5OTMwMGUwMGM5YjUnLAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgIF0sCik7Cgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzQ2FsZW5kYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDYWxlbmRhcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIEdldCBjYWxlbmRhciBjb25maWd1cmF0aW9uLgogICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgIGlmICggISVDYWxlbmRhciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBmaW5kIGNhbGVuZGFyICRQYXJhbXtDYWxlbmRhcklEfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgR2V0IHRpY2tldCBhcHBvaW50bWVudCB0eXBlcwogICAgbXkgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnRUeXBlc0dldCgpOwoKICAgIG15IEBQcm9jZXNzOwogICAgbXkgQENsZWFudXA7CiAgICBteSAlUnVsZUlETG9va3VwOwoKICAgICMgQ2hlY2sgdGlja2V0IGFwcG9pbnRtZW50cyBjb25maWcuCiAgICBpZiAoICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9ICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gKSApIHsKCiAgICAgICAgIyBHZXQgYWN0aXZlIHJ1bGUgSURzIGZyb20gdGhlIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgJVJ1bGVJRExvb2t1cCA9IG1hcCB7ICRfLT57UnVsZUlEfSA9PiAxIH0gQHsgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gfTsKCiAgICAgICAgVElDS0VUX0FQUE9JTlRNRU5UUzoKICAgICAgICBmb3IgbXkgJFRpY2tldEFwcG9pbnRtZW50cyAoIEB7ICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGFwcG9pbnRtZW50IHR5cGVzLgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSkpIHsKCiAgICAgICAgICAgICAgICAjIEFsbG93IHNwZWNpYWwgdGltZSBwcmVzZXRzIGZvciBFbmREYXRlLgogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgbmUgJ0VuZERhdGUnICYmICEoICRUaWNrZXRBcHBvaW50bWVudHMtPnskRmllbGR9ID1+IC9eUGx1c18vICkgKSB7CgogICAgICAgICAgICAgICAgICAgICMgU2tpcCBpZiB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBpcyBpbnZhbGlkLgogICAgICAgICAgICAgICAgICAgIGlmICggISRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyAkVGlja2V0QXBwb2ludG1lbnRzLT57JEZpZWxkfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRJQ0tFVF9BUFBPSU5UTUVOVFM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCBwcmV2aW91c2x5IGNyZWF0ZWQgdGlja2V0IGFwcG9pbnRtZW50cyBmb3IgdGhpcyBydWxlLgogICAgICAgICAgICBteSAlT2xkQXBwb2ludG1lbnRzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJFRpY2tldEFwcG9pbnRtZW50cy0+e1J1bGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEZpbmQgdGlja2V0cyB0aGF0IG1hdGNoIHNlYXJjaCBmaWx0ZXIKICAgICAgICAgICAgbXkgQFRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgICAgIFJlc3VsdCAgID0+ICdBUlJBWScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICAgICAgJXsgJFRpY2tldEFwcG9pbnRtZW50cy0+e1NlYXJjaFBhcmFtfSAvLyB7fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBQcm9jZXNzIGVhY2ggdGlja2V0IGJhc2VkIG9uIHRpY2tldCBhcHBvaW50bWVudCBydWxlLgogICAgICAgICAgICBUSUNLRVRJRDoKICAgICAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoIHNvcnQgQFRpY2tldElEcyApIHsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1J1bGUoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiBcJVRpY2tldEFwcG9pbnRtZW50VHlwZXMsCiAgICAgICAgICAgICAgICAgICAgUnVsZSAgICAgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBQcm9jZXNzLCB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgID0+ICRUaWNrZXRBcHBvaW50bWVudHMtPntSdWxlSUR9LAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBSZW1vdmUgcHJldmlvdXNseSBjcmVhdGVkIHRpY2tldCBhcHBvaW50bWVudHMgaWYgdGhleSBkb24ndCBtYXRjaCB0aGUgcnVsZSBhbnltb3JlLgogICAgICAgICAgICBPTERUSUNLRVRJRDoKICAgICAgICAgICAgZm9yIG15ICRPbGRUaWNrZXRJRCAoIHNvcnQga2V5cyAlT2xkQXBwb2ludG1lbnRzICkgewogICAgICAgICAgICAgICAgbmV4dCBPTERUSUNLRVRJRCBpZiBncmVwIHsgJE9sZFRpY2tldElEID09ICRfIH0gQFRpY2tldElEczsKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRPbGRBcHBvaW50bWVudHN7JE9sZFRpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRPbGRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgID0+ICRUaWNrZXRBcHBvaW50bWVudHMtPntSdWxlSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBDbGVhbnVwLCB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkT2xkQXBwb2ludG1lbnRzeyRPbGRUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkT2xkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICAgICAgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UnVsZUlEfSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSBAUnVsZUlEcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRHNHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwoKICAgICMgUmVtb3ZlIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIG1pc3NpbmcgcnVsZXMuCiAgICBmb3IgbXkgJFJ1bGVJRCAoQFJ1bGVJRHMpIHsKICAgICAgICBpZiAoICEkUnVsZUlETG9va3VweyRSdWxlSUR9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUnVsZUlEICAgICA9PiAkUnVsZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAQ2xlYW51cCwgewogICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlELAogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RlYnVnJykgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQcm9jZXNzZWQgdGlja2V0IGFwcG9pbnRtZW50cyBmb3IgY2FsZW5kYXIgJFBhcmFte0NhbGVuZGFySUR9LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgIFByb2Nlc3MgPT4gXEBQcm9jZXNzLAogICAgICAgIENsZWFudXAgPT4gXEBDbGVhbnVwLAogICAgKTsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzUnVsZSgpCgpQcm9jZXNzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZSBhbmQgY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGFwcG9pbnRtZW50IGlmIG5lY2Vzc2FyeS4KCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRQcm9jZXNzUnVsZSgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRHluYW1pY0ZpZWxkX1Rlc3REYXRlID0+IHsKICAgICAgICAgICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC4uLgogICAgICAgIH0sCiAgICAgICAgUnVsZSA9PiB7CiAgICAgICAgICAgIFN0YXJ0RGF0ZSA9PiAnRHluYW1pY0ZpZWxkX1Rlc3REYXRlJywKICAgICAgICAgICAgRW5kRGF0ZSAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICBRdWV1ZUlEICAgPT4gWyAyIF0sCiAgICAgICAgICAgIFJ1bGVJRCAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLAogICAgICAgICAgICBTZWFyY2hQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1dlbGNvbWUqJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFRpY2tldElEID0+IDEsCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzUnVsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBDb25maWcgUnVsZSBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17Q29uZmlnfSApOwogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1J1bGV9ICk7CgogICAgbXkgJEVycm9yOwogICAgbXkgJEFwcG9pbnRtZW50VHlwZTsKICAgIG15ICVBcHBvaW50bWVudERhdGE7CgogICAgbXkgJE1haW5PYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBnZXQgc3RhcnQgYW5kIGVuZCB0aW1lIHZhbHVlcwogICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnREYXRlIEVuZERhdGUpKSB7CiAgICAgICAgbXkgJFR5cGUgPSAkUGFyYW17UnVsZX0tPnskRmllbGR9OwoKICAgICAgICAjIGFwcG9pbnRtZW50IGZpZWxkcyBhcmUgbmFtZWQgZGlmZmVyZW50bHkKICAgICAgICBteSAkQXBwb2ludG1lbnRGaWVsZCA9ICRGaWVsZDsKICAgICAgICAkQXBwb2ludG1lbnRGaWVsZCA9fiBzL0RhdGUkL1RpbWUvOwoKICAgICAgICAjIGNoZWNrIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZWdpc3RlcmVkIHR5cGUKICAgICAgICBpZiAoICRQYXJhbXtDb25maWd9LT57JFR5cGV9ICYmICRQYXJhbXtDb25maWd9LT57JFR5cGV9LT57TW9kdWxlfSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkUGFyYW17Q29uZmlnfS0+eyRUeXBlfS0+e01vZHVsZX07CgogICAgICAgICAgICAjIGdldCB0aGUgdGltZSB2YWx1ZSB2aWEgdGhlIG1vZHVsZSBtZXRob2QKICAgICAgICAgICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnREYXRheyRBcHBvaW50bWVudEZpZWxkfSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICktPkdldFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRXJyb3IgPSAxIGlmICEkQXBwb2ludG1lbnREYXRheyRBcHBvaW50bWVudEZpZWxkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0aW1lIHByZXNldHMgYXJlIHZhbGlkIG9ubHkgZm9yIGVuZCB0aW1lIGFuZCBleGlzdGluZyBzdGFydCB0aW1lCiAgICAgICAgZWxzaWYgKCAkRmllbGQgZXEgJ0VuZERhdGUnICYmICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfSApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXlBsdXNfKFswLTldKykkLyApIHsKICAgICAgICAgICAgICAgIG15ICRQcmVzZXQgPSBpbnQgJDE7CgogICAgICAgICAgICAgICAgIyBnZXQgc3RhcnQgdGltZQogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50RGF0YXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSBlbmQgdGltZSB1c2luZyBwcmVzZXQgdmFsdWUKICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJFN0YXJ0VGltZSArIDYwICogJFByZXNldDsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudERhdGF7RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IDE7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIHRpbWUgcHJlc2V0OiAkVHlwZSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVua25vd24gdHlwZQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXZlbnQgZW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWUKICAgIGlmICggJEFwcG9pbnRtZW50RGF0YXtTdGFydFRpbWV9ICYmICRBcHBvaW50bWVudERhdGF7RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfSwKICAgICAgICApOwogICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50RGF0YXtFbmRUaW1lfSwKICAgICAgICApOwogICAgICAgIGlmICggJEVuZFRpbWUgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnREYXRhe0VuZFRpbWV9ID0gJEFwcG9pbnRtZW50RGF0YXtTdGFydFRpbWV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCB0aXRsZQogICAgaWYgKCAhJEVycm9yICkgewoKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgbXkgJFRpY2tldEhvb2sgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKTsKICAgICAgICBteSAkVGlja2V0SG9va0RpdmlkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKTsKICAgICAgICBteSAlVGlja2V0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRBcHBvaW50bWVudERhdGF7VGl0bGV9ID0gIlskVGlja2V0SG9vayRUaWNrZXRIb29rRGl2aWRlciRUaWNrZXR7VGlja2V0TnVtYmVyfV0gJFRpY2tldHtUaXRsZX0iOwogICAgfQoKICAgIG15ICRTdWNjZXNzOwoKICAgICMgY2hlY2sgaWYgdGlja2V0IGFwcG9pbnRtZW50IGFscmVhZHkgZXhpc3RzCiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFJ1bGVJRCAgICAgPT4gJFBhcmFte1J1bGV9LT57UnVsZUlEfSwKICAgICk7CgogICAgIyB0aWNrZXQgYXBwb2ludG1lbnQgd2FzIGZvdW5kCiAgICBpZiAoJEFwcG9pbnRtZW50SUQpIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIHRpY2tldCBhcHBvaW50bWVudCwgaWYgZXJyb3Igd2FzIHJhaXNlZAogICAgICAgIGlmICgkRXJyb3IpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJFBhcmFte1J1bGV9LT57UnVsZUlEfSwKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgdGlja2V0IGFwcG9pbnRtZW50LCBvdGhlcndpc2UKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgICA9PiAkUGFyYW17UnVsZX0tPntSdWxlSUR9LAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50RGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgdGlja2V0IGFwcG9pbnRtZW50IGlmIG5vdCBmb3VuZAogICAgZWxzaWYgKCAhJEVycm9yICkgewogICAgICAgICRTdWNjZXNzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgUnVsZUlEICAgICA9PiAkUGFyYW17UnVsZX0tPntSdWxlSUR9LAogICAgICAgICAgICAlQXBwb2ludG1lbnREYXRhLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFVwZGF0ZVRpY2tldCgpCgpVcGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50LgoKICAgICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRVcGRhdGVUaWNrZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLAogICAgICAgIFRpY2tldElEICAgICAgPT4gMSwKICAgICk7CgpUaGlzIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHJldHVybiB2YWx1ZS4KCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudFVwZGF0ZVRpY2tldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAlQXBwb2ludG1lbnREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzdG9wIGlmIG5vdCB0aWNrZXQgYXBwb2ludG1lbnQKICAgIHJldHVybiBpZiAhJEFwcG9pbnRtZW50RGF0YXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH07CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUKICAgIG15ICRSdWxlID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudERhdGF7Q2FsZW5kYXJJRH0sCiAgICAgICAgUnVsZUlEICAgICA9PiAkQXBwb2ludG1lbnREYXRhe1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICk7CiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRSdWxlKTsKCiAgICAjIGdldCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZXMKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50VHlwZXNHZXQoKTsKCiAgICBteSAkTWFpbk9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBwcm9jZXNzIHN0YXJ0IGFuZCBlbmQgdGltZSB2YWx1ZXMKICAgIGZvciBteSAkRmllbGQgKHF3KFN0YXJ0RGF0ZSBFbmREYXRlKSkgewogICAgICAgIG15ICRUeXBlID0gJFJ1bGUtPnskRmllbGR9OwoKICAgICAgICAjIGFwcG9pbnRtZW50IGZpZWxkcyBhcmUgbmFtZWQgZGlmZmVyZW50bHkKICAgICAgICBteSAkQXBwb2ludG1lbnRGaWVsZCA9ICRGaWVsZDsKICAgICAgICAkQXBwb2ludG1lbnRGaWVsZCA9fiBzL0RhdGUkL1RpbWUvOwoKICAgICAgICAjIGNoZWNrIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZWdpc3RlcmVkIHR5cGUKICAgICAgICBpZiAoICRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyRUeXBlfSAmJiAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skVHlwZX0tPntNb2R1bGV9ICkgewogICAgICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyRUeXBlfS0+e01vZHVsZX07CgogICAgICAgICAgICAjIHNldCB0aGUgdGltZSB2YWx1ZSB2aWEgdGhlIG1vZHVsZSBtZXRob2QKICAgICAgICAgICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CgogICAgICAgICAgICAgICAgIyBsb29wIHByb3RlY3Rpb246IHByZXZlbnQgdGlja2V0IGV2ZW50IG1vZHVsZSBmcm9tIHJ1bm5pbmcKICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPnsnX1RpY2tldEFwcG9pbnRtZW50czo6QWxyZWFkeVByb2Nlc3NlZCd9LT57ICRQYXJhbXtUaWNrZXRJRH0gfSsrOwoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKS0+U2V0VGltZSgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkQXBwb2ludG1lbnREYXRheyRBcHBvaW50bWVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRXJyb3Igc2V0dGluZyAkVHlwZSBmb3IgdGlja2V0ICRQYXJhbXtUaWNrZXRJRH0hIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWJ1ZycpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVXBkYXRlZCB0aWNrZXQgJFBhcmFte1RpY2tldElEfSBmcm9tIGFwcG9pbnRtZW50ICRQYXJhbXtBcHBvaW50bWVudElEfS4iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFRpY2tldElEKCkKCmdldCB0aWNrZXQgaWQgb2YgYSB0aWNrZXQgYXBwb2ludG1lbnQuCgogICAgbXkgJFRpY2tldElEID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFRpY2tldElEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICk7CgpyZXR1cm5zIGFwcG9pbnRtZW50IElEIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEFwcG9pbnRtZW50SUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCB0aWNrZXRfaWQKICAgICAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudF90aWNrZXQKICAgICAgICAgICAgV0hFUkUgYXBwb2ludG1lbnRfaWQgPSA/CiAgICAgICAgJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFRpY2tldElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRpY2tldElEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJFRpY2tldElEOwp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRHNHZXQoKQoKZ2V0IHVzZWQgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGVzIGZvciBzcGVjaWZpYyBjYWxlbmRhci4KCiAgICBteSBAUnVsZUlEcyA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRSdWxlSURzR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBUaWNrZXRJRCAgID0+IDEsICAgICMgKG9wdGlvbmFsKSBSZXR1cm4gcnVsZXMgdXNlZCBvbmx5IGZvciBzcGVjaWZpYyB0aWNrZXQKICAgICk7CgpyZXR1cm5zIGFycmF5IG9mIHJ1bGUgSURzIGlmIGZvdW5kLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU1FMID0gJwogICAgICAgIFNFTEVDVCBydWxlX2lkCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudF90aWNrZXQKICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8KICAgICc7CiAgICBteSBAQmluZDsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH07CgogICAgIyBzcGVjaWZpYyB0aWNrZXQgcXVlcnkgY29uZGl0aW9uCiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCB0aWNrZXRfaWQgPSA/CiAgICAgICAgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1RpY2tldElEfTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICVSdWxlSURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJ1bGVJRHN7ICRSb3dbMF0gfSA9IDE7CiAgICB9CgogICAgIyByZXR1cm4gdW5pcXVlIHJ1bGUgaWRzCiAgICByZXR1cm4ga2V5cyAlUnVsZUlEczsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRSdWxlR2V0KCkKCmdldCB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZS4KCiAgICBteSAkUnVsZSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRSdWxlR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBSdWxlSUQgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsCiAgICApOwoKcmV0dXJucyBydWxlIGhhc2g6Cgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRSdWxlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFJ1bGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQ2FsZW5kYXIgPSAkU2VsZi0+Q2FsZW5kYXJHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfTsKCiAgICBteSAkUmVzdWx0OwoKICAgIFJVTEU6CiAgICBmb3IgbXkgJFJ1bGUgKCBAeyAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9ICkgewogICAgICAgIGlmICggJFJ1bGUtPntSdWxlSUR9IGVxICRQYXJhbXtSdWxlSUR9ICkgewogICAgICAgICAgICAkUmVzdWx0ID0gJFJ1bGU7CiAgICAgICAgICAgIGxhc3QgUlVMRTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaWYgISRSZXN1bHQ7CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50VHlwZXNHZXQoKQoKZ2V0IGRlZmluZWQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzIGZyb20gY29uZmlnLgoKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCk7CgpyZXR1cm5zIGhhc2ggb2YgYXBwb2ludG1lbnQgdHlwZXM6CgogICAgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgPSAoKTsKCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAkVGlja2V0QXBwb2ludG1lbnRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZScpCiAgICAgICAgLy8ge307CiAgICByZXR1cm4gaWYgISRUaWNrZXRBcHBvaW50bWVudENvbmZpZzsKCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRUeXBlczsKCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgIFRZUEU6CiAgICBmb3IgbXkgJFR5cGVLZXkgKCBzb3J0IGtleXMgJXskVGlja2V0QXBwb2ludG1lbnRDb25maWd9ICkgewogICAgICAgIG5leHQgVFlQRSBpZiAhJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fTsKCiAgICAgICAgaWYgKCAkVHlwZUtleSA9fiAvRHluYW1pY0ZpZWxkJC8gKSB7CgogICAgICAgICAgICAjIGdldCBsaXN0IG9mIGFsbCB2YWxpZCBkYXRlIGFuZCBkYXRlL3RpbWUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9IG5lICdEYXRlJyAmJiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSBuZSAnRGF0ZVRpbWUnOwoKICAgICAgICAgICAgICAgIG15ICRLZXkgPSBzcHJpbnRmKCAkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntLZXl9LCAkRHluYW1pY0ZpZWxkLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyRLZXl9ID0gJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3sgJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSB9ID0KICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9OwogICAgfQoKICAgIHJldHVybiAlVGlja2V0QXBwb2ludG1lbnRUeXBlczsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnREZWxldGUoKQoKZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudChzKS4KCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgQ2FsZW5kYXJJRAogICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgICAgIyAocmVxdWlyZWQpIFJ1bGVJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFRpY2tldElEICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFRpY2tldCBJRAoKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBBcHBvaW50bWVudCBJRCBpcyBrbm93bgogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAoICEkUGFyYW17Q2FsZW5kYXJJRH0gfHwgISRQYXJhbXtSdWxlSUR9ICkgJiYgISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENhbGVuZGFySUQgYW5kIFJ1bGVJRCwgb3IgVGlja2V0SUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBAQXBwb2ludG1lbnRJRHM7CiAgICBwdXNoIEBBcHBvaW50bWVudElEcywgJFBhcmFte0FwcG9pbnRtZW50SUR9IGlmICRQYXJhbXtBcHBvaW50bWVudElEfTsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIEFwcG9pbnRtZW50IElEIGlzIHVua25vd24uCiAgICBpZiAoICFAQXBwb2ludG1lbnRJRHMgKSB7CiAgICAgICAgbXkgJFNRTCA9ICcKICAgICAgICAgICAgU0VMRUNUIGFwcG9pbnRtZW50X2lkCiAgICAgICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAgICAgICAgIFdIRVJFIDE9MQogICAgICAgICc7CiAgICAgICAgbXkgQEJpbmQ7CgogICAgICAgIGlmICggJFBhcmFte0NhbGVuZGFySUR9ICYmICRQYXJhbXtSdWxlSUR9ICkgewogICAgICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgICAgIEFORCBjYWxlbmRhcl9pZCA9ID8gQU5EIHJ1bGVfaWQgPSA/CiAgICAgICAgICAgICc7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17UnVsZUlEfTsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgICAgICBBTkQgdGlja2V0X2lkID0gPwogICAgICAgICAgICAnOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1RpY2tldElEfTsKICAgICAgICB9CgogICAgICAgICMgZGIgcXVlcnkKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnRJRHMsICRSb3dbMF07CiAgICAgICAgfQogICAgfQoKICAgICMgUmVtb3ZlIHRoZSByZWxhdGlvbihzKSBmcm9tIGRhdGFiYXNlLgogICAgbXkgJFNRTCA9ICcKICAgICAgICBERUxFVEUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudF90aWNrZXQKICAgICAgICBXSEVSRSAxPTEKICAgICc7CiAgICBteSBAQmluZDsKCiAgICBpZiAoICRQYXJhbXtDYWxlbmRhcklEfSAmJiAkUGFyYW17UnVsZUlEfSApIHsKICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgQU5EIGNhbGVuZGFyX2lkID0gPyBBTkQgcnVsZV9pZCA9ID8KICAgICAgICAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17UnVsZUlEfTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCB0aWNrZXRfaWQgPSA/CiAgICAgICAgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1RpY2tldElEfTsKICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIGdldCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAjIGNsZWFudXAgdGlja2V0IGFwcG9pbnRtZW50cwogICAgQVBQT0lOVE1FTlRfSUQ6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKEBBcHBvaW50bWVudElEcykgewoKICAgICAgICAjIGNoZWNrIGlmIGFwcG9pbnRtZW50IGV4aXN0cwogICAgICAgIG5leHQgQVBQT0lOVE1FTlRfSUQgaWYgISRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhlIGFwcG9pbnRtZW50CiAgICAgICAgcmV0dXJuIGlmICEkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gR2V0QWNjZXNzVG9rZW4oKQoKZ2V0IGFjY2VzcyB0b2tlbiBmb3IgdGhlIGNhbGVuZGFyLgoKICAgIG15ICRUb2tlbiA9ICRDYWxlbmRhck9iamVjdC0+R2V0QWNjZXNzVG9rZW4oCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLCAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIENhbGVuZGFySUQKICAgICAgICBVc2VyTG9naW4gID0+ICdhZ2VudC0xJywgICAgICAjIChyZXF1aXJlZCkgVXNlciBsb2dpbgogICAgKTsKCnJldHVybnM6CiAgICAkVG9rZW4gPSAncncnOwoKPWN1dAoKc3ViIEdldEFjY2Vzc1Rva2VuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFVzZXJMb2dpbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1Qgc2FsdF9zdHJpbmcgRlJPTSBjYWxlbmRhciBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDYWxlbmRhcklEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFNhbHRTdHJpbmc7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2FsdFN0cmluZyA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2FsdFN0cmluZzsKCiAgICAjIEVuY29kZSB1c2VyIGxvZ2luIHRvIFVURjggcmVwcmVzZW50YXRpb24sIHNpbmNlIE1ENSBpcyBkZWZpbmVkIG9ubHkgZm9yIHN0cmluZ3Mgb2YgYnl0ZXMuCiAgICAjICAgSWYgbG9naW4gY29udGFpbnMgYSBVbmljb2RlIGNoYXJhY3RlciwgTUQ1IG1pZ2h0IGZhaWwgb3RoZXJ3aXNlLiBQbGVhc2Ugc2VlIGJ1ZyMxMjU5MyBmb3IKICAgICMgICBtb3JlIGluZm9ybWF0aW9uLgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoIFwkUGFyYW17VXNlckxvZ2lufSApOwoKICAgICMgY2FsY3VsYXRlIG1kNSBzdW0KICAgIG15ICRTdHJpbmcgPSAiJFBhcmFte1VzZXJMb2dpbn0tJFNhbHRTdHJpbmciOwogICAgbXkgJE1ENSAgICA9IERpZ2VzdDo6TUQ1LT5uZXcoKS0+YWRkKCRTdHJpbmcpLT5oZXhkaWdlc3QoKTsKCiAgICByZXR1cm4gJE1ENTsKfQoKPWl0ZW0gR2V0VGV4dENvbG9yKCkKCnJldHVybnMgYmVzdCB0ZXh0IGNvbG9yIGZvciBzdXBwbGllZCBiYWNrZ3JvdW5kLCBiYXNlZCBvbiBsdW1pbm9zaXR5IGRpZmZlcmVuY2UgYWxnb3JpdGhtLgoKICAgIG15ICRCZXN0VGV4dENvbG9yID0gJENhbGVuZGFyT2JqZWN0LT5HZXRUZXh0Q29sb3IoCiAgICAgICAgQmFja2dyb3VuZCA9PiAnI0ZGRicsICAgICMgKHJlcXVpcmVkKSBtdXN0IGJlIGluIHZhbGlkIGhleGFkZWNpbWFsIFJHQiBub3RhdGlvbgogICAgKTsKCnJldHVybnM6CiAgICAkQmVzdFRleHRDb2xvciA9ICcjMDAwJzsKCj1jdXQKCnN1YiBHZXRUZXh0Q29sb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEJhY2tncm91bmQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjb2xvcgogICAgaWYgKCAhKCAkUGFyYW17QmFja2dyb3VuZH0gPX4gLyNbQS1GMC05XXszLDZ9L2kgKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0JhY2tncm91bmQgbXVzdCBiZSBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24sIGVnLiAjRkZGRkZGLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiB2YWx1ZSBpcyBjYWNoZWQKICAgIG15ICREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdHZXRUZXh0Q29sb3InLAogICAgICAgIEtleSAgPT4gJFBhcmFte0JhY2tncm91bmR9LAogICAgKTsKICAgIHJldHVybiAkRGF0YSBpZiAkRGF0YTsKCiAgICAjIGdldCBSR0IgdmFsdWVzCiAgICBteSBAQmFja2dyb3VuZENvbG9yOwogICAgbXkgJFJHQkhleCA9IHN1YnN0ciggJFBhcmFte0JhY2tncm91bmR9LCAxICk7CgogICAgIyBzaXggY2hhcmFjdGVyIGhleGFkZWNpbWFsIHN0cmluZyAoZWcuICNGRkZGRkYpCiAgICBpZiAoIGxlbmd0aCAkUkdCSGV4ID09IDYgKSB7CiAgICAgICAgJEJhY2tncm91bmRDb2xvclswXSA9IGhleCBzdWJzdHIoICRSR0JIZXgsIDAsIDIgKTsKICAgICAgICAkQmFja2dyb3VuZENvbG9yWzFdID0gaGV4IHN1YnN0ciggJFJHQkhleCwgMiwgMiApOwogICAgICAgICRCYWNrZ3JvdW5kQ29sb3JbMl0gPSBoZXggc3Vic3RyKCAkUkdCSGV4LCA0LCAyICk7CiAgICB9CgogICAgIyB0aHJlZSBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nIChlZy4gI0ZGRikKICAgIGVsc2lmICggbGVuZ3RoICRSR0JIZXggPT0gMyApIHsKICAgICAgICAkQmFja2dyb3VuZENvbG9yWzBdID0gaGV4KCBzdWJzdHIoICRSR0JIZXgsIDAsIDEgKSAuIHN1YnN0ciggJFJHQkhleCwgMCwgMSApICk7CiAgICAgICAgJEJhY2tncm91bmRDb2xvclsxXSA9IGhleCggc3Vic3RyKCAkUkdCSGV4LCAxLCAxICkgLiBzdWJzdHIoICRSR0JIZXgsIDEsIDEgKSApOwogICAgICAgICRCYWNrZ3JvdW5kQ29sb3JbMl0gPSBoZXgoIHN1YnN0ciggJFJHQkhleCwgMiwgMSApIC4gc3Vic3RyKCAkUkdCSGV4LCAxLCAxICkgKTsKICAgIH0KCiAgICAjIGludmFsaWQgaGV4YWRlY2ltYWwgc3RyaW5nCiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0JhY2tncm91bmQgbXVzdCBiZSBpbiB2YWxpZCAzIG9yIDYgY2hhcmFjdGVyIGhleGFkZWNpbWFsIFJHQiBub3RhdGlvbiwgZWcuICNGRkYgb3IgI0ZGRkZGRi4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcHJlZGVmaW5lZCB0ZXh0IGNvbG9ycwogICAgbXkgJVRleHRDb2xvcnMgPSAoCiAgICAgICAgV2hpdGUgPT4gWyAnMjU1JywgJzI1NScsICcyNTUnIF0sCiAgICAgICAgR3JheSAgPT4gWyAnMTI4JywgJzEyOCcsICcxMjgnIF0sCiAgICAgICAgQmxhY2sgPT4gWyAnMCcsICAgJzAnLCAgICcwJyBdLAogICAgKTsKCiAgICAjIGNhbGN1bGF0ZSBiYWNrZ3JvdW5kIGx1bWlub3NpdHkKICAgIG15ICRCYWNrZ3JvdW5kTHVtID0KICAgICAgICAwLjIxMjYgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMF0gLyAyNTUqKjIuMiApICsKICAgICAgICAwLjcxNTIgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMV0gLyAyNTUqKjIuMiApICsKICAgICAgICAwLjA3MjIgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMl0gLyAyNTUqKjIuMiApOwoKICAgICMgY2FsY3VsYXRlIGx1bWlub3NpdHkgZGlmZmVyZW5jZQogICAgbXkgJUx1bURpZmY7CiAgICBmb3IgbXkgJFRleHRDb2xvciAoIHNvcnQga2V5cyAlVGV4dENvbG9ycyApIHsKICAgICAgICBteSAkVGV4dEx1bSA9CiAgICAgICAgICAgIDAuMjEyNiAqICggJFRleHRDb2xvcnN7JFRleHRDb2xvcn0tPlswXSAvIDI1NSoqMi4yICkgKwogICAgICAgICAgICAwLjcxNTIgKiAoICRUZXh0Q29sb3JzeyRUZXh0Q29sb3J9LT5bMV0gLyAyNTUqKjIuMiApICsKICAgICAgICAgICAgMC4wNzIyICogKCAkVGV4dENvbG9yc3skVGV4dENvbG9yfS0+WzJdIC8gMjU1KioyLjIgKTsKCiAgICAgICAgaWYgKCAkQmFja2dyb3VuZEx1bSA+ICRUZXh0THVtICkgewogICAgICAgICAgICAkTHVtRGlmZnskVGV4dENvbG9yfSA9ICggJEJhY2tncm91bmRMdW0gKyAwLjA1ICkgLyAoICRUZXh0THVtICsgMC4wNSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEx1bURpZmZ7JFRleHRDb2xvcn0gPSAoICRUZXh0THVtICsgMC4wNSApIC8gKCAkQmFja2dyb3VuZEx1bSArIDAuMDUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbWF4aW11bSBsdW1pbm9zaXR5IGRpZmZlcmVuY2UKICAgIG15ICgkTWF4THVtRGlmZikgPSBzb3J0IHsgJGIgPD0+ICRhIH0gdmFsdWVzICVMdW1EaWZmOwogICAgcmV0dXJuIGlmICEkTWF4THVtRGlmZjsKCiAgICAjIGlkZW50aWZ5IGJlc3Qgc3VpdGVkIGNvbG9yCiAgICBteSAoJEJlc3RUZXh0Q29sb3IpID0gZ3JlcCB7ICRMdW1EaWZmeyRffSBlcSAkTWF4THVtRGlmZiB9IGtleXMgJUx1bURpZmY7CiAgICByZXR1cm4gaWYgISRCZXN0VGV4dENvbG9yOwoKICAgICMgY29udmVydCB0byBoZXggc3RyaW5nCiAgICBteSAkVGV4dENvbG9yID0gc3ByaW50ZigKICAgICAgICAnIyVYJVglWCcsCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMF0sCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMV0sCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMl0sCiAgICApOwoKICAgICMgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0dldFRleHRDb2xvcicsCiAgICAgICAgS2V5ICAgPT4gJFBhcmFte0JhY2tncm91bmR9LAogICAgICAgIFZhbHVlID0+ICRUZXh0Q29sb3IsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAkVGV4dENvbG9yOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfVGlja2V0QXBwb2ludG1lbnRHZXQoKQoKZ2V0IHRpY2tldCBhcHBvaW50bWVudCBpZCBpZiBleGlzdHMuCgogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudEdldCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICk7CgpyZXR1cm5zIGFwcG9pbnRtZW50IElEIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpY2tldElEIFJ1bGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBhcHBvaW50bWVudF9pZAogICAgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8gQU5EIHRpY2tldF9pZCA9ID8gQU5EIHJ1bGVfaWQgPSA/CiAgICAgICAgJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17VGlja2V0SUR9LCBcJFBhcmFte1J1bGVJRH0sIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJEFwcG9pbnRtZW50SUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRBcHBvaW50bWVudElEOwp9Cgo9aXRlbSBfVGlja2V0QXBwb2ludG1lbnRMaXN0KCkKCkdldCBsaXN0IG9mIHRpY2tldCBhcHBvaW50bWVudHMgYmFzZWQgb24gYSBydWxlLgoKICAgIG15ICVBcHBvaW50bWVudHMgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudExpc3QoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICBLZXkgICAgICAgID0+ICdUaWNrZXRJRCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFJldHVybiByZXN1bHQgd2lsbCBiZSBiYXNlZCBvbiB0aGlzIGtleS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IFRpY2tldElELCBQb3NzaWJsZTogVGlja2V0SUR8QXBwb2ludG1lbnRJRAogICAgKTsKClJldHVybnMgbGlzdCBvZiB0aWNrZXQgYXBwb2ludG1lbnRzLCB3aGVyZSBrZXkgd2lsbCBiZSBlaXRoZXIgVGlja2V0SUQgKGRlZmF1bHQpIG9yIEFwcG9pbnRtZW50SUQ6CgolQXBwb2ludG1lbnRzID0gKAogICAgMSA9PiAxLAogICAgMiA9PiAyLAogICAgLi4uCik7Cgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFJ1bGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17S2V5fSB8fD0gJ1RpY2tldElEJzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgYXBwb2ludG1lbnRfaWQsIHRpY2tldF9pZAogICAgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8gQU5EIHJ1bGVfaWQgPSA/CiAgICAgICAgJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtSdWxlSUR9LCBdLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJlc3VsdHsgJFJvd1sxXSB9ID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtLZXl9IGVxICdBcHBvaW50bWVudElEJyApIHsKICAgICAgICAlUmVzdWx0ID0gcmV2ZXJzZSAlUmVzdWx0OwogICAgfQoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aXRlbSBfVGlja2V0QXBwb2ludG1lbnRDcmVhdGUoKQoKY3JlYXRlIHRpY2tldCBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+X1RpY2tldEFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBUaWNrZXRJRCAgID0+IDEsCiAgICAgICAgUnVsZUlEICAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLAogICAgICAgIFRpdGxlICAgICAgPT4gJ1tUaWNrZXQjMjAxNjA4MjM4MTAwMDAwMTBdIFNvbWUgVGlja2V0IFRpdGxlJywKICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA4LTIzIDAwOjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTA4LTI0IDAwOjAwOjAwJywKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBfVGlja2V0QXBwb2ludG1lbnRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVGlja2V0SUQgUnVsZUlEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaXRsZX0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEID0+ICRQYXJhbXtSdWxlSUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwogICAgcmV0dXJuIGlmICEkQXBwb2ludG1lbnRJRDsKCiAgICAjIHNhdmUgdGhlIHJlbGF0aW9uIGluIGRhdGFiYXNlCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICAgICAgKGNhbGVuZGFyX2lkLCB0aWNrZXRfaWQsIGFwcG9pbnRtZW50X2lkLCBydWxlX2lkKQogICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8pCiAgICAgICAgJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtUaWNrZXRJRH0sIFwkQXBwb2ludG1lbnRJRCwgXCRQYXJhbXtSdWxlSUR9LCBdLAogICAgKTsKfQoKPWl0ZW0gX1RpY2tldEFwcG9pbnRtZW50VXBkYXRlKCkKCnVwZGF0ZSB0aWNrZXQgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICBUaXRsZSAgICAgICAgID0+ICdbVGlja2V0IzIwMTYwODIzODEwMDAwMDEwXSBTb21lIFRpY2tldCBUaXRsZScsCiAgICAgICAgU3RhcnRUaW1lICAgICA9PiAnMjAxNi0wOC0yMyAwMDowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wOC0yNCAwMDowMDowMCcsCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFRpY2tldElEIFJ1bGVJRCBUaXRsZSBTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAjIGdldCBjdXJyZW50IHRpY2tldCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHRpY2tldCBhcHBvaW50bWVudCBkb2VzIG5vdCBleGlzdAogICAgaWYgKCAhJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewoKICAgICAgICAjIHJlbW92ZSB0aGUgcmVsYXRpb24gYXMgd2VsbAogICAgICAgICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQgYXBwb2ludG1lbnQKICAgICAgICByZXR1cm4gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb29wIHByb3RlY3Rpb246IHByZXZlbnQgYXBwb2ludG1lbnQgZXZlbnQgbW9kdWxlIGZyb20gcnVubmluZwogICAgJFNlbGYtPnsnX1RpY2tldEFwcG9pbnRtZW50czo6VGlja2V0VXBkYXRlJ30tPnsgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9IH0rKzsKCiAgICAjIHVwZGF0ZSB0aWNrZXQgYXBwb2ludG1lbnQKICAgIHJldHVybiAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCA9PiAkUGFyYW17UnVsZUlEfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhclRlbXBsYXRlR2VuZXJhdG9yOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OlRpbWUpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yIC0gc2lnbmF0dXJlIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgc2lnbmF0dXJlIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntSaWNoVGV4dH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTm90aWZpY2F0aW9uRXZlbnQoKQoKcmVwbGFjZSBhbGwgT1RSUyBzbWFydCB0YWdzIGluIHRoZSBub3RpZmljYXRpb24gYm9keSBhbmQgc3ViamVjdAoKICAgIG15ICVOb3RpZmljYXRpb25FdmVudCA9ICRDYWxlbmRhclRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5Ob3RpZmljYXRpb25FdmVudCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEyMywKICAgICAgICBSZWNpcGllbnQgICAgID0+ICRVc2VyRGF0YUhhc2hSZWYsICAgICAgICAgICMgQWdlbnQgZGF0YSBnZXQgcmVzdWx0CiAgICAgICAgTm90aWZpY2F0aW9uICA9PiAkTm90aWZpY2F0aW9uRGF0YUhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvbkV2ZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhOb3RpZmljYXRpb24gUmVjaXBpZW50IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte05vdGlmaWNhdGlvbn0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vdGlmaWNhdGlvbiBpcyBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CgogICAgIyBnZXQgc3lzdGVtIGRlZmF1bHQgbGFuZ3VhZ2UKICAgIG15ICREZWZhdWx0TGFuZ3VhZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RlZmF1bHRMYW5ndWFnZScpIHx8ICdlbic7CgogICAgbXkgJExhbmd1YWdlcyA9IFsgJFBhcmFte1JlY2lwaWVudH0tPntVc2VyTGFuZ3VhZ2V9LCAkRGVmYXVsdExhbmd1YWdlLCAnZW4nIF07CgogICAgbXkgJExhbmd1YWdlOwogICAgTEFOR1VBR0U6CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyRMYW5ndWFnZXN9ICkgewogICAgICAgIG5leHQgTEFOR1VBR0UgaWYgISRJdGVtOwogICAgICAgIG5leHQgTEFOR1VBR0UgaWYgISROb3RpZmljYXRpb257TWVzc2FnZX0tPnskSXRlbX07CgogICAgICAgICMgc2V0IGxhbmd1YWdlCiAgICAgICAgJExhbmd1YWdlID0gJEl0ZW07CiAgICAgICAgbGFzdCBMQU5HVUFHRTsKICAgIH0KCiAgICAjIGlmIG5vIGxhbmd1YWdlLCB0aGVuIHRha2UgdGhlIGZpcnN0IG9uZSBhdmFpbGFibGUKICAgIGlmICggISRMYW5ndWFnZSApIHsKICAgICAgICBteSBATm90aWZpY2F0aW9uTGFuZ3VhZ2VzID0gc29ydCBrZXlzICV7ICROb3RpZmljYXRpb257TWVzc2FnZX0gfTsKICAgICAgICAkTGFuZ3VhZ2UgPSAkTm90aWZpY2F0aW9uTGFuZ3VhZ2VzWzBdOwogICAgfQoKICAgICMgY29weSB0aGUgY29ycmVjdCBsYW5ndWFnZSBtZXNzYWdlIGF0dHJpYnV0ZXMgdG8gYSBmbGF0IHN0cnVjdHVyZQogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFN1YmplY3QgQm9keSBDb250ZW50VHlwZSkpIHsKICAgICAgICAkTm90aWZpY2F0aW9ueyRBdHRyaWJ1dGV9ID0gJE5vdGlmaWNhdGlvbntNZXNzYWdlfS0+eyRMYW5ndWFnZX0tPnskQXR0cmlidXRlfTsKICAgIH0KCiAgICBteSAkU3RhcnQgPSAnPCc7CiAgICBteSAkRW5kICAgPSAnPic7CiAgICBpZiAoICROb3RpZmljYXRpb257Q29udGVudFR5cGV9ID1+IG17dGV4dFwvaHRtbH0gKSB7CiAgICAgICAgJFN0YXJ0ID0gJyZsdDsnOwogICAgICAgICRFbmQgICA9ICcmZ3Q7JzsKICAgIH0KCiAgICAjIGdldCBodG1sIHV0aWxzIG9iamVjdAogICAgbXkgJEhUTUxVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKTsKCiAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gJiYgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gL3RleHRcL3BsYWluL2kgKSB7CiAgICAgICAgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ICAgICAgICA9ICRIVE1MVXRpbHNPYmplY3QtPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICROb3RpZmljYXRpb257Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICYmICROb3RpZmljYXRpb257Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kgKSB7CiAgICAgICAgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJE5vdGlmaWNhdGlvbntCb2R5fSAgICAgICAgPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5vdGlmeSB0ZXh0cwogICAgZm9yIG15ICRUZXh0IChxdyhTdWJqZWN0IEJvZHkpKSB7CiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbnskVGV4dH0gKSB7CiAgICAgICAgICAgICROb3RpZmljYXRpb257JFRleHR9ID0gIk5vIE5vdGlmaWNhdGlvbiAkVGV4dCBmb3IgJFBhcmFte1R5cGV9IGZvdW5kISI7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICAgICA9PiAkU2VsZi0+e1JpY2hUZXh0fSwKICAgICAgICBUZXh0ICAgICAgICAgID0+ICROb3RpZmljYXRpb257Qm9keX0sCiAgICAgICAgUmVjaXBpZW50ICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgPT4gJExhbmd1YWdlLAogICAgKTsKCiAgICAkTm90aWZpY2F0aW9ue1N1YmplY3R9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgICAgPT4gMCwKICAgICAgICBUZXh0ICAgICAgICAgID0+ICROb3RpZmljYXRpb257U3ViamVjdH0sCiAgICAgICAgUmVjaXBpZW50ICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgPT4gJExhbmd1YWdlLAogICAgKTsKCiAgICAjIGFkZCBVUkxzIGFuZCB2ZXJpZnkgdG8gYmUgZnVsbCBIVE1MIGRvY3VtZW50CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICkgewoKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlTm90aWZpY2F0aW9uOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9Y3V0CgpzdWIgX1JlcGxhY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUZXh0IFJpY2hUZXh0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvciBtYWlsdG8gbGlua3MKICAgICMgc2luY2UgdGhlIHN1YmplY3QgYW5kIGJvZHkgb2YgdGhvc2UgbWFpbHRvIGxpbmtzIGFyZQogICAgIyB1cmkgZXNjYXBlZCB3ZSBoYXZlIHRvIHVyaSB1bmVzY2FwZSB0aGVtLCByZXBsYWNlCiAgICAjIHBvc3NpYmxlIHBsYWNlaG9sZGVycyBhbmQgdGhlbiByZS11cmkgZXNjYXBlIHRoZW0KICAgICRQYXJhbXtUZXh0fSA9fiBzewogICAgICAgIChocmVmPSJtYWlsdG86W15cP10rXD8pKFteIl0rIikKICAgIH0KICAgIHsKICAgICAgICBteSAkTWFpbFRvSHJlZiAgICAgICAgPSAkMTsKICAgICAgICBteSAkTWFpbFRvSHJlZkNvbnRlbnQgPSAkMjsKCiAgICAgICAgJE1haWxUb0hyZWZDb250ZW50ID1+IHN7CiAgICAgICAgICAgICgoPzpzdWJqZWN0fGJvZHkpPSkoLis/KSgifCYpCiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlQcmVmaXggID0gJDE7CiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5Q29udGVudCA9ICQyOwogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keVN1ZmZpeCAgPSAkMzsKCiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5Q29udGVudFVuZXNjYXBlZCA9IFVSSTo6RXNjYXBlOjp1cmlfdW5lc2NhcGUgJFN1YmplY3RPckJvZHlDb250ZW50OwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50UmVwbGFjZWQgPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkU3ViamVjdE9yQm9keUNvbnRlbnRVbmVzY2FwZWQsCiAgICAgICAgICAgICAgICBSaWNoVGV4dCA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50RXNjYXBlZCA9IFVSSTo6RXNjYXBlOjp1cmlfZXNjYXBlX3V0ZjggJFN1YmplY3RPckJvZHlDb250ZW50UmVwbGFjZWQ7CgogICAgICAgICAgICAkU3ViamVjdE9yQm9keVByZWZpeCAuICRTdWJqZWN0T3JCb2R5Q29udGVudEVzY2FwZWQgLiAkU3ViamVjdE9yQm9keVN1ZmZpeDsKICAgICAgICB9ZWd4OwoKICAgICAgICAkTWFpbFRvSHJlZiAuICRNYWlsVG9IcmVmQ29udGVudDsKICAgIH1lZ3g7CgogICAgbXkgJFN0YXJ0ID0gJzwnOwogICAgbXkgJEVuZCAgID0gJz4nOwogICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICRTdGFydCA9ICcmbHQ7JzsKICAgICAgICAkRW5kICAgPSAnJmd0Oyc7CiAgICAgICAgJFBhcmFte1RleHR9ID1+IHMvKFxufFxyKS8vZzsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgbXkgJUNhbGVuZGFyOwogICAgbXkgJUFwcG9pbnRtZW50OwoKICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICk7CiAgICAgICAgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtDYWxlbmRhcklEfSApIHsKICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgc3BlY2lhbCByZXBsYWNlIGZyb20gc2VjcmV0IGNvbmZpZyBvcHRpb25zCiAgICBteSBAU2VjcmV0Q29uZmlnT3B0aW9ucyA9IHF3KAogICAgICAgIERhdGFiYXNlUHcKICAgICAgICBTZWFyY2hVc2VyUHcKICAgICAgICBVc2VyUHcKICAgICAgICBTZW5kbWFpbE1vZHVsZTo6QXV0aFBhc3N3b3JkCiAgICAgICAgQXV0aE1vZHVsZTo6UmFkaXVzOjpQYXNzd29yZAogICAgICAgIFBHUDo6S2V5OjpQYXNzd29yZAogICAgICAgIEN1c3RvbWVyOjpBdXRoTW9kdWxlOjpEQjo6Q3VzdG9tZXJQYXNzd29yZAogICAgICAgIEN1c3RvbWVyOjpBdXRoTW9kdWxlOjpSYWRpdXM6OlBhc3N3b3JkCiAgICAgICAgUHVibGljRnJvbnRlbmQ6OkF1dGhQYXNzd29yZAogICAgKTsKCiAgICAjIHJlcGxhY2UgdGhlIHNlY3JldCBjb25maWcgb3B0aW9ucyBiZWZvcmUgdGhlIG5vcm1hbCBjb25maWcgb3B0aW9ucwogICAgZm9yIG15ICRTZWNyZXRDb25maWdPcHRpb24gKEBTZWNyZXRDb25maWdPcHRpb25zKSB7CgogICAgICAgIG15ICRUYWcgPSAkU3RhcnQgLiAnT1RSU19DT05GSUdfJyAuICRTZWNyZXRDb25maWdPcHRpb24gLiAkRW5kOwogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzeyRUYWd9e3h4eH1neDsKICAgIH0KCiAgICAjIHJlcGxhY2UgY29uZmlnIG9wdGlvbnMKICAgIG15ICRUYWcgPSAkU3RhcnQgLiAnT1RSU19DT05GSUdfJzsKICAgICRQYXJhbXtUZXh0fSA9fiBzeyRUYWcoLis/KSRFbmR9eyRDb25maWdPYmplY3QtPkdldCgkMSkgLy8gJyd9ZWd4OwoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKCiAgICBteSAlUmVjaXBpZW50ID0gJXsgJFBhcmFte1JlY2lwaWVudH0gfHwge30gfTsKCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgIGlmICggISVSZWNpcGllbnQgJiYgJFBhcmFte1JlY2lwaWVudElEfSApIHsKCiAgICAgICAgJVJlY2lwaWVudCA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50SUR9LAogICAgICAgICAgICBOb091dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhIGxvY2FsIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBnZXQgdGltZXpvbmUgb2Zmc2V0IGZvciBjdXJyZW50IHJlY2lwaWVudAogICAgbXkgJFRpbWV6b25lT2Zmc2V0UmF3ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICBVc2VySUQgPT4gJFJlY2lwaWVudHtVc2VySUR9LAogICAgKSB8fCAwOwoKICAgIG15ICRUaW1lem9uZU9mZnNldCA9ICRUaW1lem9uZU9mZnNldFJhdyAqIDYwICogNjA7CgogICAgIyBpbnN0YW5jaWF0ZSBhIG5ldyBsYW5ndWFnZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKICAgIG15ICRMYW5ndWFnZU9iamVjdCA9IEtlcm5lbDo6TGFuZ3VhZ2UtPm5ldygKICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJFBhcmFte0xhbmd1YWdlfSB8fCAnZW4nLAogICAgKTsKCiAgICAjIHN1cHBvcnRlZCBhcHBvaW50bWVudCBmaWVsZHMKICAgIG15ICVBcHBvaW50bWVudFRhZ3NTa2lwID0gKAogICAgICAgIFBhcmVudElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlRXhjbHVkZSAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0Q291bnQgICAgICAgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdCAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGEgbG9jYWwgdGltZSBvYmplY3QKICAgIG15ICRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHByb2Nlc3MgYXBwb2ludG1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHJlcGxhY2UgY29uZmlnIG9wdGlvbnMKICAgICRUYWcgPSAkU3RhcnQgLiAnT1RSU19BUFBPSU5UTUVOVF8nOwoKICAgICMgcmVwbGFjZSBhcHBvaW50bWVudCB0YWdzCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlQXBwb2ludG1lbnQgKSB7CgogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkQXR0cmlidXRlOwogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICRBcHBvaW50bWVudFRhZ3NTa2lweyRBdHRyaWJ1dGV9OwoKICAgICAgICAjIHNldHVwIGEgbmV3IHRhZyBmb3IgdGhlIGN1cnJlbnQgYXR0cmlidXRlCiAgICAgICAgbXkgJE1hdGNoVGFnID0gJFRhZyAuIHVjICRBdHRyaWJ1dGU7CgogICAgICAgICMgbWFwIE5vdGlmaWNhdGlvblRpbWUgYXR0cmlidXRlCiAgICAgICAgaWYgKCAkQXR0cmlidXRlIGVxICdOb3RpZmljYXRpb25EYXRlJyApIHsKICAgICAgICAgICAgJE1hdGNoVGFnID0gJFRhZyAuICdOT1RJRklDQVRJT05USU1FJzsKICAgICAgICB9CgogICAgICAgIG15ICRSZXBsYWNlbWVudCA9ICcnOwoKICAgICAgICAjIHByb2Nlc3MgZGF0ZXRpbWUgc3RyaW5ncyAodGltZXN0YW1wcykKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRyaWJ1dGUgZXEgJ1N0YXJ0VGltZScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnRW5kVGltZScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnTm90aWZpY2F0aW9uRGF0ZScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnQ3JlYXRlVGltZScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlVGltZScKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJy0nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzeXN0ZW0gdGltZSBvZiB0aGUgZ2l2ZW4gdGltZXN0YW1wCiAgICAgICAgICAgICAgICBteSAkVGFnU3lzdGVtVGltZSA9ICRUaW1lT2JqZWN0LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIG5ldyB0aW1lc3RhbXAgd2l0aCB0aGUgcmVsYXRlZCB0aW1lem9uZSBvZmZzZXQKICAgICAgICAgICAgICAgIG15ICROZXdUaW1lU3RhbXAgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGFnU3lzdGVtVGltZSArICRUaW1lem9uZU9mZnNldCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJERhdGVGb3JtYXQgPSAnRGF0ZUZvcm1hdCc7CgogICAgICAgICAgICAgICAgIyBEbyBub3QgaW5jbHVkZSB0aW1lIGNvbXBvbmVudCBmb3IgYWxsLWRheSBhcHBvaW50bWVudHMsCiAgICAgICAgICAgICAgICAjICAgYnV0IG9ubHkgZm9yIHN0YXJ0IGFuZCBlbmQgZGF0ZXMuCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0FsbERheX0KICAgICAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRBdHRyaWJ1dGUgZXEgJ1N0YXJ0VGltZScKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnRW5kVGltZScKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRlRm9ybWF0IC49ICdTaG9ydCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBwcmVwYXJlIGRhdGVzIGFuZCB0aW1lcwogICAgICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJExhbmd1YWdlT2JqZWN0LT5Gb3JtYXRUaW1lU3RyaW5nKCAkTmV3VGltZVN0YW1wLCAkRGF0ZUZvcm1hdCApIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgY3JlYXRlYnkgYW5kIGNoYW5nZWJ5CiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdDcmVhdGVCeScgfHwgJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlQnknICkgewoKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRBcHBvaW50bWVudHskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyB0ZWFtIGlkcwogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnVGVhbUlEJyApIHsKCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoICRBcHBvaW50bWVudHskQXR0cmlidXRlfSApOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGluc3RhbmNpYXRlIGEgbmV3IHRlYW0gb2JqZWN0CiAgICAgICAgICAgIG15ICRUZWFtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtLT5uZXcoKTsKCiAgICAgICAgICAgICMgZ2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgKHJlYWRhYmxlKSB0ZWFtcwogICAgICAgICAgICBteSAlVGVhbUxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbUxpc3QoCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGVhbUxpc3QgKTsKCiAgICAgICAgICAgIG15IEBUZWFtTmFtZXM7CgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVRlYW1MaXN0ICkgKSB7CgogICAgICAgICAgICAgICAgVEVBTUtFWToKICAgICAgICAgICAgICAgIGZvciBteSAkVGVhbUtleSAoIEB7ICRBcHBvaW50bWVudHskQXR0cmlidXRlfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICBuZXh0IFRFQU1LRVkgaWYgISRUZWFtTGlzdHskVGVhbUtleX07CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgJFRlYW1MaXN0eyRUZWFtS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggXEBUZWFtTmFtZXMgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSB0ZWFtIGlkcyB3aXRoIGEgY29tbWEgc2VwZXJhdGVkIGxpc3Qgb2YgdGVhbSBuYW1lcwogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSBqb2luICcsICcsIEBUZWFtTmFtZXM7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgcmVzb3VyY2UgaWRzCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdSZXNvdXJjZUlEJyApIHsKCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoICRBcHBvaW50bWVudHskQXR0cmlidXRlfSApOwoKICAgICAgICAgICAgbXkgQFVzZXJOYW1lczsKCiAgICAgICAgICAgIFVTRVJJRDoKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBAeyAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJJRDsKCiAgICAgICAgICAgICAgICBteSAkVXNlck5hbWUgPSAkVXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICEkVXNlck5hbWU7CgogICAgICAgICAgICAgICAgcHVzaCBAVXNlck5hbWVzLCAkVXNlck5hbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXNlck5hbWVzICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgcmVzb3VyY2UgaWRzIHdpdGggYSBjb21tYSBzZXBlcmF0ZWQgbGlzdCBvZiB0ZWFtIG5hbWVzCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9IGpvaW4gJywgJywgQFVzZXJOYW1lczsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBhbGwgZGF5IGFuZCByZWN1cnJpbmcgdGFncwogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJEF0dHJpYnV0ZSBlcSAnQWxsRGF5JwogICAgICAgICAgICB8fCAkQXR0cmlidXRlIGVxICdSZWN1cnJpbmcnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRUcmFuc2xhdGVkU3RyaW5nID0gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ05vJyk7CgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRUcmFuc2xhdGVkU3RyaW5nID0gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ1llcycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkVHJhbnNsYXRlZFN0cmluZzsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBhbGwgb3RoZXIgc2luZ2xlIHZhbHVlcwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAnLSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRSZXBsYWNlbWVudCB8fD0gJyc7CgogICAgICAgICMgcmVwbGFjZSB0aGUgdGFncwogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzeyRNYXRjaFRhZyRFbmR9eyRSZXBsYWNlbWVudH1lZ3g7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgcHJvY2VzcyBjYWxlbmRhcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgJFRhZyA9ICRTdGFydCAuICdPVFJTX0NBTEVOREFSXyc7CgogICAgIyByZXBsYWNlIGFwcG9pbnRtZW50IHRhZ3MKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVDYWxlbmRhciApIHsKCiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRBdHRyaWJ1dGU7CgogICAgICAgICMgc2V0dXAgYSBuZXcgdGFnIGZvciB0aGUgY3VycmVudCBhdHRyaWJ1dGUKICAgICAgICBteSAkTWF0Y2hUYWcgPSAkVGFnIC4gdWMgJEF0dHJpYnV0ZTsKCiAgICAgICAgbXkgJFJlcGxhY2VtZW50ID0gJyc7CgogICAgICAgICMgcHJvY2VzcyBkYXRldGltZSBzdHJpbmdzICh0aW1lc3RhbXBzKQogICAgICAgIGlmICggJEF0dHJpYnV0ZSBlcSAnQ3JlYXRlVGltZScgfHwgJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlVGltZScgKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgc3lzdGVtIHRpbWUgb2YgdGhlIGdpdmVuIHRpbWVzdGFtcAogICAgICAgICAgICBteSAkVGFnU3lzdGVtVGltZSA9ICRUaW1lT2JqZWN0LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ2FsZW5kYXJ7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdlbmVyYXRlIG5ldyB0aW1lc3RhbXAgd2l0aCB0aGUgcmVsYXRlZCB0aW1lem9uZSBvZmZzZXQKICAgICAgICAgICAgbXkgJE5ld1RpbWVTdGFtcCA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFRhZ1N5c3RlbVRpbWUgKyAkVGltZXpvbmVPZmZzZXQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHByZXBhcmUgZGF0ZXMgYW5kIHRpbWVzCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRMYW5ndWFnZU9iamVjdC0+Rm9ybWF0VGltZVN0cmluZyggJE5ld1RpbWVTdGFtcCwgJ0RhdGVGb3JtYXQnICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgY3JlYXRlYnkgYW5kIGNoYW5nZWJ5CiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdDcmVhdGVCeScgfHwgJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlQnknICkgewoKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRDYWxlbmRhcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBncm91cCBpZAogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnR3JvdXBJRCcgKSB7CiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJENhbGVuZGFyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIHZhbGlkIGlkCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdWYWxpZElEJyApIHsKCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gJENhbGVuZGFyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgkUmVwbGFjZW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIGFsbCBvdGhlciBzaW5nbGUgdmFsdWVzCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggISRDYWxlbmRhcnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICctJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRDYWxlbmRhcnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIHRoZSB0YWdzCiAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7JE1hdGNoVGFnJEVuZH17JFJlcGxhY2VtZW50fWVneDsKICAgIH0KCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWcuKz8kRW5kLy0vZ2k7CgogICAgbXkgJEhhc2hHbG9iYWxSZXBsYWNlID0gc3ViIHsKICAgICAgICBteSAoICRUYWcsICVIICkgPSBAXzsKCiAgICAgICAgIyBHZW5lcmF0ZSBvbmUgc2luZ2xlIG1hdGNoaW5nIHN0cmluZyBmb3IgYWxsIGtleXMgdG8gc2F2ZSBwZXJmb3JtYW5jZS4KICAgICAgICBteSAkS2V5cyA9IGpvaW4gJ3wnLCBtYXAge3F1b3RlbWV0YX0gZ3JlcCB7IGRlZmluZWQgJEh7JF99IH0ga2V5cyAlSDsKCiAgICAgICAgIyBBZGQgYWxsIGtleXMgYWxzbyBhcyBsb3dlcmNhc2UgdG8gYmUgYWJsZSB0byBtYXRjaCBjYXNlIGluc2Vuc2l0aXZlLAogICAgICAgICMgICBlLiBnLiA8T1RSU19DVVNUT01FUl9Gcm9tPiBhbmQgPE9UUlNfQ1VTVE9NRVJfRlJPTT4uCiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUggKSB7CiAgICAgICAgICAgICRIeyBsYyAkS2V5IH0gPSAkSHskS2V5fTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyg/OiRUYWcpKCRLZXlzKSRFbmQvJEh7IGxjICQxIH0vaWVnOwogICAgfTsKCiAgICAjIGdldCByZWNpcGllbnQgZGF0YSBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPVFJTXy4uLgogICAgJFRhZyA9ICRTdGFydCAuICdPVFJTXyc7CgogICAgIyBpbmNsdWRlIG1vcmUgcmVhZGFibGUgdGFnIDxPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlQKICAgIG15ICRSZWNpcGllbnRUYWcgPSAkU3RhcnQgLiAnT1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UXyc7CgogICAgaWYgKCVSZWNpcGllbnQpIHsKCiAgICAgICAgIyBIVE1MIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAgICAgQVRUUklCVVRFOgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlUmVjaXBpZW50ICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRSZWNpcGllbnR7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICAgICAkUmVjaXBpZW50eyRBdHRyaWJ1dGV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZWNpcGllbnR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggIiRUYWd8JFJlY2lwaWVudFRhZyIsICVSZWNpcGllbnQgKTsKICAgIH0KCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRSZWNpcGllbnRUYWcuKz8kRW5kLy0vZ2k7CgogICAgcmV0dXJuICRQYXJhbXtUZXh0fTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6OlRyYW5zcG9ydDo6RW1haWw7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6TGF5b3V0T2JqZWN0KQojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OlBhcmFtT2JqZWN0KQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpCYXNlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWwnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpFbWFpbCAtIGVtYWlsIHRyYW5zcG9ydCBsYXllciBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpOb3RpZmljYXRpb24gZXZlbnQgdHJhbnNwb3J0IGxheWVyLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBub3RpZmljYXRpb24gdHJhbnNwb3J0IG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCcnKTsKICAgIG15ICRUcmFuc3BvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6OkVtYWlsJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFNlbmROb3RpZmljYXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCBOb3RpZmljYXRpb24gUmVjaXBpZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgJE5lZWRlZCEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2xlYW51cCBldmVudCBkYXRhCiAgICAkU2VsZi0+e0V2ZW50RGF0YX0gPSB1bmRlZjsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFN5c3RlbUFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZXQgcmVjaXBpZW50IGRhdGEKICAgIG15ICVSZWNpcGllbnQgPSAleyAkUGFyYW17UmVjaXBpZW50fSB9OwoKICAgIHJldHVybiBpZiAhJFJlY2lwaWVudHtVc2VyRW1haWx9OwogICAgcmV0dXJuIGlmICRSZWNpcGllbnR7VXNlckVtYWlsfSAhfiAvQC87CgogICAgbXkgJElzTG9jYWxBZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgIEFkZHJlc3MgPT4gJFJlY2lwaWVudHtVc2VyRW1haWx9LAogICAgKTsKCiAgICByZXR1cm4gaWYgJElzTG9jYWxBZGRyZXNzOwoKICAgICMgY3JlYXRlIG5ldyBhcnJheSB0byBwcmV2ZW50IGF0dGFjaG1lbnQgZ3Jvd3RoIChzZWUgYnVnIzUxMTQpCiAgICBteSBAQXR0YWNobWVudHM7CgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtBdHRhY2htZW50c30gKSApIHsKICAgICAgICBAQXR0YWNobWVudHMgPSBAeyAkUGFyYW17QXR0YWNobWVudHN9IH07CiAgICB9CgogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CgogICAgIyBzZW5kIG5vdGlmaWNhdGlvbgogICAgbXkgJEZyb20gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ05vdGlmaWNhdGlvblNlbmRlck5hbWUnKSAuICcgPCcKICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyRW1haWwnKSAuICc+JzsKCiAgICBpZiAoICRQYXJhbXtOb3RpZmljYXRpb259LT57Q29udGVudFR5cGV9ICYmICRQYXJhbXtOb3RpZmljYXRpb259LT57Q29udGVudFR5cGV9IGVxICd0ZXh0L2h0bWwnICkgewoKICAgICAgICAjIEdldCBjb25maWd1cmVkIHRlbXBsYXRlIHdpdGggZmFsbGJhY2sgdG8gRGVmYXVsdC4KICAgICAgICBteSAkRW1haWxUZW1wbGF0ZSA9ICRQYXJhbXtOb3RpZmljYXRpb259LT57RGF0YX0tPntUcmFuc3BvcnRFbWFpbFRlbXBsYXRlfS0+WzBdIHx8ICdEZWZhdWx0JzsKCiAgICAgICAgbXkgJEhvbWUgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdIb21lJyk7CiAgICAgICAgbXkgJFRlbXBsYXRlRGlyICAgICAgID0gIiRIb21lL0tlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvTm90aWZpY2F0aW9uRXZlbnQvRW1haWwiOwogICAgICAgIG15ICRDdXN0b21UZW1wbGF0ZURpciA9ICIkSG9tZS9DdXN0b20vS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9Ob3RpZmljYXRpb25FdmVudC9FbWFpbCI7CgogICAgICAgIGlmICggIS1yICIkVGVtcGxhdGVEaXIvJEVtYWlsVGVtcGxhdGUudHQiICYmICEtciAiJEN1c3RvbVRlbXBsYXRlRGlyLyRFbWFpbFRlbXBsYXRlLnR0IiApIHsKICAgICAgICAgICAgJEVtYWlsVGVtcGxhdGUgPSAnRGVmYXVsdCc7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIEhUTUwKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gIk5vdGlmaWNhdGlvbkV2ZW50L0VtYWlsLyRFbWFpbFRlbXBsYXRlIiwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkRW1haWxPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKTsKCiAgICAjIHNlbmQgbm90aWZpY2F0aW9uCiAgICBteSAkU2VudCA9ICRFbWFpbE9iamVjdC0+U2VuZCgKICAgICAgICBGcm9tICAgICAgID0+ICRGcm9tLAogICAgICAgIFRvICAgICAgICAgPT4gJFJlY2lwaWVudHtVc2VyRW1haWx9LAogICAgICAgIFN1YmplY3QgICAgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSwKICAgICAgICBNaW1lVHlwZSAgID0+ICROb3RpZmljYXRpb257Q29udGVudFR5cGV9LAogICAgICAgIFR5cGUgICAgICAgPT4gJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0sCiAgICAgICAgQ2hhcnNldCAgICA9PiAndXRmLTgnLAogICAgICAgIEJvZHkgICAgICAgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICBMb29wICAgICAgID0+IDEsCiAgICAgICAgQXR0YWNobWVudCA9PiAkUGFyYW17QXR0YWNobWVudHN9IHx8IFtdLAogICAgKTsKCiAgICBpZiAoICEkU2VudCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIickTm90aWZpY2F0aW9ue05hbWV9JyBub3RpZmljYXRpb24gY291bGQgbm90IGJlIHNlbnQgdG8gYWdlbnQgJyRSZWNpcGllbnR7VXNlckVtYWlsfSAiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvZyBldmVudAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICJTZW50IGFnZW50ICckTm90aWZpY2F0aW9ue05hbWV9JyBub3RpZmljYXRpb24gdG8gJyRSZWNpcGllbnR7VXNlckVtYWlsfScuIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBHZXRUcmFuc3BvcnRSZWNpcGllbnRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5vdGlmaWNhdGlvbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSBAUmVjaXBpZW50czsKCiAgICAjIGdldCByZWNpcGllbnRzIGJ5IFJlY2lwaWVudEVtYWlsCiAgICBpZiAoICRQYXJhbXtOb3RpZmljYXRpb259LT57RGF0YX0tPntSZWNpcGllbnRFbWFpbH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17Tm90aWZpY2F0aW9ufS0+e0RhdGF9LT57UmVjaXBpZW50RW1haWx9LT5bMF0gKSB7CiAgICAgICAgICAgIG15ICVSZWNpcGllbnQ7CiAgICAgICAgICAgICRSZWNpcGllbnR7UmVhbG5hbWV9ICA9ICcnOwogICAgICAgICAgICAkUmVjaXBpZW50e1R5cGV9ICAgICAgPSAnQ3VzdG9tZXInOwogICAgICAgICAgICAkUmVjaXBpZW50e1VzZXJFbWFpbH0gPSAkUGFyYW17Tm90aWZpY2F0aW9ufS0+e0RhdGF9LT57UmVjaXBpZW50RW1haWx9LT5bMF07CgogICAgICAgICAgICAjIGNoZWNrIHJlY2lwaWVudHMKICAgICAgICAgICAgaWYgKCAkUmVjaXBpZW50e1VzZXJFbWFpbH0gJiYgJFJlY2lwaWVudHtVc2VyRW1haWx9ID1+IC9ALyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlY2lwaWVudHMsIFwlUmVjaXBpZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAUmVjaXBpZW50czsKfQoKc3ViIFRyYW5zcG9ydFNldHRpbmdzRGlzcGxheUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhSZWNpcGllbnRFbWFpbCkpIHsKICAgICAgICBuZXh0IEtFWSBpZiAhJFBhcmFte0RhdGF9LT57JEtleX07CiAgICAgICAgbmV4dCBLRVkgaWYgIWRlZmluZWQgJFBhcmFte0RhdGF9LT57JEtleX0tPlswXTsKICAgICAgICAkUGFyYW17JEtleX0gPSAkUGFyYW17RGF0YX0tPnskS2V5fS0+WzBdOwogICAgfQoKICAgIG15ICRIb21lICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSG9tZScpOwogICAgbXkgJFRlbXBsYXRlRGlyICAgICAgID0gIiRIb21lL0tlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvTm90aWZpY2F0aW9uRXZlbnQvRW1haWwiOwogICAgbXkgJEN1c3RvbVRlbXBsYXRlRGlyID0gIiRIb21lL0N1c3RvbS9LZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL05vdGlmaWNhdGlvbkV2ZW50L0VtYWlsIjsKCiAgICBteSBARmlsZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5EaXJlY3RvcnlSZWFkKAogICAgICAgIERpcmVjdG9yeSA9PiAkVGVtcGxhdGVEaXIsCiAgICAgICAgRmlsdGVyICAgID0+ICcqLnR0JywKICAgICk7CiAgICBpZiAoIC1kICRDdXN0b21UZW1wbGF0ZURpciApIHsKICAgICAgICBwdXNoIEBGaWxlcywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAgICAgRGlyZWN0b3J5ID0+ICRDdXN0b21UZW1wbGF0ZURpciwKICAgICAgICAgICAgRmlsdGVyICAgID0+ICcqLnR0JywKICAgICAgICApOwogICAgfQoKICAgICMgZm9yIGRlZHVwbGljYXRpb24KICAgIG15ICVUZW1wbGF0ZXM7CgogICAgZm9yIG15ICRGaWxlIChARmlsZXMpIHsKICAgICAgICAkRmlsZSA9fiBze14uKi8oW14vXSspXC50dH17JDF9c214ZzsKICAgICAgICAkVGVtcGxhdGVzeyRGaWxlfSA9ICRGaWxlOwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte1RyYW5zcG9ydEVtYWlsVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgID0+IFwlVGVtcGxhdGVzLAogICAgICAgIE5hbWUgICAgICAgID0+ICdUcmFuc3BvcnRFbWFpbFRlbXBsYXRlJywKICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtEYXRhfS0+e1RyYW5zcG9ydEVtYWlsVGVtcGxhdGV9LAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIEhUTUwKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnRUcmFuc3BvcnRFbWFpbFNldHRpbmdzJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBUcmFuc3BvcnRQYXJhbVNldHRpbmdzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEdldFBhcmFtKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIFBBUkFNRVRFUjoKICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhSZWNpcGllbnRFbWFpbCBOb3RpZmljYXRpb25BcnRpY2xlVHlwZUlEIFRyYW5zcG9ydEVtYWlsVGVtcGxhdGUpKSB7CiAgICAgICAgbXkgQERhdGEgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgbmV4dCBQQVJBTUVURVIgaWYgIUBEYXRhOwogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPntEYXRhfS0+eyRQYXJhbWV0ZXJ9ID0gXEBEYXRhOwogICAgfQoKICAgICMgTm90ZTogRXhhbXBsZSBob3cgdG8gc2V0IGVycm9ycyBhbmQgdXNlIHRoZW0KICAgICMgb24gdGhlIG5vcm1hbCBBZG1pbk5vdGlmaWNhdGlvbkV2ZW50IHNjcmVlbgogICAgIyAjIHNldCBlcnJvcgogICAgIyAkUGFyYW17R2V0UGFyYW19LT57JFBhcmFtZXRlci4nU2VydmVyRXJyb3InfSA9ICdTZXJ2ZXJFcnJvcic7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBJc1VzYWJsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGlmIHRoaXMgdHJhbnNwb3J0IGlzIHVzYWJsZSBvbgogICAgIyB0aGlzIHNwZWNpZmljIG1vbWVudAogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6OlRyYW5zcG9ydDo6QmFzZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpOb3RpZmljYXRpb25FdmVudDo6VHJhbnNwb3J0OjpCYXNlIC0gY29tbW9uIG5vdGlmaWNhdGlvbiBldmVudCB0cmFuc3BvcnQgZnVuY3Rpb25zCgo9aGVhZDEgU1lOT1BTSVMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBTZW5kTm90aWZpY2F0aW9uKCkKCnNlbmQgYSBub3RpZmljYXRpb24gdXNpbmcgYW4gc3BlY2lmaWVkIHRyYW5zcG9ydAoKICAgIG15ICRTdWNjZXNzID0gJFRyYW5zcG9ydE9iamVjdC0+U2VuZE5vdGlmaWNhdGlvbigKICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgUmVjaXBpZW50ICAgID0+IHsKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ3NvbWUgbG9naW4nLAogICAgICAgICAgICBVc2VyVGl0bGUgICAgID0+ICdzb21lIHRpdGxlJywKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnc29tZSBmaXJzdCBuYW1lJywKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnc29tZSBsYXN0IG5hbWUnLgogICAgICAgICAgICAjIC4uLgogICAgICAgIH0sCiAgICAgICAgRXZlbnQgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFdmVudH0sCiAgICAgICAgQXR0YWNobWVudHMgICAgICAgICAgID0+IFxAQXR0YWNobWVudHMsICAgICAgICAgIyBvcHRpb25hbAogICAgKTsKCnJldHVybnMKCiAgICAkU3VjY2VzcyA9IDE7ICAgICAgICMgb3IgZmFsc2UgaW4gY2FzZSBvZiBhbiBlcnJvcgoKPWN1dAoKPWl0ZW0gR2V0VHJhbnNwb3J0UmVjaXBpZW50cygpCgpnZW5lcmF0ZXMgYSBsaXN0IG9mIHJlY2lwaWVudHMgZXhjbHVzaXZlIGZvciBhIGRldGVybWluZWQgdHJhbnNwb3J0LCB0aGUgY29udGVudCBvZiB0aGUgbGlzdCBpcwp1c3VhbGx5IGFuIGF0dHJpYnV0ZSBvZiBhbiBBZ2VudCBvciBDdXN0b21lciBhbmQgaXQgZGVwZW5kcyBvbiBlYWNoIHRyYW5zcG9ydAoKICAgIG15IEBUcmFuc3BvcnRSZWNpcGllbnRzID0gJFRyYW5zcG9ydE9iamVjdC0+R2V0VHJhbnNwb3J0UmVjaXBpZW50cygKICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICApOwoKcmV0dXJuczoKCiAgICBAVHJhbnNwb3J0UmVjaXBlbnRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgVXNlckVtYWlsICAgID0+ICdzb21lIGVtYWlsJywgICAgICAgIyBvcHRpb25hbAogICAgICAgICAgICBVc2VyRmlzcm5hbWUgPT4gJ3NvbWUgbmFtZScsICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgICAgICMgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICB9CiAgICApOwoKb3IKICAgIEBUcmFuc3BvcnRSZWNpcGllbnRzID0gdW5kZWY7ICAgaW4gY2FzZSBvZiBhbiBlcnJvcgoKPWN1dAoKPWl0ZW0gVHJhbnNwb3J0U2V0dGluZ3NEaXNwbGF5R2V0KCkKCmdlbmVyYXRlcyBhbmQgcmV0dXJucyB0aGUgSFRNTCBjb2RlIHRvIGRpc3BsYXkgZXhjbHVzaXZlIHNldHRpbmdzIGZvciBlYWNoIHRyYW5zcG9ydC4KCiAgICBteSAkSFRNTE91dHB1dCA9ICRUcmFuc3BvcnRPYmplY3QtPlRyYW5zcG9ydFNldHRpbmdzRGlzcGxheUdldCgKICAgICAgICBEYXRhID0+ICROb3RpZmljYXRpb25EYXRhQXR0cmlidXRlLCAgICAgICAgICAgIyBhcyByZXRyaWV2ZWQgZnJvbSBLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQ6Ok5vdGlmaWNhdGlvbkdldCgpCiAgICApOwoKcmV0dXJucwoKICAgICRIVE1MT3VwdXQgPSAnc29tZSBIVE1MIGNvZGUnOwoKPWN1dAoKPWl0ZW0gVHJhbnNwb3J0UGFyYW1TZXR0aW5nc0dldCgpCgpnZXRzIHNwZWNpZmljIHBhcmFtZXRlcnMgZnJvbSB0aGUgd2ViIHJlcXVlc3QgYW5kIHB1dCB0aGVtIGJhY2sgaW4gdGhlIEdldFBhcmFtIGF0dHJpYnV0ZSB0byBiZQpzYXZlZCBpbiB0aGUgbm90aWZpY2F0aW9uIGFzIHRoZSBzdGFuZGFyZCBwYXJhbWV0ZXJzCgogICAgbXkgJFN1Y2Nlc3MgPSAkVHJhbnNwb3J0T2JqZWN0LT5UcmFuc3BvcnRQYXJhbVNldHRpbmdzR2V0KAogICAgICAgIEdldFBhcmFtID0+ICRQYXJtSGFzaFJlZiwKICAgICk7CgpyZXR1cm5zCgogICAgJFN1Y2Nlc3MgPSAxOyAgICAgICAjIG9yIGZhbHNlIGluIGNhc2Ugb2YgYSBmYWlsdXJlCgo9Y3V0Cgo9aXRlbSBJc1VzYWJsZSgpOwoKcmV0dXJucyBpZiB0aGUgdHJhbnNwb3J0IGNhbiBiZSB1c2VkIGluIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnQsCgogICAgbXkgJFN1Y2Nlc3MgPSAkVHJhbnNwb3J0T2JqZWN0LT5Jc1VzYWJsZSgpOwoKcmV0dXJucwoKICAgICRTdWNjZXNzID0gMTsgICAgICAgIyBvciBmYWxzZQoKPWN1dAoKPWl0ZW0gR2V0VHJhbnNwb3J0RXZlbnREYXRhKCkKCnJldHVybnMgdGhlIG5lZWRlZCBldmVudCBpbmZvcm1hdGlvbiBhZnRlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbiBzZW50CgogICAgbXkgJEV2ZW50RGF0YSA9ICRUcmFuc3BvcnRPYmplY3QtPiBHZXRUcmFuc3BvcnRFdmVudERhdGEoKTsKCnJldHVybnM6CgogICAgJEV2ZW50RGF0YSA9IHsKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZUFnZW50Tm90aWZpY2F0aW9uJywgICAgIyBvciAnQXJ0aWNsZUN1c3RvbWVyTm90aWZpY2F0aW9uJwogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+IDEyMywKICAgICAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0VHJhbnNwb3J0RXZlbnREYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57RXZlbnREYXRhfSAvLyB7fTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGlnZXN0OjpNRDU7Cgp1c2UgdmFycyBxdyhASVNBKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXI7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50IC0gY2FsZW5kYXIgYXBwb2ludG1lbnQgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBhcHBvaW50bWVudCBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBASVNBID0gcXcoCiAgICAgICAgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcgogICAgKTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQXBwb2ludG1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBBcHBvaW50bWVudENyZWF0ZSgpCgpjcmVhdGVzIGEgbmV3IGFwcG9pbnRtZW50LgoKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgdmFsaWQgUGFyZW50SUQgZm9yIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgdmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgICA9PiAnandpb2ppLWZ3amlvJywgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBwcm92aWRlIGRlc2lyZWQgVW5pcXVlSUQ7IGlmIHRoZXJlIGlzIGFscmVhZHkgZXhpc3RpbmcgQXBwb2ludG1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgd2l0aCBzYW1lIFVuaXF1ZUlELCBzeXN0ZW0gd2lsbCBkZWxldGUgaXQKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVGl0bGUKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywgICAgICAgICAjIChvcHRpb25hbCkgRGVzY3JpcHRpb24KICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgPT4gJ1N0cmF1YmluZycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTG9jYXRpb24KICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICAgICAgVGVhbUlEICAgICAgICAgICAgICAgID0+IFsgMSBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIGlmIHN1cHBsaWVkCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgID0+IFsgMSwgMyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIGlmIHN1cHBsaWVkCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGZsYWcgdGhlIGFwcG9pbnRtZW50IGFzIHJlY3VycmluZyAocGFyZW50IG9ubHkhKQogICAgICAgIFJlY3VycmluZ1JhdyAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBza2lwIGxvb3AgZm9yIHJlY3VycmluZyBhcHBvaW50bWVudHMgKGRvIG5vdCBjcmVhdGUgb2NjdXJyZW5jZXMhKQogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgICA9PiAnRGFpbHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIFJlY3VycmluZykgUG9zc2libGUgIkRhaWx5IiwgIldlZWtseSIsICJNb250aGx5IiwgIlllYXJseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSAgID0+IFsxLCAzLCA1XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgQ3VzdG9tIFJlY3VycmluZykgUmVjdXJyZW5jZSBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbVdlZWtseTogMS1Nb24sIDItVHVlLC4uLiwgNy1TdW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tTW9udGhseTogMS0xc3QsIDItMm5kLC4uLCAzMXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbVllYXJseTogMS1KYW4sIDItRmViLC4uLiwgMTItRGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgSG93IG1hbnkgQXBwb2ludG1lbnRzIHRvIGNyZWF0ZQogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBSZXBlYXRpbmcgaW50ZXJ2YWwgKGRlZmF1bHQgMSkKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVW50aWwgZGF0ZQogICAgICAgIFJlY3VycmVuY2VJRCAgICAgICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBFeHBlY3RlZCBzdGFydCB0aW1lIGZvciB0aGlzIG9jY3VycmVuY2UKICAgICAgICBSZWN1cnJlbmNlRXhjbHVkZSAgICAgPT4gWyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgV2hpY2ggc3BlY2lmaWMgb2NjdXJyZW5jZXMgdG8gZXhjbHVkZQogICAgICAgICAgICAnMjAxNi0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDE2LTAxLTExIDAwOjAwOjAwJywKICAgICAgICBdLAogICAgICAgIE5vdGlmaWNhdGlvblRpbWUgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICA9PiAncmVsYXRpdmUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJzEyJywgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5vdGlmaWNhdGlvbiBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICMgKG9wdGlvbmFsKSBUaWNrZXQgYXBwb2ludG1lbnQgcnVsZSBJRCAoZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAogICAgKTsKCnJldHVybnMgcGFyZW50IEFwcG9pbnRtZW50SUQgaWYgc3VjY2Vzc2Z1bAoKRXZlbnRzOgogICAgQXBwb2ludG1lbnRDcmVhdGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBUaXRsZSBTdGFydFRpbWUgRW5kVGltZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIHBvc3NpYmxlIG5vdGlmaWNhdGlvbiBwYXJhbXMKICAgICRTZWxmLT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGlmIFJlY3VycmluZyBpcyBwcm92aWRlZCwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG11c3QgYmUgcHJlc2VudAogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgIkRhaWx5IiwgICAgICAgIldlZWtseSIsICAgICAgICJNb250aGx5IiwgICAgICAgIlllYXJseSIsCiAgICAgICAgICAgICJDdXN0b21EYWlseSIsICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlY3VycmVuY2VUeXBlfQogICAgICAgICAgICB8fCAhZ3JlcCB7ICRfIGVxICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfSBAUmVjdXJyZW5jZVR5cGVzCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVHlwZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAhJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlRnJlcXVlbmN5IG5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8PSAxOwoKICAgIGlmICggJFBhcmFte1VuaXF1ZUlEfSAmJiAhJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFte1VuaXF1ZUlEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgYXBwb2ludG1lbnQgd2l0aCBzYW1lIFVuaXF1ZUlECiAgICAgICAgaWYgKCAlQXBwb2ludG1lbnQgJiYgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUGFyZW50SUQKICAgIGlmICggJFBhcmFte1BhcmVudElEfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17UGFyZW50SUR9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQYXJlbnRJRCBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBTdGFydFRpbWUKICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgKTsKICAgIGlmICggISRTdGFydFRpbWVTeXN0ZW0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIFN0YXJ0VGltZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgVW5pcXVlSUQKICAgIGlmICggISRQYXJhbXtVbmlxdWVJRH0gKSB7CiAgICAgICAgJFBhcmFte1VuaXF1ZUlEfSA9ICRTZWxmLT5HZXRVbmlxdWVJRCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgRW5kVGltZQogICAgbXkgJEVuZFRpbWVWYWxpZCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgKTsKICAgIGlmICggISRFbmRUaW1lVmFsaWQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIEVuZFRpbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGFycmF5IHJlZnMKICAgIG15ICVBcnJheXM7CiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoVGVhbUlEIFJlc291cmNlSUQgUmVjdXJyZW5jZUZyZXF1ZW5jeSBSZWN1cnJlbmNlRXhjbHVkZSkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IC8vIFtdIH0gKSB7CiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG5vdCBBUlJBWVJFRiEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQEFycmF5ID0gQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IH07CgogICAgICAgICAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICAgICAgICAgIEBBcnJheSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQEFycmF5OwoKICAgICAgICAgICAgJEFycmF5c3skUGFyYW1ldGVyfSA9IGpvaW4oICcsJywgQEFycmF5ICkgaWYgQEFycmF5OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG51bWJlcnMKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhSZWN1cnJpbmcgUmVjdXJyZW5jZUNvdW50IFJlY3VycmVuY2VJbnRlcnZhbCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgIUlzSW50ZWdlciggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFJlY3VycmVuY2VVbnRpbAogICAgaWYgKCAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgIyB1c3VhbGx5IGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kID0gMC4gSW4gdGhpcyBjYXNlLCB0YWtlIHRpbWUgZnJvbSBTdGFydFRpbWUKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU3lzdGVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKS0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRSZWN1cnJlbmNlVW50aWxTeXN0ZW0KICAgICAgICAgICAgfHwgJFN0YXJ0VGltZVN5c3RlbSA+ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgUmVjdXJyZW5jZVVudGlsISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15IEBCaW5kOwoKICAgICMgcGFyZW50IElEIHN1cHBsaWVkCiAgICBteSAkUGFyZW50SURDb2wgPSBteSAkUGFyZW50SURWYWwgPSAnJzsKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICAkUGFyZW50SURDb2wgPSAncGFyZW50X2lkLCc7CiAgICAgICAgJFBhcmVudElEVmFsID0gJz8sJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1BhcmVudElEfTsKCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcmVjdXJyaW5nIGZpZWxkcwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyaW5nfTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VUeXBlfTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUNvdW50fTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9OwogICAgfQoKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17VW5pcXVlSUR9LCBcJFBhcmFte1RpdGxlfSwgXCRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgXCRQYXJhbXtMb2NhdGlvbn0sIFwkUGFyYW17U3RhcnRUaW1lfSwgICBcJFBhcmFte0VuZFRpbWV9LCAgIFwkUGFyYW17QWxsRGF5fSwKICAgICAgICBcJEFycmF5c3tUZWFtSUR9LCAgXCRBcnJheXN7UmVzb3VyY2VJRH0sIFwkUGFyYW17UmVjdXJyaW5nfSwgXCRQYXJhbXtSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sIFwkUGFyYW17UmVjdXJyZW5jZUNvdW50fSwgICAgICBcJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0sCiAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LCAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUlEfSwgICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRXhjbHVkZX0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgIFwkUGFyYW17VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9LCAgICAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9OwoKICAgIG15ICRTUUwgPSAiCiAgICAgICAgSU5TRVJUIElOVE8gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICAgICAgKCRQYXJlbnRJRENvbCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAogICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsLCByZWN1cl91bnRpbCwgcmVjdXJfaWQsIHJlY3VyX2V4Y2x1ZGUsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfYnkpCiAgICAgICAgVkFMVUVTICgkUGFyZW50SURWYWwgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywKICAgICAgICAgICAgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KQogICAgIjsKCiAgICAjIGNyZWF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICRBcHBvaW50bWVudElEOwoKICAgICMgcmV0dXJuIHBhcmVudCBpZCBmb3IgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRQYXJhbXtQYXJlbnRJRH07CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgaWQgZm9yIHBhcmVudCBhcHBvaW50bWVudAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAgICAgV0hFUkUgdW5pcXVlX2lkPT8gQU5EIHBhcmVudF9pZCBJUyBOVUxMCiAgICAgICAgICAgICcsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtVbmlxdWVJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQgPSAkUm93WzBdIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyByZXR1cm4gaWYgdGhlcmUgaXMgbm90IGFwcG9pbnRtZW50IGNyZWF0ZWQKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnRJRCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NhblwndCBnZXQgQXBwb2ludG1lbnRJRCBmcm9tIElOU0VSVCEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gJiYgISRQYXJhbXtSZWN1cnJpbmdSYXd9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIEFwcG9pbnRtZW50ID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXBwb2ludG1lbnRJRDsKfQoKPWl0ZW0gQXBwb2ludG1lbnRMaXN0KCkKCmdldCBhIGhhc2ggb2YgQXBwb2ludG1lbnRzLgoKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFZhbGlkIENhbGVuZGFySUQKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICcqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSB0aXRsZSwgd2lsZGNhcmQgc3VwcG9ydGVkCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZGVzY3JpcHRpb24sIHdpbGRjYXJkIHN1cHBvcnRlZAogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgPT4gJyonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IGxvY2F0aW9uLCB3aWxkY2FyZCBzdXBwb3J0ZWQKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBzdGFydCBkYXRlCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZW5kIGRhdGUKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSB0ZWFtCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgcmVzb3VyY2UKICAgICAgICBSZXN1bHQgICAgICAgICAgICAgID0+ICdIQVNIJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpLCBIQVNIfEFSUkFZCiAgICApOwoKcmV0dXJucyBhbiBhcnJheSBvZiBoYXNoZXMgd2l0aCBzZWxlY3QgQXBwb2ludG1lbnQgZGF0YSBvciBzaW1wbGUgYXJyYXkgb2YgQXBwb2ludG1lbnRJRHM6CgpSZXN1bHQgPT4gJ0hBU0gnOgoKICAgIEBBcHBvaW50bWVudHMgPSBbCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgPT4gMCwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciByZWN1cnJpbmcgKHBhcmVudCkgYXBwb2ludG1lbnRzIG9ubHkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAyLAogICAgICAgICAgICBQYXJlbnRJRCAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHJlY3VycmVkIChjaGlsZCkgYXBwb2ludG1lbnRzIG9ubHkKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgID0+ICcyMDE2MDEwMVQxODAwMDAtQTc4QjU3QGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgID0+ICcyMDE2LTAxLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgVGVhbUlEICAgICAgICA9PiBbIDEgXSwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgQWxsRGF5ICAgICAgICA9PiAwLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgICAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTgwMDAwLUE3OEI1N0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGVhbUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEgXSwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNjoxMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAnMTAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICAgICAgICAgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAgICMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEKICAgICAgICB9LAogICAgICAgIC4uLgogICAgXTsKClJlc3VsdCA9PiAnQVJSQVknOgoKICAgIEBBcHBvaW50bWVudHMgPSBbIDEsIDIsIC4uLiBdCgo9Y3V0CgpzdWIgQXBwb2ludG1lbnRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGFycmF5IG9mIGhhc2hlcyBieSBkZWZhdWx0CiAgICAkUGFyYW17UmVzdWx0fSA9ICRQYXJhbXtSZXN1bHR9IHx8ICdIQVNIJzsKCiAgICAjIGNhY2hlIGtleXMKICAgIG15ICRDYWNoZVR5cGUgICAgICAgID0gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9OwogICAgbXkgJENhY2hlS2V5VGl0bGUgICAgPSAkUGFyYW17VGl0bGV9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RGVzYyAgICAgPSAkUGFyYW17RGVzY3JpcHRpb259IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5TG9jYXRpb24gPSAkUGFyYW17TG9jYXRpb259IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5U3RhcnQgICAgPSAkUGFyYW17U3RhcnRUaW1lfSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUVuZCAgICAgID0gJFBhcmFte0VuZFRpbWV9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5VGVhbSAgICAgPSAkUGFyYW17VGVhbUlEfSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleVJlc291cmNlID0gJFBhcmFte1Jlc291cmNlSUR9IHx8ICdhbnknOwoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VGl0bGV9ICYmICRQYXJhbXtUaXRsZX0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleVRpdGxlID0gJ2FueSc7CiAgICB9CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Rlc2NyaXB0aW9ufSAmJiAkUGFyYW17RGVzY3JpcHRpb259ID1+IC9eW1wqXSskLyApIHsKICAgICAgICAkQ2FjaGVLZXlEZXNjID0gJ2FueSc7CiAgICB9CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0xvY2F0aW9ufSAmJiAkUGFyYW17TG9jYXRpb259ID1+IC9eW1wqXSskLyApIHsKICAgICAgICAkQ2FjaGVLZXlMb2NhdGlvbiA9ICdhbnknOwogICAgfQoKICAgIG15ICRDYWNoZUtleQogICAgICAgID0gIiRDYWNoZUtleVRpdGxlLSRDYWNoZUtleURlc2MtJENhY2hlS2V5TG9jYXRpb24tJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kLSRDYWNoZUtleVRlYW0tJENhY2hlS2V5UmVzb3VyY2UtJFBhcmFte1Jlc3VsdH0iOwoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIGlmICggcmVmICREYXRhIGVxICdBUlJBWScgKSB7CiAgICAgICAgcmV0dXJuIEB7JERhdGF9OwogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBjaGVjayB0aW1lCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdGFydFRpbWVTeXN0ZW0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJEVuZFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRW5kVGltZVN5c3RlbSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVuZFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRQYXJhbXtFbmRUaW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyktPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZVN5c3RlbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgYWxsX2RheSwgcmVjdXJyaW5nLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAogICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX2RhdGUsIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFIGNhbGVuZGFyX2lkPT8KICAgICc7CgogICAgbXkgQEJpbmQ7CgogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAjIEZpbHRlciB0aXRsZSwgZGVzY3JpcHRpb24gYW5kIGxvY2F0aW9uIGZpZWxkcyBieSB1c2luZyBRdWVyeUNvbmRpdGlvbiBtZXRob2QsIHdoaWNoIHdpbGwKICAgICMgICByZXR1cm4gYmFja2VuZCBzcGVjaWZpYyBTUUwgc3RhdGVtZW50cyBpbiBvcmRlciB0byBwcm92aWRlIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggYW5kCiAgICAjICAgd2lsZGNhcmQgc3VwcG9ydC4KICAgIEZJTFRFUjoKICAgIGZvciBteSAkRmlsdGVyIChxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbikpIHsKICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJFBhcmFteyRGaWx0ZXJ9OwogICAgICAgICRTUUwgLj0gJyBBTkQgJyAuICREQk9iamVjdC0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICA9PiBsYyAkRmlsdGVyLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJFBhcmFteyRGaWx0ZXJ9LAogICAgICAgICAgICBTZWFyY2hQcmVmaXggPT4gJyonLAogICAgICAgICAgICBTZWFyY2hTdWZmaXggPT4gJyonLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJyBBTkQgKAogICAgICAgICAgICAoc3RhcnRfdGltZSA+PSA/IEFORCBzdGFydF90aW1lIDwgPykgT1IKICAgICAgICAgICAgKGVuZF90aW1lID4gPyBBTkQgZW5kX3RpbWUgPD0gPykgT1IKICAgICAgICAgICAgKHN0YXJ0X3RpbWUgPD0gPyBBTkQgZW5kX3RpbWUgPj0gPykKICAgICAgICApICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgISRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnIEFORCBlbmRfdGltZSA+PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAhJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICcgQU5EIHN0YXJ0X3RpbWUgPD0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17RW5kVGltZX07CiAgICB9CgogICAgJFNRTCAuPSAnIE9SREVSIEJZIGlkIEFTQyc7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSBAUmVzdWx0OwoKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHRlYW0gaWQKICAgICAgICBteSBAVGVhbUlEID0gc3BsaXQoICcsJywgJFJvd1s5XSAvLyAnJyApOwogICAgICAgIGlmICggJFBhcmFte1RlYW1JRH0gKSB7CiAgICAgICAgICAgIG5leHQgUk9XIGlmICFncmVwIHsgJF8gPT0gJFBhcmFte1RlYW1JRH0gfSBAVGVhbUlEOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZSBpZAogICAgICAgICRSb3dbMTBdID0gJFJvd1sxMF0gPyAkUm93WzEwXSA6IDA7CiAgICAgICAgbXkgQFJlc291cmNlSUQgPSAkUm93WzEwXSA9fiAvLC8gPyBzcGxpdCggJywnLCAkUm93WzEwXSApIDogKCAkUm93WzEwXSApOwogICAgICAgIGlmICggJFBhcmFte1Jlc291cmNlSUR9ICkgewogICAgICAgICAgICBuZXh0IFJPVyBpZiAhZ3JlcCB7ICRfID09ICRQYXJhbXtSZXNvdXJjZUlEfSB9IEBSZXNvdXJjZUlEOwogICAgICAgIH0KCiAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gKAogICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIFBhcmVudElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbM10sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s0XSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbNl0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s3XSwKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzhdLAogICAgICAgICAgICBUZWFtSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFxAVGVhbUlELAogICAgICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFxAUmVzb3VyY2VJRCwKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzExXSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzEyXSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzEzXSB8fCAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkUm93WzE0XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzE1XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUm93WzE2XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUm93WzE3XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUm93WzE4XSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUm93WzE5XSB8fCAnJywKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgICAgICAgICAgICAgICA9PiAkUm93WzIwXSwKICAgICAgICApOwogICAgICAgIHB1c2ggQFJlc3VsdCwgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICAjIGlmIFJlc3VsdCB3YXMgQVJSQVksIG91dHB1dCBvbmx5IElEcwogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQVJSQVknICkgewogICAgICAgIG15IEBSZXN1bHRMaXN0OwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBSZXN1bHQpIHsKICAgICAgICAgICAgcHVzaCBAUmVzdWx0TGlzdCwgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgfQogICAgICAgIEBSZXN1bHQgPSBAUmVzdWx0TGlzdDsKICAgIH0KCiAgICAjIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxAUmVzdWx0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gQFJlc3VsdDsKfQoKPWl0ZW0gQXBwb2ludG1lbnREYXlzKCkKCmdldCBhIGhhc2ggb2YgZGF5cyB3aXRoIEFwcG9pbnRtZW50cyBpbiBhbGwgdXNlciBjYWxlbmRhcnMuCgogICAgbXkgJUFwcG9pbnRtZW50RGF5cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREYXlzKAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHN0YXJ0IGRhdGUKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBlbmQgZGF0ZQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgVXNlcklECiAgICApOwoKcmV0dXJucyBhIGhhc2ggd2l0aCBkYXlzIGFzIGtleXMgYW5kIG51bWJlciBvZiBBcHBvaW50bWVudHMgYXMgdmFsdWVzOgoKICAgICVBcHBvaW50bWVudERheXMgPSB7CiAgICAgICAgJzIwMTYtMDEtMDEnID0+IDEsCiAgICAgICAgJzIwMTYtMDEtMTMnID0+IDIsCiAgICAgICAgJzIwMTYtMDEtMzAnID0+IDEsCiAgICB9OwoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RGF5cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUga2V5cwogICAgbXkgJENhY2hlVHlwZSAgICAgPSAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfTsKICAgIG15ICRDYWNoZUtleVN0YXJ0ID0gJFBhcmFte1N0YXJ0VGltZX0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlFbmQgICA9ICRQYXJhbXtFbmRUaW1lfSB8fCAnYW55JzsKCiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgY2hlY2sgdGltZQogICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSApIHsKICAgICAgICBteSAkU3RhcnRUaW1lVmFsaWQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3RhcnRUaW1lVmFsaWQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJEVuZFRpbWVWYWxpZCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkRW5kVGltZVZhbGlkICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJERhdGEgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICA9PiAiJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kIiwKICAgICk7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAleyREYXRhfTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgbXkgJUdyb3VwTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICApOwogICAgbXkgQEdyb3VwSURzID0gc29ydCBrZXlzICVHcm91cExpc3Q7CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBTRUxFQ1QgY2Euc3RhcnRfdGltZSwgY2EuZW5kX3RpbWUKICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IGNhCiAgICAgICAgSk9JTiBjYWxlbmRhciBjIE9OIGNhLmNhbGVuZGFyX2lkID0gYy5pZAogICAgICAgIFdIRVJFIGMuZ3JvdXBfaWQgSU4gKCAke1woam9pbiAnLCAnLCBAR3JvdXBJRHMpfSApCiAgICAiOwoKICAgIG15IEBCaW5kOwoKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICdBTkQgKAogICAgICAgICAgICAoY2Euc3RhcnRfdGltZSA+PSA/IEFORCBjYS5zdGFydF90aW1lIDwgPykgT1IKICAgICAgICAgICAgKGNhLmVuZF90aW1lID4gPyBBTkQgY2EuZW5kX3RpbWUgPD0gPykgT1IKICAgICAgICAgICAgKGNhLnN0YXJ0X3RpbWUgPD0gPyBBTkQgY2EuZW5kX3RpbWUgPj0gPykKICAgICAgICApICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgISRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnQU5EIGNhLmVuZF90aW1lID49ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX07CiAgICB9CiAgICBlbHNpZiAoICEkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJ0FORCBjYS5zdGFydF90aW1lIDw9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0VuZFRpbWV9OwogICAgfQoKICAgICRTUUwgLj0gJ09SREVSIEJZIGNhLmlkIEFTQyc7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAoICRTdGFydFRpbWUsICRFbmRUaW1lLCAkU3RhcnRUaW1lU3lzdGVtLCAkRW5kVGltZVN5c3RlbSApOwoKICAgICAgICAjIFN0YXJ0VGltZQogICAgICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgICAgICRTdGFydFRpbWUgPSAkUm93WzBdIGx0ICRQYXJhbXtTdGFydFRpbWV9ID8gJFBhcmFte1N0YXJ0VGltZX0gOiAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIEVuZFRpbWUKICAgICAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkUm93WzFdIGd0ICRQYXJhbXtFbmRUaW1lfSA/ICRQYXJhbXtFbmRUaW1lfSA6ICRSb3dbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRW5kVGltZSA9ICRSb3dbMV07CiAgICAgICAgfQoKICAgICAgICAjIEdldCBzeXN0ZW0gdGltZXMKICAgICAgICAkU3RhcnRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwoKICAgICAgICAkRW5kVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRFbmRUaW1lLAogICAgICAgICk7CgogICAgICAgIGZvciAoCiAgICAgICAgICAgIG15ICRMb29wU3lzdGVtVGltZSA9ICRTdGFydFRpbWVTeXN0ZW07CiAgICAgICAgICAgICRMb29wU3lzdGVtVGltZSA8ICRFbmRUaW1lU3lzdGVtOwogICAgICAgICAgICAkTG9vcFN5c3RlbVRpbWUgKz0gNjAgKiA2MCAqIDI0CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRMb29wVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkTG9vcFN5c3RlbVRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTG9vcFRpbWUgPX4gcy9ccy4qPyQvL2dzbTsKCiAgICAgICAgICAgIGlmICggJFJlc3VsdHskTG9vcFRpbWV9ICkgewogICAgICAgICAgICAgICAgJFJlc3VsdHskTG9vcFRpbWV9Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0eyRMb29wVGltZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICAgPT4gIiRDYWNoZUtleVN0YXJ0LSRDYWNoZUtleUVuZCIsCiAgICAgICAgVmFsdWUgPT4gXCVSZXN1bHQsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aXRlbSBBcHBvaW50bWVudEdldCgpCgpnZXQgQXBwb2ludG1lbnQuCgogICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFVuaXF1ZUlEICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywgIyAocmVxdWlyZWQpIHdpbGwgcmV0dXJuIG9ubHkgcGFyZW50IGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpyZXR1cm5zIGEgaGFzaDoKICAgICVBcHBvaW50bWVudCA9ICgKICAgICAgICBBcHBvaW50bWVudElEICAgICAgID0+IDIsCiAgICAgICAgUGFyZW50SUQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgZm9yIHJlY3VycmVkIChjaGlsZCkgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAxLAogICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICA9PiAnU3RyYXViaW5nJywKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgVGVhbUlEICAgICAgICAgICAgICA9PiBbIDEgXSwKICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgID0+IFsgMSwgMyBdLAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICdEYWlseScsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiAxLAogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDIsCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgUmVjdXJyZW5jZUlEICAgICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgUmVjdXJyZW5jZUV4Y2x1ZGUgICA9PiBbCiAgICAgICAgICAgICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMTYtMDEtMTEgMDA6MDA6MDAnLAogICAgICAgIF0sCiAgICAgICAgTm90aWZpY2F0aW9uVGltZSAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjA6MDAnLAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0Q291bnQgICAgICAgPT4gJzEyJywKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0ICAgICAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAoKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAgIyBmb3IgdGlja2V0IGFwcG9pbnRtZW50cyBvbmx5IQogICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgICAgICA9PiAyLAogICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgICAgICA9PiAyLAogICAgKTsKCj1jdXQKCnN1YiBBcHBvaW50bWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcHBvaW50bWVudElEfQogICAgICAgICYmICEoICRQYXJhbXtVbmlxdWVJRH0gJiYgJFBhcmFte0NhbGVuZGFySUR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEFwcG9pbnRtZW50SUQgb3IgVW5pcXVlSUQgYW5kIENhbGVuZGFySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkRGF0YTsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgICREYXRhID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggcmVmICREYXRhIGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJXskRGF0YX07CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgQEJpbmQ7CiAgICBteSAkU1FMID0gJwogICAgICAgIFNFTEVDVCBpZCwgcGFyZW50X2lkLCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAogICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsLCByZWN1cl91bnRpbCwgcmVjdXJfaWQsIHJlY3VyX2V4Y2x1ZGUsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfYnkKICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUKICAgICc7CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnaWQ9PyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17QXBwb2ludG1lbnRJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICd1bmlxdWVfaWQ9PyBBTkQgY2FsZW5kYXJfaWQ9PyBBTkQgcGFyZW50X2lkIElTIE5VTEwgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtDYWxlbmRhcklEfTsKICAgIH0KCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHRlYW0gaWQKICAgICAgICBteSBAVGVhbUlEID0gc3BsaXQoICcsJywgJFJvd1sxMF0gLy8gJycgKTsKCiAgICAgICAgIyByZXNvdXJjZSBpZAogICAgICAgIG15IEBSZXNvdXJjZUlEID0gc3BsaXQoICcsJywgJFJvd1sxMV0gLy8gJzAnICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBmcmVxdWVuY3kKICAgICAgICBteSBAUmVjdXJyZW5jZUZyZXF1ZW5jeSA9ICRSb3dbMTRdID8gc3BsaXQoICcsJywgJFJvd1sxNF0gKSA6IHVuZGVmOwoKICAgICAgICAjIHJlY3VycmVuY2UgZXhjbHVkZQogICAgICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9ICRSb3dbMTldID8gc3BsaXQoICcsJywgJFJvd1sxOV0gKSA6IHVuZGVmOwoKICAgICAgICAkUmVzdWx0e0FwcG9pbnRtZW50SUR9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAkUmVzdWx0e1BhcmVudElEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkUmVzdWx0e0NhbGVuZGFySUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAkUmVzdWx0e1VuaXF1ZUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1szXTsKICAgICAgICAkUmVzdWx0e1RpdGxlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s0XTsKICAgICAgICAkUmVzdWx0e0Rlc2NyaXB0aW9ufSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAkUmVzdWx0e0xvY2F0aW9ufSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s2XTsKICAgICAgICAkUmVzdWx0e1N0YXJ0VGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s3XTsKICAgICAgICAkUmVzdWx0e0VuZFRpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s4XTsKICAgICAgICAkUmVzdWx0e0FsbERheX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s5XTsKICAgICAgICAkUmVzdWx0e1RlYW1JRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXEBUZWFtSUQ7CiAgICAgICAgJFJlc3VsdHtSZXNvdXJjZUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFxAUmVzb3VyY2VJRDsKICAgICAgICAkUmVzdWx0e1JlY3VycmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxMl07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlVHlwZX0gICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTNdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gICAgICAgICAgICAgICAgICAgPSBcQFJlY3VycmVuY2VGcmVxdWVuY3k7CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlQ291bnR9ICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTVdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUludGVydmFsfSAgICAgICAgICAgICAgICAgICAgPSAkUm93WzE2XTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VVbnRpbH0gICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxN107CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMThdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUV4Y2x1ZGV9ICAgICAgICAgICAgICAgICAgICAgPSBcQFJlY3VycmVuY2VFeGNsdWRlOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uRGF0ZX0gICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzIwXSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvblRlbXBsYXRlfSAgICAgICAgICAgICAgICAgID0gJFJvd1syMV0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b219ICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjJdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ICAgPSAkUm93WzIzXSB8fCAwOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fSAgICAgICAgPSAkUm93WzI0XSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9ID0gJFJvd1syNV0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gICAgICAgICAgICA9ICRSb3dbMjZdIHx8ICcnOwogICAgICAgICRSZXN1bHR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICAgICAgICAgICAgICAgPSAkUm93WzI3XTsKICAgICAgICAkUmVzdWx0e0NyZWF0ZVRpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syOF07CiAgICAgICAgJFJlc3VsdHtDcmVhdGVCeX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjldOwogICAgICAgICRSZXN1bHR7Q2hhbmdlVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMwXTsKICAgICAgICAkUmVzdWx0e0NoYW5nZUJ5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1szMV07CiAgICB9CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICMgY2FjaGUKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFZhbHVlID0+IFwlUmVzdWx0LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aXRlbSBBcHBvaW50bWVudFVwZGF0ZSgpCgp1cGRhdGVzIGFuIGV4aXN0aW5nIGFwcG9pbnRtZW50LgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBUaXRsZQogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLCAgICAgICAgICMgKG9wdGlvbmFsKSBEZXNjcmlwdGlvbgogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICA9PiAnU3RyYXViaW5nJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBMb2NhdGlvbgogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEFsbERheSAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWZhdWx0IDAKICAgICAgICBUZWFtICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgPT4gWyAxLCAzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgaWYgc3VwcGxpZWQKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZmxhZyB0aGUgYXBwb2ludG1lbnQgYXMgcmVjdXJyaW5nIChwYXJlbnQgb25seSEpCgogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgICA9PiAnRGFpbHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIFJlY3VycmluZykgUG9zc2libGUgIkRhaWx5IiwgIldlZWtseSIsICJNb250aGx5IiwgIlllYXJseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgQ3VzdG9tIFJlY3VycmluZykgUmVjdXJyZW5jZSBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbVdlZWtseTogMS1Nb24sIDItVHVlLC4uLiwgNy1TdW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tTW9udGhseTogMS1KYW4sIDItRmViLC4uLiwgMTItRGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgSG93IG1hbnkgQXBwb2ludG1lbnRzIHRvIGNyZWF0ZQogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBSZXBlYXRpbmcgaW50ZXJ2YWwgKGRlZmF1bHQgMSkKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVW50aWwgZGF0ZQogICAgICAgIE5vdGlmaWNhdGlvblRpbWUgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICA9PiAncmVsYXRpdmUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJzEyJywgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5vdGlmaWNhdGlvbiBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICMgKG9wdGlvbmFsKSBUaWNrZXQgYXBwb2ludG1lbnQgcnVsZSBJRCAoZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKRXZlbnRzOgogICAgQXBwb2ludG1lbnRVcGRhdGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBpZiBSZWN1cnJpbmcgaXMgcHJvdmlkZWQsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGJlIHByZXNlbnQKICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gKSB7CgogICAgICAgIG15IEBSZWN1cnJlbmNlVHlwZXMgPSAoCiAgICAgICAgICAgICJEYWlseSIsICAgICAgICJXZWVrbHkiLCAgICAgICAiTW9udGhseSIsICAgICAgICJZZWFybHkiLAogICAgICAgICAgICAiQ3VzdG9tRGFpbHkiLCAiQ3VzdG9tV2Vla2x5IiwgIkN1c3RvbU1vbnRobHkiLCAiQ3VzdG9tWWVhcmx5IgogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRQYXJhbXtSZWN1cnJlbmNlVHlwZX0KICAgICAgICAgICAgfHwgIWdyZXAgeyAkXyBlcSAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IH0gQFJlY3VycmVuY2VUeXBlcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZVR5cGUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21ZZWFybHknCiAgICAgICAgICAgICkKICAgICAgICAgICAgJiYgISRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZUZyZXF1ZW5jeSBuZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfSB8fD0gMTsKCiAgICAjIGNoZWNrIFN0YXJ0VGltZQogICAgbXkgJFN0YXJ0VGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICApOwogICAgaWYgKCAhJFN0YXJ0VGltZVN5c3RlbSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBFbmRUaW1lCiAgICBteSAkRW5kVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgKTsKICAgIGlmICggISRFbmRUaW1lU3lzdGVtICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBpZiBhcnJheSByZWZzCiAgICBteSAlQXJyYXlzOwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFRlYW1JRCBSZXNvdXJjZUlEIFJlY3VycmVuY2VGcmVxdWVuY3kpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFBhcmFteyRQYXJhbWV0ZXJ9ICYmIEB7ICRQYXJhbXskUGFyYW1ldGVyfSAvLyBbXSB9ICkgewogICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFtZXRlciBub3QgQVJSQVlSRUYhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXskUGFyYW1ldGVyfSB9OwoKICAgICAgICAgICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgICAgICAgICBAQXJyYXkgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBBcnJheTsKCiAgICAgICAgICAgICRBcnJheXN7JFBhcmFtZXRlcn0gPSBqb2luKCAnLCcsIEBBcnJheSApIGlmIEBBcnJheTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBudW1iZXJzCiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoUmVjdXJyaW5nIFJlY3VycmVuY2VDb3VudCBSZWN1cnJlbmNlSW50ZXJ2YWwpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFBhcmFteyRQYXJhbWV0ZXJ9ICYmICFJc0ludGVnZXIoICRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBSZWN1cnJlbmNlVW50aWwKICAgIGlmICggJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gKSB7CgogICAgICAgICMgdXN1YWxseSBob3VyLCBtaW51dGUgYW5kIHNlY29uZCA9IDAuIEluIHRoaXMgY2FzZSwgdGFrZSB0aW1lIGZyb20gU3RhcnRUaW1lCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVDaGVjaygKICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbFN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFJlY3VycmVuY2VVbnRpbFN5c3RlbQogICAgICAgICAgICB8fCAkU3RhcnRUaW1lU3lzdGVtID4gJFJlY3VycmVuY2VVbnRpbFN5c3RlbQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZVVudGlsIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmV2aW91cyBDYWxlbmRhcklECiAgICBteSAkUHJldmlvdXNDYWxlbmRhcklEID0gJFNlbGYtPl9BcHBvaW50bWVudEdldENhbGVuZGFySUQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgc2V0IHJlY3VycmVuY2UgZXhjbHVkZSBsaXN0CiAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBAeyAkUGFyYW17UmVjdXJyZW5jZUV4Y2x1ZGV9IC8vIFtdIH07CgogICAgIyBnZXQgUmVjdXJyZW5jZUlECiAgICBteSAkUmVjdXJyZW5jZUlEID0gJFNlbGYtPl9BcHBvaW50bWVudEdldFJlY3VycmVuY2VJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyB1c2UgZXhjbHVkZSBsaXN0IHRvIGZsYWcgdGhlIHJlY3VycmluZyBvY2N1cnJlbmNlIGFzIHVwZGF0ZWQKICAgIGlmICgkUmVjdXJyZW5jZUlEKSB7CiAgICAgICAgQFJlY3VycmVuY2VFeGNsdWRlID0gKCRSZWN1cnJlbmNlSUQpOwogICAgfQoKICAgICMgcmVzZXQgZXhjbHVkZSBsaXN0IGlmIHJlY3VycmVuY2UgaXMgdHVybmVkIG9mZgogICAgZWxzaWYgKCAhJFBhcmFte1JlY3VycmluZ30gKSB7CiAgICAgICAgQFJlY3VycmVuY2VFeGNsdWRlID0gKCk7CiAgICB9CgogICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgQFJlY3VycmVuY2VFeGNsdWRlID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgIyBzZXJpYWxpemUgZGF0YQogICAgbXkgJFJlY3VycmVuY2VFeGNsdWRlID0gam9pbiggJywnLCBAUmVjdXJyZW5jZUV4Y2x1ZGUgKSB8fCB1bmRlZjsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyByZWN1cnJlZCBhcHBvaW50bWVudHMKICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSgKICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgIGlmICggISREZWxldGVTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5hYmxlIHRvIGRlbGV0ZSByZWN1cnJpbmcgQXBwb2ludG1lbnQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudAogICAgbXkgJFNRTCA9ICcKICAgICAgICBVUERBVEUgY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBTRVQKICAgICAgICAgICAgY2FsZW5kYXJfaWQ9PywgdGl0bGU9PywgZGVzY3JpcHRpb249PywgbG9jYXRpb249Pywgc3RhcnRfdGltZT0/LCBlbmRfdGltZT0/LCBhbGxfZGF5PT8sCiAgICAgICAgICAgIHRlYW1faWQ9PywgcmVzb3VyY2VfaWQ9PywgcmVjdXJyaW5nPT8sIHJlY3VyX3R5cGU9PywgcmVjdXJfZnJlcT0/LCByZWN1cl9jb3VudD0/LAogICAgICAgICAgICByZWN1cl9pbnRlcnZhbD0/LCByZWN1cl91bnRpbD0/LCByZWN1cl9leGNsdWRlPT8sIG5vdGlmeV90aW1lPT8sIG5vdGlmeV90ZW1wbGF0ZT0/LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tPT8sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudD0/LCBub3RpZnlfY3VzdG9tX3VuaXQ9PywKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50PT8sIG5vdGlmeV9jdXN0b21fZGF0ZT0/LCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZD0/LAogICAgICAgICAgICBjaGFuZ2VfdGltZT1jdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5PT8KICAgICAgICBXSEVSRSBpZD0/CiAgICAnOwoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1RpdGxlfSwgICBcJFBhcmFte0Rlc2NyaXB0aW9ufSwgXCRQYXJhbXtMb2NhdGlvbn0sCiAgICAgICAgICAgIFwkUGFyYW17U3RhcnRUaW1lfSwgIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17QWxsRGF5fSwgICAgICBcJEFycmF5c3tUZWFtSUR9LAogICAgICAgICAgICBcJEFycmF5c3tSZXNvdXJjZUlEfSwgICAgICAgICAgXCRQYXJhbXtSZWN1cnJpbmd9LCAgICAgICBcJFBhcmFte1JlY3VycmVuY2VUeXBlfSwKICAgICAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sIFwkUGFyYW17UmVjdXJyZW5jZUNvdW50fSwgXCRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9LAogICAgICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sIFwkUmVjdXJyZW5jZUV4Y2x1ZGUsIFwkUGFyYW17Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LCBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgYWRkIHJlY3VycmVkIGFwcG9pbnRtZW50cyBhZ2FpbgogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdDcmVhdGUoCiAgICAgICAgICAgIFBhcmVudElEICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgIG15IEBDYWxlbmRhcklEcyA9ICggJFBhcmFte0NhbGVuZGFySUR9ICk7CiAgICBwdXNoIEBDYWxlbmRhcklEcywgJFByZXZpb3VzQ2FsZW5kYXJJRCBpZiAkUHJldmlvdXNDYWxlbmRhcklEIG5lICRQYXJhbXtDYWxlbmRhcklEfTsKICAgIGZvciBteSAkQ2FsZW5kYXJJRCAoQENhbGVuZGFySURzKSB7CiAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRDYWxlbmRhcklELAogICAgICAgICk7CiAgICB9CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBmaXJlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudFVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFwcG9pbnRtZW50RGVsZXRlKCkKCmRlbGV0ZXMgYW4gZXhpc3RpbmcgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKRXZlbnRzOgogICAgQXBwb2ludG1lbnREZWxldGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBnZXQgQ2FsZW5kYXJJRAogICAgbXkgJENhbGVuZGFySUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjaGVjayB1c2VyJ3MgcGVybWlzc2lvbnMgZm9yIHRoaXMgY2FsZW5kYXIKICAgIG15ICRQZXJtaXNzaW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15IEBSZXF1aXJlZFBlcm1pc3Npb25zID0gKCAnY3JlYXRlJywgJ3J3JyApOwoKICAgIGlmICggIWdyZXAgeyAkUGVybWlzc2lvbiBlcSAkXyB9IEBSZXF1aXJlZFBlcm1pc3Npb25zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVXNlcigkUGFyYW17VXNlcklEfSkgaGFzIG5vIHBlcm1pc3Npb24gdG8gZGVsZXRlIEFwcG9pbnRtZW50KCRQYXJhbXtBcHBvaW50bWVudElEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgc2F2ZSBleGNsdXNpb24gaW5mbyB0byBwYXJlbnQgYXBwb2ludG1lbnQKICAgIGlmICggJEFwcG9pbnRtZW50e1BhcmVudElEfSAmJiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSApIHsKICAgICAgICAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRXhjbHVkZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0sCiAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIG15ICREZWxldGVSZWN1cnJpbmdTdWNjZXNzID0gJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSgKICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgIGlmICggISREZWxldGVSZWN1cnJpbmdTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50cyBjb3VsZG5cJ3QgYmUgZGVsZXRlZCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGFwcG9pbnRtZW50CiAgICBteSAkU1FMID0gJwogICAgICAgIERFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUgaWQ9PwogICAgJzsKCiAgICAjIGRlbGV0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgY2xlYW4gdXAgbGlzdCBtZXRob2RzIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkQ2FsZW5kYXJJRCwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBmaXJlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudERlbGV0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFwcG9pbnRtZW50RGVsZXRlT2NjdXJyZW5jZSgpCgpkZWxldGVzIGEgc2luZ2xlIHJlY3VycmluZyBhcHBvaW50bWVudCBvY2N1cnJlbmNlLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UoCiAgICAgICAgVW5pcXVlSUQgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsICAgICMgKHJlcXVpcmVkKQogICAgICAgIFJlY3VycmVuY2VJRCA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVbmlxdWVJRCBDYWxlbmRhcklEIFJlY3VycmVuY2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICBXSEVSRSB1bmlxdWVfaWQ9PyBBTkQgY2FsZW5kYXJfaWQ9PyBBTkQgcmVjdXJfaWQ9PycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtSZWN1cnJlbmNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJUFwcG9pbnRtZW50OwoKICAgICMgZ2V0IGFkZGl0aW9uYWwgaW5mbwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiBpZiAhJUFwcG9pbnRtZW50OwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgID0+ICdERUxFVEUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZD0/JywKICAgICAgICBCaW5kICA9PiBbIFwkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBjYWNoZSBvYmplY3QKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEdldFVuaXF1ZUlEKCkKCnJldHVybnMgVW5pcXVlSUQgY29udGFpbmluZyBhcHBvaW50bWVudCBzdGFydCB0aW1lLCByYW5kb20gaGFzaCBhbmQgc3lzdGVtIEZRRE4uCgogICAgbXkgJFVuaXF1ZUlEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5HZXRVbmlxdWVJRCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgU3RhcnRUaW1lICA9PiAxNDUxNjA2NDAwLCAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgogICAgJFVuaXF1ZUlEID0gJyc7Cgo9Y3V0CgpzdWIgR2V0VW5pcXVlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgU3RhcnRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNhbGN1bGF0ZSBhIGhhc2gKICAgIG15ICRSYW5kb21TdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZyggTGVuZ3RoID0+IDMyICk7CiAgICBteSAkU3RyaW5nICAgICAgID0gIiRQYXJhbXtDYWxlbmRhcklEfS0kUmFuZG9tU3RyaW5nLSRQYXJhbXtVc2VySUR9IjsKICAgIG15ICREaWdlc3QgICAgICAgPSB1bnBhY2soICdOJywgRGlnZXN0OjpNRDUtPm5ldygpLT5hZGQoJFN0cmluZyktPmRpZ2VzdCgpICk7CiAgICBteSAkRGlnZXN0SGV4ICAgID0gc3ByaW50ZiggJyV4JywgJERpZ2VzdCApOwogICAgbXkgJEhhc2ggICAgICAgICA9IHVjKCBzcHJpbnRmKCAiJS42cyIsICREaWdlc3RIZXggKSApOwoKICAgICMgcHJlcGFyZSBzdGFydCB0aW1lc3RhbXAgZm9yIFVuaXF1ZUlECiAgICBteSAkU3RhcnRUaW1lU3RyZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyktPlRpbWVzdGFtcEdldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgKTsKICAgICRTdGFydFRpbWVTdHJnID1+IHMvWy06XS8vZzsKICAgICRTdGFydFRpbWVTdHJnID1+IHMvXHMvVC87CgogICAgIyBnZXQgc3lzdGVtIEZRRE4KICAgIG15ICRGUUROID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGUUROJyk7CgogICAgIyByZXR1cm4gVW5pcXVlSUQKICAgIHJldHVybiAiJFN0YXJ0VGltZVN0cmctJEhhc2hcQCRGUUROIjsKfQoKPWl0ZW0gQXBwb2ludG1lbnRVcGNvbWluZ0dldCgpCgpHZXQgYXBwb2ludG1lbnQgZGF0YSBmb3IgdXBjb21pbmcgYXBwb2ludG1lbnQgc3RhcnQgb3IgZW5kLgoKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgKICAgICAgICBUaW1lc3RhbXAgPT4gJzIwMTYtMDgtMDIgMDM6NTk6MDAnLCAjIGdldCBhcHBvaW50bWVudHMgZm9yIHRoZSByZWxhdGVkIG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAKICAgICk7CgpyZXR1cm5zOgoKICAgIEFwcG9pbnRtZW50IGRhdGEgb2YgQXBwb2ludG1lbnRHZXQoKS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudFVwY29taW5nR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VycmVudCB0aW1lc3RhbXAKICAgIG15ICRDdXJyZW50VGltZXN0YW1wOwoKICAgICMgY3JlYXRlIG5lZWRlZCBzcWwgcXVlcnkgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3IgYSBnaXZlbiB0aW1lc3RhbXAKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCAnOwoKICAgIGlmICggJFBhcmFte1RpbWVzdGFtcH0gKSB7CgogICAgICAgICRDdXJyZW50VGltZXN0YW1wID0gJFBhcmFte1RpbWVzdGFtcH07CiAgICAgICAgJFNRTCAuPSAiV0hFUkUgbm90aWZ5X3RpbWUgPSA/ICI7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgJEN1cnJlbnRUaW1lc3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpLT5DdXJyZW50VGltZXN0YW1wR2V0KCk7CiAgICAgICAgJFNRTCAuPSAiV0hFUkUgbm90aWZ5X3RpbWUgPj0gPyAiOwogICAgfQoKICAgICRTUUwgLj0gJ09SREVSIEJZIG5vdGlmeV90aW1lIEFTQyc7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWyBcJEN1cnJlbnRUaW1lc3RhbXAgXSwKICAgICk7CgogICAgbXkgQFJlc3VsdFJhdzsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJVVwY29taW5nQXBwb2ludG1lbnQ7CgogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ID0gJFJvd1swXTsKICAgICAgICAkVXBjb21pbmdBcHBvaW50bWVudHtQYXJlbnRJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gICAgPSAkUm93WzJdOwogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e1VuaXF1ZUlEfSAgICAgID0gJFJvd1szXTsKCiAgICAgICAgcHVzaCBAUmVzdWx0UmF3LCBcJVVwY29taW5nQXBwb2ludG1lbnQ7CiAgICB9CgogICAgbXkgQFJlc3VsdHM7CgogICAgQVBQT0lOVE1FTlREQVRBOgogICAgZm9yIG15ICRBcHBvaW50bWVudERhdGEgKEBSZXN1bHRSYXcpIHsKCiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcHBvaW50bWVudERhdGEpOwogICAgICAgIG5leHQgQVBQT0lOVE1FTlREQVRBIGlmICEkQXBwb2ludG1lbnREYXRhLT57Q2FsZW5kYXJJRH07CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgISRBcHBvaW50bWVudERhdGEtPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCAleyRBcHBvaW50bWVudERhdGF9ICk7CgogICAgICAgIHB1c2ggQFJlc3VsdHMsIFwlQXBwb2ludG1lbnQ7CiAgICB9CgogICAgcmV0dXJuIEBSZXN1bHRzOwp9Cgo9aXRlbSBBcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCkKCkRlbGV0ZSBhbGwgY2FsZW5kYXIgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgZnV0dXJlIHRhc2sgZGVsZXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBzY2hlZHVsZXIgZGIgb2JqZWN0CiAgICBteSAkU2NoZWR1bGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbHJlYWR5IHN0b3JlZCBmdXR1cmUgdGFza3MKICAgIG15IEBGdXR1cmVUYXNrTGlzdCA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyQXBwb2ludG1lbnQnLAogICAgKTsKCiAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxARnV0dXJlVGFza0xpc3QgKSApIHsKCiAgICAgICAgRlVUVVJFVEFTSzoKICAgICAgICBmb3IgbXkgJEZ1dHVyZVRhc2sgKEBGdXR1cmVUYXNrTGlzdCkgewoKICAgICAgICAgICAgbmV4dCBGVVRVUkVUQVNLIGlmICEkRnV0dXJlVGFzazsKICAgICAgICAgICAgbmV4dCBGVVRVUkVUQVNLIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRnV0dXJlVGFzayk7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGVsZXRlIGZ1dHVyZSB0YXNrIHdpdGggaWQgJEZ1dHVyZVRhc2stPntUYXNrSUR9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCkKClVwZGF0ZSBPVFJTIGRhZW1vbiBmdXR1cmUgdGFzayBsaXN0IGZvciB1cGNvbWluZyBhcHBvaW50bWVudHMuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBmdXR1cmUgdGFzayB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYXBwb2ludG1lbnQgZGF0YSBmb3IgdXBjb21pbmcgYXBwb2ludG1lbnRzCiAgICBteSBAVXBjb21pbmdBcHBvaW50bWVudHMgPSAkU2VsZi0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgpOwoKICAgICMgY2hlY2sgZm9yIG5vIHVwY29taW5nIGFwcG9pbnRtZW50cwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFVwY29taW5nQXBwb2ludG1lbnRzICkgKSB7CgogICAgICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IGEgbG9jYWwgc2NoZWR1bGVyIGRiIG9iamVjdAogICAgbXkgJFNjaGVkdWxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTY2hlZHVsZXInKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxyZWFkeSBzdG9yZWQgZnV0dXJlIHRhc2tzCiAgICBteSBARnV0dXJlVGFza0xpc3QgPSAkU2NoZWR1bGVyT2JqZWN0LT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICk7CgogICAgIyBjaGVjayBmb3IgaW52YWxpZCB0YXNrIGNvdW50IChqdXN0IG9uZSB0YXNrIG1heCBhbGxvd2VkKQogICAgaWYgKCBzY2FsYXIgQEZ1dHVyZVRhc2tMaXN0ID4gMSApIHsKCiAgICAgICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0IGlzIG5lZWRlZCB0byB1cGRhdGUgdGhlIGZ1dHVyZSB0YXNrIGxpc3QKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCBcQEZ1dHVyZVRhc2tMaXN0ICkgKSB7CgogICAgICAgICMgZ2V0IGEgbG9jYWwgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgICAgIG15ICRVcGRhdGVOZWVkZWQgPSAwOwoKICAgICAgICBGVVRVUkVUQVNLOgogICAgICAgIGZvciBteSAkRnV0dXJlVGFzayAoQEZ1dHVyZVRhc2tMaXN0KSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhSXNIYXNoUmVmV2l0aERhdGEoJEZ1dHVyZVRhc2spCiAgICAgICAgICAgICAgICB8fCAhJEZ1dHVyZVRhc2stPntUYXNrSUR9CiAgICAgICAgICAgICAgICB8fCAhJEZ1dHVyZVRhc2stPntFeGVjdXRpb25UaW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVXBkYXRlTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgRlVUVVJFVEFTSzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHN0b3JlZCBmdXR1cmUgdGFzawogICAgICAgICAgICBteSAlRnV0dXJlVGFza0RhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrR2V0KAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRGdXR1cmVUYXNrLT57VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUZ1dHVyZVRhc2tEYXRhICkgKSB7CiAgICAgICAgICAgICAgICAkVXBkYXRlTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgRlVUVVJFVEFTSzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdW5peCB0aW1lc3RhbXBzIG9mIHN0b3JlZCBhbmQgdXBjb21pbmcgdGltZXMgdG8gY29tcGFyZQogICAgICAgICAgICBteSAkRnV0dXJlVGFza1RpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57Tm90aWZ5VGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRVcGNvbWluZ0FwcG9pbnRtZW50VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gbm90aGluZyBpZiB0aGUgdXBjb21pbmcgbm90aWZpY2F0aW9uIHRpbWUgZXF1YWxzIHRoZSBzdG9yZWQgdmFsdWUKICAgICAgICAgICAgaWYgKCAkVXBjb21pbmdBcHBvaW50bWVudFRpbWUgIT0gJEZ1dHVyZVRhc2tUaW1lICkgewogICAgICAgICAgICAgICAgJFVwZGF0ZU5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEZVVFVSRVRBU0s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkVXBkYXRlTmVlZGVkKSB7CgogICAgICAgICAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzY2hlZHVsZSBuZXcgZnV0dXJlIHRhc2tzIGZvciBub3RpZmljYXRpb24gYWN0aW9ucwogICAgbXkgJFRhc2tJRCA9ICRTY2hlZHVsZXJPYmplY3QtPlRhc2tBZGQoCiAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvbicsCiAgICAgICAgVHlwZSAgICAgICAgICA9PiAnQ2FsZW5kYXJBcHBvaW50bWVudCcsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiB7CiAgICAgICAgICAgIE5vdGlmeVRpbWUgPT4gJFVwY29taW5nQXBwb2ludG1lbnRzWzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFRhc2tJRCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzY2hlZHVsZSBmdXR1cmUgdGFzayBmb3IgQXBwb2ludG1lbnRJRCAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntBcHBvaW50bWVudElEfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKCkKClByZXBhcmUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIGRhdGEuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBwcmVwYXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIF9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZXNldCBub3RpZmljYXRpb24gZGF0YSBpZiBuZWVkZWQKICAgIGlmICggISRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApIHsKCiAgICAgICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtICgKICAgICAgICAgICAgcXcoCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgTm90aWZpY2F0aW9uVGVtcGxhdGUgTm90aWZpY2F0aW9uQ3VzdG9tIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBwb3NzaWJsZSBub3RpZmljYXRpb24gcGFyYW1zCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlIE5vdGlmaWNhdGlvbkN1c3RvbSBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17RGF0YX0tPnskUG9zc2libGVQYXJhbX0gfHw9ICcnOwogICAgfQoKICAgICMgc3BlY2lhbCBjaGVjayBmb3IgcmVsYXRpdmUgdW5pdCBjb3VudCBhcyBpdCBjYW4gYmUgemVybwogICAgIyAoZW1wdHkgYW5kIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgemVybyB0byBhdm9pZCBlcnJvcnMpCiAgICBpZiAoCiAgICAgICAgIUlzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gKQogICAgICAgIHx8ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSA8PSAwCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSA9IDA7CiAgICB9CgogICAgIyBzZXQgZW1wdHkgZGF0ZXRpbWUgc3RyaW5ncyB0byB1bmRlZgogICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtIChxdyhOb3RpZmljYXRpb25EYXRlIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lKSkgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuIGlmICEkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgIyBnZXQgYSBsb2NhbCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMKICAgICMgdGVtcGxhdGUgU3RhcnQKICAgICMKICAgIGlmICggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9IGVxICdTdGFydCcgKSB7CgogICAgICAgICMgc2V0dXAgdGhlIGFwcG9pbnRtZW50IHN0YXJ0IGRhdGUgYXMgbm90aWZpY2F0aW9uIGRhdGUKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRQYXJhbXtEYXRhfS0+e1N0YXJ0VGltZX07CiAgICB9CgogICAgIwogICAgIyB0ZW1wbGF0ZSB0aW1lIGJlZm9yZSBzdGFydAogICAgIwogICAgZWxzaWYgKAogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSBuZSAnQ3VzdG9tJwogICAgICAgICYmIElzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gKQogICAgICAgICYmICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSA+IDAKICAgICAgICApCiAgICB7CgogICAgICAgIHJldHVybiBpZiAhSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApOwoKICAgICAgICAjIG9mZnNldCB0ZW1wbGF0ZSAoYmVmb3JlIHN0YXJ0IGRhdGV0aW1lKSB1c2VkCiAgICAgICAgbXkgJE9mZnNldCA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfTsKCiAgICAgICAgIyBnZXQgYSB1bml4IHRpbWVzdGFtcCBvZiBhcHBvaW50bWVudCBzdGFydCB0aW1lCiAgICAgICAgbXkgJFN0YXJ0TG9jYWxUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdGhlIHN0YXJ0IHRpbWUgLSBvZmZzZXQgYXMgbmV3IG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJFN0YXJ0TG9jYWxUaW1lIC0gJE9mZnNldCApLAogICAgICAgICk7CiAgICB9CgogICAgIwogICAgIyB0ZW1wbGF0ZSBDdXN0b20KICAgICMKICAgIGVsc2UgewoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gcmVsYXRpdmUgaW5wdXQuCiAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CgogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdENvdW50ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdCAgICAgID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRQb2ludCA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9OwoKICAgICAgICAgICAgIyBzZXR1cCB0aGUgY291bnQgdG8gY29tcHV0ZSBmb3IgdGhlIG9mZnNldAogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25Mb2NhbFRpbWU7CgogICAgICAgICAgICAjIGNvbXB1dGUgZnJvbSBzdGFydCB0aW1lCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyc3RhcnQnICkgewoKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgZnJvbSBlbmQgdGltZQogICAgICAgICAgICBlbHNpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJlbmQnICkgewoKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBub3Qgc3VwcG9ydGVkIHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGJlIHVzZWQKICAgICAgICAgICAgbXkgJE9mZnNldCA9ICggJEN1c3RvbVVuaXRDb3VudCAqICRVbml0T2Zmc2V0Q29tcHV0ZXskQ3VzdG9tVW5pdH0gKTsKCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbmV3bHkgY29tcHV0ZWQgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZwogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnICkgewogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJE5vdGlmaWNhdGlvbkxvY2FsVGltZSAtICRPZmZzZXQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkTm90aWZpY2F0aW9uTG9jYWxUaW1lICsgJE9mZnNldCApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIGRhdGUvdGltZSBpbnB1dC4KICAgICAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gPSAnZGF0ZXRpbWUnOwoKICAgICAgICAgICAgIyB2YWxpZGF0aW9uCiAgICAgICAgICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIGdpdmVuIGRhdGUgdGltZSB2YWx1ZXMgYXMgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZyAoaS5lLiAyMDE2LTA2LTI4IDAyOjAwOjAwKQogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gKSApIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9IHVuZGVmOwogICAgfQoKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9IHVuZGVmOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBcHBvaW50bWVudE5vdGlmaWNhdGlvbigpCgpXaWxsIGJlIHRyaWdnZXJlZCBieSB0aGUgT1RSUyBkYWVtb24gdG8gZmlyZSBldmVudHMgZm9yIGFwcG9pbnRtZW50cywKdGhhdCByZWFjaGVzIGl0J3MgcmVtaW5kZXIgKG5vdGlmaWNhdGlvbikgdGltZS4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnROb3RpZmljYXRpb24oKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBub3RpZnkgYWN0aW9uIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCgo9Y3V0CgpzdWIgQXBwb2ludG1lbnROb3RpZmljYXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5vdGlmeVRpbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnRzIGZvciB0aGUgcmVsYXRlZCBub3RpZmljYXRpb24gdGltZXN0YW1wCiAgICBteSBAVXBjb21pbmdBcHBvaW50bWVudHMgPSAkU2VsZi0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgKICAgICAgICBUaW1lc3RhbXAgPT4gJFBhcmFte05vdGlmeVRpbWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggXEBVcGNvbWluZ0FwcG9pbnRtZW50cyApOwoKICAgICMgc2xlZXAgYXQgbGVhc3QgMSBzZWNvbmQgdG8gbWFrZSBzdXJlIHRoZSB0aW1lc3RhbXAgZG9lc24ndAogICAgIyBlcXVhbHMgdGhlIGxhc3Qgb25lIGZvciB1cGRhdGUgdXBjb21pbmcgZnV0dXJlIHRhc2tzCiAgICBzbGVlcCAxOwoKICAgIFVQQ09NSU5HQVBQT0lOVE1FTlQ6CiAgICBmb3IgbXkgJFVwY29taW5nQXBwb2ludG1lbnQgKEBVcGNvbWluZ0FwcG9pbnRtZW50cykgewoKICAgICAgICBuZXh0IFVQQ09NSU5HQVBQT0lOVE1FTlQgaWYgISRVcGNvbWluZ0FwcG9pbnRtZW50OwogICAgICAgIG5leHQgVVBDT01JTkdBUFBPSU5UTUVOVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFVwY29taW5nQXBwb2ludG1lbnQpOwogICAgICAgIG5leHQgVVBDT01JTkdBUFBPSU5UTUVOVCBpZiAhJFVwY29taW5nQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgIyBmaXJlIGV2ZW50CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkVXBjb21pbmdBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCBBcHBvaW50bWVudCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgKTsKICAgIG15ICRFbmRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICApOwoKICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9IEB7ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRXhjbHVkZX0gLy8gW10gfTsKCiAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIHJlc2V0IHRoZSBwYXJhbWV0ZXIgZm9yIG9jY3VycmVuY2VzCiAgICAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUV4Y2x1ZGV9ID0gdW5kZWY7CgogICAgbXkgJE9yaWdpbmFsU3RhcnRUaW1lID0gJFN0YXJ0VGltZVN5c3RlbTsKICAgIG15ICRPcmlnaW5hbEVuZFRpbWUgICA9ICRFbmRUaW1lU3lzdGVtOwogICAgbXkgJFN0ZXAgICAgICAgICAgICAgID0gMDsKCiAgICAjIHVudGlsIC4uLgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbFN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CgogICAgICAgIFVOVElMX1RJTUU6CiAgICAgICAgd2hpbGUgKCAkU3RhcnRUaW1lU3lzdGVtIDw9ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0gKSB7CiAgICAgICAgICAgICRTdGVwICs9ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgcmVjdXJyaW5nIHRpbWVzCiAgICAgICAgICAgICRTdGFydFRpbWVTeXN0ZW0gPSAkU2VsZi0+X0NhbGN1bGF0ZVJlY3VycmVuY2VUaW1lKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+ICRQYXJhbXtBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICBTdGVwICAgICAgICAgPT4gJFN0ZXAsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJE9yaWdpbmFsU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgQ3VycmVudFRpbWUgID0+ICRTdGFydFRpbWVTeXN0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkRW5kVGltZVN5c3RlbSA9ICRTdGFydFRpbWVTeXN0ZW0gKyAkT3JpZ2luYWxFbmRUaW1lIC0gJE9yaWdpbmFsU3RhcnRUaW1lOwoKICAgICAgICAgICAgbGFzdCBVTlRJTF9USU1FIGlmICEkU3RhcnRUaW1lU3lzdGVtOwogICAgICAgICAgICBsYXN0IFVOVElMX1RJTUUgaWYgJFN0YXJ0VGltZVN5c3RlbSA+ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW07CgogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWVTeXN0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lU3lzdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWdmaXg6IE9uIHNvbWUgc3lzdGVtcyB3aXRoIG9sZGVyIHBlcmwgdmVyc2lvbiBzeXN0ZW0gbWlnaHQgY2FsY3VsYXRlIHRpbWV6b25lIGRpZmZlcmVuY2UKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBza2lwIGV4Y2x1ZGVkIGFwcG9pbnRtZW50cwogICAgICAgICAgICBuZXh0IFVOVElMX1RJTUUgaWYgZ3JlcCB7ICRTdGFydFRpbWUgZXEgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17QXBwb2ludG1lbnR9IH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZm9yIC4uLiB0aW1lKHMpCiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9ICkgewoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9IC0gMSApIHsKICAgICAgICAgICAgJFN0ZXAgKz0gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSByZWN1cnJpbmcgdGltZXMKICAgICAgICAgICAgJFN0YXJ0VGltZVN5c3RlbSA9ICRTZWxmLT5fQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudCAgPT4gJFBhcmFte0FwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgIFN0ZXAgICAgICAgICA9PiAkU3RlcCwKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkT3JpZ2luYWxTdGFydFRpbWUsCiAgICAgICAgICAgICAgICBDdXJyZW50VGltZSAgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRFbmRUaW1lU3lzdGVtID0gJFN0YXJ0VGltZVN5c3RlbSArICRPcmlnaW5hbEVuZFRpbWUgLSAkT3JpZ2luYWxTdGFydFRpbWU7CgogICAgICAgICAgICBsYXN0IENPVU5UIGlmICEkU3RhcnRUaW1lU3lzdGVtOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lU3lzdGVtCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1Z2ZpeDogT24gc29tZSBzeXN0ZW1zIHdpdGggb2xkZXIgcGVybCB2ZXJzaW9uIHN5c3RlbSBtaWdodCBjYWxjdWxhdGUgdGltZXpvbmUgZGlmZmVyZW5jZQogICAgICAgICAgICAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZXhjbHVkZWQgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgZ3JlcCB7ICRTdGFydFRpbWUgZXEgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17QXBwb2ludG1lbnR9IH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICBteSAkU1FMID0gJwogICAgICAgIERFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUgcGFyZW50X2lkPT8KICAgICc7CgogICAgIyBkZWxldGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17UGFyZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nRXhjbHVkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQgUmVjdXJyZW5jZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgbXkgJERCT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIHJlY3VyX2V4Y2x1ZGUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZD0/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtQYXJlbnRJRH0gXSwKICAgICk7CgogICAgIyBnZXQgZXhpc3RpbmcgZXhjbHVzaW9ucwogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgQFJlY3VycmVuY2VFeGNsdWRlID0gc3BsaXQoICcsJywgJFJvd1swXSApIGlmICRSb3dbMF07CiAgICB9CiAgICBwdXNoIEBSZWN1cnJlbmNlRXhjbHVkZSwgJFBhcmFte1JlY3VycmVuY2VJRH07CiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBzb3J0IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIGpvaW4gaW50byBzdHJpbmcKICAgIG15ICRSZWN1cnJlbmNlRXhjbHVkZTsKICAgIGlmIChAUmVjdXJyZW5jZUV4Y2x1ZGUpIHsKICAgICAgICAkUmVjdXJyZW5jZUV4Y2x1ZGUgPSBqb2luKCAnLCcsIEBSZWN1cnJlbmNlRXhjbHVkZSApOwogICAgfQoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudCBTRVQgcmVjdXJfZXhjbHVkZT0/IFdIRVJFIGlkPT8nLAogICAgICAgIEJpbmQgPT4gWyBcJFJlY3VycmVuY2VFeGNsdWRlLCBcJFBhcmFte1BhcmVudElEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudEdldENhbGVuZGFySUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNxbCBxdWVyeQogICAgbXkgJFNRTCAgPSAnU0VMRUNUIGNhbGVuZGFyX2lkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQ9Pyc7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBzdGFydCBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJENhbGVuZGFySUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ2FsZW5kYXJJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRDYWxlbmRhcklEOwp9CgpzdWIgX0FwcG9pbnRtZW50R2V0UmVjdXJyZW5jZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzcWwgcXVlcnkKICAgIG15ICRTUUwgID0gJ1NFTEVDVCByZWN1cl9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkPT8nOwogICAgbXkgQEJpbmQgPSAoIFwkUGFyYW17QXBwb2ludG1lbnRJRH0gKTsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgc3RhcnQgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRSZWN1cnJlbmNlSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUmVjdXJyZW5jZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJFJlY3VycmVuY2VJRDsKfQoKc3ViIF9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnQgU3RlcCBPcmlnaW5hbFRpbWUgQ3VycmVudFRpbWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgIG15ICRTeXN0ZW1UaW1lID0gJFBhcmFte0N1cnJlbnRUaW1lfTsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JyApIHsKCiAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICRTeXN0ZW1UaW1lICs9IDYwICogNjAgKiAyNDsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JyApIHsKCiAgICAgICAgIyBhZGQgNyBkYXlzCiAgICAgICAgJFN5c3RlbVRpbWUgKz0gNjAgKiA2MCAqIDI0ICogNzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScgKSB7CgogICAgICAgICMgYWRkIG9uZSBtb250aAogICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgICA9PiAkUGFyYW17T3JpZ2luYWxUaW1lfSwKICAgICAgICAgICAgTW9udGhzID0+ICRQYXJhbXtTdGVwfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknICkgewoKICAgICAgICAjIGFkZCBvbmUgeWVhcgogICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgID0+ICRQYXJhbXtPcmlnaW5hbFRpbWV9LAogICAgICAgICAgICBZZWFycyA9PiAkUGFyYW17U3RlcH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tRGFpbHknICkgewogICAgICAgICRTeXN0ZW1UaW1lICs9ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9ICogNjAgKiA2MCAqIDI0OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknICkgewoKICAgICAgICAjIHRoaXMgYmxvY2sgY292ZXJzIGZvbGxvd2luZyB1c2UgY2FzZToKICAgICAgICAjIGVhY2ggbi10aCBNb25kYXkgYW5kIEZyaWRheQoKICAgICAgICBteSAkRm91bmQ7CgogICAgICAgIG15ICggJE9yaWdpbmFsV2Vla0RheSwgJE9yaWdpbmFsQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb29wIHVwIHRvIDcqbiB0aW1lcyAoNyBkYXlzIGluIHdlZWsgKiBmcmVxdWVuY3kpCiAgICAgICAgTE9PUDoKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDA7ICRDb3VudGVyIDwgNyAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OyAkQ291bnRlcisrICkgewoKICAgICAgICAgICAgIyBBZGQgMSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWUgKz0gNjAgKiA2MCAqIDI0OwoKICAgICAgICAgICAgbXkgKCAkV2Vla0RheSwgJENXICk7CgogICAgICAgICAgICBteSAlRGlmZlBhcmFtZXRlcnMgPSAoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lICAgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJENXRGlmZiA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q1dEaWZmKAogICAgICAgICAgICAgICAgJURpZmZQYXJhbWV0ZXJzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBMT09QIGlmICRDV0RpZmYgJSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgU3lzdGVtVGltZSBtYXRjaCByZXF1aXJlbWVudHMKICAgICAgICAgICAgaWYgKCBncmVwIHsgJFdlZWtEYXkgPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfSApIHsKICAgICAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IExPT1A7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQoKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CgogICAgICAgICMgT2NjdXJzIGV2ZXJ5IDJuZCBtb250aCBvbiA1dGgsIDEwdGggYW5kIDE1dGggZGF5CiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICBteSAoICRPcmlnaW5hbFNlYywgJE9yaWdpbmFsTWluLCAkT3JpZ2luYWxIb3VyLCAkT3JpZ2luYWxEYXksICRPcmlnaW5hbE1vbnRoLCAkT3JpZ2luYWxZZWFyLCAkT3JpZ2luYWxXZWVrRGF5ICkKICAgICAgICAgICAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICMgbG9vcCB0aHJvdWdoIGVhY2ggZGF5IChtYXggb25lIHllYXIpLCBhbmQgY2hlY2sgaWYgZGF5IG1hdGNoZXMuCiAgICAgICAgREFZOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMDsgJENvdW50ZXIgPCAzMSAqIDM2NjsgJENvdW50ZXIrKyApIHsKCiAgICAgICAgICAgICMgQWRkIG9uZSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWUgKz0gMjQgKiA2MCAqIDYwOwoKICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJFdlZWtEYXkgKTsKCiAgICAgICAgICAgICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICRXZWVrRGF5ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTa2lwIG1vbnRoIGlmIG5lZWRlZAogICAgICAgICAgICBuZXh0IERBWSBpZiAoICRNb250aCAtICRPcmlnaW5hbE1vbnRoICkgJSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgbmV4dCBkYXkgaWYgdGhpcyBkYXkgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgICAgbmV4dCBEQVkgaWYgIWdyZXAgeyAkRGF5ID09ICRfIH0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CgogICAgICAgICAgICAkRm91bmQgPSAxOwogICAgICAgICAgICBsYXN0IERBWTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScgKSB7CgogICAgICAgICMgdGhpcyBibG9jayBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlOgogICAgICAgICMgT2NjdXJzIGVhY2ggM3RoIHllYXIsIEphbnVhcnkgMTh0aCBhbmQgTWFyY2ggMTh0aAogICAgICAgIG15ICRGb3VuZDsKCiAgICAgICAgbXkgKCAkT3JpZ2luYWxTZWMsICRPcmlnaW5hbE1pbiwgJE9yaWdpbmFsSG91ciwgJE9yaWdpbmFsRGF5LCAkT3JpZ2luYWxNb250aCwgJE9yaWdpbmFsWWVhciwgJE9yaWdpbmFsV2Vla0RheSApCiAgICAgICAgICAgID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRQYXJhbXtPcmlnaW5hbFRpbWV9LAogICAgICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU3lzdGVtOwogICAgICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBNT05USDoKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDE7OyAkQ291bnRlcisrICkgewoKICAgICAgICAgICAgIyBBZGQgb25lIG1vbnRoCiAgICAgICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgICAgICBUaW1lICAgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgICAgICBNb250aHMgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgdGhpcyB0aW1lLCBzaW5jZSBpdCB3YXMgYWxyZWFkeSBjaGVja2VkCiAgICAgICAgICAgIG5leHQgTU9OVEggaWYgJFN5c3RlbVRpbWUgPCAkUGFyYW17Q3VycmVudFRpbWV9ICsgMjQgKiA2MCAqIDYwOwoKICAgICAgICAgICAgIyBjaGVjayBsb29wIGNvbmRpdGlvbnMgKGFjY29yZGluZyB0byBVbnRpbCAvICkKICAgICAgICAgICAgaWYgKCRSZWN1cnJlbmNlVW50aWxTeXN0ZW0pIHsKICAgICAgICAgICAgICAgIGxhc3QgTU9OVEggaWYgJFN5c3RlbVRpbWUgPiAkUmVjdXJyZW5jZVVudGlsU3lzdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGFzdCBNT05USAogICAgICAgICAgICAgICAgICAgIGlmICRDb3VudGVyCiAgICAgICAgICAgICAgICAgICAgPiAxMiAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9ICogJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VDb3VudH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICRXZWVrRGF5ICk7CgogICAgICAgICAgICAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkV2Vla0RheSApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgeWVhciBpcyBPSwogICAgICAgICAgICBuZXh0IE1PTlRIIGlmICggJFllYXIgLSAkT3JpZ2luYWxZZWFyICkgJSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgbmV4dCBtb250aCBpZiB0aGlzIG1vbnRoIHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgICAgIG5leHQgTU9OVEggaWYgIWdyZXAgeyAkTW9udGggPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgIGxhc3QgTU9OVEg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkU3lzdGVtVGltZTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OlRpbWUpCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERhdGVUaW1lOwp1c2UgVGltZTo6UGllY2U7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXIgLSBjYWxlbmRhciBoZWxwZXIgbWV0aG9kcwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgaGVscGVyIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFRpbWVDaGVjaygpCgpjaGVjayBpZiBUaW1lIGFuZCBPcmlnaW5hbFRpbWUgaGF2ZSBzYW1lIGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kIHZhbHVlLCBhbmQgcmV0dXJuIHRpbWVzdGFtcCB3aXRoIHZhbHVlcyAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGFzIGluIFRpbWUuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgIE9yaWdpbmFsVGltZSAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAyOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMjAxNi0wMi0wMSAwMDowMTowMCc7Cj1jdXQKCnN1YiBUaW1lQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KE9yaWdpbmFsVGltZSBUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFJlc3VsdCA9ICcnOwoKICAgICRQYXJhbXtPcmlnaW5hbFRpbWV9ID1+IC8oLio/KVxzKC4qPykkLzsKICAgIG15ICRPcmlnaW5hbERhdGUgPSAkMTsKICAgIG15ICRPcmlnaW5hbFRpbWUgPSAkMjsKCiAgICAkUGFyYW17VGltZX0gPX4gLyguKj8pXHMoLio/KSQvOwogICAgbXkgJERhdGUgPSAkMTsKCiAgICAkUmVzdWx0ID0gIiREYXRlICRPcmlnaW5hbFRpbWUiOwogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1pdGVtIFN5c3RlbVRpbWVHZXQoKQoKcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbi1sZWFwIHNlY29uZHMgc2luY2Ugd2hhdCBldmVyIHRpbWUgdGhlIHN5c3RlbSBjb25zaWRlcnMgdG8gYmUgdGhlIGVwb2NoCih0aGF0J3MgMDA6MDA6MDAsIEphbnVhcnkgMSwgMTkwNCBmb3IgTWFjIE9TLCBhbmQgMDA6MDA6MDAgVVRDLCBKYW51YXJ5IDEsIDE5NzAgZm9yIG1vc3Qgb3RoZXIgc3lzdGVtcykuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMTQ1MTYwNjQ2MCc7Cj1jdXQKCnN1YiBTeXN0ZW1UaW1lR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyggU3RyaW5nICkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHN5c3RlbSB0aW1lCiAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RyaW5nfSwKICAgICk7CgogICAgcmV0dXJuICRTeXN0ZW1UaW1lOwp9Cgo9aXRlbSBUaW1lc3RhbXBHZXQoKQoKcmV0dXJucyBhIHRpbWUgc3RhbXAgZm9yIGEgZ2l2ZW4gc3lzdGVtIHRpbWUgaW4gInl5eXktbW0tZGQgMjM6NTk6NTkiIGZvcm1hdC4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgU3lzdGVtVGltZSAgICAgPT4gJzE0NTE2MDY0NjAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcyMDE2LTAxLTAxIDAwOjAxOjAwJzsKPWN1dAoKc3ViIFRpbWVzdGFtcEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFN5c3RlbVRpbWUgKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGltZXN0YW1wCiAgICBteSAkVGltZXN0YW1wID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkUGFyYW17U3lzdGVtVGltZX0sCiAgICApOwoKICAgIHJldHVybiAkVGltZXN0YW1wOwp9Cgo9aXRlbSBDdXJyZW50VGltZXN0YW1wR2V0KCkKCnJldHVybnMgYSBjdXJyZW50IHRpbWUgc3RhbXAgZm9yIGEgZ2l2ZW4gc3lzdGVtIHRpbWUgaW4gInl5eXktbW0tZGQgMjM6NTk6NTkiIGZvcm1hdC4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50VGltZXN0YW1wR2V0KCk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcyMDE2LTAxLTAxIDAwOjAxOjAwJzsKPWN1dAoKc3ViIEN1cnJlbnRUaW1lc3RhbXBHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjdXJyZW50IHRpbWVzdGFtcAogICAgbXkgJEN1cnJlbnRUaW1lc3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5DdXJyZW50VGltZXN0YW1wKCk7CgogICAgcmV0dXJuICRDdXJyZW50VGltZXN0YW1wOwp9Cgo9aXRlbSBDdXJyZW50U3lzdGVtVGltZSgpCgpyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uLWxlYXAgc2Vjb25kcyBzaW5jZSB3aGF0IGV2ZXIgdGltZSB0aGUgc3lzdGVtIGNvbnNpZGVycyB0byBiZSB0aGUgZXBvY2ggdW50aWxsIG5vdy4KKHRoYXQncyAwMDowMDowMCwgSmFudWFyeSAxLCAxOTA0IGZvciBNYWMgT1MsIGFuZCAwMDowMDowMCBVVEMsIEphbnVhcnkgMSwgMTk3MCBmb3IgbW9zdCBvdGhlciBzeXN0ZW1zKS4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMTQ2Mjg3MTE2Mic7Cj1jdXQKCnN1YiBDdXJyZW50U3lzdGVtVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIHRpbWUKICAgIG15ICRDdXJyZW50U3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlN5c3RlbVRpbWUoKTsKCiAgICByZXR1cm4gJEN1cnJlbnRTeXN0ZW1UaW1lOwp9Cgo9aXRlbSBEYXRlR2V0KCkKCnJldHVybnMgZGF0ZS90aW1lIGluZm9ybWF0aW9uIGluIGEgaGFzaCBmb3IgZ2l2ZW4gdW5peCB0aW1lLgoKICAgIG15ICgkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlaykgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ2Mjg3MTE2MicsCiAgICApOwoKcmV0dXJuczoKICAgICRTZWNvbmQgICAgPSAnMCc7CiAgICAkTWludXRlICAgID0gJzAnOwogICAgJEhvdXIgICAgICA9ICcxJzsKICAgICREYXkgICAgICAgPSAnMSc7CiAgICAkTW9udGggICAgID0gJzEnOwogICAgJFllYXIgICAgICA9ICcyMDE2JzsKICAgICREYXlPZldlZWsgPSAnMic7ICAgIyAxLW1vbmRheSwuLi4sIDctc3VuZGF5Cgo9Y3V0CgpzdWIgRGF0ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFN5c3RlbVRpbWUgKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkUGFyYW17U3lzdGVtVGltZX0sCiAgICAgICAgKTsKICAgICRTZWNvbmQgICAgPSBpbnQgJFNlY29uZDsKICAgICRNaW51dGUgICAgPSBpbnQgJE1pbnV0ZTsKICAgICRIb3VyICAgICAgPSBpbnQgJEhvdXI7CiAgICAkRGF5ICAgICAgID0gaW50ICREYXk7CiAgICAkTW9udGggICAgID0gaW50ICRNb250aDsKICAgICRZZWFyICAgICAgPSBpbnQgJFllYXI7CiAgICAkRGF5T2ZXZWVrID0gaW50ICREYXlPZldlZWs7CgogICAgIyBLZXJuZWw6OlN5c3RlbTo6VGltZSBvYmplY3QgcmV0dXJucyAwIGZvciBTdW5kYXkgLSB3ZSBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIDcgKGxpa2Ugb24gb3RoZXIgcGxhY2VzKQogICAgaWYgKCAhJERheU9mV2VlayApIHsKICAgICAgICAkRGF5T2ZXZWVrID0gNzsKICAgIH0KCiAgICByZXR1cm4gKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApOwp9Cgo9aXRlbSBEYXRlMlN5c3RlbVRpbWUoKQoKcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbi1sZWFwIHNlY29uZHMgc2luY2Ugd2hhdCBldmVyIHRpbWUgdGhlIHN5c3RlbSBjb25zaWRlcnMgdG8gYmUgdGhlIGVwb2NoIGZvciBnaXZlbiBwYXJhbWV0ZXJzLgoodGhhdCdzIDAwOjAwOjAwLCBKYW51YXJ5IDEsIDE5MDQgZm9yIE1hYyBPUywgYW5kIDAwOjAwOjAwIFVUQywgSmFudWFyeSAxLCAxOTcwIGZvciBtb3N0IG90aGVyIHN5c3RlbXMpLgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICBZZWFyICAgICAgPT4gJzIwMTYnLAogICAgICAgIE1vbnRoICAgICA9PiAnMScsCiAgICAgICAgRGF5ICAgICAgID0+ICcxJywKICAgICAgICBIb3VyICAgICAgPT4gJzEnLAogICAgICAgIE1pbnV0ZSAgICA9PiAnMCcsCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMTQ1MTYxMDAwMCc7Cj1jdXQKCnN1YiBEYXRlMlN5c3RlbVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KCBZZWFyIE1vbnRoIERheSApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICRQYXJhbXtIb3VyfSAgIC8vPSAwOwogICAgJFBhcmFte01pbnV0ZX0gLy89IDA7CiAgICAkUGFyYW17U2Vjb25kfSAvLz0gMDsKCiAgICAjIGdldCBzeXN0ZW0gdGltZQogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJFN5c3RlbVRpbWU7Cn0KCj1pdGVtIEFkZFBlcmlvZCgpCgphZGRzIHRpbWUgcGVyaW9kICh5ZWFycyBhbmQgbW9udGhzKSB0byB0aGUgdGltZSBnaXZlbiBpbiBVbml4IGZvcm1hdC4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgVGltZSAgICAgICA9PiAnMTQ2Mjg3MTE2MicsICAgICAjIChyZXF1aXJlZCkgdGltZSBpbiBVbml4IGZvcm1hdAogICAgICAgIFllYXJzICAgICAgPT4gJzEnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHllYXJzIHRvIGFkZAogICAgICAgIE1vbnRocyAgICAgPT4gJzEnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1vbnRocyB0byBhZGQKICAgICk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcxNDk3MDg1NTYyJzsKPWN1dAoKc3ViIEFkZFBlcmlvZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGltZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtNb250aHN9IC8vPSAwOwogICAgJFBhcmFte1llYXJzfSAgLy89IDA7CgogICAgbXkgJFRpbWVQaWVjZSA9IGxvY2FsdGltZSggJFBhcmFte1RpbWV9ICk7CiAgICBteSAkU3RhcnREYXkgID0gJFRpbWVQaWVjZS0+ZGF5X29mX21vbnRoKCk7CgogICAgbXkgJE5leHRUaW1lUGllY2UgPSAkVGltZVBpZWNlLT5hZGRfbW9udGhzKCAkUGFyYW17TW9udGhzfSApOwogICAgJE5leHRUaW1lUGllY2UgPSAkTmV4dFRpbWVQaWVjZS0+YWRkX3llYXJzKCAkUGFyYW17WWVhcnN9ICk7CiAgICBteSAkRW5kRGF5ID0gJE5leHRUaW1lUGllY2UtPmRheV9vZl9tb250aCgpOwoKICAgICMgY2hlY2sgaWYgbW9udGggZG9lc24ndCBoYXZlIGVub3VnaCBkYXlzIChmb3IgZXhhbXBsZTogSmFudWFyeSAzMSArIDEgbW9udGggPSBNYXJjaCAwMSkKICAgIGlmICggJFN0YXJ0RGF5ICE9ICRFbmREYXkgKSB7CgogICAgICAgICMgU3VidHJhY3QgbmVlZGVkIGRheXMKICAgICAgICBteSAkRGF5cyA9ICROZXh0VGltZVBpZWNlLT5kYXlfb2ZfbW9udGgoKTsKICAgICAgICAkTmV4dFRpbWVQaWVjZSAtPSAkRGF5cyAqIDI0ICogNjAgKiA2MDsKICAgIH0KCiAgICByZXR1cm4gJE5leHRUaW1lUGllY2UtPmVwb2NoKCk7Cn0KCj1pdGVtIFRpbWV6b25lT2Zmc2V0R2V0KCkKCnJldHVybnMgb2Zmc2V0IG9mIHNwZWNpZmllZCB0aW1lIHpvbmUgb3IgdXNlcidzIHRpbWUgem9uZS4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgVGltZXpvbmVJRCAgPT4gJ0V1cm9wZS9CZXJsaW4nICAgICAgIyAob3B0aW9uYWwpIFRpbWV6b25lIG5hbWUKICAgICAgICBUaW1lICAgICAgICA9PiAnMTQ2Mjg3MTE2MicsICAgICAgICAjIChvcHRpb25hbCkgVGltZSBpbiBVbml4IGZvcm1hdCB5b3Ugd2FudCBvZmZzZXQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIG90aGVyd2lzZSwgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZAogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gMjsKCj1jdXQKCnN1YiBUaW1lem9uZU9mZnNldEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICYmICEkUGFyYW17VGltZXpvbmVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCBvciBUaW1lem9uZUlEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRVc2Vye1VzZXJUaW1lWm9uZX0gPyBpbnQgJFVzZXJ7VXNlclRpbWVab25lfSA6IDA7CiAgICB9CgogICAgIyBPZmZzZXQgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiBzcGVjaWZpYyB0aW1lLCBiZWNhdXNlIG9mIGRheWxpZ2h0IHNhdmluZ3MuCiAgICAjICAgSWYgbm90IHN1cHBsaWVkLCB1c2UgY3VycmVudCB0aW1lLgogICAgbXkgJERhdGVUaW1lID0gZXZhbCB7IERhdGVUaW1lLT5mcm9tX2Vwb2NoKCBlcG9jaCA9PiAkUGFyYW17VGltZX0gPyAkUGFyYW17VGltZX0gOiB0aW1lKCkgKSB9OwogICAgcmV0dXJuIDAgaWYgISREYXRlVGltZTsKCiAgICAjIERhdGVUaW1lOjpUaW1lWm9uZSBtaWdodCBub3QgcmVjb2duaXplIHRpbWV6b25lIGJ5IGl0cyBuYW1lIGFuZCBkaWUsCiAgICAjICAgbWFrZSB0aGUgY2FsbCBpbiBhbiBldmFsIGJsb2NrLgogICAgbXkgJFRpbWV6b25lID0gZXZhbCB7IERhdGVUaW1lOjpUaW1lWm9uZS0+bmV3KCBuYW1lID0+ICRQYXJhbXtUaW1lem9uZUlEfSApIH07CgogICAgaWYgKCRUaW1lem9uZSkgewogICAgICAgIHJldHVybiAkVGltZXpvbmUtPm9mZnNldF9mb3JfZGF0ZXRpbWUoJERhdGVUaW1lKSAvIDM2MDAuMDA7ICAgICMgaW4gaG91cnMKICAgIH0KCiAgICAjIExhc3QgcmVzb3J0IGRldGVjdGlvbiBvZiB0aW1lem9uZSBvZmZzZXQgZnJvbSB0aGUgc3VwcGxpZWQgVGltZXpvbmVJRCwKICAgICMgICBpLmUuIChVVEMrMDE6MDApIEJlbGdyw6FkLCBCdWRhcGVzdCwgTGp1YmxqYW5hLCBQb3pzb255LCBQcsOhZ2EKICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjQ4NSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgIGlmICggJFBhcmFte1RpbWV6b25lSUR9ID1+IC8oWystXT8pKFswLTldKyk6KFswLTldKykvICkgewogICAgICAgIG15ICRTaWduICA9IGludCAiJHsxfTEiOwogICAgICAgIG15ICRIb3VycyA9ICQyICsgJDMgLyA2MC4wMDsKICAgICAgICByZXR1cm4gJFNpZ24gKiAkSG91cnM7CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGZpbmQgb2Zmc2V0IGZvciAnJFBhcmFte1RpbWV6b25lSUR9JywgYXNzdW1pbmcgVVRDISIsCiAgICApOwoKICAgIHJldHVybiAwOwp9Cgo9aXRlbSBMb2NhbFRpbWV6b25lT2Zmc2V0R2V0KCkKCnJldHVybnMgb2Zmc2V0IG9mIGxvY2FsIHRpbWUgem9uZSBmb3IgYSBzcGVjaWZpZWQgVVRDIHN5c3RlbSB0aW1lLgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkxvY2FsVGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgVGltZSA9PiAnMTQ2Mjg3MTE2MicsICAgICAjIChyZXF1aXJlZCkgdGltZSBpbiBVbml4IGZvcm1hdAogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gMjsKCj1jdXQKCnN1YiBMb2NhbFRpbWV6b25lT2Zmc2V0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1RpbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFRpbWUgICA9IGxvY2FsdGltZSggJFBhcmFte1RpbWV9ICk7CiAgICBteSAkT2Zmc2V0ID0gJFRpbWUtPnR6b2Zmc2V0KCkgLyAzNjAwLjAwOyAgICAjIGluIGhvdXJzCgogICAgcmV0dXJuICRPZmZzZXQ7Cn0KCj1pdGVtIFdlZWtEZXRhaWxzR2V0KCkKCmdldCB3ZWVrIGRldGFpbHMgZm9yIGEgZ2l2ZW4gdW5peCB0aW1lLgoKICAgIG15ICgkV2Vla0RheSwgJENXKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ2Mjg4MDc3OCcsCiAgICApOwoKcmV0dXJuczoKICAgICRXZWVrRGF5ID0gNDsgIyA3LXN1biwgMS1tb24KICAgICRDVyA9IDE5Owo9Y3V0CgpzdWIgV2Vla0RldGFpbHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFN5c3RlbVRpbWUgKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgVGltZTo6UGllY2Ugb2JqZWN0CiAgICBteSAkVGltZSA9IGxvY2FsdGltZSggJFBhcmFte1N5c3RlbVRpbWV9ICk7CgogICAgIyBUaW1lOjpQaWVjZSBvYmplY3QgcmV0dXJucyAwIGZvciBTdW5kYXkgLSB3ZSBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIDcgKGxpa2Ugb24gb3RoZXIgcGxhY2VzKQogICAgbXkgJERheU9mV2VlayA9ICRUaW1lLT5kYXlfb2Zfd2VlaygpOwogICAgaWYgKCAhJERheU9mV2VlayApIHsKICAgICAgICAkRGF5T2ZXZWVrID0gNzsKICAgIH0KCiAgICByZXR1cm4gKCAkRGF5T2ZXZWVrLCAkVGltZS0+d2VlaygpICk7Cn0KCj1pdGVtIENXRGlmZigpCgpyZXR1cm5zIGhvdyBtYW55IGNhbGVuZGFyIHdlZWtzIGhhcyBiZWVuIHBhc3NlZCBiZXR3ZWVuIHR3byB1bml4IHRpbWVzLgoKICAgIG15ICRDV0RpZmYgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkNXRGlmZigKICAgICAgICBTeXN0ZW1UaW1lICAgPT4gJzE0NjI4ODA3NzgnLAogICAgICAgIE9yaWdpbmFsVGltZSA9PiAnMTQ2Mjk4MDc3OCcsCiAgICApOwoKcmV0dXJuczoKICAgICRDV0RpZmYgPSA1Owo9Y3V0CgpzdWIgQ1dEaWZmIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KCBTeXN0ZW1UaW1lIE9yaWdpbmFsVGltZSApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3RhcnRUaW1lID0gbG9jYWx0aW1lKCAkUGFyYW17T3JpZ2luYWxUaW1lfSApOwogICAgbXkgJEVuZFRpbWUgICA9IGxvY2FsdGltZSggJFBhcmFte1N5c3RlbVRpbWV9ICk7CgogICAgbXkgJFN0YXJ0WWVhciA9ICRTdGFydFRpbWUtPnllYXIoKTsKICAgIG15ICRFbmRZZWFyICAgPSAkRW5kVGltZS0+eWVhcigpOwoKICAgIG15ICRSZXN1bHQgPSAkRW5kVGltZS0+d2VlaygpIC0gJFN0YXJ0VGltZS0+d2VlaygpOwogICAgaWYgKCAkUmVzdWx0IDwgMCAmJiAkRW5kVGltZS0+bWRheSgpID09IDMxICYmICRFbmRUaW1lLT5tb24oKSA9PSAxMiApIHsKCiAgICAgICAgIyBJZiBkYXRlIGlzIGVuZCBvZiB0aGUgeWVhciBhbmQgZGF0ZSBDVyBzdGFydHMgd2l0aCAxLCB3ZSBuZWVkIHRvIGluY2x1ZGUgYWRkaXRpb25hbCB5ZWFyLgogICAgICAgICRFbmRZZWFyKys7CiAgICB9CgogICAgZm9yIG15ICRZZWFyICggJFN0YXJ0WWVhciAuLiAkRW5kWWVhciAtIDEgKSB7CgogICAgICAgIG15ICRDVyAgPSAwOwogICAgICAgIG15ICREYXkgPSAzMTsKCiAgICAgICAgd2hpbGUgKCAkQ1cgPCA1MCApIHsKCiAgICAgICAgICAgICMgVG8gZ2V0IGhvdyBtYW55IENXJ3MgYXJlIGluIHRoaXMgeWVhciwgd2Ugc2V0IHRlbXBvcmFyeSBkYXRlIHRvIDMxLWRlYy4KICAgICAgICAgICAgbXkgJFRpbWVzdGFtcCAgPSAiJFllYXItMTItJERheSAyMzo1OTowMCI7CiAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFRpbWVzdGFtcCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRUaW1lID0gbG9jYWx0aW1lKCRTeXN0ZW1UaW1lKTsKCiAgICAgICAgICAgICRDVyA9ICRUaW1lLT53ZWVrKCk7CiAgICAgICAgICAgICREYXktLTsKICAgICAgICB9CgogICAgICAgICRSZXN1bHQgKz0gJENXOwoKICAgIH0KCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4gLSBQbHVnaW4gbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFic3RyYWN0aW9uIGxheWVyIGZvciBhcHBvaW50bWVudCBwbHVnaW5zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgcmVnaXN0ZXJlZCBwbHVnaW4gbW9kdWxlcwogICAgbXkgJFBsdWdpbkNvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiQXBwb2ludG1lbnRDYWxlbmRhcjo6UGx1Z2luIik7CgogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgbG9hZCBwbHVnaW4gbW9kdWxlcwogICAgUExVR0lOOgogICAgZm9yIG15ICRQbHVnaW5LZXkgKCBzb3J0IGtleXMgJXskUGx1Z2luQ29uZmlnfSApIHsKCiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkUGx1Z2luQ29uZmlnLT57JFBsdWdpbktleX0tPntNb2R1bGV9OwogICAgICAgIG5leHQgUExVR0lOIGlmICEkR2VuZXJpY01vZHVsZTsKCiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIHBsdWdpbiBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1BsdWdpbnN9LT57JFBsdWdpbktleX0tPntQbHVnaW5OYW1lfSAgID0gJFBsdWdpbkNvbmZpZy0+eyRQbHVnaW5LZXl9LT57TmFtZX0gLy8gJEdlbmVyaWNNb2R1bGU7CiAgICAgICAgJFNlbGYtPntQbHVnaW5zfS0+eyRQbHVnaW5LZXl9LT57UGx1Z2luTW9kdWxlfSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgIG15ICRQbHVnaW5VUkwgPSAkUGx1Z2luQ29uZmlnLT57JFBsdWdpbktleX0tPntVUkx9OwogICAgICAgICRQbHVnaW5VUkwgPX4gc3s8T1RSU19DT05GSUdfKC4rPyk+fXskS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJDEpfWVneDsKICAgICAgICAkU2VsZi0+e1BsdWdpbnN9LT57JFBsdWdpbktleX0tPntQbHVnaW5VUkx9ID0gJFBsdWdpblVSTDsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFBsdWdpbkxpc3QoKQoKcmV0dXJucyB0aGUgaGFzaCBvZiByZWdpc3RlcmVkIHBsdWdpbnMKCiAgICBteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKCj1jdXQKCnN1YiBQbHVnaW5MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVBsdWdpbkxpc3QgPSBtYXAgewogICAgICAgICRfID0+IHsKICAgICAgICAgICAgUGx1Z2luTmFtZSA9PiAkU2VsZi0+e1BsdWdpbnN9LT57JF99LT57UGx1Z2luTmFtZX0sCiAgICAgICAgICAgIFBsdWdpblVSTCAgPT4gJFNlbGYtPntQbHVnaW5zfS0+eyRffS0+e1BsdWdpblVSTH0sCiAgICAgICAgfQogICAgfSBrZXlzICV7ICRTZWxmLT57UGx1Z2luc30gfTsKCiAgICByZXR1cm4gXCVQbHVnaW5MaXN0Owp9Cgo9aXRlbSBQbHVnaW5LZXlzKCkKCnJldHVybnMgdGhlIGhhc2ggb2YgcHJvcGVyIHBsdWdpbiBrZXlzIGZvciBsb3dlcmNhc2UgbWF0Y2hpbmcKCiAgICBteSAkUGx1Z2luS2V5cyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbktleXMoKTsKCj1jdXQKCnN1YiBQbHVnaW5LZXlzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVBsdWdpbktleXMgPSBtYXAgewogICAgICAgIGxjICRfID0+ICRfCiAgICB9IGtleXMgJXsgJFNlbGYtPntQbHVnaW5zfSB9OwoKICAgIHJldHVybiBcJVBsdWdpbktleXM7Cn0KCj1pdGVtIFBsdWdpbkxpbmtBZGQoKQoKbGluayBhcHBvaW50bWVudCBieSBwbHVnaW4KCiAgICBteSAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtBZGQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLAogICAgICAgIFBsdWdpbktleSAgICAgPT4gJzAxMDAtVGlja2V0JywKICAgICAgICBQbHVnaW5EYXRhICAgID0+ICc0MicsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBQbHVnaW5MaW5rQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFBsdWdpbktleSBQbHVnaW5EYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntQbHVnaW5zfS0+eyAkUGFyYW17UGx1Z2luS2V5fSB9LT57UGx1Z2luTW9kdWxlfS0+TGlua0FkZCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWl0ZW0gUGx1Z2luTGlua0xpc3QoKQoKcmV0dXJucyBsaXN0IG9mIGxpbmtzIGZvciBzdXBwbGllZCBhcHBvaW50bWVudAoKICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICcwMTAwLVRpY2tldCcsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBQbHVnaW5MaW5rTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBQbHVnaW5LZXkgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtQbHVnaW5VUkx9ID0gJFNlbGYtPntQbHVnaW5zfS0+eyAkUGFyYW17UGx1Z2luS2V5fSB9LT57UGx1Z2luVVJMfTsKCiAgICBteSAkTGlua0xpc3QgPSAkU2VsZi0+e1BsdWdpbnN9LT57ICRQYXJhbXtQbHVnaW5LZXl9IH0tPntQbHVnaW5Nb2R1bGV9LT5MaW5rTGlzdCglUGFyYW0pOwoKICAgIHJldHVybiAkTGlua0xpc3Q7Cn0KCj1pdGVtIFBsdWdpbkxpbmtEZWxldGUoKQoKcmVtb3ZlcyBhbGwgbGlua3MgZm9yIGFuIGFwcG9pbnRtZW50CgogICAgbXkgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rRGVsZXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFBsdWdpbkxpbmtEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICBPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBLZXkgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmFibGUgdG8gZGVsZXRlIHBsdWdpbiBsaW5rcyEiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBQbHVnaW5TZWFyY2goKQoKc2VhcmNoIGZvciBwbHVnaW4gb2JqZWN0cwoKICAgIG15ICRSZXN1bHRMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luU2VhcmNoKAogICAgICAgIFBsdWdpbktleSA9PiAkUGx1Z2luS2V5LCAgICAgICAgIyAocmVxdWlyZWQpCgogICAgICAgIFNlYXJjaCAgICA9PiAkU2VhcmNoLCAgICAgICAgICAgIyAocmVxdWlyZWQpIFNlYXJjaCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAgICBPYmplY3RJRCAgPT4gJE9iamVjdElEICAgICAgICAgICMgKHJlcXVpcmVkKSBPYmplY3QgSUQKCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwgICAjIChyZXF1aXJlZCkKICAgICk7Cgo9Y3V0CgpzdWIgUGx1Z2luU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQbHVnaW5LZXkgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhJFBhcmFte1NlYXJjaH0gJiYgISRQYXJhbXtPYmplY3RJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBTZWFyY2ggb3IgT2JqZWN0SUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkUmVzdWx0TGlzdCA9ICRTZWxmLT57UGx1Z2luc30tPnsgJFBhcmFte1BsdWdpbktleX0gfS0+e1BsdWdpbk1vZHVsZX0tPlNlYXJjaCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0TGlzdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHBzOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luOjpUaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldCAtIFRpY2tldCBwbHVnaW4KCj1oZWFkMSBTWU5PUFNJUwoKVGlja2V0IGFwcG9pbnRtZW50IHBsdWdpbi4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGlja2V0UGx1Z2luT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIExpbmtBZGQoKQoKYWRkcyBhIGxpbmsgZnJvbSBhbiBhcHBvaW50bWVudCB0byB0aGUgdGlja2V0CgogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UGx1Z2luT2JqZWN0LT5MaW5rQWRkKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMTIzLAogICAgICAgIFBsdWdpbkRhdGEgICAgPT4gJFRpY2tldElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBQbHVnaW5EYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRpY2tldCBpZAogICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtQbHVnaW5EYXRhfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISVUaWNrZXQ7CgogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAkUGFyYW17UGx1Z2luRGF0YX0sCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBMaW5rTGlzdCgpCgpyZXR1cm5zIGEgaGFzaCBvZiBsaW5rZWQgdGlja2V0cyB0byBhbiBhcHBvaW50bWVudAoKICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFBsdWdpbk9iamVjdC0+TGlua0xpc3QoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBVc2VySUQgUGx1Z2luVVJMKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVMaW5rS2V5TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtLZXlMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0MSA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIEtleTEgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIE9iamVjdDIgPT4gJ1RpY2tldCcsCiAgICAgICAgU3RhdGUgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVSZXN1bHQgPSBtYXAgewogICAgICAgICRfID0+IHsKICAgICAgICAgICAgTGlua0lEICAgPT4gJExpbmtLZXlMaXN0eyRffS0+e1RpY2tldElEfSwKICAgICAgICAgICAgTGlua05hbWUgPT4gJExpbmtLZXlMaXN0eyRffS0+e1RpY2tldE51bWJlcn0gLiAnICcgLiAkTGlua0tleUxpc3R7JF99LT57VGl0bGV9LAogICAgICAgICAgICBMaW5rVVJMICA9PiBzcHJpbnRmKCAkUGFyYW17UGx1Z2luVVJMfSwgJExpbmtLZXlMaXN0eyRffS0+e1RpY2tldElEfSApLAogICAgICAgIH0KICAgIH0ga2V5cyAlTGlua0tleUxpc3Q7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBTZWFyY2goKQoKc2VhcmNoIGZvciB0aWNrZXQgYW5kIHJldHVybiBhIGhhc2ggb2YgZm91bmQgdGlja2V0cwoKICAgIG15ICRSZXN1bHRMaXN0ID0gJFRpY2tldFBsdWdpbk9iamVjdC0+U2VhcmNoKAogICAgICAgIFNlYXJjaCAgID0+ICcqKicsICAgIyBzZWFyY2ggYnkgdGlja2V0IG51bWJlciBvciB0aXRsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIE9iamVjdElEID0+IDEsICAgICAgIyBzZWFyY2ggYnkgdGlja2V0IElEIChzaW5nbGUgcmVzdWx0KQoKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17U2VhcmNofSAmJiAhJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFNlYXJjaCBvciBPYmplY3RJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgQFRpY2tldElEczsKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgc2VhcmNoIHRoZSB0aWNrZXRzIGJ5IHRpY2tldCBudW1iZXIKICAgICAgICBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICBBcmNoaXZlRmxhZ3MgPT4gWyduJ10sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHRyeSB0aGUgdGl0bGUgc2VhcmNoIGlmIG5vIHJlc3VsdHMgd2VyZSBmb3VuZAogICAgICAgIGlmICggIUBUaWNrZXRJRHMgKSB7CiAgICAgICAgICAgIEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJyUnIC4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgICAgICAgICBBcmNoaXZlRmxhZ3MgPT4gWyduJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17T2JqZWN0SUR9ICkgewogICAgICAgIEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgICAgICAgICBSZXN1bHQgICAgICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgQXJjaGl2ZUZsYWdzID0+IFsnbiddLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlUmVzdWx0TGlzdDsKCiAgICAjIGNsZWFuIHRoZSByZXN1bHRzCiAgICBUSUNLRVQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CgogICAgICAgIG5leHQgVElDS0VUIGlmICEkVGlja2V0SUQ7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUSUNLRVQgaWYgISVUaWNrZXQ7CgogICAgICAgICMgZ2VuZXJhdGUgdGhlIHRpY2tldCBpbmZvcm1hdGlvbiBzdHJpbmcKICAgICAgICAkUmVzdWx0TGlzdHsgJFRpY2tldHtUaWNrZXRJRH0gfSA9ICRUaWNrZXR7VGlja2V0TnVtYmVyfSAuICcgJyAuICRUaWNrZXR7VGl0bGV9OwogICAgfQoKICAgIHJldHVybiBcJVJlc3VsdExpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkpTT04nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyVGVtcGxhdGVHZW5lcmF0b3InLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRXZlbnQgRGF0YSBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICYmICEkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIENhbGVuZGFySUQgb3IgQXBwb2ludG1lbnRJRCBpbiBEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgbm90aWZpY2F0aW9uIGV2ZW50IG9iamVjdAogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50Jyk7CgogICAgIyBjaGVjayBpZiBldmVudCBpcyBhZmZlY3RlZAogICAgbXkgQElEcyA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uRXZlbnRDaGVjaygKICAgICAgICBFdmVudCA9PiAkUGFyYW17RXZlbnR9LAogICAgKTsKCiAgICAjIHJldHVybiBpZiBubyBub3RpZmljYXRpb24gZm9yIGV2ZW50IGV4aXN0cwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCBcQElEcyApICkgewoKICAgICAgICAjIHVwZGF0ZSB0aGUgZnV0dXJlIHRhc2tzCiAgICAgICAgJFNlbGYtPl9GdXR1cmVUYXNrVXBkYXRlKCk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgIG15ICVDYWxlbmRhcjsKICAgIG15ICVBcHBvaW50bWVudDsKCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgKTsKICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSB8fCAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSApIHsKICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9LAogICAgICAgICk7CiAgICB9CgogICAgTk9USUZJQ0FUSU9OSUQ6CiAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbklEIChASURzKSB7CgogICAgICAgIG15ICVOb3RpZmljYXRpb24gPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkdldCgKICAgICAgICAgICAgSUQgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGFwcG9pbnRtZW50IGNvbmRpdGlvbnMKICAgICAgICBteSAkUGFzc0ZpbHRlciA9ICRTZWxmLT5fTm90aWZpY2F0aW9uRmlsdGVyKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiBcJUFwcG9pbnRtZW50LAogICAgICAgICAgICBDYWxlbmRhciAgICAgPT4gXCVDYWxlbmRhciwKICAgICAgICAgICAgTm90aWZpY2F0aW9uID0+IFwlTm90aWZpY2F0aW9uLAogICAgICAgICk7CgogICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgISRQYXNzRmlsdGVyOwoKICAgICAgICAjIGdldCByZWNpcGllbnRzCiAgICAgICAgbXkgQFJlY2lwaWVudFVzZXJzID0gJFNlbGYtPl9SZWNpcGllbnRzR2V0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiBcJUFwcG9pbnRtZW50LAogICAgICAgICAgICBDYWxlbmRhciAgICAgPT4gXCVDYWxlbmRhciwKICAgICAgICAgICAgTm90aWZpY2F0aW9uID0+IFwlTm90aWZpY2F0aW9uLAogICAgICAgICk7CgogICAgICAgIG15IEBOb3RpZmljYXRpb25CdW5kbGU7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGdlbmVyYXRvciBvYmplY3Q7CiAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyVGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgIyBwYXJzZSBhbGwgbm90aWZpY2F0aW9uIHRhZ3MgZm9yIGVhY2ggdXNlcgogICAgICAgIGZvciBteSAkUmVjaXBpZW50IChAUmVjaXBpZW50VXNlcnMpIHsKCiAgICAgICAgICAgIG15ICVSZXBsYWNlZE5vdGlmaWNhdGlvbiA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+Tm90aWZpY2F0aW9uRXZlbnQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlY2lwaWVudCAgICAgPT4gJFJlY2lwaWVudCwKICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiAgPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRSZWNpcGllbnQtPntBcHBvaW50bWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBOb3RpZmljYXRpb25CdW5kbGUsIHsKICAgICAgICAgICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICAgICAgICAgICA9PiAkUmVjaXBpZW50LAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uICAgICAgICAgICAgICAgICAgID0+IFwlUmVwbGFjZWROb3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICBSZWNpcGllbnROb3RpZmljYXRpb25UcmFuc3BvcnQgPT4gJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnQsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgZ2V0IG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQgY29uZmlnCiAgICAgICAgbXkgJVRyYW5zcG9ydENvbmZpZyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQXBwb2ludG1lbnROb3RpZmljYXRpb246OlRyYW5zcG9ydCcpIHx8IHt9IH07CgogICAgICAgICMgcmVtZW1iZXIgYWxyZWFkeSBzZW50IGFnZW50IG5vdGlmaWNhdGlvbnMKICAgICAgICBteSAlQWxyZWFkeVNlbnQ7CgogICAgICAgICMgbG9vcCBvdmVyIHRyYW5zcG9ydHMgZm9yIGVhY2ggbm90aWZpY2F0aW9uCiAgICAgICAgVFJBTlNQT1JUOgogICAgICAgIGZvciBteSAkVHJhbnNwb3J0ICggc29ydCBrZXlzICVUcmFuc3BvcnRDb25maWcgKSB7CgogICAgICAgICAgICAjIG9ubHkgY29uZmlndXJlZCB0cmFuc3BvcnRzIGZvciB0aGlzIG5vdGlmaWNhdGlvbgogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJFRyYW5zcG9ydCB9IEB7ICROb3RpZmljYXRpb257RGF0YX0tPntUcmFuc3BvcnRzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFRyYW5zcG9ydENvbmZpZ3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhJFRyYW5zcG9ydENvbmZpZ3skVHJhbnNwb3J0fS0+e01vZHVsZX07CgogICAgICAgICAgICAjIGdldCB0cmFuc3BvcnQgb2JqZWN0CiAgICAgICAgICAgIG15ICRUcmFuc3BvcnRPYmplY3Q7CiAgICAgICAgICAgIGV2YWwgewogICAgICAgICAgICAgICAgJFRyYW5zcG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoICRUcmFuc3BvcnRDb25maWd7JFRyYW5zcG9ydH0tPntNb2R1bGV9ICk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoICEkVHJhbnNwb3J0T2JqZWN0ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGNyZWF0ZSBhIG5ldyAkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9LT57TW9kdWxlfSBvYmplY3QhIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggcmVmICRUcmFuc3BvcnRPYmplY3QgbmUgJFRyYW5zcG9ydENvbmZpZ3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9LT57TW9kdWxlfSBvYmplY3QgaXMgaW52YWxpZCIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRyYW5zcG9ydCBpcyB1c2FibGUKICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgISRUcmFuc3BvcnRPYmplY3QtPklzVXNhYmxlKCk7CgogICAgICAgICAgICBCVU5ETEU6CiAgICAgICAgICAgIGZvciBteSAkQnVuZGxlIChATm90aWZpY2F0aW9uQnVuZGxlKSB7CgogICAgICAgICAgICAgICAgbXkgJFVzZXJQcmVmZXJlbmNlID0gIk5vdGlmaWNhdGlvbi0kTm90aWZpY2F0aW9ue0lEfS0kVHJhbnNwb3J0IjsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGFnZW50IHNob3VsZCBnZXQgdGhlIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgbXkgJEFnZW50U2VuZE5vdGlmaWNhdGlvbiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEJ1bmRsZS0+e1JlY2lwaWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydH0tPnskVXNlclByZWZlcmVuY2V9ICkgewogICAgICAgICAgICAgICAgICAgICRBZ2VudFNlbmROb3RpZmljYXRpb24gPSAkQnVuZGxlLT57UmVjaXBpZW50Tm90aWZpY2F0aW9uVHJhbnNwb3J0fS0+eyRVc2VyUHJlZmVyZW5jZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoIGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e0FnZW50RW5hYmxlZEJ5RGVmYXVsdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkQWdlbnRTZW5kTm90aWZpY2F0aW9uID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAhSXNBcnJheVJlZldpdGhEYXRhKCAkTm90aWZpY2F0aW9ue0RhdGF9LT57VmlzaWJsZUZvckFnZW50fSApCiAgICAgICAgICAgICAgICAgICAgfHwgKAogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9LT5bMF0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgISROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9LT5bMF0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRBZ2VudFNlbmROb3RpZmljYXRpb24gPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2tpcCBzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gaWYgdGhlIGFnZW50IGhhcyBkaXNhYmxlIGl0IGluIGl0cyBwcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0gKQogICAgICAgICAgICAgICAgICAgICYmICROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9LT5bMF0KICAgICAgICAgICAgICAgICAgICAmJiAkQnVuZGxlLT57UmVjaXBpZW50fS0+e1R5cGV9IGVxICdBZ2VudCcKICAgICAgICAgICAgICAgICAgICAmJiAhJEFnZW50U2VuZE5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEJVTkRMRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fU2VuZFJlY2lwaWVudE5vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSAgICAgICB8fCAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uICAgICAgICAgID0+ICRCdW5kbGUtPntOb3RpZmljYXRpb259LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyTWVzc2FnZVBhcmFtcyA9PiAkUGFyYW17RGF0YX0tPntDdXN0b21lck1lc3NhZ2VQYXJhbXN9IHx8IHt9LAogICAgICAgICAgICAgICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICA9PiAkQnVuZGxlLT57UmVjaXBpZW50fSwKICAgICAgICAgICAgICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgICAgICAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRPYmplY3QgICAgICAgPT4gJFRyYW5zcG9ydE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gaGF2ZSBzZW50CiAgICAgICAgICAgICAgICAkQWxyZWFkeVNlbnR7ICRCdW5kbGUtPntSZWNpcGllbnR9LT57VXNlcklEfSB9ID0gMTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHNwZWNpYWwgcmVjaXBpZW50cyBzcGVjaWZpYyBmb3IgZWFjaCB0cmFuc3BvcnQKICAgICAgICAgICAgbXkgQFRyYW5zcG9ydFJlY2lwaWVudHMgPSAkVHJhbnNwb3J0T2JqZWN0LT5HZXRUcmFuc3BvcnRSZWNpcGllbnRzKAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uID0+IFwlTm90aWZpY2F0aW9uLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgIUBUcmFuc3BvcnRSZWNpcGllbnRzOwoKICAgICAgICAgICAgUkVDSVBJRU5UOgogICAgICAgICAgICBmb3IgbXkgJFJlY2lwaWVudCAoQFRyYW5zcG9ydFJlY2lwaWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgYWxsIG5vdGlmaWNhdGlvbiB0YWdzIGZvciBlYWNoIHNwZWNpYWwgcmVjaXBpZW50CiAgICAgICAgICAgICAgICBteSAlUmVwbGFjZWROb3RpZmljYXRpb24gPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPk5vdGlmaWNhdGlvbkV2ZW50KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICAgICBSZWNpcGllbnQgICAgICAgICAgICAgPT4gJFJlY2lwaWVudCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fU2VuZFJlY2lwaWVudE5vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSAgICAgICB8fCAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uICAgICAgICAgID0+IFwlUmVwbGFjZWROb3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30sCiAgICAgICAgICAgICAgICAgICAgUmVjaXBpZW50ICAgICAgICAgICAgID0+ICRSZWNpcGllbnQsCiAgICAgICAgICAgICAgICAgICAgRXZlbnQgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFdmVudH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0ICAgICAgICAgICAgID0+ICRUcmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0T2JqZWN0ICAgICAgID0+ICRUcmFuc3BvcnRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAlQWxyZWFkeVNlbnQgJiYgJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfSAmJiAkUGFyYW17RGF0YX0tPntBcnRpY2xlVHlwZX0gKSB7CgogICAgICAgICAgICAjIHVwZGF0ZSB0byBmaWVsZAogICAgICAgICAgICBteSAkVXBkYXRlVG9TdWNjZXNzID0gJFNlbGYtPl9BcnRpY2xlVG9VcGRhdGUoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICA9PiAkUGFyYW17RGF0YX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZVR5cGUgPT4gJFBhcmFte0RhdGF9LT57QXJ0aWNsZVR5cGV9LAogICAgICAgICAgICAgICAgVXNlcklEcyAgICAgPT4gXCVBbHJlYWR5U2VudCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZXJyb3JzCiAgICAgICAgICAgIGlmICggISRVcGRhdGVUb1N1Y2Nlc3MgKSB7CgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHVwZGF0ZSBUbyBmaWVsZCBmb3IgQXJ0aWNsZTogJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfS4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MKICAgICRTZWxmLT5fRnV0dXJlVGFza1VwZGF0ZSgpOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX05vdGlmaWNhdGlvbkZpbHRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50IENhbGVuZGFyIE5vdGlmaWNhdGlvbikpIHsKICAgICAgICByZXR1cm4gaWYgISRQYXJhbXskTmVlZGVkfTsKICAgIH0KCiAgICAjIHNldCBsb2NhbCB2YWx1ZXMKICAgIG15ICVOb3RpZmljYXRpb24gPSAleyAkUGFyYW17Tm90aWZpY2F0aW9ufSB9OwoKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICROb3RpZmljYXRpb257RGF0YX0gKTsKCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkTm90aWZpY2F0aW9ue0RhdGF9IH0gKSB7CgogICAgICAgICMgaWdub3JlIG5vdCBhcHBvaW50bWVudCByZWxhdGVkIGF0dHJpYnV0ZXMKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdSZWNpcGllbnRzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdTa2lwUmVjaXBpZW50cyc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnUmVjaXBpZW50QWdlbnRzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdSZWNpcGllbnRHcm91cHMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1JlY2lwaWVudFJvbGVzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdUcmFuc3BvcnRFbWFpbFRlbXBsYXRlJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdFdmVudHMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVUeXBlSUQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVTZW5kZXJUeXBlSUQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVTdWJqZWN0TWF0Y2gnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVCb2R5TWF0Y2gnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FydGljbGVBdHRhY2htZW50SW5jbHVkZSc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnTm90aWZpY2F0aW9uQXJ0aWNsZVR5cGVJRCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnVHJhbnNwb3J0cyc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnT25jZVBlckRheSc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnVmlzaWJsZUZvckFnZW50JzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdWaXNpYmxlRm9yQWdlbnRUb29sdGlwJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdMYW5ndWFnZUlEJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdTZW5kT25PdXRPZk9mZmljZSc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQWdlbnRFbmFibGVkQnlEZWZhdWx0JzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdOb3RpZmljYXRpb25UeXBlJzsKCiAgICAgICAgIyBjaGVjayByZWNpcGllbnQgZmllbGRzIGZyb20gdHJhbnNwb3J0IG1ldGhvZHMKICAgICAgICBpZiAoICRLZXkgPX4gbXtcQSBSZWNpcGllbnR9eG1zICkgewogICAgICAgICAgICBuZXh0IEtFWTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYXBwb2ludG1lbnQgYXR0cmlidXRlcwogICAgICAgIG5leHQgS0VZIGlmICEkTm90aWZpY2F0aW9ue0RhdGF9LT57JEtleX07CiAgICAgICAgbmV4dCBLRVkgaWYgIUB7ICROb3RpZmljYXRpb257RGF0YX0tPnskS2V5fSB9OwogICAgICAgIG5leHQgS0VZIGlmICEkTm90aWZpY2F0aW9ue0RhdGF9LT57JEtleX0tPlswXTsKCiAgICAgICAgbXkgJE1hdGNoID0gMDsKCiAgICAgICAgVkFMVUU6CiAgICAgICAgZm9yIG15ICRWYWx1ZSAoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPnskS2V5fSB9ICkgewoKICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhJFZhbHVlOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEtleSBlcSAnVGVhbUlEJwogICAgICAgICAgICAgICAgfHwgJEtleSBlcSAnUmVzb3VyY2VJRCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZXhpc3Rpbmcgb2JqZWN0IGlkcyBpbiBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0FwcG9pbnRtZW50fS0+eyRLZXl9ICk7CgogICAgICAgICAgICAgICAgT0JKRUNUSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJE9iamVjdElEICggQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+eyRLZXl9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgIG5leHQgT0JKRUNUSUQgaWYgISRPYmplY3RJRDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVmFsdWUgZXEgJE9iamVjdElEICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTWF0Y2ggPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFZBTFVFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte0FwcG9pbnRtZW50fS0+eyRLZXl9ICYmICRWYWx1ZSBlcSAkUGFyYW17QXBwb2ludG1lbnR9LT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE1hdGNoID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IFZBTFVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWYgISRNYXRjaDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9SZWNpcGllbnRzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnQgQ2FsZW5kYXIgTm90aWZpY2F0aW9uKSkgewogICAgICAgIHJldHVybiBpZiAhJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICMgc2V0IGxvY2FsIHZhbHVlcwogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CiAgICBteSAlQXBwb2ludG1lbnQgID0gJXsgJFBhcmFte0FwcG9pbnRtZW50fSB9OwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgIG15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSBAUmVjaXBpZW50VXNlcklEczsKICAgIG15IEBSZWNpcGllbnRVc2VyczsKCiAgICAjIGFkZCBwcmUtY2FsY3VsYXRlZCByZWNpcGllbnQKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntSZWNpcGllbnRzfSApICkgewogICAgICAgIHB1c2ggQFJlY2lwaWVudFVzZXJJRHMsIEB7ICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudHN9IH07CiAgICB9CgogICAgIyByZW1lbWJlciBwcmUtY2FsY3VsYXRlZCB1c2VyIHJlY2lwaWVudHMgZm9yIGxhdGVyIGNvbXBhcmlzb25zCiAgICBteSAlUHJlY2FsY3VsYXRlZFVzZXJJRHMgPSBtYXAgeyAkXyA9PiAxIH0gQFJlY2lwaWVudFVzZXJJRHM7CgogICAgIyBnZXQgcmVjaXBpZW50cyBieSBSZWNpcGllbnRzCiAgICBpZiAoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRzfSApIHsKCiAgICAgICAgUkVDSVBJRU5UOgogICAgICAgIGZvciBteSAkUmVjaXBpZW50ICggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudHN9IH0gKSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUmVjaXBpZW50CiAgICAgICAgICAgICAgICA9fiAvXkFwcG9pbnRtZW50KEFnZW50c3xBZ2VudFJlYWRQZXJtaXNzaW9uc3xBZ2VudFdyaXRlUGVybWlzc2lvbnMpJC8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkUmVjaXBpZW50IGVxICdBcHBvaW50bWVudEFnZW50cycgKSB7CgogICAgICAgICAgICAgICAgICAgIFJFU09VUkNFSUQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZXNvdXJjZUlEICggQHsgJEFwcG9pbnRtZW50e1Jlc291cmNlSUR9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFJFU09VUkNFSUQgaWYgISRSZXNvdXJjZUlEOwoKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkTm90aWZpY2F0aW9ue0RhdGF9LT57UmVjaXBpZW50QWdlbnRzfSB9LCAkUmVzb3VyY2VJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWNpcGllbnQgZXEgJ0FwcG9pbnRtZW50QWdlbnRSZWFkUGVybWlzc2lvbnMnICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBjYWxlbmRhciBpbmZvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9IHx8ICRQYXJhbXtDYWxlbmRhcn0tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGEgbGlzdCBvZiByZWFkIGFjY2VzcyB1c2VycyBmb3IgdGhlIHJlbGF0ZWQgY2FsZW5kYXIKICAgICAgICAgICAgICAgICAgICBteSAlVXNlcnMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkQ2FsZW5kYXJ7R3JvdXBJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBVU0VSSUQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVVzZXJzICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VySUQ7CgogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRBZ2VudHN9IH0sICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50IGVxICdBcHBvaW50bWVudEFnZW50V3JpdGVQZXJtaXNzaW9ucycgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGNhbGVuZGFyIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJFBhcmFte0NhbGVuZGFyfS0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+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=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6OlRpY2tldEFwcG9pbnRtZW50czsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpBc3luY2hyb25vdXNFeGVjdXRvcik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEV2ZW50IERhdGEgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQXBwb2ludG1lbnRJRCBpbiBEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29wIHByb3RlY3Rpb246IHByZXZlbnQgZnJvbSBydW5uaW5nIGlmIHVwZGF0ZSB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB0aWNrZXQgdXBkYXRlCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJykKICAgICAgICAtPnsnX1RpY2tldEFwcG9pbnRtZW50czo6VGlja2V0VXBkYXRlJ30KICAgICAgICAtPnsgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0gfSsrCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJ1biBvbmx5IG9uIHRpY2tldCBhcHBvaW50bWVudHMgKGdldCB0aWNrZXQgaWQpCiAgICBteSAkVGlja2V0SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+VGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJFRpY2tldElEOwoKICAgICMgdXBkYXRlIHRpY2tldCBpbiBhbiBhc3luY2hyb25vdXMgY2FsbAogICAgcmV0dXJuICRTZWxmLT5Bc3luY0NhbGwoCiAgICAgICAgT2JqZWN0TmFtZSAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAgICAgRnVuY3Rpb25OYW1lICAgPT4gJ1RpY2tldEFwcG9pbnRtZW50VXBkYXRlVGlja2V0JywKICAgICAgICBGdW5jdGlvblBhcmFtcyA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgIH0sCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXhwb3J0OjpJQ2FsOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERhdGE6OklDYWw7CnVzZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQ7CnVzZSBEYXRlOjpJQ2FsOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIGNvbnN0YW50IFBBQ0tBR0VfTkFNRSA9PiAnT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXInOwoKb3VyICRQYWNrYWdlVmVyc2lvbjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpQYWNrYWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWwgLSBpQ2FsZW5kYXIgZXhwb3J0IGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpFeHBvcnQgZnVuY3Rpb25zIGZvciBpQ2FsZW5kYXIgZm9ybWF0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV4cG9ydDo6SUNhbCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBteSAkUGFja2FnZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQYWNrYWdlJyk7CgogICAgbXkgJFBhY2thZ2VJbnN0YWxsZWQgPSAkUGFja2FnZU9iamVjdC0+UGFja2FnZUlzSW5zdGFsbGVkKAogICAgICAgIE5hbWUgPT4gUEFDS0FHRV9OQU1FLAogICAgKTsKCiAgICAjIElmIHBhY2thZ2UgaXMgaW5zdGFsbGVkLCBnZXQgdmVyc2lvbiBmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXIuCiAgICBpZiAoJFBhY2thZ2VJbnN0YWxsZWQpIHsKICAgICAgICBteSBATGlzdCA9ICRQYWNrYWdlT2JqZWN0LT5SZXBvc2l0b3J5TGlzdCgKICAgICAgICAgICAgUmVzdWx0ID0+ICdzaG9ydCcsCiAgICAgICAgKTsKCiAgICAgICAgUEFDS0FHRToKICAgICAgICBmb3IgbXkgJFBhY2thZ2UgKEBMaXN0KSB7CiAgICAgICAgICAgIGlmICggJFBhY2thZ2UtPntOYW1lfSBlcSBQQUNLQUdFX05BTUUgKSB7CiAgICAgICAgICAgICAgICAkUGFja2FnZVZlcnNpb24gPSAkUGFja2FnZS0+e1ZlcnNpb259OwogICAgICAgICAgICAgICAgbGFzdCBQQUNLQUdFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgT3RoZXJ3aXNlLCBpbmNsdWRlIGZyYW1ld29yayB2ZXJzaW9uIG9ubHkuCiAgICBlbHNlIHsKICAgICAgICAkUGFja2FnZVZlcnNpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1ZlcnNpb24nKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEV4cG9ydCgpCgpleHBvcnQgY2FsZW5kYXIgdG8gaUNhbGVuZGFyIGZvcm1hdAoKICAgIG15ICRJQ2FsU3RyaW5nID0gJEV4cG9ydE9iamVjdC0+RXhwb3J0KAogICAgICAgIENhbGVuZGFySUQgICA9PiAxLCAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLCAgICAjIChyZXF1aXJlZCkgVXNlcklECiAgICApOwoKcmV0dXJucyBpQ2FsZW5kYXIgc3RyaW5nIGlmIHN1Y2Nlc3NmdWwKCj1jdXQKCnN1YiBFeHBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVDYWxlbmRhciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJENhbGVuZGFye0NhbGVuZGFySUR9OwoKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICBteSBAQXBwb2ludG1lbnRJRHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICApOwoKICAgIG15ICRJQ2FsQ2FsZW5kYXIgPSBEYXRhOjpJQ2FsLT5uZXcoCiAgICAgICAgY2FsbmFtZSA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJOYW1lfSwKICAgICk7CgogICAgIyBleHBvcnQgY29sb3IgZm9yIGFwcGxlIGNhbGVuZGFyCiAgICAkSUNhbENhbGVuZGFyLT5hZGRfcHJvcGVydHkoCiAgICAgICAgJ3gtYXBwbGUtY2FsZW5kYXItY29sb3InID0+ICRDYWxlbmRhcntDb2xvcn0sCiAgICApOwoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CiAgICBteSAkUGx1Z2luT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwoKICAgIG15ICRUZWFtT2JqZWN0OwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgfQoKICAgIEFQUE9JTlRNRU5UX0lEOgogICAgZm9yIG15ICRBcHBvaW50bWVudElEIChAQXBwb2ludG1lbnRJRHMpIHsKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGlmICEkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH07CgogICAgICAgICMgY2FsY3VsYXRlIHN0YXJ0IHRpbWUKICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgKTsKICAgICAgICBteSAkSUNhbFN0YXJ0VGltZSA9IERhdGU6OklDYWwtPm5ldygKICAgICAgICAgICAgZXBvY2ggPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwoKICAgICAgICAjIGNhbGN1bGF0ZSBlbmQgdGltZQogICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0VuZFRpbWV9LAogICAgICAgICk7CiAgICAgICAgbXkgJElDYWxFbmRUaW1lID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICBlcG9jaCA9PiAkRW5kVGltZSwKICAgICAgICApOwoKICAgICAgICAjIHJlY2FsY3VsYXRlIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50LCBkaXNjYXJkIHRpbWUgZGF0YQogICAgICAgIGlmICggJEFwcG9pbnRtZW50e0FsbERheX0gKSB7CiAgICAgICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElDYWxTdGFydFRpbWUgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgICAgICB5ZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICBtb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgZGF5ICAgID0+ICREYXksCiAgICAgICAgICAgICAgICBvZmZzZXQgPT4gJyswMDAwJywgICAgIyBVVEMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElDYWxFbmRUaW1lID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICAgICAgeWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgbW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgICAgIGRheSAgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgb2Zmc2V0ID0+ICcrMDAwMCcsICAgICMgVVRDCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBpQ2FsZW5kYXIgZXZlbnQgZW50cnkKICAgICAgICBteSAkSUNhbEV2ZW50ID0gRGF0YTo6SUNhbDo6RW50cnk6OkV2ZW50LT5uZXcoKTsKCiAgICAgICAgIyBvcHRpb25hbCBwcm9wZXJ0aWVzCiAgICAgICAgbXkgJUlDYWxFdmVudFByb3BlcnRpZXM7CgogICAgICAgICMgcmVwZWF0YWJsZSBwcm9wZXJ0aWVzCiAgICAgICAgbXkgQElDYWxSZXBlYXRhYmxlUHJvcGVydGllczsKCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7RGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tkZXNjcmlwdGlvbn0gPSAkQXBwb2ludG1lbnR7RGVzY3JpcHRpb259OwogICAgICAgIH0KICAgICAgICBpZiAoICRBcHBvaW50bWVudHtMb2NhdGlvbn0gKSB7CiAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze2xvY2F0aW9ufSA9ICRBcHBvaW50bWVudHtMb2NhdGlvbn07CiAgICAgICAgfQogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmluZ30gKSB7CiAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSA9ICcnOwoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdEYWlseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gJ0ZSRVE9REFJTFknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnRlJFUT1XRUVLTFknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gJ0ZSRVE9TU9OVEhMWSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknICkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICdGUkVRPVlFQVJMWSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21EYWlseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gIkZSRVE9REFJTFk7SU5URVJWQUw9JEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiRlJFUT1XRUVLTFk7SU5URVJWQUw9JEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0iOwoKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBARGF5TmFtZXM7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGF5ICggQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERheSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdNTyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF5ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ1RVJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXkgPT0gMyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheU5hbWVzLCAnV0UnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERheSA9PSA0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdUSCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF5ID09IDUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ0ZSJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXkgPT0gNiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheU5hbWVzLCAnU0EnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERheSA9PSA3ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdTVSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiO0JZREFZPSIgLiBqb2luKCAiLCIsIEBEYXlOYW1lcyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gIkZSRVE9TU9OVEhMWTtJTlRFUlZBTD0kQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSI7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gIjtCWU1PTlRIREFZPSIgLiBqb2luKCAiLCIsIEB7ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSB9ICk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKICAgICAgICAgICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiRlJFUT1ZRUFSTFk7SU5URVJWQUw9JEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH07QllNT05USERBWT0kRGF5IjsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiO0JZTU9OVEg9IiAuIGpvaW4oICIsIiwgQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH0gKTsKCiAgICAgICAgICAgICAgICAjIFJSVUxFOkZSRVE9WUVBUkxZO1VOVElMPTIwMjAwNjAyVDA4MDAwMFo7SU5URVJWQUw9MjtCWU1PTlRIREFZPTE7QllNT05USD00CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkSUNhbFJlY3VycmVuY2VVbnRpbCA9IERhdGU6OklDYWwtPm5ldygKICAgICAgICAgICAgICAgICAgICBlcG9jaCA9PiAkUmVjdXJyZW5jZVVudGlsLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnO1VOVElMPScgLiBzdWJzdHIoICRJQ2FsUmVjdXJyZW5jZVVudGlsLT5pY2FsKCksIDAsIC0xICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUNvdW50fSApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnO0NPVU5UPScgLiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUNvdW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRXhjbHVkZX0gKSB7CiAgICAgICAgICAgICAgICBSRUNVUlJFTkNFX0VYQ0xVREU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFJlY3VycmVuY2VFeGNsdWRlICggQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VFeGNsdWRlfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgUkVDVVJSRU5DRV9FWENMVURFIGlmICEkUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VJRCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZWN1cnJlbmNlRXhjbHVkZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRJQ2FsUmVjdXJyZW5jZUlEID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICBlcG9jaCA9PiAkUmVjdXJyZW5jZUlELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQElDYWxSZXBlYXRhYmxlUHJvcGVydGllcywgewogICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSA9PiAnZXhkYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEFwcG9pbnRtZW50e0FsbERheX0KICAgICAgICAgICAgICAgICAgICAgICAgPyBzdWJzdHIoICRJQ2FsUmVjdXJyZW5jZUlELT5pY2FsKCksIDAsIC0xICkKICAgICAgICAgICAgICAgICAgICAgICAgOiAkSUNhbFJlY3VycmVuY2VJRC0+aWNhbCgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb2NjdXJyZW5jZSBhcHBvaW50bWVudAogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1BhcmVudElEfSApIHsKCiAgICAgICAgICAgICMgb3ZlcnJpZGRlbiBvY2N1cnJlbmNlcyBvbmx5CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9CiAgICAgICAgICAgICAgICAmJiBncmVwIHsgKCAkXyAvLyAnJyApIGVxICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9IH0gQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VFeGNsdWRlfSB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSByZWN1cnJlbmNlIGlkCiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZUlEID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkSUNhbFJlY3VycmVuY2VJRCA9IERhdGU6OklDYWwtPm5ldygKICAgICAgICAgICAgICAgICAgICBlcG9jaCA9PiAkUmVjdXJyZW5jZUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3sncmVjdXJyZW5jZS1pZCd9CiAgICAgICAgICAgICAgICAgICAgPSAkQXBwb2ludG1lbnR7QWxsRGF5fSA/IHN1YnN0ciggJElDYWxSZWN1cnJlbmNlSUQtPmljYWwoKSwgMCwgLTEgKSA6ICRJQ2FsUmVjdXJyZW5jZUlELT5pY2FsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2tpcCBpZiBub3Qgb3ZlcnJpZGRlbgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRfSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2FsY3VsYXRlIGxhc3QgbW9kaWZpZWQgdGltZQogICAgICAgIG15ICRDaGFuZ2VUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0NoYW5nZVRpbWV9LAogICAgICAgICk7CiAgICAgICAgbXkgJElDYWxDaGFuZ2VUaW1lID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICBlcG9jaCA9PiAkQ2hhbmdlVGltZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKICAgICAgICBpZiAoJFRlYW1PYmplY3QpIHsKCiAgICAgICAgICAgICMgaW5jbHVkZSB0ZWFtIG5hbWVzCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RlYW1JRH0gKSB7CiAgICAgICAgICAgICAgICBteSBAVGVhbXM7CgogICAgICAgICAgICAgICAgIyBnZXQgdGVhbSBuYW1lcwogICAgICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyAkQXBwb2ludG1lbnR7VGVhbUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICgkVGVhbUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVUZWFtID0gJFRlYW1PYmplY3QtPlRlYW1HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGVhbXtOYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1zLCAkVGVhbXtOYW1lfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChAVGVhbXMpIHsKICAgICAgICAgICAgICAgICAgICAkSUNhbEV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICAgICAgICAgICAgICAgICAgIngtb3Rycy10ZWFtIiA9PiBqb2luKCAnLCcsIEBUZWFtcyApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaW5jbHVkZSByZXNvdXJjZSBuYW1lcwogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZXNvdXJjZUlEfSApIHsKICAgICAgICAgICAgICAgIG15IEBVc2VyczsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBAeyAkQXBwb2ludG1lbnR7UmVzb3VyY2VJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJFVzZXJJRCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRVc2Vye1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBVc2VycywgJFVzZXJ7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChAVXNlcnMpIHsKICAgICAgICAgICAgICAgICAgICAkSUNhbEV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICAgICAgICAgICAgICAgICAgIngtb3Rycy1yZXNvdXJjZSIgPT4gam9pbiggJywnLCBAVXNlcnMgKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGluY2x1ZGUgcGx1Z2luIChsaW5rKSBkYXRhCiAgICAgICAgbXkgJFBsdWdpbkxpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaXN0KCk7CiAgICAgICAgZm9yIG15ICRQbHVnaW5LZXkgKCBzb3J0IGtleXMgJXskUGx1Z2luTGlzdH0gKSB7CiAgICAgICAgICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXksCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBATGlua0FycmF5OwogICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBMaW5rQXJyYXksICRMaW5rTGlzdC0+eyRMaW5rSUR9LT57TGlua0lEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEBMaW5rQXJyYXkpIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnQtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgICAgICAgICAgICAgICJ4LW90cnMtcGx1Z2luLSRQbHVnaW5LZXkiID0+IGpvaW4oICcsJywgQExpbmtBcnJheSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgYm90aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcHJvcGVydGllcwogICAgICAgICMgcmVtb3ZlIHRpbWUgem9uZSBmbGFnIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cwogICAgICAgICRJQ2FsRXZlbnQtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgICAgICBzdW1tYXJ5ICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1RpdGxlfSwKICAgICAgICAgICAgZHRzdGFydCAgICAgICAgID0+ICRBcHBvaW50bWVudHtBbGxEYXl9ID8gc3Vic3RyKCAkSUNhbFN0YXJ0VGltZS0+aWNhbCgpLCAwLCAtMSApIDogJElDYWxTdGFydFRpbWUtPmljYWwoKSwKICAgICAgICAgICAgZHRlbmQgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtBbGxEYXl9ID8gc3Vic3RyKCAkSUNhbEVuZFRpbWUtPmljYWwoKSwgMCwgLTEgKSA6ICRJQ2FsRW5kVGltZS0+aWNhbCgpLAogICAgICAgICAgICB1aWQgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1VuaXF1ZUlEfSwKICAgICAgICAgICAgJ2xhc3QtbW9kaWZpZWQnID0+ICRJQ2FsQ2hhbmdlVGltZS0+aWNhbCgpLAogICAgICAgICAgICAlSUNhbEV2ZW50UHJvcGVydGllcywKICAgICAgICApOwoKICAgICAgICAjIGFkZCByZXBlYXRhYmxlIHByb3BlcnRpZXMKICAgICAgICBmb3IgbXkgJFJlcGVhdGFibGUgKEBJQ2FsUmVwZWF0YWJsZVByb3BlcnRpZXMpIHsKICAgICAgICAgICAgJElDYWxFdmVudC0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgICAgICAkUmVwZWF0YWJsZS0+e1Byb3BlcnR5fSA9PiAkUmVwZWF0YWJsZS0+e1ZhbHVlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRJQ2FsQ2FsZW5kYXItPmFkZF9lbnRyeSgkSUNhbEV2ZW50KTsKICAgIH0KCiAgICByZXR1cm4gJElDYWxDYWxlbmRhci0+YXNfc3RyaW5nKCk7Cn0KCnsKICAgIG5vIHdhcm5pbmdzICdyZWRlZmluZSc7ICAgICMjIG5vIGNyaXRpYwoKICAgICMgSW5jbHVkZSBwYWNrYWdlIG5hbWUgYW5kIHZlcnNpb24gaW4gcHJvZHVjdCBJRCBwcm9wZXJ0eSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBieSByZWRlZmluaW5nCiAgICAjICAgZXh0ZXJuYWwgbGlicmFyeSBtZXRob2QuCiAgICBzdWIgRGF0YTo6SUNhbDo6cHJvZHVjdF9pZCB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgIHJldHVybiBQQUNLQUdFX05BTUUgLiAnICcgLiAkUGFja2FnZVZlcnNpb247CiAgICB9Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SW1wb3J0OjpJQ2FsOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERhdGE6OklDYWw7CnVzZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQ7CnVzZSBEYXRlOjpJQ2FsOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SW1wb3J0OjpJQ2FsIC0gaUNhbGVuZGFyIGltcG9ydCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKSW1wb3J0IGZ1bmN0aW9ucyBmb3IgaUNhbGVuZGFyIGZvcm1hdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkSW1wb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWwnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBJbXBvcnQoKQoKaW1wb3J0IGNhbGVuZGFyIGluIGlDYWxlbmRhciBmb3JtYXQKICAgIG15ICRTdWNjZXNzID0gJEltcG9ydE9iamVjdC0+SW1wb3J0KAogICAgICAgIENhbGVuZGFySUQgICAgID0+IDEyMywKICAgICAgICBJQ2FsICAgICAgICAgICA9PiAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgaUNhbCBzdHJpbmcKICAgICAgICAgICAgJwogICAgICAgICAgICAgICAgQkVHSU46VkNBTEVOREFSCiAgICAgICAgICAgICAgICBQUk9ESUQ6WmltYnJhLUNhbGVuZGFyLVByb3ZpZGVyCiAgICAgICAgICAgICAgICBWRVJTSU9OOjIuMAogICAgICAgICAgICAgICAgTUVUSE9EOlJFUVVFU1QKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAnLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKICAgICAgICBVcGRhdGVFeGlzdGluZyA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRGVsZXRlIGV4aXN0aW5nIEFwcG9pbnRtZW50cyB3aXRoaW4gc2FtZSBDYWxlbmRhciBpZiBVbmlxdWVJRCBtYXRjaGVzCiAgICAgICAgVW50aWxMaW1pdCAgICAgPT4gJzIwMTctMDEtMDEgMDA6MDA6MDAnLCAgIyAob3B0aW9uYWwpIElmIHByb3ZpZGVkLCBzeXN0ZW0gd2lsbCB1c2UgdGhpcyB2YWx1ZSBmb3IgbGltaXRpbmcgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGRlZmluZWQgZW5kIGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluc3RlYWQgb2YgQXBwb2ludG1lbnRDYWxlbmRhcjo6SW1wb3J0OjpSZWN1cnJpbmdNb250aHNMaW1pdCB0byBkbyB0aGUgY2FsY3VsYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5PVEU6IFBMRUFTRSBVU0UgVEhJUyBQQVJBTUVURVIgRk9SIFVOSVQgVEVTVFMgT05MWQogICAgKTsKCnJldHVybnMgbnVtYmVyIG9mIGltcG9ydGVkIGFwcG9pbnRtZW50cyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgMAoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBJQ2FsIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVW50aWxMaW1pdGVkVGltZXN0YW1wID0gJFBhcmFte1VudGlsTGltaXR9IHx8ICcnOwoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgaWYgKCAhJFVudGlsTGltaXRlZFRpbWVzdGFtcCApIHsKCiAgICAgICAgIyBjYWxjdWxhdGUgdW50aWwgdGltZSB3aGljaCB3aWxsIGJlIHVzZWQgaWYgdGhlcmUgaXMgYW55IHJlY3VycmluZyBBcHBvaW50bWVudCB3aXRob3V0IGVuZCB0aW1lIGRlZmluZWQuCiAgICAgICAgbXkgJEN1cnJlbnRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwogICAgICAgIG15ICRSZWN1cnJpbmdNb250aHNMaW1pdAogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiQXBwb2ludG1lbnRDYWxlbmRhcjo6SW1wb3J0OjpSZWN1cnJpbmdNb250aHNMaW1pdCIpCiAgICAgICAgICAgIHx8ICcxMic7ICAgICMgZGVmYXVsdCAxMiBtb250aHMKCiAgICAgICAgbXkgJFVudGlsTGltaXRlZFN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICBUaW1lICAgPT4gJEN1cnJlbnRTeXN0ZW1UaW1lLAogICAgICAgICAgICBNb250aHMgPT4gJFJlY3VycmluZ01vbnRoc0xpbWl0LAogICAgICAgICk7CiAgICAgICAgJFVudGlsTGltaXRlZFRpbWVzdGFtcCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRVbnRpbExpbWl0ZWRTeXN0ZW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFR1cm4gb24gVVRGOCBmbGFnIG9uIHN1cHBsaWVkIHN0cmluZyBmb3IgY29ycmVjdCBlbmNvZGluZyBpbiBQb3N0Z3JlU1FMIGJhY2tlbmQuCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZUlucHV0KCBcJFBhcmFte0lDYWx9ICk7CgogICAgbXkgJENhbGVuZGFyID0gRGF0YTo6SUNhbC0+bmV3KCBkYXRhID0+ICRQYXJhbXtJQ2FsfSApOwoKICAgICMgSWYgZXh0ZXJuYWwgbGlicmFyeSBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBJQ1MgZmlsZSwgbG9nIHRoZSByZWNlaXZlZCBtZXNzYWdlCiAgICAjICAgYXQgdGhpcyB0aW1lIGFuZCByZXR1cm4uCiAgICBpZiAoICRDYWxlbmRhci0+e2Vycm5vfSApIHsKICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gJENhbGVuZGFyLT57ZXJyb3JfbWVzc2FnZX0gLy8gJyc7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJbRGF0YTo6SUNhbF0gJEVycm9yTWVzc2FnZSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQEVudHJpZXMgICAgICAgICAgICAgID0gQHsgJENhbGVuZGFyLT5lbnRyaWVzKCkgfTsKICAgIG15ICRBcHBvaW50bWVudHNJbXBvcnRlZCA9IDA7CiAgICBteSAlSUNhbFRpbWVab25lczsKCiAgICBteSAkUGx1Z2luT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+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+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRFbmRUaW1lIC09ICRPZmZzZXQgKiAzNjAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkUGFyYW1ldGVyc3tBbGxEYXl9ICkgewogICAgICAgICAgICAgICAgbXkgJExvY2FsT2Zmc2V0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5Mb2NhbFRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEVuZFRpbWUgKz0gJExvY2FsT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnN7RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFNvbWUgaUNhbGVuZGFyIGltcGxlbWVudGF0aW9ucyAobG9va2luZyBhdCB5b3UgaWNhbGVuZGFyLXJ1YnkpIGRvIG5vdCByZXF1aXJlIG5vciBpbmNsdWRlCiAgICAgICAgIyAgIGVuZCB0aW1lIGZvciBhcHBvaW50bWVudHMuIEluIHRoaXMgY2FzZSwgcHJldmVudCBmYWlsaW5nIGFuZCB1c2Ugc3RhcnQgdGltZSBpbnN0ZWFkLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW1ldGVyc3tFbmRUaW1lfSA9ICRQYXJhbWV0ZXJze1N0YXJ0VGltZX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsb2NhdGlvbgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+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+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRMaW5rU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIG9iamVjdCBsaW5rIChBcHBvaW50bWVudElEPSRTdWNjZXNzIC0gJFBsdWdpbktleT0kUGx1Z2luRGF0YSkgZHVyaW5nIGNhbGVuZGFyIGltcG9ydCEiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXBwb2ludG1lbnRzSW1wb3J0ZWQrKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRBcHBvaW50bWVudHNJbXBvcnRlZDsKfQoKc3ViIF9Gb3JtYXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaW1lU3RhbXA7CgogICAgaWYgKCAkUGFyYW17VGltZX0gPX4gLyhcZHs0fSkoXGR7Mn0pKFxkezJ9KVQoXGR7Mn0pKFxkezJ9KShcZHsyfSkvaSApIHsKCiAgICAgICAgIyBmb3JtYXQgc3RyaW5nCiAgICAgICAgJFRpbWVTdGFtcCA9ICIkMS0kMi0kMyAkNDokNTokNiI7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtUaW1lfSA9fiAvKFxkezR9KShcZHsyfSkoXGR7Mn0pLyApIHsKCiAgICAgICAgIyBvbmx5IGRhdGUgaXMgZ2l2ZW4gKHdpdGhvdXQgdGltZSkKICAgICAgICAkVGltZVN0YW1wID0gIiQxLSQyLSQzIDAwOjAwOjAwIjsKICAgIH0KCiAgICByZXR1cm4gJFRpbWVTdGFtcDsKfQoKewogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsgICAgIyMgbm8gY3JpdGljCgogICAgIyBJbmNsdWRlIGFkZGl0aW9uYWwgb3B0aW9uYWwgcmVwZWF0YWJsZSBwcm9wZXJ0aWVzIHVzZWQgYnkgc29tZSBpQ2FsZW5kYXIgaW1wbGVtZW50YXRpb25zLCBpbiBvcmRlcgogICAgIyAgIHRvIHByZXZlbnQgUGVybCB3YXJuaW5ncy4KICAgIHN1YiBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Om9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcyB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgIHF3KAogICAgICAgICAgICB1aWQgYWNrbm93bGVkZ2VkIHJlbGF0ZWQtdG8gZGVzY3JpcHRpb24KICAgICAgICApOwogICAgfQp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cHM6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpEeW5hbWljRmllbGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpEeW5hbWljRmllbGQgLSBEeW5hbWljRmllbGQgYXBwb2ludG1lbnQgdHlwZQoKPWhlYWQxIFNZTk9QU0lTCgpEeW5hbWljRmllbGQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRpY2tldER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpEeW5hbWljRmllbGQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZXRUaW1lKCkKCnJldHVybnMgdGltZSB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCBhcHBvaW50bWVudCB0eXBlLgoKICAgIG15ICRTdGFydFRpbWUgPSAkVGlja2V0RHluYW1pY0ZpZWxkT2JqZWN0LT5HZXRUaW1lKAogICAgICAgIFR5cGUgICAgID0+ICdEeW5hbWljRmllbGRfVGVzdERhdGUnLAogICAgICAgIFRpY2tldElEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEdldFRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGRhdGEgaW5jbC4gZHluYW1pYyBmaWVsZHMKICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKICAgIHJldHVybiBpZiAhJFRpY2tldHsgJFBhcmFte1R5cGV9IH07CgogICAgIyBjaGVjayBpZiB3ZSBmb3VuZCBhIHZhbGlkIHRpbWUgdmFsdWUgYW5kIHJldHVybiBpdAogICAgaWYgKCAkVGlja2V0eyAkUGFyYW17VHlwZX0gfSA9fiAnXGR7NH0tXGR7Mn0tXGR7Mn0gXGR7Mn06XGR7Mn06XGR7Mn0nICkgewogICAgICAgIHJldHVybiAkVGlja2V0eyAkUGFyYW17VHlwZX0gfTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIFNldFRpbWUoKQoKc2V0IHRpY2tldCBkeW5hbWljIGZpZWxkIHZhbHVlIHRvIHN1cHBsaWVkIHRpbWUgdmFsdWUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0RHluYW1pY0ZpZWxkT2JqZWN0LT5TZXRUaW1lKAogICAgICAgIFR5cGUgICAgID0+ICdEeW5hbWljRmllbGRfVGVzdERhdGUnLAogICAgICAgIFZhbHVlICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJwogICAgICAgIFRpY2tldElEID0+IDEsCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgU2V0VGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBWYWx1ZSBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGRhdGEKICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJFBhcmFte1R5cGV9OwogICAgJER5bmFtaWNGaWVsZE5hbWUgPX4gcy9eRHluYW1pY0ZpZWxkXy8vOwogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICApOwogICAgcmV0dXJuIGlmICEkRHluYW1pY0ZpZWxkOwoKICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWUKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZFZhbHVlJyktPlZhbHVlU2V0KAogICAgICAgIEZpZWxkSUQgID0+ICREeW5hbWljRmllbGQtPntJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBWYWx1ZSAgICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlRGF0ZVRpbWUgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpFc2NhbGF0aW9uVGltZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpFc2NhbGF0aW9uVGltZSAtIEVzY2FsYXRpb25UaW1lIGFwcG9pbnRtZW50IHR5cGUKCj1oZWFkMSBTWU5PUFNJUwoKRXNjYWxhdGlvblRpbWUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRpY2tldEVzY2FsYXRpb25UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gR2V0VGltZSgpCgpyZXR1cm5zIHRpbWUgdmFsdWUgZm9yIGVzY2FsYXRpb24gdGltZSBhcHBvaW50bWVudCB0eXBlLgoKICAgIG15ICRTb2x1dGlvblRpbWUgPSAkVGlja2V0RXNjYWxhdGlvblRpbWVPYmplY3QtPkdldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgR2V0VGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkVGlja2V0eyAkUGFyYW17VHlwZX0gLiAnRGVzdGluYXRpb25EYXRlJyB9OwoKICAgICMgcmV0dXJuIGVzY2FsYXRpb24gZGVzdGluYXRpb24gZGF0ZQogICAgcmV0dXJuICRUaWNrZXR7ICRQYXJhbXtUeXBlfSAuICdEZXN0aW5hdGlvbkRhdGUnIH07Cn0KCj1pdGVtIFNldFRpbWUoKQoKZG9lcyBub3RoaW5nLCBhcyB5b3UgY2Fubm90IGV4cGxpY2l0bHkgc2V0IHRpY2tldCBlc2NhbGF0aW9uIHRpbWVzLgpyZXR1cm5zIDEgdG8gcHJldmVudCBlcnJvcnMgaW4gbG9nLgoKPWN1dAoKc3ViIFNldFRpbWUgewogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpQZW5kaW5nVGltZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWUgLSBQZW5kaW5nVGltZSBhcHBvaW50bWVudCB0eXBlCgo9aGVhZDEgU1lOT1BTSVMKClBlbmRpbmdUaW1lIHRpY2tldCBhcHBvaW50bWVudCB0eXBlLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUaWNrZXRQZW5kaW5nVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpQZW5kaW5nVGltZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEdldFRpbWUoKQoKcmV0dXJucyB0aW1lIHZhbHVlIGZvciBwZW5kaW5nIHRpbWUgYXBwb2ludG1lbnQgdHlwZS4KCiAgICBteSAkUGVuZGluZ1RpbWUgPSAkVGlja2V0UGVuZGluZ1RpbWVPYmplY3QtPkdldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBHZXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRUaWNrZXR7VW50aWxUaW1lfTsKCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgcmV0dXJuIHBlbmRpbmcgdGltZQogICAgcmV0dXJuICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpICsgJFRpY2tldHtVbnRpbFRpbWV9LAogICAgKTsKfQoKPWl0ZW0gU2V0VGltZSgpCgpzZXQgdGlja2V0IHBlbmRpbmcgdGltZSB0byBzdXBwbGllZCB0aW1lIHZhbHVlLgoKICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFBlbmRpbmdUaW1lT2JqZWN0LT5TZXRUaW1lKAogICAgICAgIFR5cGUgICAgID0+ICdQZW5kaW5nVGltZScsCiAgICAgICAgVmFsdWUgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBTZXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFZhbHVlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNhbGVuZGFyIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBnZXQgZGF0ZSBjb21wb25lbnRzCiAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoIFN0cmluZyA9PiAkUGFyYW17VmFsdWV9ICksCiAgICApOwoKICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgIFllYXIgICAgID0+ICRZZWFyLAogICAgICAgIE1vbnRoICAgID0+ICRNb250aCwKICAgICAgICBEYXkgICAgICA9PiAkRGF5LAogICAgICAgIEhvdXIgICAgID0+ICRIb3VyLAogICAgICAgIE1pbnV0ZSAgID0+ICRNaW51dGUsCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkNhbGVuZGFyQXBwb2ludG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpCYXNlVGFza1dvcmtlcik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpTY2hlZHVsZXJUYXNrV29ya2VyOjpDYWxlbmRhckFwcG9pbnRtZW50IC0gU2NoZWR1bGVyIGRhZW1vbiB0YXNrIGhhbmRsZXIgbW9kdWxlIGZvciBDYWxlbmRhckFwcG9pbnRtZW50Cgo9aGVhZDEgU1lOT1BTSVMKClRoaXMgdGFzayBoYW5kbGVyIGV4ZWN1dGVzIGNhbGVuZGFyIGFwcG9pbnRtZW50IGpvYnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRhc2tIYW5kbGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tR2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpTY2hlZHVsZXJUYXNrV29ya2VyOjpDYWxlbmRhckFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0RlYnVnfSAgICAgID0gJFBhcmFte0RlYnVnfTsKICAgICRTZWxmLT57V29ya2VyTmFtZX0gPSAnV29ya2VyOiBDYWxlbmRhckFwcG9pbnRtZW50JzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpwZXJmb3JtcyB0aGUgc2VsZWN0ZWQgdGFzay4KCiAgICBteSAkUmVzdWx0ID0gJFRhc2tIYW5kbGVyT2JqZWN0LT5SdW4oCiAgICAgICAgVGFza0lEICAgPT4gMTIzLAogICAgICAgIFRhc2tOYW1lID0+ICdzb21lIG5hbWUnLCAgICAjIG9wdGlvbmFsCiAgICAgICAgRGF0YSAgICAgPT4geyAgICAgICAgICAgICAgICMgYXBwb2ludG1lbnQgaWQgYXMgZ290IGZyb20gS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudDo6QXBwb2ludG1lbnRHZXQoKQogICAgICAgICAgICBOb3RpZnlUaW1lID0+ICcyMDE2LTA4LTAyIDAzOjU5OjAwJywKICAgICAgICB9LAogICAgKTsKClJldHVybnM6CgogICAgJFJlc3VsdCA9IDE7ICMgb3IgZmFpbCBpbiBjYXNlIG9mIGFuIGVycm9yCgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB0YXNrIHBhcmFtcwogICAgbXkgJENoZWNrUmVzdWx0ID0gJFNlbGYtPl9DaGVja1Rhc2tQYXJhbXMoCiAgICAgICAgJVBhcmFtLAogICAgICAgIE5lZWRlZERhdGFBdHRyaWJ1dGVzID0+IFsnTm90aWZ5VGltZSddLAogICAgKTsKCiAgICAjIHN0b3AgZXhlY3V0aW9uIGlmIGFuIGVycm9yIGluIHBhcmFtcyBpcyBkZXRlY3RlZAogICAgcmV0dXJuIGlmICEkQ2hlY2tSZXN1bHQ7CgogICAgIyB0cmlnZ2VyIHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24KICAgIG15ICRTdWNjZXNzCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uKCAleyAkUGFyYW17RGF0YX0gfSApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHRyaWdnZXIgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIGZvciBBcHBvaW50bWVudElEICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ISIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudAoKPWhlYWQxIFNZTk9QU0lTCgpBcHBvaW50bWVudCBiYWNrZW5kIGZvciB0aGUgYXBwb2ludG1lbnQgbGluayBvYmplY3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJExpbmtPYmplY3RBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpBcHBvaW50bWVudCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIExpbmtMaXN0V2l0aERhdGEoKQoKZmlsbCB1cCB0aGUgbGluayBsaXN0IHdpdGggZGF0YQoKICAgICRTdWNjZXNzID0gJExpbmtPYmplY3RCYWNrZW5kLT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIExpbmtMaXN0ICAgICAgICAgICAgICAgICAgICAgPT4gJEhhc2hSZWYsCiAgICAgICAgSWdub3JlTGlua2VkVGlja2V0U3RhdGVUeXBlcyA9PiAwfDEsICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdFdpdGhEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KExpbmtMaXN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgICMgY2hlY2sgbGluayBsaXN0CiAgICBpZiAoIHJlZiAkUGFyYW17TGlua0xpc3R9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xpbmtMaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fSB9ICkgewoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfSB9ICkgewoKICAgICAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgYXBwb2ludG1lbnQgZGF0YQogICAgICAgICAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBpZCBmcm9tIGhhc2ggaWYgbm8gc2VydmljZSBkYXRhIHdhcyBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUFwcG9pbnRtZW50ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgYXBwb2ludG1lbnQgZGF0YQogICAgICAgICAgICAgICAgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufS0+eyRBcHBvaW50bWVudElEfSA9IFwlQXBwb2ludG1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdFBlcm1pc3Npb24oKQoKY2hlY2tzIHJlYWQgcGVybWlzc2lvbiBmb3IgYSBnaXZlbiBvYmplY3QgYW5kIFVzZXJJRC4KCiAgICAkUGVybWlzc2lvbiA9ICRMaW5rT2JqZWN0LT5PYmplY3RQZXJtaXNzaW9uKAogICAgICAgIE9iamVjdCAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgVE9ETzogUGVybWlzc2lvbiBoYW5kbGluZwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpyZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMKClJldHVybgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAxMjMsCiAgICAgICAgTG9uZyAgID0+ICJUaGUgQXBwb2ludG1lbnQgVGl0bGUiLAogICAgKTsKCiAgICAlRGVzY3JpcHRpb24gPSAkTGlua09iamVjdC0+T2JqZWN0RGVzY3JpcHRpb25HZXQoCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgTW9kZSAgICA9PiAnVGVtcG9yYXJ5JywgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGVzY3JpcHRpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGRlc2NyaXB0aW9uCiAgICBteSAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgTG9uZyAgID0+ICdBcHBvaW50bWVudCcsCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb24gaWYgJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCB0aWNrZXQKICAgIG15ICVBcHBvaW50bWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17S2V5fSwKICAgICk7CgogICAgcmV0dXJuIGlmICElQXBwb2ludG1lbnQ7CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgIExvbmcgICA9PiAkQXBwb2ludG1lbnR7VGl0bGV9LAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uOwp9Cgo9aXRlbSBPYmplY3RTZWFyY2goKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHRoZSBzZWFyY2ggcmVzdWx0cwoKUmV0dXJuCiAgICAkU2VhcmNoTGlzdCA9IHsKICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAzMzIgPT4gJERhdGFPZkl0ZW0zMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07CgogICAgJFNlYXJjaExpc3QgPSAkTGlua09iamVjdEJhY2tlbmQtPk9iamVjdFNlYXJjaCgKICAgICAgICBTdWJPYmplY3QgICAgPT4gJ0JsYScsICAgICAjIChvcHRpb25hbCkKICAgICAgICBTZWFyY2hQYXJhbXMgPT4gJEhhc2hSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHBhcmFtcwogICAgJFBhcmFte1NlYXJjaFBhcmFtc30gfHw9IHt9OwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICBteSAlU2VhcmNoOwogICAgbXkgQENhbGVuZGFySURzOwogICAgbXkgQEFwcG9pbnRtZW50czsKCiAgICAjIFNlYXJjaCBieSBhcHBvaW50bWVudCB0aXRsZSBhbmQgZGVzY3JpcHRpb24sIGlmIHN1cHBsaWVkLiBUaGUgY29udmVyc2lvbiBvZiBwYXJhbWV0ZXIgbmFtZXMgaXMKICAgICMgICBuZWNlc3NhcnksIHNpbmNlIGxpbmsgb2JqZWN0IHNlYXJjaCBwYXJhbWV0ZXJzIHNob3VsZCBoYXZlIHVuaXF1ZSBuYW1lcy4KICAgIGlmICggJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudFRpdGxlfSApIHsKICAgICAgICAkU2VhcmNoe1RpdGxlfSA9ICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnRUaXRsZX07CiAgICB9CiAgICBpZiAoICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnREZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgJFNlYXJjaHtEZXNjcmlwdGlvbn0gPSAkUGFyYW17U2VhcmNoUGFyYW1zfS0+e0FwcG9pbnRtZW50RGVzY3JpcHRpb259OwogICAgfQoKICAgICMgU2VhcmNoIGJ5IHNwZWNpZmljIGNhbGVuZGFyIElEcy4KICAgIGlmICgKICAgICAgICAkUGFyYW17U2VhcmNoUGFyYW1zfS0+e0FwcG9pbnRtZW50Q2FsZW5kYXJJRH0KICAgICAgICAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnRDYWxlbmRhcklEfSApCiAgICAgICAgKQogICAgewogICAgICAgIEBDYWxlbmRhcklEcyA9IEB7ICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnRDYWxlbmRhcklEfSB9OwogICAgfQoKICAgICMgU2VhcmNoIGluIGFsbCBhdmFpbGFibGUgY2FsZW5kYXJzIGZvciB0aGUgdXNlci4KICAgIGVsc2UgewogICAgICAgIG15IEBDYWxlbmRhckxpc3QgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAncncnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgQENhbGVuZGFySURzID0gbWFwIHsgJF8tPntDYWxlbmRhcklEfSB9IEBDYWxlbmRhckxpc3Q7CiAgICB9CgogICAgZm9yIG15ICRDYWxlbmRhcklEIChAQ2FsZW5kYXJJRHMpIHsKICAgICAgICBteSBAQ2FsZW5kYXJBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgJVNlYXJjaCwKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBBcHBvaW50bWVudHMsIEBDYWxlbmRhckFwcG9pbnRtZW50czsKICAgIH0KCiAgICAjIGFkZCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAlU2VhcmNoTGlzdDsKICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAkU2VhcmNoTGlzdHtOT1RMSU5LRUR9LT57U291cmNlfS0+eyAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSB9ID0gJEFwcG9pbnRtZW50OwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaExpc3Q7Cn0KCj1pdGVtIExpbmtBZGRQcmUoKQoKbGluayBhZGQgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rQWRkUG9zdCgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUHJlKCkKCmxpbmsgZGVsZXRlIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUHJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQb3N0KCkKCmxpbmsgZGVsZXRlIHBvc3QgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudHM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6QXN5bmNocm9ub3VzRXhlY3V0b3IpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXtEYXRhfS0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIGluIERhdGEhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb3AgcHJvdGVjdGlvbjogb25seSBleGVjdXRlIHRoaXMgaGFuZGxlciBvbmNlIGZvciBlYWNoIHRpY2tldAogICAgaWYgKAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKQogICAgICAgIC0+eydfVGlja2V0QXBwb2ludG1lbnRzOjpBbHJlYWR5UHJvY2Vzc2VkJ30KICAgICAgICAtPnsgJFBhcmFte0RhdGF9LT57VGlja2V0SUR9IH0rKwogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBoYW5kbGUgdGlja2V0IGFwcG9pbnRtZW50cyBpbiBhbiBhc3luY2hyb25vdXMgY2FsbAogICAgcmV0dXJuICRTZWxmLT5Bc3luY0NhbGwoCiAgICAgICAgT2JqZWN0TmFtZSAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAgICAgRnVuY3Rpb25OYW1lICAgPT4gJ1RpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1RpY2tldCcsCiAgICAgICAgRnVuY3Rpb25QYXJhbXMgPT4gewogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgfSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudERlbGV0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpBc3luY2hyb25vdXNFeGVjdXRvcik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQgaW4gRGF0YSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgSGFuZGxlIHRpY2tldCBhcHBvaW50bWVudCBkZWxldGUgaW4gYW4gYXN5bmNocm9ub3VzIGNhbGwuCiAgICByZXR1cm4gJFNlbGYtPkFzeW5jQ2FsbCgKICAgICAgICBPYmplY3ROYW1lICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICAgICBGdW5jdGlvbk5hbWUgICA9PiAnVGlja2V0QXBwb2ludG1lbnREZWxldGUnLAogICAgICAgIEZ1bmN0aW9uUGFyYW1zID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgIH0sCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCgogICAgfSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBuZWVkZWQgb2JqZWN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSGVscGVyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRHcm91cE9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFRlc3RFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbDo6VGVzdCcpOwpteSAkQ2FsZW5kYXJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY29uZmlnIGNoYW5nZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkaXNhYmxlIHJpY2ggdGV4dCBlZGl0b3IKbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnRnJvbnRlbmQ6OlJpY2hUZXh0JywKICAgIFZhbHVlID0+IDAsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIkRpc2FibGUgUmljaFRleHQgd2l0aCB0cnVlIiwKKTsKCiMgdXNlIFRlc3QgZW1haWwgYmFja2VuZAokU3VjY2VzcyA9ICRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdTZW5kbWFpbE1vZHVsZScsCiAgICBWYWx1ZSA9PiAnS2VybmVsOjpTeXN0ZW06OkVtYWlsOjpUZXN0JywKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiU2V0IEVtYWlsIFRlc3QgYmFja2VuZCB3aXRoIHRydWUiLAopOwoKIyBzZXQgbm90IHNlbGYgbm90aWZ5CiRTdWNjZXNzID0gJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0FnZW50U2VsZk5vdGlmeU9uQWN0aW9uJywKICAgIFZhbHVlID0+IDAsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIkRpc2FibGUgQWdlbnQgU2VsZiBOb3RpZnkgT24gQWN0aW9uIiwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBlbWFpbCB0ZXN0IGJhY2tlbmQKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKJFN1Y2Nlc3MgPSAkVGVzdEVtYWlsT2JqZWN0LT5DbGVhblVwKCk7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAnSW5pdGlhbCBjbGVhbnVwJywKKTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICRUZXN0RW1haWxPYmplY3QtPkVtYWlsc0dldCgpLAogICAgW10sCiAgICAnVGVzdCBiYWNrZW5kIGVtcHR5IGFmdGVyIGluaXRpYWwgY2xlYW51cCcsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdXNlciBjcmVhdGUKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgYSBuZXcgdXNlciBmb3IgY3VycmVudCB0ZXN0Cm15ICRVc2VyTG9naW4gPSAkSGVscGVyT2JqZWN0LT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbJ3VzZXJzJ10sCik7Cm15ICVVc2VyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgVXNlciA9PiAkVXNlckxvZ2luLAopOwpteSAkVXNlcklEID0gJFVzZXJEYXRhe1VzZXJJRH07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZ3JvdXAgY3JlYXRlCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAndW5pdHRlc3Rncm91cCcgLiAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpLAogICAgQ29tbWVudCA9PiAnY29tbWVudCBkZXNjcmliaW5nIHRoZSBncm91cCcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRHcm91cElELAogICAgJ0dyb3VwIGNyZWF0ZScsCik7CgokU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICBydyAgICAgICAgPT4gMSwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAnR3JvdXAgdXNlciBhZGQnLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNhbGVuZGFyIGNyZWF0ZQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBjYWxlbmRhciBhbmQgYXBwb2ludG1lbnQKbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAndW5pdHRlc3RjYWxlbmRhcicgLiAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgQ29sb3IgICAgICAgID0+ICcjRkY3NzAwJywKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgVmFsaWRJRCAgICAgID0+IDEsCik7CgpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSA9PiAnU2luZ2xlIFJlY2lwaWVudEFnZW50JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRXZlbnRzICAgICAgICAgICA9PiBbJ0NhbGVuZGFyVXBkYXRlJ10sCiAgICAgICAgICAgIFJlY2lwaWVudEFnZW50cyAgPT4gWyRVc2VySURdLAogICAgICAgICAgICBOb3RpZmljYXRpb25UeXBlID0+IFsnQXBwb2ludG1lbnQnXSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRvQXJyYXkgPT4gWyAkVXNlckRhdGF7VXNlckVtYWlsfSBdLAogICAgICAgICAgICAgICAgQm9keSAgICA9PiAiQ2FsZW5kZXI6ICRDYWxlbmRhcntDYWxlbmRhck5hbWV9PVxuIiwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdSZWNpcGllbnQgQ3VzdG9tZXIgLSBKdXN0VG9SZWFsQ3VzdG9tZXIgZW5hYmxlZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEV2ZW50cyAgICAgICAgICAgPT4gWydDYWxlbmRhclVwZGF0ZSddLAogICAgICAgICAgICBSZWNpcGllbnRzICAgICAgID0+IFsnQ3VzdG9tZXInXSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVHlwZSA9PiBbJ0FwcG9pbnRtZW50J10sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJlc3VsdHMgICAgPT4gW10sCiAgICAgICAgSnVzdFRvUmVhbEN1c3RvbWVyID0+IDEsCiAgICB9LAopOwoKbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKbXkgJEV2ZW50Tm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpOb3RpZmljYXRpb24nKTsKCm15ICRDb3VudCA9IDA7CmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBhZGQgdHJhbnNwb3J0IHNldHRpbmcKICAgICRUZXN0LT57RGF0YX0tPntUcmFuc3BvcnRzfSA9IFsnRW1haWwnXTsKCiAgICAjIHNldCBqdXN0IHRvIHJlYWwgY3VzdG9tZXIKICAgIG15ICRKdXN0VG9SZWFsQ3VzdG9tZXIgPSAkVGVzdC0+e0p1c3RUb1JlYWxDdXN0b21lcn0gfHwgMDsKICAgICRTdWNjZXNzID0gJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgIEtleSAgID0+ICdDdXN0b21lck5vdGlmeUp1c3RUb1JlYWxDdXN0b21lcicsCiAgICAgICAgVmFsdWUgPT4gJEp1c3RUb1JlYWxDdXN0b21lciwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlNldCBub3RpZmljYXRpb25zIGp1c3QgdG8gcmVhbCBjdXN0b21lcjogJEp1c3RUb1JlYWxDdXN0b21lci4iLAogICAgKTsKCiAgICBteSAkTm90aWZpY2F0aW9uSUQgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkFkZCgKICAgICAgICBOYW1lICAgID0+ICJKb2JOYW1lJENvdW50IiwKICAgICAgICBEYXRhICAgID0+ICRUZXN0LT57RGF0YX0sCiAgICAgICAgTWVzc2FnZSA9PiB7CiAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICdKb2JOYW1lJywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgID0+ICdDYWxlbmRlcjogPE9UUlNfQ0FMRU5EQVJfQ0FMRU5EQVJOQU1FPicsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb21tZW50ID0+ICdBbiBvcHRpb25hbCBjb21tZW50JywKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVjawogICAgJFNlbGYtPklzTm90KAogICAgICAgICROb3RpZmljYXRpb25JRCwKICAgICAgICB1bmRlZiwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vdGlmaWNhdGlvbkFkZCgpIHNob3VsZCBub3QgYmUgdW5kZWYiLAogICAgKTsKCiAgICBteSAkUmVzdWx0ID0gJEV2ZW50Tm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPlJ1bigKICAgICAgICBFdmVudCA9PiAnQ2FsZW5kYXJVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4ge30sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIG15ICRFbWFpbHMgPSAkVGVzdEVtYWlsT2JqZWN0LT5FbWFpbHNHZXQoKTsKCiAgICAjIHJlbW92ZSBub3QgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkRW1haWwgKCBAeyRFbWFpbHN9ICkgewogICAgICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhGcm9tIEhlYWRlcikpIHsKICAgICAgICAgICAgZGVsZXRlICRFbWFpbC0+eyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgIyBkZS1yZWZlcmVuY2UgYm9keQogICAgICAgICRFbWFpbC0+e0JvZHl9ID0gJHsgJEVtYWlsLT57Qm9keX0gfTsKICAgIH0KCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJEVtYWlscywKICAgICAgICAkVGVzdC0+e0V4cGVjdGVkUmVzdWx0c30sCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZWNpcGllbnRzIiwKICAgICk7CgogICAgIyBkZWxldGUgbm90aWZpY2F0aW9uIGV2ZW50CiAgICBteSAkTm90aWZpY2F0aW9uRGVsZXRlID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25EZWxldGUoCiAgICAgICAgSUQgICAgID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBzYW5pdHkgY2hlY2sKICAgICRTZWxmLT5UcnVlKAogICAgICAgICROb3RpZmljYXRpb25EZWxldGUsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBOb3RpZmljYXRpb25EZWxldGUoKSBzdWNjZXNzZnVsIGZvciBOb3RpZmljYXRpb24gSUQgJE5vdGlmaWNhdGlvbklEIiwKICAgICk7CgogICAgJFRlc3RFbWFpbE9iamVjdC0+Q2xlYW5VcCgpOwoKICAgICRDb3VudCsrOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkR3JvdXBPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiMgY3JlYXRlIHRlc3QgdXNlcgpteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFVzZXJJRCAgICA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAopOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkUmFuZG9tSUQ7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJUZXN0IGdyb3VwICRVc2VySUQgY3JlYXRlZCIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cApteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICBydyAgICAgICAgPT4gMSwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgYWRkZWQgdG8gdGVzdCBncm91cCAkR3JvdXBJRCIsCik7CgpteSBAQ2FsZW5kYXJJRHM7CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyQ3JlYXRlKCkKIwpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyQ3JlYXRlIC0gTWlzc2luZyBDYWxlbmRhck5hbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENvbG9yICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBNaXNzaW5nIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBNaXNzaW5nIEdyb3VwSUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBNaXNzaW5nIENvbG9yJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBXcm9uZyBDb2xvcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJ3JlZCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBBbGwgcmVxdWlyZWQgcGFyYW1ldGVycycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyQ3JlYXRlIC0gU2FtZSBuYW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBJbnZhbGlkIHN0YXRlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRC0yIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRUM5MDczJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBPcHRpb25hbCBwYXJhbWV0ZXJzJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgICAgICAgPT4gIkNhbGVuZGFyLSRSYW5kb21JRC0zIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgICAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ0ZpcnN0UmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgIEVuZERhdGUgICAgICA9PiAnUGx1c181JywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWzJdLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdUaGlzIGlzIGEgdGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyA9PiAnVGhpcyBpcyBhIHR5cGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIGRhdGEKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICBmb3IgbXkgJEtleSAocXcoQ2FsZW5kYXJJRCBHcm91cElEIENhbGVuZGFyTmFtZSBDb2xvciBDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkgVmFsaWRJRCkpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJ7JEtleX0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtICRLZXkgZXhpc3RzIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e0NvbmZpZ30gfSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnVXNlcklEJzsKCiAgICAgICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgICAgICRUZXN0LT57Q29uZmlnfS0+eyRLZXl9LAogICAgICAgICAgICAgICAgJENhbGVuZGFyeyRLZXl9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBEYXRhIGZvciAkS2V5IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQENhbGVuZGFySURzLCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJHZXQgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyR2V0IC0gTWlzc2luZyBDYWxlbmRhck5hbWUgYW5kIENhbGVuZGFySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyR2V0IC0gRmlyc3QgY2FsZW5kYXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJHZXQgLSBTZWNvbmQgY2FsZW5kYXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlELTIiLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckdldCAtIFRoaXJkIGNhbGVuZGFyJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRC0zIiwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgZGF0YQogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgIGZvciBteSAkS2V5IChxdyhDYWxlbmRhcklEIEdyb3VwSUQgQ2FsZW5kYXJOYW1lIENvbG9yIENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSBWYWxpZElEKSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDYWxlbmRhcnskS2V5fSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gJEtleSBleGlzdHMiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYnkgaWQKICAgICAgICBteSAlQ2FsZW5kYXJCeUlEID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjb21wYXJlIHJldHVybmVkIGRhdGEKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFwlQ2FsZW5kYXIsCiAgICAgICAgICAgIFwlQ2FsZW5kYXJCeUlELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEdldCBieSBDYWxlbmRhcklEIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBDYWxlbmRhckxpc3QoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhckxpc3QgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyTGlzdCAtIFdpdGggVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBDb3VudCAgID0+IDMsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJMaXN0IC0gV2l0aCBVc2VySUQgYW5kIG9ubHkgdmFsaWQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIENvdW50ICAgPT4gMiwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckxpc3QgLSBXaXRoIFVzZXJJRCBhbmQgb25seSBpbnZhbGlkJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBDb3VudCAgID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15IEBSZXN1bHQgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgIyBjaGVjayBkYXRhCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CgogICAgICAgICMgY2hlY2sgY291bnQKICAgICAgICBpZiAoICRUZXN0LT57Q291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICBzY2FsYXIgQFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57Q291bnR9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXN1bHQgY291bnQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb21wYXJlIHJldHVybmVkIGRhdGEKICAgICAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQFJlc3VsdCkgewogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KENhbGVuZGFySUQgR3JvdXBJRCBDYWxlbmRhck5hbWUgQ29sb3IgQ3JlYXRlVGltZSBDcmVhdGVCeSBDaGFuZ2VUaW1lIENoYW5nZUJ5IFZhbGlkSUQpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICAgICAkQ2FsZW5kYXItPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSAkS2V5IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBieSBpZAogICAgICAgICAgICAgICAgbXkgJUNhbGVuZGFyQnlJRCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZGVsZXRlICRDYWxlbmRhckJ5SUR7VGlja2V0QXBwb2ludG1lbnRzfTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICAgICAgICAgJENhbGVuZGFyLAogICAgICAgICAgICAgICAgICAgIFwlQ2FsZW5kYXJCeUlELAogICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ29tcGFyZSByZXR1cm5lZCBkYXRhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgc2NhbGFyIEBSZXN1bHQgPiAxLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBIYXMgcmVzdWx0IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIEBSZXN1bHQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBDYWxlbmRhclVwZGF0ZSgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgQ2FsZW5kYXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBNaXNzaW5nIEdyb3VwSUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAkQ2FsZW5kYXJJRHNbMF0sCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgQ2FsZW5kYXJOYW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgQ29sb3IgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAyLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTWlzc2luZyBDb2xvcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBNaXNzaW5nIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgVmFsaWRJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIEFsbCByZXF1aXJlZCBwYXJhbXMgZmlyc3QnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAkQ2FsZW5kYXJJRHNbMF0sCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDaGFuZ2UtJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRkY5OTAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAyLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gQWxsIHJlcXVpcmVkIGFuZCBhbiBvcHRpb25hbCBwYXJhbSBzZWNvbmQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJJRHNbMV0sCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lICAgICAgID0+ICJDaGFuZ2UtJFJhbmRvbUlELTIiLAogICAgICAgICAgICBDb2xvciAgICAgICAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSAgICA9PiAnRmlyc3RSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdUaGlzIGlzIGEgdGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyA9PiAnVGhpcyBpcyBhIHR5cGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIEFsbCByZXF1aXJlZCBhbmQgYW4gb3B0aW9uYWwgcGFyYW0gdGhpcmQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJJRHNbMV0sCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lICAgICAgID0+ICJDaGFuZ2UtJFJhbmRvbUlELTIiLAogICAgICAgICAgICBDb2xvciAgICAgICAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gdW5kZWYsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIGRhdGEKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYnkgaWQKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRUZXN0LT57Q29uZmlnfS0+e0NhbGVuZGFySUR9LAogICAgICAgICk7CgogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e0NvbmZpZ30gfSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnVXNlcklEJzsKCiAgICAgICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgICAgICRUZXN0LT57Q29uZmlnfS0+eyRLZXl9LAogICAgICAgICAgICAgICAgJENhbGVuZGFyeyRLZXl9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBEYXRhIGZvciAkS2V5IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQ2FsZW5kYXJQZXJtaXNzaW9uR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJQZXJtaXNzaW9uR2V0IC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25HZXQgLSBNaXNzaW5nIENhbGVuZGFySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyUGVybWlzc2lvbkdldCAtIE1pc3NpbmcgVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25HZXQgLSBBbGwgcGFyYW1zIGZpcnN0JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIFJlc3VsdCAgPT4gJ3J3JywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25HZXQgLSBBbGwgcGFyYW1zIHNlY29uZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICdydycsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICRQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFBlcm1pc3Npb24sCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBQZXJtaXNzaW9uIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUGVybWlzc2lvbiwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIEdldFRleHRDb2xvcigpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0dldFRleHRDb2xvciAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnR2V0VGV4dENvbG9yIC0gSW52YWxpZCBjb2xvcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQmFja2dyb3VuZCA9PiAnI0NDQ0NDJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBXaGl0ZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQmFja2dyb3VuZCA9PiAnI0ZGRicsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAnIzAwMCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnR2V0VGV4dENvbG9yIC0gTGlnaHQgR3JheScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQmFja2dyb3VuZCA9PiAnIzgwODA4MCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAnIzAwMCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnR2V0VGV4dENvbG9yIC0gRGFyayBHcmF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjNzk3OTc5JywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICcjRkZGRkZGJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBCbGFjaycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQmFja2dyb3VuZCA9PiAnIzAwMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAnI0ZGRkZGRicsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICRUZXh0Q29sb3IgPSAkQ2FsZW5kYXJPYmplY3QtPkdldFRleHRDb2xvcigKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgIyBjaGVjayB0ZXh0IGNvbG9yCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkVGV4dENvbG9yLAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGV4dCBjb2xvciIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFRleHRDb2xvciwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyRXhwb3J0KCkgYW5kIENhbGVuZGFySW1wb3J0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJFeHBvcnQvSW1wb3J0IC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckV4cG9ydC9JbXBvcnQgLSBObyBDYWxlbmRhckRhdGEnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyRXhwb3J0L0ltcG9ydCAtIEFsbCBwYXJhbXMgd2l0aCBvdmVyd3JpdGUnLAogICAgICAgIEV4cG9ydCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzJdLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIE92ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXMgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzJdLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQxLSRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1syXSwKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50Mi0kUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50cwogICAgaWYgKCAkVGVzdC0+e0FwcG9pbnRtZW50c30gKSB7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoIEB7ICRUZXN0LT57QXBwb2ludG1lbnRzfSB9ICkgewogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENyZWF0ZWQgYXBwb2ludG1lbnQgKCRBcHBvaW50bWVudElEKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZXhwb3J0IGNhbGVuZGFyCiAgICBpZiAoICRUZXN0LT57RXhwb3J0fSApIHsKICAgICAgICBteSAlRGF0YSA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJFeHBvcnQoCiAgICAgICAgICAgICV7ICRUZXN0LT57RXhwb3J0fSB9LAogICAgICAgICk7CgogICAgICAgICRUZXN0LT57Q29uZmlnfS0+e0RhdGF9ID0gXCVEYXRhOwogICAgfQoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFySW1wb3J0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIHJlc3VsdAogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICAleyAkVGVzdC0+e0V4cG9ydH0gfSwKICAgICAgICApOwoKICAgICAgICAjIHJlc2V0IENyZWF0ZVRpbWUgYW5kIENoYW5nZVRpbWUgc2luY2UgdGhleSBtaWdodCBkaWZmZXIKICAgICAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKSkgewogICAgICAgICAgICAkQ2FsZW5kYXJ7JEtleX0gPSB1bmRlZjsKICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57RGF0YX0tPntDYWxlbmRhckRhdGF9LT57JEtleX0gPSB1bmRlZjsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXCVDYWxlbmRhciwKICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57RGF0YX0tPntDYWxlbmRhckRhdGF9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENhbGVuZGFyIGRhdGEiLAogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgJXsgJFRlc3QtPntFeHBvcnR9IH0sCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudERhdGE7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEIChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gPSB1bmRlZjsKCiAgICAgICAgICAgICMgcmVzZXQgQ3JlYXRlVGltZSBhbmQgQ2hhbmdlVGltZSBzaW5jZSB0aGV5IG1pZ2h0IGRpZmZlcgogICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKSkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50eyRLZXl9ID0gdW5kZWY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50RGF0YSwgXCVBcHBvaW50bWVudDsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKCBAeyAkVGVzdC0+e0NvbmZpZ30tPntEYXRhfS0+e0FwcG9pbnRtZW50RGF0YX0gfSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gPSB1bmRlZjsKCiAgICAgICAgICAgICMgcmVzZXQgQ3JlYXRlVGltZSBhbmQgQ2hhbmdlVGltZSBzaW5jZSB0aGV5IG1pZ2h0IGRpZmZlcgogICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKSkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57JEtleX0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQEFwcG9pbnRtZW50RGF0YSwKICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57RGF0YX0tPntBcHBvaW50bWVudERhdGF9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IGRhdGEiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgojIE92ZXJyaWRlIGxvY2FsIHRpbWUgem9uZSBmb3IgZHVyYXRpb24gb2YgdGhlIHRlc3QuCmxvY2FsICRFTlZ7VFp9ID0gJ1VUQyc7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7Cm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkUmFuZG9tSUQ7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJUZXN0IGdyb3VwICRHcm91cElEIGNyZWF0ZWQiLAopOwoKIyBDcmVhdGUgdGVzdCB1c2VyIGFuZCBhZGQgaXQgdG8gdGhlIHRlc3QgZ3JvdXAuCm15ICRVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbJEdyb3VwTmFtZV0sCik7Cm15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKCiRTZWxmLT5UcnVlKAogICAgJFVzZXJJRCwKICAgICJUZXN0IHVzZXIgJFVzZXJJRCBjcmVhdGVkIiwKKTsKCiMgY3JlYXRlIHRlc3QgY2FsZW5kYXIKbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgIkNhbGVuZGFyQ3JlYXRlIC0gJENhbGVuZGFye0NhbGVuZGFySUR9IiwKKTsKCiMKIyBUZXN0cyBmb3IgQXBwb2ludG1lbnRDcmVhdGUoKSwgQXBwb2ludG1lbnRHZXQoKSBhbmQgQXBwb2ludG1lbnRVcGRhdGUoKQojCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRDcmVhdGUgLSBObyBDYWxlbmRhcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaXRsZSAgICAgPT4gIkFwcG9pbnRtZW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gTm8gVGl0bGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIFN0YXJ0VGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRDcmVhdGUgLSBObyBFbmRUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIEFsbCByZXF1aXJlZCBwYXJhbXMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudC0kUmFuZG9tSUQiLAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIERlc2NyaXB0aW9uLCBMb2NhdGlvbiBhbmQgQWxsRGF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICJBcHBvaW50bWVudDItJFJhbmRvbUlEIiwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NhbGVuZGFyIEFwcG9pbnRtZW50JywKICAgICAgICAgICAgTG9jYXRpb24gICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICA9PiAnMjAxNi0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgID0+ICcyMDE2LTAxLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gIkFwcG9pbnRtZW50Mi0kUmFuZG9tSUQiLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBkZXNjcmlwdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgID0+ICdVU0EnLAogICAgICAgICAgICBTdGFydFRpbWUgICA9PiAnMjAxNi0wMS0wMyAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgID0+ICcyMDE2LTAxLTAzIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CgogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgKTsKCiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdVc2VySUQnOwoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50eyRLZXl9LAogICAgICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57JEtleX0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJldHVybmVkIGRhdGEiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVGVzdC0+e1VwZGF0ZX0gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICV7ICRUZXN0LT57VXBkYXRlfSB9LAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gVXBkYXRlZCBhcHBvaW50bWVudCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntVcGRhdGV9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdVc2VySUQnOwoKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7JEtleX0sCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntVcGRhdGV9LT57JEtleX0sCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBVcGRhdGVkIGRhdGEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBBcHBvaW50bWVudExpc3QoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdBcHBvaW50bWVudExpc3QgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIENhbGVuZGFySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIH0sCiAgICAgICAgQ291bnQgICA9PiAyLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudExpc3QgLSBTdGFydFRpbWUgYW5kIEVuZFRpbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wNCAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDIsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIEJlZm9yZSBhcHBvaW50bWVudHMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE1LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMCwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gQWZ0ZXIgYXBwb2ludG1lbnRzJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wNCAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDAsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIFRpdGxlIHNlYXJjaCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50Ki0kUmFuZG9tSUQiLCAgICAjIHdpbGRjYXJkCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDIsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIERlc2NyaXB0aW9uIHNlYXJjaCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnZm9vYmFyJywgICAgICAgICAgICAgICAgICAgIyBub24tZXhpc3RlbnQKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMCwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gTG9jYXRpb24gc2VhcmNoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgTG9jYXRpb24gICA9PiAndXNhJywgICAgICAgICAgICAgICAgICAgICAgICMgbG93ZXJjYXNlCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDEsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzLAogICAgICAgICAgICAkVGVzdC0+e0NvdW50fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXN1bHQgY291bnQiLAogICAgICAgICk7CgogICAgICAgIGlmICggJFRlc3QtPntDb25maWd9LT57UmVzdWx0fSAmJiAkVGVzdC0+e0NvbmZpZ30tPntSZXN1bHR9IGVxICdBUlJBWScgKSB7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KEFwcG9pbnRtZW50SUQgQ2FsZW5kYXJJRCBVbmlxdWVJRCBUaXRsZSBTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gJEtleSBleGlzdHMiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFxAQXBwb2ludG1lbnRzLAogICAgICAgICAgICBbXSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIHJlY3VycmluZyBhcHBvaW50bWVudHMKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBPbmNlIHBlciBkYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0RhaWx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICMgb25jZSBwZXIgZGF5CiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsICAgICAjIGluY2x1ZGVkIGxhc3QgZGF5CiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gNSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMiAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMyAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wNCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDIgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDMgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDQgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDMtMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uY2UgcGVyIG1vbnRoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxMi0wMS0zMSAxNTowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxMi0wMS0zMSAxNjowMDowMCcsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ01vbnRobHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmNlIHBlciBtb250aAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgPT4gJzIwMTMtMDEtMDMgMTY6MDA6MDAnLCAgICAgIyBpbmNsdWRlZCBsYXN0IGRheQogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxMi0wMS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTMtMDEtMDQgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDEyLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDEyLTAxLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTAyLTI5IDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTAzLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA0LTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA1LTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA2LTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA3LTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA4LTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA5LTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTEwLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTExLTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTEyLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxMi0wMS0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wMi0yOSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wMy0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wNC0zMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wNS0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wNi0zMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wNy0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wOC0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0wOS0zMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0xMC0zMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0xMS0zMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxMi0xMi0zMSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gRXZlcnkgbW9udGggYWxsLWRheSBwZXIgbW9udGgnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgID0+ICcyMDA4LTA0LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgID0+ICcyMDA4LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgPT4gJ01vbnRobHknLAogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgPT4gMywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMDgtMDQtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDA4LTA3LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDA4LTA0LTMwIDAwOjAwOjAwJywgICAgIyBvbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBkYXRlIHRpbWUgbGlicmFyeQogICAgICAgICAgICAgICAgJzIwMDgtMDUtMzAgMDA6MDA6MDAnLCAgICAjIHRoZXJlIHdpbGwgYmUgYW4gYXBwb2ludG1lbnQgb24gMjAwOC0wNS0zMQogICAgICAgICAgICAgICAgJzIwMDgtMDYtMzAgMDA6MDA6MDAnLCAgICAjIGJ1dCBub3Qgb24gMjAwOC0wNi0zMAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDA4LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDA4LTA1LTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDA4LTA3LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VUeXBlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIFdyb25nIFJlY3VycmVuY2VUeXBlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdXcm9uZ0RhaWx5JywgICAgICAgICAgICAgICMgV3JvbmdEYWlseSBpcyBub3Qgc3VwcG9ydGVkCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgPT4gJzIwMTYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBXaXRob3V0IFJlY3VycmVuY2VGcmVxdWVuY3knLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE4LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE4LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbURhaWx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICA9PiAyLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxOC0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTgtMDMtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTgtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDMtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VGcmVxdWVuY3kgKEN1c3RvbVdlZWtseSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgPT4gJzIwMTYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VGcmVxdWVuY3kgKEN1c3RvbU1vbnRobHkpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdDdXN0b21Nb250aGx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE1pc3NpbmcgUmVjdXJyZW5jZUZyZXF1ZW5jeSAoQ3VzdG9tWWVhcmx5KScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uY2UgcGVyIHdlZWsnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnV2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0xMC0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0xMC0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdXZWVrbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFjaCB3ZWVrCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0xMC0wNiAwMDowMDowMCcsICAgICAgICAgICAgIyBpbmNsdWRlZCBsYXN0IGRheQogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMTAtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTYtMTAtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE2LTEwLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBPbmNlIHBlciBtb250aCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdNb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0xMC0wNyAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0xMC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdNb250aGx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIG1vbnRoCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBtb250aHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMTAtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE3LTAxLTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMi0wNyAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT25jZSBwZXIgeWVhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdZZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDI3LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDI3LTEwLTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ1llYXJseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIHllYXIKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgeWVhcnMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMjctMTAtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDMwLTEwLTExIDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDI3LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI4LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI5LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAyNy0xMC0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyOC0xMC0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyOS0xMC0xMCAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gRXZlcnkgdHdvIGRheXMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnQ3VzdG9tIGRhaWx5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTctMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTctMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnQ3VzdG9tRGFpbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMiwKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE3LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNy0wMS0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMyAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTctMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uIFdlZG5lc2RheSwgcmVjdXJyaW5nIGV2ZXJ5IHR3byB3ZWVrcyBvbiBNb25kYXkgYW5kIEZyaWRheScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wNS0wNCAxNjowMDowMCcsICAgICAgICAgICAgICAgICAgICMgd2VkbmVzZGF5CiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDUtMDQgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFjaCAybmQKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDUgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTW9uZGF5IGFuZCBGcmlkYXkKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA1LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wNS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0wNCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0wNiAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0xNiAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTYtMDUtMDQgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDUtMDYgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDUtMTYgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIEV2ZXJ5IDJuZCBtb250aCBvbiA1dGgsIDEwdGggYW5kIDE1dGggZGF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxOS0wNy0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTktMDctMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAiQ3VzdG9tTW9udGhseSIsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBldmVyeSAyIG1vbnRocwogICAgICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgNSwgMTAsIDE1IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGF5cyBpbiBtb250aAogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE5LTA3LTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxOS0xMC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gNiwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0wNSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xNSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0wNSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xMCAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xNSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTktMDctMDUgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMTAgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMTUgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMDUgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMTAgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMTUgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIEV2ZXJ5IDJuZCB5ZWFyIG9uIEphbnVhcnkgNXRoLCBGZWJydWFyeSBhbmQgRGVjZW1iZXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdDdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMjItMDEtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDIyLTAxLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVllYXJseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV2ZXJ5IDIgeWVhcnMKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDIsIDEyIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9udGhzCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAyMi0wMS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMjQtMTItMDYgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMjItMDEtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjItMDItMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjItMTItMDUgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDIyLTAxLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIyLTAyLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIyLTEyLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBFdmVyeSAyIHdlZWtzLCBvbiBNb24sIFdlZCwgVGh1LCBGcmkgYW5kIFN1bicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMjUtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDI1LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFjaCAyIHdlZWtzCiAgICAgICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCAzLCA0LCA1LCA3IF0sICAgICAgICAgICAgICAgICMgTW9uLCBXZWQsIFRodSwgRnJpLCBTdW4KICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICA9PiAnMjAyNi0xMC0wMSAwMDowMDowMCcsICAgICAgICAgICAgIyBvY3RvYmVyCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAyNS0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMjYtMTAtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDE0MywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMjUtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMTggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMjEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMDktMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTAtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTEtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjUtMTItMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMDkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMjEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMjMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDEtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMTggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDItMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMTggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDMtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDQtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDUtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDYtMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMDggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMDkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDctMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMDkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMjEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMjMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDgtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMTggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMDktMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjYtMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uIFR1ZXNkYXkgYW5kIEZyaWRheSwgcmVjdXJyaW5nIGV2ZXJ5IGZpdmUgd2Vla3MuJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTA5LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICdDdXN0b21XZWVrbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIDV0aCB3ZWVrCiAgICAgICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAyLCA1IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFR1ZXNkYXkgYW5kIEZyaWRheQogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgID0+ICcyMDIxLTEyLTMxIDIzOjU5OjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAyMi0wMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMTI3LAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKCiAgICAgICAgICAgICAgICAjIGRhdGVzIGZyb20gcHJldmlvdXMgdGVzdHMKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIyLTAxLTA1IDE2OjAwOjAwJywKCiAgICAgICAgICAgICAgICAjIGhlcmUgY29tZXMgZGF0ZXMgZnJvbSB0aGlzIHRlc3QKICAgICAgICAgICAgICAgICcyMDE2LTA5LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTEzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTE3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAyLTIxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAyLTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAzLTI4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAzLTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA1LTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA1LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA2LTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA2LTA5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA3LTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA3LTE0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA4LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA4LTE4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA5LTE5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA5LTIyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEwLTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEwLTI3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTExLTI4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEyLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAxLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAyLTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAyLTA5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTEzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA0LTE3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA0LTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA1LTIyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA1LTI1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA2LTI2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA2LTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA3LTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA4LTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA5LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA5LTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEwLTA5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEwLTEyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTExLTEzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTExLTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEyLTE4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEyLTIxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAxLTIyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAxLTI1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAyLTI2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA0LTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA0LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA1LTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA1LTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA2LTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA2LTE0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA4LTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA4LTIzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTI3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEwLTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTExLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEyLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEyLTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAxLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAxLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAyLTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAyLTE0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAzLTE3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAzLTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA0LTIxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA0LTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA1LTI2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA1LTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA2LTMwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA3LTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA4LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA4LTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA5LTA4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA5LTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEwLTEzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEwLTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTExLTE3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTExLTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEyLTIyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEyLTI1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAxLTI2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAxLTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAzLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAzLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA0LTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA0LTA5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA1LTExIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA1LTE0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA2LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA2LTE4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA3LTIwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA3LTIzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA4LTI0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA4LTI3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA5LTI4IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEwLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTExLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTExLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEyLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEyLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMi0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMi0wMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wOS0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMS0wOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMS0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMi0xMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0xMi0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0xNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMi0yMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMi0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMy0yOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMy0zMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNi0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNi0wOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNy0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wNy0xNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wOC0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wOC0xOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wOS0xOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wOS0yMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0xMC0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0xMC0yNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0xMS0yOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0xMi0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMi0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMi0wOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0xMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNC0xNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNC0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNS0yMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNS0yNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNi0yNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNi0yOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wNy0zMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wOC0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wOS0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wOS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMC0wOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMC0xMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMS0xMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMS0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMi0xOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0xMi0yMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wMS0yMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wMS0yNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wMi0yNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNC0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNC0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNS0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNi0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNi0xNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOC0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOC0yMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0yNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0xMC0yOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0xMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0xMi0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0xMi0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMS0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMS0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMi0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMi0xNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMy0xNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wMy0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNC0yMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNC0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNS0yNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNS0yOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNi0zMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wNy0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wOC0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wOC0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wOS0wOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0wOS0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMC0xMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMC0xNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMS0xNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMS0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMi0yMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMC0xMi0yNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wMS0yNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wMS0yOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wMy0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wMy0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNC0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNC0wOSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNS0xMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNS0xNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNi0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNi0xOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNy0yMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wNy0yMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wOC0yNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wOC0yNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0wOS0yOCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMC0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMi0wNyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMS0xMi0xMCAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gMyBkYXkgYXBwb2ludG1lbnQsIEN1c3RvbSB3ZWVrbHkoTW9uLCBXZWQpIHdpdGggdW50aWwgY29uZGl0aW9uLicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNS0wNy0wNiAyMzowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTUtMDctMDggMDE6MDA6MDAnLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMywKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICA9PiAnMjAxNS0xMi0zMSAyMzo1OTowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNS0wNy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDIwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKCiAgICAgICAgICAgICAgICAjIHByZXZpb3VzIGFwcG9pbnRtZW50cwogICAgICAgICAgICAgICAgJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDEtMDMgMTY6MDA6MDAnLAoKICAgICAgICAgICAgICAgICMgbmV3IGFwcG9pbnRtZW50cwogICAgICAgICAgICAgICAgJzIwMTUtMDctMDYgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMDggMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMjcgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMjkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDgtMTcgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDgtMTkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMDcgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMDkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMjggMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMzAgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMTkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMjEgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMDkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMTEgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMzAgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMDIgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMjEgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMjMgMjM6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKCiAgICAgICAgICAgICAgICAjIHByZXZpb3VzIGFwcG9pbnRtZW50cwogICAgICAgICAgICAgICAgJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMDEtMDMgMTc6MDA6MDAnLAoKICAgICAgICAgICAgICAgICMgbmV3IGFwcG9pbnRtZW50cwogICAgICAgICAgICAgICAgJzIwMTUtMDctMDggMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMTAgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMjkgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDctMzEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDgtMTkgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDgtMjEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMDkgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMTEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMDktMzAgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMDIgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMjEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTAtMjMgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMTEgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTEtMTMgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMDIgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMDQgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMjMgMDE6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTUtMTItMjUgMDE6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIDMgZGF5IGFwcG9pbnRtZW50LCBDdXN0b20gd2Vla2x5KE1vbiwgV2VkKSwgMTAgYXBwb2ludG1lbnRzLicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNC0wNy0wNiAyMzowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTQtMDctMDggMDE6MDA6MDAnLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMTAsCiAgICAgICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCAzIF0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNC0wNy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTUtMDEtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDEwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE0LTA3LTA2IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTA3IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTA5IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTE0IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTE2IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTIxIDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTIzIDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTI4IDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTMwIDIzOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA4LTA0IDIzOjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0wOCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0wOSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0xMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0xNiAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0xOCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0yMyAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0yNSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wNy0zMCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wOC0wMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNC0wOC0wNiAwMTowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGNvdW50CiAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAleyAkVGVzdC0+e0xpc3R9IC8vIHt9IH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzLAogICAgICAgICAgICAkVGVzdC0+e0xpc3R9LT57Q291bnR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExpc3QgY291bnQiLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZXMKICAgICAgICBteSBAU3RhcnRUaW1lczsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgIHB1c2ggQFN0YXJ0VGltZXMsICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX07CiAgICAgICAgfQogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBTdGFydFRpbWVzLAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN0YXJ0IHRpbWUgcmVzdWx0IiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVuZCB0aW1lcwogICAgICAgIG15IEBFbmRUaW1lczsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgIHB1c2ggQEVuZFRpbWVzLCAkQXBwb2ludG1lbnQtPntFbmRUaW1lfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBFbmRUaW1lcywKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gRW5kIHRpbWUgcmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIEFwcG9pbnRtZW50RGF5cygpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREYXlzIC0gTWlzc2luZyBVc2VySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wMS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wMi0wMSAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREYXlzIC0gSmFudWFyeScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAnMjAxNi0wMS0wMScgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDEtMDMnID0+IDEsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREYXlzIC0gTWFyY2gnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wNC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgJzIwMTYtMDMtMDEnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTAzLTAyJyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wMy0wMycgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDMtMDQnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTAzLTA1JyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wMy0wNicgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERheXMgLSBNYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wNi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgJzIwMTYtMDUtMDQnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTA1LTA2JyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wNS0xNicgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJUFwcG9pbnRtZW50RGF5cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREYXlzKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CgogICAgICAgICMgY2hlY2sgZGF0ZXMKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFwlQXBwb2ludG1lbnREYXlzLAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcJUFwcG9pbnRtZW50RGF5cywKICAgICAgICAgICAge30sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBnZXQgYSBmZXcgVW5pcXVlSURzIGluIHF1aWNrIHN1Y2Nlc3Npb24KbXkgQFVuaXF1ZUlEczsKZm9yICggMSAuLiAxMCApIHsKICAgIHB1c2ggQFVuaXF1ZUlEcywgJEFwcG9pbnRtZW50T2JqZWN0LT5HZXRVbmlxdWVJRCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgU3RhcnRUaW1lICA9PiAxNDUxNjA2NDAwLCAgICAjIHNhbWUgc3RhcnQgdGltZSAnMjAxNi0wMS0wMSAwMDowMDowMCcKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwp9CgpteSAlU2VlbjsKZm9yIG15ICRVbmlxdWVJRCAoQFVuaXF1ZUlEcykgewogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRTZWVueyRVbmlxdWVJRH0rKywKICAgICAgICAiVW5pcXVlSUQgJFVuaXF1ZUlEIGlzIHVuaXF1ZSIsCiAgICApOwp9CgojIGNyZWF0ZSBhbm90aGVyIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZTIgPSAndGVzdC1jYWxlbmRhci1ncm91cC0nIC4gJFJhbmRvbUlEIC4gJy0yJzsKbXkgJEdyb3VwSUQyICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lMiwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEdyb3VwSUQyLAogICAgIlRlc3QgZ3JvdXAgJEdyb3VwSUQyIGNyZWF0ZWQiLAopOwoKIyBhZGQgdGVzdCB1c2VyIHRvIHRlc3QgZ3JvdXAgd2l0aCBybyBwZXJtaXNzaW9ucwpteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQyLAogICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgbW92ZV9pbnRvID0+IDAsCiAgICAgICAgY3JlYXRlICAgID0+IDAsCiAgICAgICAgb3duZXIgICAgID0+IDAsCiAgICAgICAgcHJpb3JpdHkgID0+IDAsCiAgICAgICAgcncgICAgICAgID0+IDAsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlRlc3QgdXNlciAkVXNlcklEIGFkZGVkIHRvIHRlc3QgZ3JvdXAgJEdyb3VwSUQyIHdpdGggJ3JvJyIsCik7CgojIGNyZWF0ZSBhbm90aGVyIHRlc3QgY2FsZW5kYXIKbXkgJUNhbGVuZGFyMiA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMi0kUmFuZG9tSUQiLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRDIsCiAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJENhbGVuZGFyMntDYWxlbmRhcklEfSwKICAgICJDYWxlbmRhckNyZWF0ZSAtICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0iLAopOwoKIwojIFRlc3RzIGZvciBBcHBvaW50bWVudERlbGV0ZSgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0FwcG9pbnRtZW50RGVsZXRlIC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERlbGV0ZSAtIE5vIEFwcG9pbnRtZW50SUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50RGVsZXRlIC0gTm8gVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREZWxldGUgLSBBbGwgcGFyYW1zJywKICAgICAgICBDcmVhdGUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMi0yOSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDItMjkgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAyLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMi0yOSAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREZWxldGUgLSBObyBwZXJtaXNzaW9ucycsCiAgICAgICAgQ3JlYXRlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudC1STy0kUmFuZG9tSUQiLAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA3LTA0IDE5OjQ1OjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wNy0wNCAxOTo0NTowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wNy0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDctMDUgMDA6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBpZiAoICRUZXN0LT57Q3JlYXRlfSApIHsKICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICV7ICRUZXN0LT57Q3JlYXRlfSB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSBhcHBvaW50bWVudCBpZAogICAgICAgICRUZXN0LT57Q29uZmlnfS0+e0FwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50SUQ7CgogICAgICAgICMgY2hlY2sgbGlzdAogICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgJXsgJFRlc3QtPntMaXN0fSB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcHBvaW50bWVudCBsaXN0IHN0YXJ0IiwKICAgICAgICApOwogICAgfQoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBsaXN0IGFnYWluCiAgICBpZiAoICRUZXN0LT57Q3JlYXRlfSApIHsKICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICV7ICRUZXN0LT57TGlzdH0gfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudExpc3QsCiAgICAgICAgICAgICRUZXN0LT57U3VjY2Vzc30gPyAwIDogMSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcHBvaW50bWVudCBsaXN0IGVuZCIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIE5vdGlmaWNhdGlvbnMKIwoKIyBub3RpZmljYXRpb24gY3JlYXRpb24gdGVzdCBkZWZpbml0aW9uCm15IEBOb3RpZmljYXRpb25DcmVhdGVUZXN0cyA9ICgKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQgZXhwbGljaXRseQogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdubyBub3RpZmljYXRpb24nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggd3Jvbmcgbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ3dyb25nIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdXcm9uZ05vdGlmaWNhdGlvblRlbXBsYXRlJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1dyb25nTm90aWZpY2F0aW9uVGVtcGxhdGUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMCBtaW51dGUgdGVtcGxhdGUgKEFwcG9pbnRtZW50U3RhcnQpCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdTdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMzAgbWludXRlcyB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgNCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdub3RpZmljYXRpb24gdGVtcGxhdGUgMzAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzozMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggbm90aWZpY2F0aW9uIDEyIGhvdXJzIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA0MzIwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMTI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDQzMjAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMiBkYXlzIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA2JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMTcyODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTcyODAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMSB3ZWVrIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA3JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxIHdlZWsgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNjA0ODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0yNSAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gNjA0ODAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgbWludXRlcyBiZWZvcmUgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA4JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgOScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBjdXN0b20gMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIyOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBtaW51dGVzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMjowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYWZ0ZXIgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgaG91cnMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGRheXMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgbWludXRlcyBiZWZvcmUgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMjM6NTg6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDE1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBob3VycyBiZWZvcmUgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMjI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDE2JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBkYXlzIGJlZm9yZSBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAyOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTgnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGhvdXJzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxOScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgZGF5cyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDIwJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGN1c3RvbSAwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgaG91cnMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDAgaG91cnMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBkYXlzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDIyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGN1c3RvbSAwIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgbWludXRlcyBhZnRlciBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDIzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBtaW51dGVzIGFmdGVyIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGhvdXJzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIGhvdXJzIGFmdGVyIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgZGF5cyBhZnRlciBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBkYXlzIGFmdGVyIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI2JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBtaW51dGVzIGJlZm9yZSBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGhvdXJzIGJlZm9yZSBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyNycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDAgaG91cnMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBkYXlzIGJlZm9yZSBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDAgZGF5cyBiZWZvcmUgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGFmdGVyIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBtaW51dGVzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGhvdXJzIGFmdGVyIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDMwJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBob3VycyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGRheXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIGRheXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIC0yMzQ1IGRheXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAtMjM0NSBkYXlzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gLTIzNDUsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMiBtaW51dGVzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDMzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDM0JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIyOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIyOjAwOjAwJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDM1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMjowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDI6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMjowMCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIgaG91cnMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGhvdXJzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDI6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAyOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDI6MDA6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIGRheXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzgnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGRheXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgfSwKICAgIH0sCik7CgojIG5vdGlmaWNhdGlvbiBjcmVhdGUgdGVzdCBleGVjdXRpb24KZm9yIG15ICRUZXN0IChATm90aWZpY2F0aW9uQ3JlYXRlVGVzdHMpIHsKCiAgICAjIGNyZWF0ZSBhcHBvaW50bWVudAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57RGF0YX0gfSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgY3JlYXRpb24KICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgY3JlYXRlZCAtICcgLiAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259LAogICAgKTsKCiAgICAjIHJldHJpZXZlIHN0b3JlZCBhcHBvaW50bWVudCBpbmZvcm1hdGlvbgogICAgbXkgJUFwcG9pbnRtZW50RGF0YSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgZGF0YSBnZXQKICAgIG15ICRDcmVhdGVkID0gSXNIYXNoUmVmV2l0aERhdGEoIFwlQXBwb2ludG1lbnREYXRhICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ3JlYXRlZCwKICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IGRhdGEgcmV0cmlldmVkIC0gJyAuICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgdmVyaWZ5IHJlc3VsdHMKICAgIGZvciBteSAkUmVzdWx0S2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57UmVzdWx0fSB9ICkgewoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRBcHBvaW50bWVudERhdGF7JFJlc3VsdEtleX0sCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IHJlc3VsdDogJyAuICRSZXN1bHRLZXkgLiAnIC0gJyAuICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgKTsKICAgIH0KfQoKIyBub3RpZmljYXRpb24gdXBkYXRlIHRlc3QgZGVmaW5pdGlvbgpteSBATm90aWZpY2F0aW9uVXBkYXRlVGVzdHMgPSAoCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBubyB0ZW1wbGF0ZSB0byB3cm9uZyB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnQmVmb3JlIHVwZGF0ZSBubyBub3RpZmljYXRpb24nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byB3cm9uZyBub3RpZmljYXRpb24gdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnV3JvbmdOb3RpZmljYXRpb25UZW1wbGF0ZScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdXcm9uZ05vdGlmaWNhdGlvblRlbXBsYXRlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gbm8gdGVtcGxhdGUgdG8gc3RhcnR0aW1lIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdCZWZvcmUgdXBkYXRlIG5vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdTdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBzdGFydHRpbWUgdGVtcGxhdGUgdG8gMzAgbWludXRlcyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIDMwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIDMwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMTgwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6MzA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDE4MDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIDMwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIDEyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA0JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMTIgaG91cnMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNDMyMDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDEyOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA0MzIwMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gMTIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIDIgZGF5cyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMiBkYXlzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDQzMjAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA1JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE3MjgwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDE3MjgwMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gMiBkYXlzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA2JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxNzI4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnQmVmb3JlIHVwZGF0ZSB0byBubyBub3RpZmljYXRpb24nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gMTIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgNycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNDMyMDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA3JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzo1ODowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBjdXN0b20gMiBtaW51dGVzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDgnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgojIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgOScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgojIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEwJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEwJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzo1ODowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gbm8gbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDExJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgICMgdmVyaWZ5IHRoYXQgbm90IG5lZWRlZCB2YWx1ZXMgYXJlIGZsdXNoZWQgYWZ0ZXJ3YXJkcwogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDExJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm8gbm90aWZpY2F0aW9uIHRlbXBsYXRlJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDMwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCik7CgojIG5vdGlmaWNhdGlvbiB1cGRhdGUgdGVzdCBleGVjdXRpb24KZm9yIG15ICRUZXN0IChATm90aWZpY2F0aW9uVXBkYXRlVGVzdHMpIHsKCiAgICAjIGNyZWF0ZSBhcHBvaW50bWVudAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57RGF0YUJlZm9yZX0gfSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgY3JlYXRpb24KICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgY3JlYXRlZCAtICcgLiAkVGVzdC0+e0RhdGFCZWZvcmV9LT57RGVzY3JpcHRpb259LAogICAgKTsKCiAgICAjIHJldHJpZXZlIHN0b3JlZCBhcHBvaW50bWVudCBpbmZvcm1hdGlvbgogICAgbXkgJUFwcG9pbnRtZW50RGF0YSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgZGF0YSBnZXQKICAgIG15ICRDcmVhdGVkID0gSXNIYXNoUmVmV2l0aERhdGEoIFwlQXBwb2ludG1lbnREYXRhICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ3JlYXRlZCwKICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IGRhdGEgcmV0cmlldmVkIC0gJyAuICRUZXN0LT57RGF0YUJlZm9yZX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50CiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGRhdGUoCiAgICAgICAgJXsgJFRlc3QtPntEYXRhQWZ0ZXJ9IH0sCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICMgdmVyaWZ5IGFwcG9pbnRtZW50IHVwZGF0ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCB1cGRhdGVkIC0gJyAuICRUZXN0LT57RGF0YUFmdGVyfS0+e0Rlc2NyaXB0aW9ufSwKICAgICk7CgogICAgIyByZXRyaWV2ZSBzdG9yZWQgYXBwb2ludG1lbnQgaW5mb3JtYXRpb24KICAgICVBcHBvaW50bWVudERhdGEgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICApOwoKICAgICMgdmVyaWZ5IGFwcG9pbnRtZW50IGRhdGEgZ2V0CiAgICAkQ3JlYXRlZCA9IElzSGFzaFJlZldpdGhEYXRhKCBcJUFwcG9pbnRtZW50RGF0YSApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENyZWF0ZWQsCiAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCBkYXRhIHJldHJpZXZlZCAtICcgLiAkVGVzdC0+e0RhdGFCZWZvcmV9LT57RGVzY3JpcHRpb259LAogICAgKTsKCiAgICAjIHZlcmlmeSByZXN1bHRzCiAgICBmb3IgbXkgJFJlc3VsdEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Jlc3VsdH0gfSApIHsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQXBwb2ludG1lbnREYXRheyRSZXN1bHRLZXl9LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPnskUmVzdWx0S2V5fSwKICAgICAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCByZXN1bHQ6ICcgLiAkUmVzdWx0S2V5IC4gJyAtICcgLiAkVGVzdC0+e0RhdGFBZnRlcn0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgKTsKICAgIH0KfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgb3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdApsb2NhbCAkRU5We1RafSA9ICdVVEMnOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdApteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKIwojIFRlc3RzIGZvciBUaW1lQ2hlY2soKQojCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc3NpbmcgVGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNzaW5nIE9yaWdpbmFsVGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZSA9PiAnMjAxNi0wMi0wMSAwMDowMjowMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQWxsIHBhcmFtcycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywKICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAyOjAwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gJzIwMTYtMDItMDEgMDA6MDE6MDAnLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICJUaW1lQ2hlY2sgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIlRpbWVDaGVjayAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBTeXN0ZW1UaW1lR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBbGwgcGFyYW1zJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAnMTQ1MTYwNjQ2MCcsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICJTeXN0ZW1UaW1lR2V0IC0gJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJTeXN0ZW1UaW1lR2V0IC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIFRpbWVzdGFtcEdldCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQWxsIHBhcmFtcycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ1MTYwNjQ2MCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiVGltZXN0YW1wR2V0IC0gJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJUaW1lc3RhbXBHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQ3VycmVudFRpbWVzdGFtcEdldCgpIGFuZCBDdXJyZW50U3lzdGVtVGltZSgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHRUaW1lc3RhbXAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRUaW1lc3RhbXBHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwogICAgbXkgJFJlc3VsdFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXN1bHRUaW1lc3RhbXAsCiAgICAgICAgICAgICJDdXJyZW50VGltZXN0YW1wR2V0IC0gJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXN1bHRTeXN0ZW1UaW1lLAogICAgICAgICAgICAiQ3VycmVudFN5c3RlbVRpbWUgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXN1bHRUaW1lc3RhbXAgPX4gL1xkezR9LVxkezJ9LVxkezJ9XHNcZHsyfTpcZHsyfTpcZHsyfS8sCiAgICAgICAgICAgICJDdXJyZW50VGltZXN0YW1wR2V0IC0gRXhwZWN0ZWQgZm9ybWF0IiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgSXNJbnRlZ2VyKCRSZXN1bHRTeXN0ZW1UaW1lKSAmJiAkUmVzdWx0U3lzdGVtVGltZSA+IDE0NjMwODE3ODEsCiAgICAgICAgICAgICJDdXJyZW50U3lzdGVtVGltZSAtIEV4cGVjdGVkIGZvcm1hdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdFRpbWVzdGFtcCwKICAgICAgICAgICAgIkN1cnJlbnRUaW1lc3RhbXBHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmVzdWx0U3lzdGVtVGltZSwKICAgICAgICAgICAgIkN1cnJlbnRTeXN0ZW1UaW1lIC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIERhdGVHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0ZyaWRheSwgMjAxNi0xMi0yMyAxNDowNToxMCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ4MjUwMTkxMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICAxMCwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMTQsCiAgICAgICAgICAgIDIzLAogICAgICAgICAgICAxMiwKICAgICAgICAgICAgMjAxNiwKICAgICAgICAgICAgNSwKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdTdW5kYXksIDIwMTYtMDUtMDggMDI6MDM6MDQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJzE0NjI2NzI5ODQnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IFsKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMywKICAgICAgICAgICAgMiwKICAgICAgICAgICAgOCwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMjAxNiwKICAgICAgICAgICAgNywKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgQFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIkRhdGVHZXQgLSAkVGVzdC0+e05hbWV9IC0gUmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICBzY2FsYXIgQFJlc3VsdCwKICAgICAgICAgICAgIkRhdGVHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgRGF0ZTJTeXN0ZW1UaW1lKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNpbmcgWWVhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgTW9udGggID0+ICcxJywKICAgICAgICAgICAgRGF5ICAgID0+ICcxJywKICAgICAgICAgICAgSG91ciAgID0+ICcxJywKICAgICAgICAgICAgTWludXRlID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNpbmcgTW9udGgnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFllYXIgICA9PiAnMjAxNicsCiAgICAgICAgICAgIERheSAgICA9PiAnMScsCiAgICAgICAgICAgIEhvdXIgICA9PiAnMScsCiAgICAgICAgICAgIE1pbnV0ZSA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnTWlzaW5nIERheScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgWWVhciAgID0+ICcyMDE2JywKICAgICAgICAgICAgTW9udGggID0+ICcxJywKICAgICAgICAgICAgSG91ciAgID0+ICcxJywKICAgICAgICAgICAgTWludXRlID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICcyMDE2LTAxLTAxIDAxOjAwOjAwJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBZZWFyICAgPT4gJzIwMTYnLAogICAgICAgICAgICBNb250aCAgPT4gJzEnLAogICAgICAgICAgICBEYXkgICAgPT4gJzEnLAogICAgICAgICAgICBIb3VyICAgPT4gJzEnLAogICAgICAgICAgICBNaW51dGUgPT4gJzAnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAnMTQ1MTYxMDAwMCcsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIkRhdGUyU3lzdGVtVGltZSAtICRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJEYXRlMlN5c3RlbVRpbWUgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQWRkUGVyaW9kKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNpbmcgVGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgWWVhcnMgID0+ICcxJywKICAgICAgICAgICAgTW9udGhzID0+ICcxJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBbGwgcGFyYW1zJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lICAgPT4gJzE0NjI4NzExNjInLAogICAgICAgICAgICBZZWFycyAgPT4gJzEnLAogICAgICAgICAgICBNb250aHMgPT4gJzEnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAnMTQ5NzA4NTU2MicsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIkFkZFBlcmlvZCAtICRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJBZGRQZXJpb2QgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgVGltZXpvbmVPZmZzZXRHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1VUQyAoQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICdVVEMnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAwLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDRVQgKENlbnRyYWwgRXVyb3BlYW4gVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0V1cm9wZS9CZXJsaW4nLAogICAgICAgICAgICBUaW1lICAgICAgID0+IDE0NTY3ODY4MDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IDEsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NFRFQgKENlbnRyYWwgRXVyb3BlYW4gU3VtbWVyIFRpbWUpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICdFdXJvcGUvQmVybGluJywKICAgICAgICAgICAgVGltZSAgICAgICA9PiAxNDYyODcxMTYyLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAyLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDU1QgKENlbnRyYWwgU3RhbmRhcmQgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0FtZXJpY2EvTWV4aWNvX0NpdHknLAogICAgICAgICAgICBUaW1lICAgICAgID0+IDE0NTY3ODY4MDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IC02LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDRFQgKENlbnRyYWwgRGF5bGlnaHQgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0FtZXJpY2EvTWV4aWNvX0NpdHknLAogICAgICAgICAgICBUaW1lICAgICAgID0+IDE0NjI4NzExNjIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IC01LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdJU1QgKEluZGlhIFN0YW5kYXJkIFRpbWUpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICdBc2lhL0NhbGN1dHRhJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gNS41LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdOUFQgKE5lcGFsIFRpbWUpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICdBc2lhL0thdGhtYW5kdScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IDUuNzUsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ091dGxvb2sgZXhwb3J0IChub24tc3RhbmRhcmQgZm9ybWF0KScsICAgICMgYnVnIzEyNDg1CiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAnKFVUQy0wMjozMCkgTmV3Zm91bmRsYW5kIFN0YW5kYXJkIFRpbWUgKE5TVCknLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAtMi41LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIlRpbWV6b25lT2Zmc2V0R2V0IC0gJFRlc3QtPntOYW1lfSAtIFJlc3VsdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIlRpbWV6b25lT2Zmc2V0R2V0IC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIFdlZWtEZXRhaWxzR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdTdW5kYXksIDIwMTctMDUtMTQgMDU6MDU6MDUsIENXMTknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJzE0OTQ3MzgzMDUnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IFsKICAgICAgICAgICAgNywKICAgICAgICAgICAgMTksCiAgICAgICAgXSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15IEBSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiV2Vla0RldGFpbHNHZXQgLSAkVGVzdC0+e05hbWV9IC0gUmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICBzY2FsYXIgQFJlc3VsdCwKICAgICAgICAgICAgIldlZWtEZXRhaWxzR2V0IC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ29uZmlnT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkUGx1Z2luT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwpteSAkTWFpbk9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwpteSAkR3JvdXBPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKbXkgJFRpY2tldE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKIyBnZXQgcmVnaXN0ZXJlZCBwbHVnaW4gbW9kdWxlcwpteSAkUGx1Z2luQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJBcHBvaW50bWVudENhbGVuZGFyOjpQbHVnaW4iKTsKbXkgJFBsdWdpbkNvdW50ICA9IHNjYWxhciBrZXlzICV7JFBsdWdpbkNvbmZpZ307CgpteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKCiRTZWxmLT5UcnVlKAogICAgJFBsdWdpbkxpc3QsCiAgICAnUGx1Z2luIGxpc3QgbG9hZGVkJywKKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBrZXlzICV7JFBsdWdpbkxpc3R9LAogICAgJFBsdWdpbkNvdW50LAogICAgJ1JlZ2lzdGVyZWQgcGx1Z2luIGNvdW50JywKKTsKCm15ICRQbHVnaW5LZXlUaWNrZXQ7CgojIGNoZWNrIGFsbCByZWdpc3RlcmVkIHBsdWdpbiBtb2R1bGVzClBMVUdJTjoKZm9yIG15ICRQbHVnaW5LZXkgKCBzb3J0IGtleXMgJXskUGx1Z2luQ29uZmlnfSApIHsKCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICRQbHVnaW5Db25maWctPnskUGx1Z2luS2V5fS0+e01vZHVsZX07CiAgICBuZXh0IFBMVUdJTiBpZiAhJEdlbmVyaWNNb2R1bGU7CgogICAgaWYgKCAkR2VuZXJpY01vZHVsZSBlcSAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldCcgKSB7CiAgICAgICAgJFBsdWdpbktleVRpY2tldCA9ICRQbHVnaW5LZXk7CiAgICB9CgogICAgIyBjaGVjayBpZiBtb2R1bGUgY2FuIGJlIHJlcXVpcmVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSksCiAgICAgICAgIlJlcXVpcmVkICckR2VuZXJpY01vZHVsZScgcGx1Z2luIG1vZHVsZSIsCiAgICApOwoKICAgIG15ICRQbHVnaW5Nb2R1bGUgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgY2hlY2sgaWYgbW9kdWxlIGhhcyBiZWVuIGxvYWRlZAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFBsdWdpbk1vZHVsZSwKICAgICAgICAiUGx1Z2luIG1vZHVsZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5IiwKICAgICk7CgogICAgIyBjaGVjayBjbGFzcyBuYW1lCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkUGx1Z2luTW9kdWxlLT5pc2EoJEdlbmVyaWNNb2R1bGUpLAogICAgICAgICdQbHVnaW4gbW9kdWxlIGhhcyBjb3JyZWN0IHBhY2thZ2UgbmFtZScsCiAgICApOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgbWV0aG9kcwogICAgZm9yIG15ICRNZXRob2ROYW1lIChxdyhMaW5rQWRkIExpbmtMaXN0IFNlYXJjaCkpIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFBsdWdpbk1vZHVsZS0+Y2FuKCRNZXRob2ROYW1lKSwKICAgICAgICAgICAgIlBsdWdpbiBtb2R1bGUgaW1wbGVtZW50cyAkTWV0aG9kTmFtZSgpIiwKICAgICAgICApOwogICAgfQoKICAgIG15ICRQbHVnaW5VUkwgPSAkUGx1Z2luQ29uZmlnLT57JFBsdWdpbktleX0tPntVUkx9OwoKICAgICMgY2hlY2sgaWYgVVJMIGNvbnRhaW5zIElEIHBsYWNlaG9sZGVyCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICBzY2FsYXIgJFBsdWdpblVSTCA9fiAvJXMvLAogICAgICAgICdQbHVnaW4gbW9kdWxlIFVSTCBjb250YWlucyBJRCBwbGFjZWhvbGRlcicsCiAgICApOwp9CgojIGNoZWNrIHRpY2tldCBwbHVnaW4gaWYgcmVnaXN0ZXJlZAppZiAoJFBsdWdpbktleVRpY2tldCkgewoKICAgICMgY3JlYXRlIHRlc3QgZ3JvdXAKICAgIG15ICRHcm91cE5hbWUgPSAndGVzdC1jYWxlbmRhci1ncm91cC0nIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkR3JvdXBJRCwKICAgICAgICAiVGVzdCBncm91cCAkR3JvdXBJRCBjcmVhdGVkIiwKICAgICk7CgogICAgIyBjcmVhdGUgdGVzdCB1c2VyCiAgICBteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgR3JvdXBzID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgKTsKICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVXNlcklELAogICAgICAgICJUZXN0IHVzZXIgJFVzZXJJRCBjcmVhdGVkIiwKICAgICk7CgogICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAjIGNyZWF0ZSBhIHRlc3QgdGlja2V0CiAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgVGl0bGUgICAgICAgID0+ICdUZXN0IFRpY2tldCAnIC4gJFJhbmRvbUlELAogICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdvcGVuJywKICAgICAgICBDdXN0b21lck5vICAgPT4gJzEyMzQ2NScsCiAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICdjdXN0b21lckBleGFtcGxlLmNvbScsCiAgICAgICAgT3duZXJJRCAgICAgID0+ICRVc2VySUQsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRpY2tldElELAogICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRJRCIsCiAgICApOwogICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0TnVtYmVyLAogICAgICAgICJUaWNrZXROdW1iZXJMb29rdXAoKSAtICRUaWNrZXROdW1iZXIiLAogICAgKTsKCiAgICAjIGNyZXRlIHRlc3QgY2FsZW5kYXIKICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICdUZXN0IENhbGVuZGFyICcgLiAkUmFuZG9tSUQsCiAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAiQ2FsZW5kYXJDcmVhdGUoKSAtICRDYWxlbmRhcntDYWxlbmRhcklEfSIsCiAgICApOwoKICAgICMgY3JlYXRlIHRlc3QgYXBwb2ludG1lbnQKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBUaXRsZSAgICAgID0+ICdUZXN0IGFwcG9pbnRtZW50ICcgLiAkUmFuZG9tSUQsCiAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxMzowMDowMCcsCiAgICAgICAgVGltZXpvbmVJRCA9PiAwLAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgIkFwcG9pbnRtZW50Q3JlYXRlKCkgLSAkQXBwb2ludG1lbnRJRCIsCiAgICApOwoKICAgICMgc2VhcmNoIHRoZSB0aWNrZXQgdmlhIHRpY2tldCBudW1iZXIKICAgIG15ICRSZXN1bHRMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luU2VhcmNoKAogICAgICAgIFNlYXJjaCAgICA9PiAkVGlja2V0TnVtYmVyLAogICAgICAgIFBsdWdpbktleSA9PiAkUGx1Z2luS2V5VGlja2V0LAogICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJFJlc3VsdExpc3QsCiAgICAgICAgewogICAgICAgICAgICAkVGlja2V0SUQgPT4gIiRUaWNrZXROdW1iZXIgVGVzdCBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICB9LAogICAgICAgICdQbHVnaW5TZWFyY2goKSAtIFNlYXJjaCByZXN1bHRzIChieSB0aWNrZXQgbnVtYmVyKScKICAgICk7CgogICAgIyBzZWFyY2ggdGhlIHRpY2tldCB2aWEgdGlja2V0IGlkCiAgICAkUmVzdWx0TGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpblNlYXJjaCgKICAgICAgICBPYmplY3RJRCAgPT4gJFRpY2tldElELAogICAgICAgIFBsdWdpbktleSA9PiAkUGx1Z2luS2V5VGlja2V0LAogICAgICAgIFVzZXJJRCAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJFJlc3VsdExpc3QsCiAgICAgICAgewogICAgICAgICAgICAkVGlja2V0SUQgPT4gIiRUaWNrZXROdW1iZXIgVGVzdCBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICB9LAogICAgICAgICdQbHVnaW5TZWFyY2goKSAtIFNlYXJjaCByZXN1bHRzIChieSB0aWNrZXQgSUQpJwogICAgKTsKCiAgICAjIGxpbmsgYXBwb2ludG1lbnQgd2l0aCB0aGUgdGlja2V0CiAgICBteSAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtBZGQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnUGx1Z2luTGlua0FkZCgpIC0gTGluayBhcHBvaW50bWVudCB0byB0aGUgdGlja2V0JywKICAgICk7CgogICAgIyB2ZXJpZnkgbGluawogICAgbXkgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTGlua0xpc3QtPnskVGlja2V0SUR9LAogICAgICAgICdQbHVnaW5MaW5rTGlzdCgpIC0gVmVyaWZ5IGxpbmsgdG8gdGhlIHRpY2tldCcKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRMaW5rTGlzdC0+eyRUaWNrZXRJRH0tPntMaW5rSUR9LAogICAgICAgICRUaWNrZXRJRCwKICAgICAgICAnVGlja2V0SUQnLAogICAgKTsKCiAgICAjIGNoZWNrIFVSTAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJExpbmtMaXN0LT57JFRpY2tldElEfS0+e0xpbmtVUkx9ID1+IC9UaWNrZXRJRD0kVGlja2V0SUQvLAogICAgICAgICdUaWNrZXQgVVJMIGNvbnRhaW5zIHRpY2tldCBJRCcKICAgICAgICApLAoKICAgICAgICAjIGxpbmsgbmFtZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAkTGlua0xpc3QtPnskVGlja2V0SUR9LT57TGlua05hbWV9LAogICAgICAgICIkVGlja2V0TnVtYmVyIFRlc3QgVGlja2V0ICRSYW5kb21JRCIsCiAgICAgICAgJ0xpbmsgbmFtZScKICAgICAgICApLAoKICAgICAgICAjIGRlbGV0ZSBsaW5rcwogICAgICAgICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdQbHVnaW5MaW5rRGVsZXRlKCkgLSBMaW5rcyBkZWxldGVkJwogICAgKTsKCiAgICAjIHZlcmlmeSBsaW5rcyBoYXZlIGJlZW4gZGVsZXRlZAogICAgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJExpbmtMaXN0LAogICAgICAgIHt9LAogICAgICAgICdQbHVnaW5MaW5rTGlzdCgpIC0gRW1wdHkgbGluayBsaXN0JywKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpteSAkSGVscGVyICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkTWFpbk9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwpteSAkR3JvdXBPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7Cm15ICREeW5hbWljRmllbGRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKbXkgJER5bmFtaWNGaWVsZFZhbHVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZFZhbHVlJyk7Cm15ICRDYWxlbmRhck9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgojIGNyZWF0ZSB0ZXN0IHVzZXIKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKCk7Cm15ICRVc2VySUQgICAgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3RVc2VyQ3JlYXRlIC0gJFVzZXJJRCIsCik7CgojIGNyZWF0ZSB0ZXN0IGdyb3VwCm15ICRHcm91cE5hbWUgPSAnR3JvdXAnIC4gJFJhbmRvbUlEOwpteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJHcm91cEFkZCAtICRHcm91cE5hbWUgKCRHcm91cElEKSIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cApteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBydyA9PiAxLAogICAgfSwKICAgIFVzZXJJRCA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlBlcm1pc3Npb25Hcm91cFVzZXJBZGQgLSBUZXN0IHVzZXIgJFVzZXJJRCBhZGRlZCB0byB0ZXN0IGdyb3VwICRHcm91cElEIiwKKTsKCiMgY3JlYXRlIHRlc3QgcXVldWUgd2l0aCBlc2NhbGF0aW9uIHJ1bGVzCm15ICRRdWV1ZU5hbWUgPSAnUXVldWUnIC4gJFJhbmRvbUlEOwpteSAkUXVldWVJRCAgID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUFkZCgKICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFF1ZXVlTmFtZSwKICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgIEdyb3VwSUQgICAgICAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDMwLAogICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiA3MCwKICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMjQwLAogICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA4MCwKICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMjQ0MCwKICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gOTAsCiAgICBTeXN0ZW1BZGRyZXNzSUQgICAgID0+IDEsCiAgICBTYWx1dGF0aW9uSUQgICAgICAgID0+IDEsCiAgICBTaWduYXR1cmVJRCAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdTb21lIENvbW1lbnQnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRRdWV1ZUlELAogICAgIlF1ZXVlQWRkIC0gJFF1ZXVlTmFtZSAoJFF1ZXVlSUQpIiwKKTsKCiMgY3JlYXRlIHRlc3QgZHluYW1pYyBmaWVsZHMKbXkgQER5bmFtaWNGaWVsZHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZScgLiAkUmFuZG9tSUQsCiAgICAgICAgTGFiZWwgICAgICA9PiAnRGF0ZScgLiAkUmFuZG9tSUQsCiAgICAgICAgQ29uZmlnICAgICA9PiB7fSwKICAgICAgICBGaWVsZE9yZGVyID0+IDEwMDAwLAogICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGUnLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZVRpbWUnIC4gJFJhbmRvbUlELAogICAgICAgIExhYmVsICAgICAgPT4gJ0RhdGVUaW1lJyAuICRSYW5kb21JRCwKICAgICAgICBDb25maWcgICAgID0+IHt9LAogICAgICAgIEZpZWxkT3JkZXIgPT4gMTAwMDAsCiAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIH0sCik7CmZvciBteSAkRHluYW1pY0ZpZWxkIChARHluYW1pY0ZpZWxkcykgewogICAgbXkgJER5bmFtaWNGaWVsZElEID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkQWRkKAogICAgICAgICV7JER5bmFtaWNGaWVsZH0sCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJER5bmFtaWNGaWVsZElELAogICAgICAgICJEeW5hbWljRmllbGRBZGQgLSAkRHluYW1pY0ZpZWxkLT57TmFtZX0gKCREeW5hbWljRmllbGRJRCkiLAogICAgKTsKICAgICREeW5hbWljRmllbGQtPntEeW5hbWljRmllbGRJRH0gPSAkRHluYW1pY0ZpZWxkSUQ7Cn0KCiMgRnJlZXplIHRpbWUgYXQgdGhpcyBwb2ludCBzaW5jZSBjcmVhdGluZyB0aWNrZXRzIGFuZCBjaGVja2luZyByZXN1bHRzIGNhbiB0YWtlCiMgICBzZXZlcmFsIHNlY29uZHMgdG8gY29tcGxldGUuCiRIZWxwZXItPkZpeGVkVGltZVNldCgKICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKSwKKTsKCm15ICRUaWNrZXRDb3VudCA9IDM7CgojIGNyZWF0ZSBhIGZldyB0ZXN0IHRpY2tldHMKbXkgQFRpY2tldElEczsKZm9yIG15ICRDb3VudCAoIDEgLi4gJFRpY2tldENvdW50ICkgewogICAgbXkgJFRpY2tldFRpdGxlID0gIlRpY2tldCRSYW5kb21JRC0kQ291bnQiOwogICAgbXkgJFRpY2tldElEICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgIFRpdGxlICAgID0+ICRUaWNrZXRUaXRsZSwKICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICBQcmlvcml0eSA9PiAnMyBub3JtYWwnLAogICAgICAgIFN0YXRlICAgID0+ICdvcGVuJywKICAgICAgICBPd25lcklEICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRpY2tldElELAogICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRUaXRsZSAoJFRpY2tldElEKSIsCiAgICApOwoKICAgICMgY3JlYXRlIGFydGljbGUKICAgIG15ICRBcnRpY2xlSUQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgIFRpY2tldElEICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBBcnRpY2xlVHlwZSAgICA9PiAnZW1haWwtZXh0ZXJuYWwnLAogICAgICAgIFNlbmRlclR5cGUgICAgID0+ICdjdXN0b21lcicsCiAgICAgICAgRnJvbSAgICAgICAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLAogICAgICAgIFRvICAgICAgICAgICAgID0+ICdTb21lIEFnZW50IDxlbWFpbEBleGFtcGxlLmNvbT4nLAogICAgICAgIFN1YmplY3QgICAgICAgID0+ICdzb21lIHNob3J0IGRlc2NyaXB0aW9uJywKICAgICAgICBCb2R5ICAgICAgICAgICA9PiAndGhlIG1lc3NhZ2UgdGV4dCcsCiAgICAgICAgQ29udGVudFR5cGUgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTUnLAogICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICdFbWFpbEN1c3RvbWVyJywKICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAnQ3VzdG9tZXIgc2VudCBhbiBlbWFpbCcsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCkgKyA2MCAqIDYwICogMjQsICAgICMgKzI0aAogICAgKTsKICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgWWVhciAgICAgPT4gJFllYXIsCiAgICAgICAgTW9udGggICAgPT4gJE1vbnRoLAogICAgICAgIERheSAgICAgID0+ICREYXksCiAgICAgICAgSG91ciAgICAgPT4gJEhvdXIsCiAgICAgICAgTWludXRlICAgPT4gJE1pbnV0ZSwKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGlja2V0UGVuZGluZ1RpbWVTZXQgLSBUaWNrZXQgJFRpY2tldElEOiAiCiAgICAgICAgICAgIC4gc3ByaW50ZiggJyVkLSUwMmQtJTAyZCAlMDJkOiUwMmQnLCAkWWVhciwgJE1vbnRoLCAkRGF5LCAkSG91ciwgJE1pbnV0ZSApLAogICAgKTsKCiAgICAjIHNldCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkVmFsdWVPYmplY3QtPlZhbHVlU2V0KAogICAgICAgIEZpZWxkSUQgID0+ICREeW5hbWljRmllbGRzWzBdLT57RHluYW1pY0ZpZWxkSUR9LAogICAgICAgIE9iamVjdElEID0+ICRUaWNrZXRJRCwKICAgICAgICBWYWx1ZSAgICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlZhbHVlU2V0IC0gJER5bmFtaWNGaWVsZHNbMF0tPntEeW5hbWljRmllbGRJRH0gZm9yIHRpY2tldCAkVGlja2V0SUQiLAogICAgKTsKCiAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgRmllbGRJRCAgPT4gJER5bmFtaWNGaWVsZHNbMV0tPntEeW5hbWljRmllbGRJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFRpY2tldElELAogICAgICAgIFZhbHVlICAgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWVEYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVmFsdWVTZXQgLSAkRHluYW1pY0ZpZWxkc1sxXS0+e0R5bmFtaWNGaWVsZElEfSBmb3IgdGlja2V0ICRUaWNrZXRJRCIsCiAgICApOwoKICAgIHB1c2ggQFRpY2tldElEcywgJFRpY2tldElEOwp9CgojIGNyZWF0ZSB0ZXN0IGNhbGVuZGFyCm15ICRDYWxlbmRhck5hbWUgPSAiQ2FsZW5kYXIkUmFuZG9tSUQiOwpteSAlQ2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXJOYW1lLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwokU2VsZi0+VHJ1ZSgKICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICJDYWxlbmRhckNyZWF0ZSAtICRDYWxlbmRhck5hbWUgKCRDYWxlbmRhcntDYWxlbmRhcklEfSkiLAopOwoKIyBHZW5lcmF0ZSBmZXcgcmFuZG9tIHN0cmluZ3MgZm9yIFJ1bGVJRHMuCm15IEBSdWxlSURzOwpmb3IgKCAxIC4uIDUgKSB7CiAgICBwdXNoIEBSdWxlSURzLCAkTWFpbk9iamVjdC0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoICAgICA9PiAzMiwKICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnYScgLi4gJ2YnIF0sCiAgICApOwp9CgojCiMgVGVzdHMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMKIwpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgID0+ICRSdWxlSURzWzBdLAogICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgICAgICAgICBFbmREYXRlICAgICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWyRRdWV1ZUlEXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gIiokUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRUaWNrZXRDb3VudCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnQgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgIENsZWFudXAgICAgICAgICAgID0+IFtdLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgID0+ICRSdWxlSURzWzFdLAogICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICAgICA9PiAnUGx1c18xNScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWyRRdWV1ZUlEXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gIiokUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRUaWNrZXRDb3VudCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnQgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgID0+ICdQbHVzXzE1JywKICAgICAgICAgICAgQ2xlYW51cCAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgPT4gJFJ1bGVJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgID0+ICRSdWxlSURzWzJdLAogICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdTb2x1dGlvblRpbWUnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzMwJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgID0+ICdQbHVzXzMwJywKICAgICAgICAgICAgQ2xlYW51cCAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgPT4gJFJ1bGVJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgPT4gJFJ1bGVJRHNbM10sCiAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICAgICA9PiAnUGx1c182MCcsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWyRRdWV1ZUlEXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gIiokUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRUaWNrZXRDb3VudCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnQgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ1BsdXNfNjAnLAogICAgICAgICAgICBDbGVhbnVwICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlEc1syXSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTAxLTAxIDAxOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIFVwZGF0ZVJlc3VsdCA9PiB7CiAgICAgICAgICAgIFVudGlsVGltZSA9PiAtKAogICAgICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpIC0KICAgICAgICAgICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICA9PiAkUnVsZUlEc1s0XSwKICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkc1swXS0+e05hbWV9LAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzFdLT57TmFtZX0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gWyRRdWV1ZUlEXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gIiokUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRUaWNrZXRDb3VudCwKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnQgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzBdLT57TmFtZX0sCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzFdLT57TmFtZX0sCiAgICAgICAgICAgIENsZWFudXAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgID0+ICRSdWxlSURzWzNdLAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gJzIwMTYtMDMtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJzIwMTYtMDMtMDEgMDE6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlUmVzdWx0ID0+IHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMF0tPntOYW1lfSA9PiAnMjAxNi0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzFdLT57TmFtZX0gPT4gJzIwMTYtMDMtMDEgMDE6MDA6MDAnLAogICAgICAgIH0sCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIHVwZGF0ZSB0ZXN0IGNhbGVuZGFyCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJVcGRhdGUoCiAgICAgICAgJUNhbGVuZGFyLAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiAkVGVzdC0+e1RpY2tldEFwcG9pbnRtZW50c30sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDYWxlbmRhclVwZGF0ZSAtIFVwZGF0ZSB0aWNrZXQgYXBwb2ludG1lbnRzIHJ1bGUiLAogICAgKTsKCiAgICAjIFByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50cyBvZiB0aGUgY2FsZW5kYXIuCiAgICBteSAlUmVzdWx0ID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcigKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICk7CgogICAgbXkgJVJlc3VsdENvbXBhcmU7CiAgICBmb3IgbXkgJFRpY2tldElEICggc29ydCBAVGlja2V0SURzICkgewogICAgICAgIHB1c2ggQHsgJFJlc3VsdENvbXBhcmV7UHJvY2Vzc30gfSwgewogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFJ1bGVJRCAgID0+ICRUZXN0LT57VGlja2V0QXBwb2ludG1lbnRzfS0+WzBdLT57UnVsZUlEfSwKICAgICAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICB9OwogICAgfQogICAgJFJlc3VsdENvbXBhcmV7Q2xlYW51cH0gPSAkVGVzdC0+e1Jlc3VsdH0tPntDbGVhbnVwfTsKCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgXCVSZXN1bHQsCiAgICAgICAgXCVSZXN1bHRDb21wYXJlLAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzQ2FsZW5kYXIgLSBSZXN1bHQiLAogICAgKTsKCiAgICAjIGdldCBhcHBvaW50bWVudHMKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICk7CgogICAgIyBjaGVjayBhcHBvaW50bWVudCBjb3VudAogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzLAogICAgICAgICRUZXN0LT57UmVzdWx0fS0+e0NvdW50fSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFRpY2tldCBhcHBvaW50bWVudCBjb3VudCIsCiAgICApOwoKICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IGlkIGJ5IHRpY2tldCBudW1iZXIKICAgICAgICAkQXBwb2ludG1lbnQtPntUaXRsZX0gPX4gLyMoWzAtOV0rKVxdLzsKICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRJRExvb2t1cCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICQxLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aWNrZXQKICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBhcHBvaW50bWVudCBpcyBvZiB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGlja2V0IGFwcG9pbnRtZW50IHR5cGUiLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkRmllbGQgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICBteSAkS2V5ID0gJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfTsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHRpY2tldCB2YWx1ZSBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgIG15ICRUaWNrZXRWYWx1ZTsKCiAgICAgICAgICAgICMgZXNjYWxhdGlvbiB0aW1lcwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPnskRmllbGR9IGVxICdGaXJzdFJlc3BvbnNlVGltZScKICAgICAgICAgICAgICAgIHx8ICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gZXEgJ1VwZGF0ZVRpbWUnCiAgICAgICAgICAgICAgICB8fCAkVGVzdC0+e1Jlc3VsdH0tPnskRmllbGR9IGVxICdTb2x1dGlvblRpbWUnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaWNrZXRWYWx1ZSA9ICRUaWNrZXR7ICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gLiAnRGVzdGluYXRpb25EYXRlJyB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gZXEgJ1BlbmRpbmdUaW1lJyApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRWYWx1ZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpICsgJFRpY2tldHtVbnRpbFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlID0gJFRpY2tldHsgJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgc3RhcnQgdGltZSB2YWx1ZQogICAgICAgICAgICBpZiAoICRGaWVsZCBlcSAnU3RhcnRUaW1lJyApIHsKICAgICAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+e1N0YXJ0VGltZVZhbHVlfSA9ICRUaWNrZXRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgcHJlc2V0IHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZTsKICAgICAgICAgICAgaWYgKCAkS2V5ID1+IC9eUGx1c18oWzAtOV0rKSQvICkgewogICAgICAgICAgICAgICAgbXkgJFByZXNldCA9IGludCAkMTsKCiAgICAgICAgICAgICAgICAjIGdldCBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVGVzdC0+e1Jlc3VsdH0tPntTdGFydFRpbWVWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIGVuZCB0aW1lIHVzaW5nIHByZXNldCB2YWx1ZQogICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkU3RhcnRUaW1lICsgNjAgKiAkUHJlc2V0OwogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcGFyZSB2YWx1ZXMKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57JEZpZWxkfSwKICAgICAgICAgICAgICAgICRUaWNrZXRWYWx1ZSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXBwb2ludG1lbnQgJEZpZWxkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJFRlc3QtPntVcGRhdGV9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICAleyAkVGVzdC0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcHBvaW50bWVudCB1cGRhdGUiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYW51YWxseSB0cmlnZ2VyIGFwcG9pbnRtZW50IGV2ZW50IG1vZHVsZQogICAgICAgICAgICAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50VXBkYXRlVGlja2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnVGlja2V0JyApOwoKICAgICAgICAgICAgIyBnZXQgdGlja2V0IGRhdGEgYWdhaW4KICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb21wYXJlIHZhbHVlcwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICV7ICRUZXN0LT57VXBkYXRlUmVzdWx0fSB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAkVGVzdC0+e1VwZGF0ZVJlc3VsdH0tPnskRmllbGR9LAogICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGlja2V0ICRGaWVsZCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojIENsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UuCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgb3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdApsb2NhbCAkRU5We1RafSA9ICdVVEMnOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJFVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKbXkgJEdyb3VwT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7Cm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRFeHBvcnRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXhwb3J0OjpJQ2FsJyk7Cm15ICRJbXBvcnRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SW1wb3J0OjpJQ2FsJyk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGNyZWF0ZSB0ZXN0IHVzZXIKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKCk7Cm15ICRVc2VySUQgICAgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKCiRTZWxmLT5UcnVlKAogICAgJFVzZXJJRCwKICAgICJUZXN0IHVzZXIgJFVzZXJJRCBjcmVhdGVkIiwKKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEdyb3VwSUQsCiAgICAiVGVzdCBncm91cCAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBhZGQgdGVzdCB1c2VyIHRvIHRlc3QgZ3JvdXAKbXkgJFN1Y2Nlc3MgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJBZGQoCiAgICBHSUQgICAgICAgID0+ICRHcm91cElELAogICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgb3duZXIgICAgID0+IDEsCiAgICAgICAgcHJpb3JpdHkgID0+IDEsCiAgICAgICAgcncgICAgICAgID0+IDEsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlRlc3QgdXNlciAkVXNlcklEIGFkZGVkIHRvIHRlc3QgZ3JvdXAgJEdyb3VwSUQiLAopOwoKbXkgQFRlYW1JRDsKbXkgQFJlc291cmNlSUQ7CgojIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwoKICAgICMgY3JlYXRlIHRlc3QgdGVhbQogICAgbXkgJFRlYW1OYW1lID0gJ3Rlc3QtdGVhbS0nIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICRTdWNjZXNzID0gJFRlYW1PYmplY3QtPlRlYW1BZGQoCiAgICAgICAgTmFtZSAgICA9PiAkVGVhbU5hbWUsCiAgICAgICAgR3JvdXBJRCA9PiAkR3JvdXBJRCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnVGVhbUFkZCgpIC0gVGVzdCB0ZWFtIGNyZWF0ZWQnLAogICAgKTsKCiAgICBteSAlVGVhbSA9ICRUZWFtT2JqZWN0LT5UZWFtR2V0KAogICAgICAgIE5hbWUgICA9PiAkVGVhbU5hbWUsCiAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTdWNjZXNzID0gJFRlYW1PYmplY3QtPlRlYW1Vc2VyQWRkKAogICAgICAgIFRlYW1JRCAgICAgPT4gJFRlYW17SUR9LAogICAgICAgIFRlYW1Vc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZWFtVXNlckFkZCgpIC0gQWRkZWQgdGVzdCB1c2VyIHRvIHRlc3QgdGVhbScsCiAgICApOwoKICAgIHB1c2ggQFRlYW1JRCwgICAgICRUZWFte0lEfTsKICAgIHB1c2ggQFJlc291cmNlSUQsICRVc2VySUQ7Cn0KCiMgY3JlYXRlIGEgdGVzdCBjYWxlbmRhciBmb3IgZXhwb3J0Cm15ICRFeHBvcnRDYWxlbmRhck5hbWUgPSAnRXhwb3J0ICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAlRXhwb3J0Q2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkRXhwb3J0Q2FsZW5kYXJOYW1lLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAiQ2FsZW5kYXJDcmVhdGUoIENhbGVuZGFyTmFtZSA9PiAnJEV4cG9ydENhbGVuZGFyTmFtZScsIENvbG9yID0+ICcjM0E4N0FEJywgR3JvdXBJRCA9PiAkR3JvdXBJRCwgVXNlcklEID0+ICRVc2VySUQgKSAtIENhbGVuZGFySUQ6ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSIsCik7CgojIHNhbXBsZSBhcHBvaW50bWVudHMKbXkgQEFwcG9pbnRtZW50cyA9ICgKCiAgICAjIHJlZ3VsYXIKICAgIHsKICAgICAgICBDYWxlbmRhcklEICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgPT4gJzIwMTYtMDMtMDEgMTA6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgID0+ICcyMDE2LTAzLTAxIDEyOjAwOjAwJywKICAgICAgICBUaXRsZSAgICAgICA9PiAnUmVndWxhciBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NhbXBsZSBkZXNjcmlwdGlvbicsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyBhbGwtZGF5IHdpdGggcmVzb3VyY2UKICAgIHsKICAgICAgICBDYWxlbmRhcklEID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAzLTAyIDAwOjAwOjAwJywKICAgICAgICBBbGxEYXkgICAgID0+IDEsCiAgICAgICAgVGl0bGUgICAgICA9PiAnQWxsLWRheSBBcHBvaW50bWVudCcsCiAgICAgICAgTG9jYXRpb24gICA9PiAnU2FtcGxlIGxvY2F0aW9uJywKICAgICAgICBUZWFtSUQgICAgID0+IFxAVGVhbUlELAogICAgICAgIFJlc291cmNlSUQgPT4gXEBSZXNvdXJjZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyByZWN1cnJpbmcgZGFpbHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICA9PiAnMjAxNi0wMy0wMSAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgPT4gJ0RhaWx5JywKICAgICAgICBSZWN1cnJlbmNlQ291bnQgPT4gMywKICAgICAgICBUaXRsZSAgICAgICAgICAgPT4gJ1JlY3VycmluZyBEYWlseSBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdFdmVyeSBkYXksIGZvciAzIGRheXMnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIHJlY3VycmluZyB3ZWVrbHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICA9PiAnMjAxNi0wMy0wMiAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgID0+ICcyMDE2LTAzLTAyIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgPT4gJ1dlZWtseScsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ID0+IDMsCiAgICAgICAgVGl0bGUgICAgICAgICAgID0+ICdSZWN1cnJpbmcgV2Vla2x5IEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0V2ZXJ5IHdlZWssIGZvciAzIHdlZWtzJywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyByZWN1cnJpbmcgbW9udGhseQogICAgewogICAgICAgIENhbGVuZGFySUQgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgID0+ICcyMDE2LTAzLTAzIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgPT4gJzIwMTYtMDMtMDMgMTY6MDA6MDAnLAogICAgICAgIFJlY3VycmluZyAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICA9PiAnTW9udGhseScsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ID0+IDMsCiAgICAgICAgVGl0bGUgICAgICAgICAgID0+ICdSZWN1cnJpbmcgTW9udGhseSBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdFdmVyeSBtb250aCwgZm9yIDMgbW9udGhzJywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyByZWN1cnJpbmcgeWVhcmx5CiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgPT4gJzIwMTYtMDMtMDQgMTU6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICA9PiAnMjAxNi0wMy0wNCAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgID0+ICdZZWFybHknLAogICAgICAgIFJlY3VycmVuY2VDb3VudCA9PiAzLAogICAgICAgIFRpdGxlICAgICAgICAgICA9PiAnUmVjdXJyaW5nIFllYXJseSBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdFdmVyeSBZZWFybHksIGZvciAzIHllYXJzJywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyBjdXN0b20gZGFpbHkgcmVjdXJyaW5nCiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTU6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdDdXN0b21EYWlseScsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDIsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDMsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdDdXN0b20gRGFpbHkgUmVjdXJyaW5nIEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJ0V2ZXJ5IDIgZGF5cywgMyB0aW1lcycsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAoKICAgICMgIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nCiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMy0wMiAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMiAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLAogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCAzLCA3IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1vbiwgV2VkLCBTdW4KICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDYsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIFdlZWtseSBSZWN1cnJpbmcgQXBwb2ludG1lbnQnLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0V2ZXJ5IG1vbmRheSwgd2VkbmVzZGF5IGFuZCBzdW5kYXksIDYgYXBwb2ludG1lbnRzJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAoKICAgICMgY3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIG1vbnRobHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAzLTAzIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAzLTAzIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tTW9udGhseScsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLAogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCAzLCAzMSBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxc3QsIDN0aCBhbmQgMzFzdAogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgPT4gJzIwMTctMTAtMDEgMDA6MDA6MDAnLAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBNb250aGx5IFJlY3VycmluZyBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnRXZlcnkgMXN0LCAzdGggYW5kIDMxc3QgZGF5LCB1bnRpbCAyMDE3LTEwLTAxJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAoKICAgICMgY3VzdG9tIHllYXJseSByZWN1cnJpbmcgeWVhcmx5CiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMy0wNCAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMy0wNCAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVllYXJseScsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMsIDEyIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgamFuLCBtYXIsIGRlYwogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwKICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDEwLAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBZZWFybHkgUmVjdXJyaW5nIEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICdFdmVyeSAyIFllYXJzIGluIEphbiwgRmViIGFuZCBNYXIgLSAxMCB0aW1lcycsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKKTsKCmZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICJBcHBvaW50bWVudENyZWF0ZSgpIC0gQXBwb2ludG1lbnRJRDogJEFwcG9pbnRtZW50SUQiLAogICAgKTsKfQoKIyBleHBvcnQgYXBwb2ludG1lbnRzCm15ICRJQ2FsU3RyaW5nID0gJEV4cG9ydE9iamVjdC0+RXhwb3J0KAogICAgQ2FsZW5kYXJJRCA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCik7CgojIGdldCBleHBvcnRlZCBhcHBvaW50bWVudHMKbXkgQEV4cG9ydGVkQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkSUNhbFN0cmluZywKICAgICdFeHBvcnQoKSAtIENhbGVuZGFyIGV4cG9ydGVkIHRvIGlDYWwgZm9ybWF0JywKKTsKCiMgY3JlYXRlIGEgdGVzdCBjYWxlbmRhciBmb3IgaW1wb3J0Cm15ICRJbXBvcnRDYWxlbmRhck5hbWUgPSAnSW1wb3J0ICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAlSW1wb3J0Q2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkSW1wb3J0Q2FsZW5kYXJOYW1lLAogICAgQ29sb3IgICAgICAgID0+ICcjRUM5MDczJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkSW1wb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAiQ2FsZW5kYXJDcmVhdGUoIENhbGVuZGFyTmFtZSA9PiAnJEltcG9ydENhbGVuZGFyTmFtZScsIEdyb3VwSUQgPT4gJEdyb3VwSUQsIFVzZXJJRCA9PiAkVXNlcklEICkgLSBDYWxlbmRhcklEOiAkSW1wb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAopOwoKIyBpbXBvcnQgYXBwb2ludG1lbnRzCiRTdWNjZXNzID0gJEltcG9ydE9iamVjdC0+SW1wb3J0KAogICAgQ2FsZW5kYXJJRCA9PiAkSW1wb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBJQ2FsICAgICAgID0+ICRJQ2FsU3RyaW5nLAogICAgVXNlcklEICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICdJbXBvcnQoKSAtIENhbGVuZGFyIGltcG9ydGVkIGZyb20gaUNhbCBmb3JtYXQnLAopOwoKIyBnZXQgaW1wb3J0ZWQgYXBwb2ludG1lbnRzCm15IEBJbXBvcnRlZEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgQ2FsZW5kYXJJRCA9PiAkSW1wb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKKTsKCiMgbnVtYmVyIG9mIGltcG9ydGVkIGFuZCBleHBvcnRlZCBhcHBvaW50bWVudHMgbWF0Y2gKJFNlbGYtPklzKAogICAgc2NhbGFyIEBJbXBvcnRlZEFwcG9pbnRtZW50cywKICAgIHNjYWxhciBARXhwb3J0ZWRBcHBvaW50bWVudHMsCiAgICAnSW1wb3J0ZWQgYXBwb2ludG1lbnQgY291bnQnCik7CgpteSAkQ291bnQgPSAxOwpmb3IgbXkgJEltcG9ydGVkQXBwb2ludG1lbnQgKEBJbXBvcnRlZEFwcG9pbnRtZW50cykgewoKICAgICMgZGVsZXRlIHNwZWNpZmljIGtleXMKICAgIGRlbGV0ZSAkSW1wb3J0ZWRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgZGVsZXRlICRJbXBvcnRlZEFwcG9pbnRtZW50LT57Q2FsZW5kYXJJRH07CiAgICBkZWxldGUgJEltcG9ydGVkQXBwb2ludG1lbnQtPntVbmlxdWVJRH07CiAgICBkZWxldGUgJEltcG9ydGVkQXBwb2ludG1lbnQtPntQYXJlbnRJRH07CiAgICBkZWxldGUgJEV4cG9ydGVkQXBwb2ludG1lbnRzWyAkQ291bnQgLSAxIF0tPntBcHBvaW50bWVudElEfTsKICAgIGRlbGV0ZSAkRXhwb3J0ZWRBcHBvaW50bWVudHNbICRDb3VudCAtIDEgXS0+e0NhbGVuZGFySUR9OwogICAgZGVsZXRlICRFeHBvcnRlZEFwcG9pbnRtZW50c1sgJENvdW50IC0gMSBdLT57VW5pcXVlSUR9OwogICAgZGVsZXRlICRFeHBvcnRlZEFwcG9pbnRtZW50c1sgJENvdW50IC0gMSBdLT57UGFyZW50SUR9OwoKICAgICMgY29tcGFyZSBpbXBvcnRlZCBhbmQgZXhwb3J0ZWQgYXBwb2ludG1lbnRzCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJEltcG9ydGVkQXBwb2ludG1lbnQsCiAgICAgICAgJEV4cG9ydGVkQXBwb2ludG1lbnRzWyAkQ291bnQgLSAxIF0sCiAgICAgICAgIkltcG9ydGVkIGFwcG9pbnRtZW50ICRDb3VudCIsCiAgICApOwogICAgJENvdW50Kys7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgT3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdC4gVGhpcyBpcyByZXF1aXJlZCBzaW5jZSBleHBlY3RlZCBpbXBvcnRlZCBkYXRlCiMgICB2YWx1ZXMgYXJlIGFsbCBpbiBVVEMuCmxvY2FsICRFTlZ7VFp9ID0gJ1VUQyc7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7Cm15ICRVc2VyT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgojIGNyZWF0ZSB0ZXN0IHVzZXIKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKCk7Cm15ICRVc2VySUQgICAgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRVc2VyTG9naW4gKTsKCiRTZWxmLT5UcnVlKAogICAgJFVzZXJJRCwKICAgICJUZXN0IHVzZXIgJFVzZXJJRCBjcmVhdGVkIiwKKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEdyb3VwSUQsCiAgICAiVGVzdCBncm91cCAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBhZGQgdGVzdCB1c2VyIHRvIHRlc3QgZ3JvdXAKbXkgJFN1Y2Nlc3MgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJBZGQoCiAgICBHSUQgICAgICAgID0+ICRHcm91cElELAogICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgb3duZXIgICAgID0+IDEsCiAgICAgICAgcHJpb3JpdHkgID0+IDEsCiAgICAgICAgcncgICAgICAgID0+IDEsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlRlc3QgdXNlciAkVXNlcklEIGFkZGVkIHRvIHRlc3QgZ3JvdXAgJEdyb3VwSUQiLAopOwoKbXkgQFRlYW1JRDsKbXkgQFJlc291cmNlSUQ7CgojIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwoKICAgICMgY3JlYXRlIHRlc3QgdGVhbQogICAgJFN1Y2Nlc3MgPSAkVGVhbU9iamVjdC0+VGVhbUFkZCgKICAgICAgICBOYW1lICAgID0+ICdUZXN0IFRlYW0nLAogICAgICAgIEdyb3VwSUQgPT4gMSwgICAgICAgICAgICAgIyBhZG1pbgogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsICAgICAgICAgICAgICMgcm9vdAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnVGVhbUFkZCgpIC0gVGVzdCB0ZWFtIGNyZWF0ZWQnLAogICAgKTsKCiAgICBteSAlVGVhbSA9ICRUZWFtT2JqZWN0LT5UZWFtR2V0KAogICAgICAgIE5hbWUgICA9PiAnVGVzdCBUZWFtJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJBZGQoCiAgICAgICAgVGVhbUlEICAgICA9PiAkVGVhbXtJRH0sCiAgICAgICAgVGVhbVVzZXJJRCA9PiAxLCAgICAgICAgICAgIyByb290CiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnVGVhbVVzZXJBZGQoKSAtIEFkZGVkIHJvb3QgdXNlciB0byB0ZXN0IHRlYW0nLAogICAgKTsKCiAgICBwdXNoIEBUZWFtSUQsICAgICAkVGVhbXtJRH07CiAgICBwdXNoIEBSZXNvdXJjZUlELCAxOwp9CgojIHRoaXMgd2lsbCBiZSBvawpteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICdUZXN0IGNhbGVuZGFyJywKICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgIkNhbGVuZGFyQ3JlYXRlKCBDYWxlbmRhck5hbWUgPT4gJ1Rlc3QgY2FsZW5kYXInLCBDb2xvciA9PiAnIzNBODdBRCcsIEdyb3VwSUQgPT4gJEdyb3VwSUQsIFVzZXJJRCA9PiAkVXNlcklEICkgLSBDYWxlbmRhcklEIiwKKTsKCiMgcmVhZCBzYW1wbGUgLmljcyBmaWxlCm15ICRDb250ZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RmlsZVJlYWQoCiAgICBEaXJlY3RvcnkgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+e0hvbWV9IC4gJy9zY3JpcHRzL3Rlc3Qvc2FtcGxlL0NhbGVuZGFyLycsCiAgICBGaWxlbmFtZSAgPT4gJ1NhbXBsZUNhbGVuZGFyLmljcycsCik7CgokU2VsZi0+VHJ1ZSgKICAgICR7JENvbnRlbnR9LAogICAgJy5pY3Mgc3RyaW5nIGxvYWRlZCcsCik7CgpteSAkSW1wb3J0U3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SW1wb3J0OjpJQ2FsJyktPkltcG9ydCgKICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgSUNhbCAgICAgICA9PiAkeyRDb250ZW50fSwKICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgIFVudGlsTGltaXQgPT4gJzIwMTgtMDEtMDEgMDA6MDA6MDAnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkSW1wb3J0U3VjY2VzcywKICAgICdJbXBvcnQgc3VjY2VzcycsCik7CgpteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAopOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBBcHBvaW50bWVudHMsCiAgICAxNzEsCiAgICAnQXBwb2ludG1lbnQgY291bnQnLAopOwoKbXkgQFJlc3VsdCA9ICgKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFxAVGVhbUlELAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMDUgMDA6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0FsbCBkYXknLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gXEBSZXNvdXJjZUlELAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMDYgMDA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAndGVzdCBhbGwgZGF5IGV2ZW50JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTEyIDA5OjMwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09ubHkgb25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnQmVsZ3JhZGUnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDQtMTIgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+ICcxJywKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMTkgMDk6MzA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMTkgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI2IDA5OjMwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTI2IDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09ubHkgb25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnQmVsZ3JhZGUnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMDMgMDk6MzA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNS0wMyAxMDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMTAgMTA6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMDk6MzA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0xNyAwOTozMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMTcgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnQmVsZ3JhZGUnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09ubHkgb25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA1LTI0IDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09ubHkgb25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnQmVsZ3JhZGUnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0yNCAwOTozMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTMxIDA5OjMwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0zMSAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0wNyAwOTozMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNi0wNyAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdHZXJtYW55JywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTEyIDEyOjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTEyIDExOjE1OjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0xMiAxMToxNTowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0xMiAxMToxNTowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA2LTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdHZXJtYW55JwogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA3LTEyIDExOjE1OjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNy0xMiAxMjowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA4LTEyIDExOjE1OjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+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+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMjAtMDQtMDEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTAyIDAwOjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+ICcxJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0wMyAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gJzEnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0wNSAwMDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0wNiAwMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+ICcxJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTA4IDAwOjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gJzEnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMDkgMDA6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTEyIDAwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTExIDAwOjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0xNCAwMDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDQtMTUgMDA6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+ICcxJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTE3IDAwOjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0xOCAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgPT4gJzEnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTIxIDAwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAzdGhkIGFsbCBkYXknLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTIwIDAwOjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+ICcxJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTI0IDAwOjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAzdGhkIGFsbCBkYXknLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0yMyAwMDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0yNyAwMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMjYgMDA6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTMwIDAwOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMjkgMDA6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDMtMDcgMTY6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiAnMScsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdGaXJzdCAzIGRheXMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMy0wNyAxNTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDMtMDggMTY6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMy0wOCAxNTowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRmlyc3QgMyBkYXlzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0ZpcnN0IDMgZGF5cycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTA5IDE1OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAzLTA5IDE2OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDMtMDIgMTc6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgbmV4dCAyIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gJzEnLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMy0wMiAxODowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ09uY2UgcGVyIG5leHQgMiBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0wMiAxNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0wMiAxODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAxLTAzIDE4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0phbnVhcnkgM3RoIG5leHQgMyB5ZWFycycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdKYW51YXJ5IDN0aCBuZXh0IDMgeWVhcnMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMDEtMDMgMTg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTgtMDEtMDMgMTg6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTgtMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0phbnVhcnkgM3RoIG5leHQgMyB5ZWFycycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0xMiAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMTIgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMjYgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTI2IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTEwIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTI0IDE1OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0yNCAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDYtMDcgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA2LTA3IDE1OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDYtMjEgMTQ6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTIxIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDctMDUgMTU6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNy0wNSAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA3LTE5IDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNy0xOSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDgtMDIgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA4LTAyIDE1OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JwogICAgfSwKICAgIHsKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTE2IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wOC0xNiAxNDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDgtMzAgMTU6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOC0zMCAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wOS0xMyAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA5LTEzIDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDktMjcgMTU6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMjcgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICB9LAogICAgewogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTEwLTExIDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEwLTExIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScKICAgIH0sCiAgICB7CiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0xMC0yNSAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTEwLTI1IDE0OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMS0wOCAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMS0wOCAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTEtMjIgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMTEtMjIgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0wNiAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTItMDYgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMTItMjAgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTEyLTIwIDE0OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDEtMDMgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDEtMDMgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wMS0xNyAxNDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTAxLTE3IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wMS0zMSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wMS0zMSAxNDowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXQogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTAyLTE0IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTAyLTE0IDE0OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wMi0yOCAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAyLTI4IDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDMtMTQgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTAzLTE0IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDMtMjggMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAzLTI4IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDQtMTEgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wNC0xMSAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDQtMjUgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTA0LTI1IDE0OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDUtMDkgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA1LTA5IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wNS0yMyAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA1LTIzIDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTA2LTA2IDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNy0wNi0wNiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wNi0yMCAxNTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDYtMjAgMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDctMDQgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE3LTA3LTA0IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTA3LTE4IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wNy0xOCAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wOC0wMSAxNDowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDgtMDEgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDgtMTUgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA4LTE1IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wOC0yOSAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDgtMjkgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA5LTEyIDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDktMTIgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDktMjYgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA5LTI2IDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0xMC0xMCAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMTAtMTAgMTU6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMTAtMjQgMTU6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMTAtMjQgMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMTEtMDcgMTQ6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMTEtMDcgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0xMS0yMSAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMTEtMjEgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTEyLTA1IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0xMi0wNSAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0xMi0xOSAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0xMi0xOSAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0xMSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+ICcxJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMS0xMSAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10KICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTEzIDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDEtMTMgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0xNyAwOTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTE3IDA4OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTI3IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMS0yNyAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMScKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0zMSAwOTowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMS0zMSAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAyLTEwIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDItMTAgMDg6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDItMTQgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0xNCAwODowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10KICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDItMjQgMDk6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0yNCAwODowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0yOCAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wMi0yOCAwOTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDMtMDkgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMy0wOSAwODowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDMtMTMgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTAzLTEzIDA5OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDMtMjMgMDk6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0yMyAwODowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0yNyAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMy0yNyAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTEyIDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDEtMTIgMDk6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMS0xNiAwODowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0xNiAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTMxIDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMS0zMSAwOTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDItMTYgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDItMTYgMDg6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDMtMTYgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTE2IDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAzLTMxIDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDMtMzEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTE2IDA5OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0xNiAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMTYgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTE2IDA4OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMzEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTMxIDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTE2IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA3LTE2IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNy0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTMxIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA3LTMxIDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wOC0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDgtMTYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDgtMzEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTMxIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wOS0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMTYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTAtMTYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMC0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTAtMzEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTEwLTMxIDA5OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMS0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMS0xNiAwODowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTItMTYgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTEyLTE2IDA5OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTItMzEgMDg6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0xMi0zMSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAxLTMxIDA5OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTMxIDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0yOSAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wMi0yOSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0zMSAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTEyLTMxIDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gNCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMS0wNCAxNTowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDEtMDQgMTY6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMi0wNCAxNTowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSA0JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDItMDQgMTY6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wMi0wNCAxNTowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSA0JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDItMDQgMTY6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMS0wNCAxNjowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ1llYXJseScsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTA0IDE1OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDEtMDQgMTU6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdZZWFybHknLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTAxLTA0IDE2OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAopOwoKTE9PUDoKZm9yICggbXkgJEluZGV4ID0gMDsgJEluZGV4IDwgc2NhbGFyIEBBcHBvaW50bWVudHM7ICRJbmRleCsrICkgewogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFJlc3VsdFskSW5kZXhdIH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdW5kZWYKICAgICAgICBpZiAoICFkZWZpbmVkICRSZXN1bHRbJEluZGV4XS0+eyRLZXl9ICkgewoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c1skSW5kZXhdLT57JEtleX0sCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICJDaGVjayBpZiAkS2V5IGlzIHVuZGVmLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUmVzdWx0WyRJbmRleF0tPnskS2V5fSApICkgewogICAgICAgICAgICBteSAlSXRlbXMgPSAoKTsKICAgICAgICAgICAgJEl0ZW1zeyRffSArPSAxIGZvcmVhY2ggKCBAeyAkUmVzdWx0WyRJbmRleF0tPnskS2V5fSB9ICk7CiAgICAgICAgICAgICRJdGVtc3skX30gLT0gMSBmb3JlYWNoICggQHsgJEFwcG9pbnRtZW50c1skSW5kZXhdLT57JEtleX0gfSApOwoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAhKCBncmVwIHsgJF8gIT0gMCB9IHZhbHVlcyAlSXRlbXMgKSwKICAgICAgICAgICAgICAgICJDaGVjayBpZiBhcnJheSAkS2V5IGlzIE9LLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggSXNTdHJpbmdXaXRoRGF0YSggJFJlc3VsdFskSW5kZXhdLT57JEtleX0gKSApIHsKCiAgICAgICAgICAgICMgU2tpcCBQYXJlbnRJRCBzaW5jZSB0aGlzIHZhbHVlIGNhbid0IG1hdGNoIEFwcG9pbnRtZW50SUQgKGV2ZXJ5IHRpbWUgaXMgZGlmZmVyZW50KQogICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxCgogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c1skSW5kZXhdLT57JEtleX0sCiAgICAgICAgICAgICAgICAkUmVzdWx0WyRJbmRleF0tPnskS2V5fSwKICAgICAgICAgICAgICAgICJDaGVjayBpZiAkS2V5IHZhbHVlIGlzIE9LLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiAgICAgICAgIyBEbyBub3QgY2hlY2sgUmljaFRleHQuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbJ2FkbWluJ10sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWRtaW5Ob3RpZmljYXRpb25FdmVudCBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Iik7CgogICAgICAgICMgQ2hlY2sgb3ZlcnZpZXcgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIENsaWNrICJBZGQgbm90aWZpY2F0aW9uIi4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50O1N1YmFjdGlvbj1BZGQnICldIikKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgYWRkIE5vdGlmaWNhdGlvbkV2ZW50IHNjcmVlbi4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoTmFtZSBDb21tZW50IFZhbGlkSUQgRXZlbnRzIGVuX1N1YmplY3QgZW5fQm9keSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiMkSUQiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICAjIFRvZ2dsZSBUaWNrZXQgZmlsdGVyIHdpZGdldC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8xJyldIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCdhW2FyaWEtY29udHJvbHMqPVwiQ29yZV9VSV9BdXRvZ2VuZXJhdGVkSURfMVwiXScpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnKSA9PT0gJ3RydWUnOyIKICAgICAgICApOwoKICAgICAgICAjIFRvZ2dsZSBBcnRpY2xlIGZpbHRlciAoT25seSBmb3IgQXJ0aWNsZUNyZWF0ZSBhbmQgQXJ0aWNsZVNlbmQgZXZlbnQpIHdpZGdldC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8yJyldIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCdhW2FyaWEtY29udHJvbHMqPVwiQ29yZV9VSV9BdXRvZ2VuZXJhdGVkSURfMlwiXScpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnKSA9PT0gJ2ZhbHNlJzsiCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBOb3RpZmljYXRpb25FdmVudC4KICAgICAgICBteSAkTm90aWZFdmVudFJhbmRvbUlEID0gIk5vdGlmaWNhdGlvbkV2ZW50IiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJE5vdGlmRXZlbnRUZXh0ICAgICA9ICJTZWxlbml1bSBOb3RpZmljYXRpb25FdmVudCB0ZXN0IjsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCROb3RpZkV2ZW50UmFuZG9tSUQpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NvbW1lbnQiLCAnY3NzJyApLT5zZW5kX2tleXMoJE5vdGlmRXZlbnRUZXh0KTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNFdmVudHMnKS52YWwoJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9TdWJqZWN0IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCROb3RpZkV2ZW50VGV4dCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjZW5fQm9keSIsICAgICdjc3MnICktPnNlbmRfa2V5cygkTm90aWZFdmVudFRleHQpOwoKICAgICAgICAjIENoZWNrICdBZGRpdGlvbmFsIHJlY2lwaWVudCcgbGVuZ3RoIHZhbGlkYXRpb24gZnJvbSBBZGRpdGlvbmFsIHJlY2lwaWVudCBlbWFpbCBhZGRyZXNzZXMgKHNlZSBidWcjMTM5MzYpLgogICAgICAgIG15ICRGaWVsZFZhbHVlID0gImEiIHggMjAxOwoKICAgICAgICAjIENoZWNrIFRyYW5zcG9ydEVtYWlsIGNoZWNrYm94IGlmIGl0IGlzIG5vdCBjaGVja2VkLgogICAgICAgIG15ICRUcmFuc3BvcnRFbWFpbENoZWNrID0gJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjVHJhbnNwb3J0RW1haWwnKS5wcm9wKCdjaGVja2VkJyk7Iik7CiAgICAgICAgaWYgKCAhJFRyYW5zcG9ydEVtYWlsQ2hlY2sgKSB7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjVHJhbnNwb3J0RW1haWwnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7Iik7CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjVHJhbnNwb3J0RW1haWwnKS5wcm9wKCdjaGVja2VkJykgPT09IHRydWU7IiApOwogICAgICAgIH0KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNSZWNpcGllbnRFbWFpbCIsICdjc3MnICktPnNlbmRfa2V5cygkRmllbGRWYWx1ZSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI1JlY2lwaWVudEVtYWlsLkVycm9yJykubGVuZ3RoOyIgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI1JlY2lwaWVudEVtYWlsLkVycm9yJykubGVuZ3RoOyIpLAogICAgICAgICAgICAiVmFsaWRhdGlvbiBmb3IgJ0FkZGl0aW9uYWwgcmVjaXBpZW50JyBmaWVsZCBpcyBjb3JyZWN0IiwKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JlY2lwaWVudEVtYWlsIiwgJ2NzcycgKS0+Y2xlYXIoKTsKCiAgICAgICAgIyBTZXQgYmFjayBUcmFuc3BvcnRFbWFpbCBjaGVja2JveCBpZiBpdCB3YXMgbm90IGNoZWNrZWQuCiAgICAgICAgaWYgKCAhJFRyYW5zcG9ydEVtYWlsQ2hlY2sgKSB7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjVHJhbnNwb3J0RW1haWwnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOyIpOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI1RyYW5zcG9ydEVtYWlsJykucHJvcCgnY2hlY2tlZCcpID09PSBmYWxzZTsiICk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgaWYgdGVzdCBOb3RpZmljYXRpb25FdmVudCBzaG93IG9uIEFkbWluTm90aWZpY2F0aW9uRXZlbnQgc2NyZWVuLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5EYXRhVGFibGUgdHIgdGQgYTpjb250YWlucygkTm90aWZFdmVudFJhbmRvbUlEKScpLmxlbmd0aDsiKSwKICAgICAgICAgICAgIiROb3RpZkV2ZW50UmFuZG9tSUQgTm90aWZpY2Fpb25FdmVudCBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIHRlc3QgTm90aWZpY2F0aW9uRXZlbnQgdmFsdWVzLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAkTm90aWZFdmVudFJhbmRvbUlELCAnbGlua190ZXh0JyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjTmFtZScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkTm90aWZFdmVudFJhbmRvbUlELAogICAgICAgICAgICAiI05hbWUgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ29tbWVudCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkTm90aWZFdmVudFRleHQsCiAgICAgICAgICAgICIjQ29tbWVudCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNlbl9TdWJqZWN0JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICROb3RpZkV2ZW50VGV4dCwKICAgICAgICAgICAgIiNlbl9TdWJqZWN0IHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI2VuX0JvZHknLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJE5vdGlmRXZlbnRUZXh0LAogICAgICAgICAgICAiI2VuX0JvZHkgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjVmFsaWRJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiI1ZhbGlkSUQgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwoKICAgICAgICAjIEVkaXQgdGVzdCBOb3RpZmljYXRpb25FdmVudCBhbmQgc2V0IGl0IHRvIGludmFsaWQuCiAgICAgICAgbXkgJEVkaXROb3RpZkV2ZW50VGV4dCA9ICJTZWxlbml1bSBlZGl0ZWQgTm90aWZpY2F0aW9uRXZlbnQgdGVzdCI7CgogICAgICAgICMgVG9nZ2xlIEFydGljbGUgZmlsdGVyIChPbmx5IGZvciBBcnRpY2xlQ3JlYXRlIGFuZCBBcnRpY2xlU2VuZCBldmVudCkgd2lkZ2V0LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBhcmlhLWNvbnRyb2xzLCBcJ0NvcmVfVUlfQXV0b2dlbmVyYXRlZElEXzInKV0iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ2FbYXJpYS1jb250cm9scyo9XCJDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8yXCJdJykuYXR0cignYXJpYS1leHBhbmRlZCcpID09PSAnZmFsc2UnOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50IiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRFZGl0Tm90aWZFdmVudFRleHQpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5zZW5kX2tleXMoJEVkaXROb3RpZkV2ZW50VGV4dCk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNWYWxpZElEJykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcuRGF0YVRhYmxlIHRyIHRkIGE6Y29udGFpbnMoJE5vdGlmRXZlbnRSYW5kb21JRCknKS5sZW5ndGg7IgogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgZWRpdGVkIE5vdGlmY2F0aW9uRXZlbnQgdmFsdWVzLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAkTm90aWZFdmVudFJhbmRvbUlELCAnbGlua190ZXh0JyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ29tbWVudCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAiIiwKICAgICAgICAgICAgIiNDb21tZW50IHVwZGF0ZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNlbl9Cb2R5JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRFZGl0Tm90aWZFdmVudFRleHQsCiAgICAgICAgICAgICIjZW5fQm9keSB1cGRhdGVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjVmFsaWRJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAyLAogICAgICAgICAgICAiI1ZhbGlkSUQgdXBkYXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyBiYWNrIHRvIEFkbWluTm90aWZpY2F0aW9uRXZlbnQgb3ZlcnZpZXcgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIpOwoKICAgICAgICAjIENoZWNrIGNsYXNzIG9mIGludmFsaWQgTm90aWZpY2F0aW9uRXZlbnQgaW4gdGhlIG92ZXJ2aWV3IHRhYmxlLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgndHIuSW52YWxpZCB0ZCBhOmNvbnRhaW5zKCROb3RpZkV2ZW50UmFuZG9tSUQpJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIlRoZXJlIGlzIGEgY2xhc3MgJ0ludmFsaWQnIGZvciB0ZXN0IE5vdGlmaWNhdGlvbkV2ZW50IiwKICAgICAgICApOwoKICAgICAgICAjIEdldCBOb3RpZmljYXRpb25FdmVudElELgogICAgICAgIG15ICVOb3RpZkV2ZW50SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKS0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBOYW1lID0+ICROb3RpZkV2ZW50UmFuZG9tSUQKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIGRlbGV0ZSBpY29uLgogICAgICAgIG15ICRDaGVja0NvbmZpcm1KUyA9IDw8IkpBVkFTQ1JJUFQiOwooZnVuY3Rpb24gKCkgewogICAgd2luZG93LmNvbmZpcm0gPSBmdW5jdGlvbiAobWVzc2FnZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKfSgpKTsKSkFWQVNDUklQVAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoJENoZWNrQ29uZmlybUpTKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBTTEEgd2l0aCBkZWxldGUgYnV0dG9uLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ1N1YmFjdGlvbj1EZWxldGU7SUQ9JE5vdGlmRXZlbnRJRHtJRH0nICldIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBDaGVjayBpZiB0ZXN0IE5vdGlmaWNhdGlvbkV2ZW50IGlzIGRlbGV0ZWQuCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgndHIuSW52YWxpZCB0ZCBhOmNvbnRhaW5zKCROb3RpZkV2ZW50UmFuZG9tSUQpJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIlRlc3QgTm90aWZpY2F0aW9uRXZlbnQgaXMgZGVsZXRlZCAtICROb3RpZkV2ZW50UmFuZG9tSUQiLAogICAgICAgICkgfHwgZGllOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICAgICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBncm91cC4KICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICBteSAkVXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY3VzdG9tZXIgdXNlci4KICAgICAgICBteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCBjdXN0b21lciB1c2VyIjsKCiAgICAgICAgIyBMb2dpbiBhcyB0ZXN0IHVzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGEgZmV3IHRlc3QgY2FsZW5kYXJzLgogICAgICAgIG15IEBDYWxlbmRhcnM7CiAgICAgICAgbXkgJENvdW50ID0gMTsKICAgICAgICBmb3IgbXkgJENvbG9yICggJyMzQTg3QUQnLCAnI0VDOTA3MycsICcjNkJBRDU0JyApIHsKICAgICAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIkQ291bnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAkQ29sb3IsCiAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDYWxlbmRhcnMsIFwlQ2FsZW5kYXI7CgogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICB9CgogICAgICAgIG15ICRDYWxlbmRhcldlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCA3OwoKICAgICAgICAjIEdldCBzdGFydCBvZiB0aGUgd2Vlay4KICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwogICAgICAgIG15ICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CiAgICAgICAgd2hpbGUgKCAkV2Vla0RheSAhPSAkQ2FsZW5kYXJXZWVrRGF5U3RhcnQgKSB7CiAgICAgICAgICAgICRTdGFydFRpbWUgLT0gNjAgKiA2MCAqIDI0OwogICAgICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICMgQXBwb2ludG1lbnQgdGltZXMgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrLgogICAgICAgIG15ICVTdGFydFRpbWUgPSAoCiAgICAgICAgICAgIERheSAgICA9PiAkRGF5LAogICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICBZZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgIEhvdXIgICA9PiAxMiwKICAgICAgICAgICAgTWludXRlID0+IDE1LAogICAgICAgICk7CgogICAgICAgICMgRGVmaW5lIGFwcG9pbnRtZW50IG5hbWVzLgogICAgICAgIG15IEBBcHBvaW50bWVudE5hbWVzID0gKCAnQXBwb2ludG1lbnQgMScsICdBcHBvaW50bWVudCAyJywgJ0FwcG9pbnRtZW50IDMnICk7CgogICAgICAgICMgR28gdG8gYWdlbmRhIG92ZXJ2aWV3IHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3Iik7CgogICAgICAgICMgQ2xpY2sgb24gdGhlIGFwcG9pbnRtZW50IGNyZWF0ZSBidXR0b24uCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGEgcmVndWxhciBhcHBvaW50bWVudC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoICRBcHBvaW50bWVudE5hbWVzWzBdICk7CiAgICAgICAgZm9yIG15ICRHcm91cCAocXcoU3RhcnQgRW5kKSkgewogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhIb3VyIE1pbnV0ZSBEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgIlwkKCcjJEdyb3VwJEZpZWxkJykudmFsKCRTdGFydFRpbWV7JEZpZWxkfSkudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyc1swXS0+e0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgU2F2ZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CgogICAgICAgICMgVmVyaWZ5IHRoZSByZWd1bGFyIGFwcG9pbnRtZW50IGlzIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgndGJvZHkgdHI6Y29udGFpbnMoJEFwcG9pbnRtZW50TmFtZXNbMF0pJykubGVuZ3RoOyIpLAogICAgICAgICAgICAiRmlyc3QgYXBwb2ludG1lbnQgJyRBcHBvaW50bWVudE5hbWVzWzBdJyBmb3VuZCBpbiB0aGUgdGFibGUiCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBvbiB0aGUgY3JlYXRlIGJ1dHRvbiBmb3IgYW5vdGhlciBhcHBvaW50bWVudCBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBDcmVhdGUgYW4gYWxsLWRheSBhcHBvaW50bWVudC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgICduYW1lJyApLT5zZW5kX2tleXMoICRBcHBvaW50bWVudE5hbWVzWzFdICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdBbGxEYXknLCAnbmFtZScgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgIGZvciBteSAkR3JvdXAgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJcJCgnIyRHcm91cCRGaWVsZCcpLnZhbCgkU3RhcnRUaW1leyRGaWVsZH0pLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcnNbMV0tPntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CgogICAgICAgICMgVmVyaWZ5IHRoZSBhbGwtZGF5IGFwcG9pbnRtZW50IGlzIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgndGJvZHkgdHI6Y29udGFpbnMoJEFwcG9pbnRtZW50TmFtZXNbMV0pJykubGVuZ3RoOyIpLAogICAgICAgICAgICAiU2Vjb25kIGFwcG9pbnRtZW50ICckQXBwb2ludG1lbnROYW1lc1sxXScgZm91bmQgaW4gdGhlIHRhYmxlIgogICAgICAgICk7CgogICAgICAgIG15ICRSZWN1cnJlbmNlQ291bnQgPSAzOwoKICAgICAgICAjIENsaWNrIGFnYWluIG9uIHRoZSBjcmVhdGUgYnV0dG9uIGZvciBhbiBhcHBvaW50bWVudCBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBDcmVhdGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCAkQXBwb2ludG1lbnROYW1lc1syXSApOwogICAgICAgIGZvciBteSAkR3JvdXAgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoSG91ciBNaW51dGUgRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJcJCgnIyRHcm91cCRGaWVsZCcpLnZhbCgkU3RhcnRUaW1leyRGaWVsZH0pLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcnNbMl0tPntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJFJlY3VycmVuY2VDb3VudCk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmICFcJCgnLkRpYWxvZy5Nb2RhbCcpLmxlbmd0aCIgKTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkUmVmcmVzaCgpOwoKICAgICAgICAjIFZlcmlmeSBhbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMgYXJlIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCd0Ym9keSB0cjpjb250YWlucygkQXBwb2ludG1lbnROYW1lc1syXSknKS5sZW5ndGggPT09ICRSZWN1cnJlbmNlQ291bnQ7IgogICAgICAgICAgICApLAogICAgICAgICAgICAiQWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VycmVuY2VzIGZvdW5kIGluIHRoZSB0YWJsZSIKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0aGlyZCBhcHBvaW50bWVudCBtYXN0ZXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICRBcHBvaW50bWVudE5hbWVzWzJdLCAnbGlua190ZXh0JyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCAmJiBcJCgnI0VkaXRGb3JtRGVsZXRlJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtRGVsZXRlJywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEFsZXJ0UHJlc2VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5hY2NlcHRfYWxlcnQoKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAgXCQoJ3Rib2R5IHRyOmNvbnRhaW5zKCRBcHBvaW50bWVudE5hbWVzWzJdKScpLmxlbmd0aCA9PT0gMDsiCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgYWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VyZW5jZXMgaGF2ZSBiZWVuIHJlbW92ZWQuCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJ3Rib2R5IHRyOmNvbnRhaW5zKCRBcHBvaW50bWVudE5hbWVzWzJdKScpLmxlbmd0aDsiKSwKICAgICAgICAgICAgIkFsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cmVuY2VzIGRlbGV0ZWQiCiAgICAgICAgKTsKICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGdyb3VwLgogICAgICAgIG15ICRHcm91cE5hbWUgPSAidGVzdC1jYWxlbmRhci1ncm91cC0kUmFuZG9tSUQiOwogICAgICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRHcm91cElELAogICAgICAgICAgICAnVGVzdCBncm91cCBjcmVhdGVkJywKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHF1ZXVlLgogICAgICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gIlF1ZXVlJFJhbmRvbUlEIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTb21lIGNvbW1lbnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUXVldWVJRCwKICAgICAgICAgICAgJ1Rlc3QgcXVldWUgY3JlYXRlZCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIENoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpLgogICAgICAgICRTZWxlbml1bS0+c2V0X3dpbmRvd19zaXplKCA3NjgsIDEwNTAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbJEdyb3VwTmFtZV0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCB1c2VyJzsKCiAgICAgICAgIyBTdGFydCB0ZXN0LgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIE9wZW4gQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIik7CgogICAgICAgICMgQ2xpY2sgQWRkIG5ldyBjYWxlbmRhci4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5TaWRlYmFyQ29sdW1uIHVsLkFjdGlvbkxpc3QgYSNBZGQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV3JpdGUgY2FsZW5kYXIgbmFtZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGlucHV0I0NhbGVuZGFyTmFtZScsICdjc3MnICktPnNlbmRfa2V5cygiQ2FsZW5kYXIgJFJhbmRvbUlEIik7CgogICAgICAgICMgU2V0IGl0IHRvIHRlc3QgZ3JvdXAuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjR3JvdXBJRCcpLnZhbCgkR3JvdXBJRCkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBTdWJtaXQuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBidXR0b24jU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFZlcmlmeSBkb3dubG9hZCBhbmQgY29weS10by1jbGlwYm9hcmQgbGlua3MuCiAgICAgICAgZm9yIG15ICRDbGFzcyAocXcoRG93bmxvYWRMaW5rIENvcHlUb0NsaXBib2FyZCkpIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi4kQ2xhc3MiLCAnY3NzJyApOwoKICAgICAgICAgICAgbXkgJFVSTDsKICAgICAgICAgICAgaWYgKCAkQ2xhc3MgZXEgJ0Rvd25sb2FkTGluaycgKSB7CiAgICAgICAgICAgICAgICAkVVJMID0gJEVsZW1lbnQtPmdldF9hdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRDbGFzcyBlcSAnQ29weVRvQ2xpcGJvYXJkJyApIHsKICAgICAgICAgICAgICAgICRVUkwgPSAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy4kQ2xhc3MnKS5hdHRyKCdkYXRhLWNsaXBib2FyZC10ZXh0Jyk7Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVSTCwKICAgICAgICAgICAgICAgICIkQ2xhc3MgVVJMIHByZXNlbnQiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFVSTCBzaG91bGQgbm90IGNvbnRhaW4gT1RSUyBzcGVjaWZpYyBVUkwgZGVsaW1pdGVyIG9mIHNlbWljb2xvbiAoOykuCiAgICAgICAgICAgICMgICBGb3IgYmV0dGVyIGNvbXBhdGliaWxpdHksIHVzZSBzdGFuZGFyZCBhbXBlcnNhbmQgKCYpIGluc3RlYWQuCiAgICAgICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjY2NyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgKCAkVVJMID1+IC9bO10vICkgPyAxIDogMCwKICAgICAgICAgICAgICAgICIkQ2xhc3MgVVJMIGRvZXMgbm90IGNvbnRhaW4gZm9yYmlkZGVuIGNoYXJhY3RlcnMiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyBMZXQncyB0cnkgdG8gYWRkIGNhbGVuZGFyIHdpdGggc2FtZSBuYW1lLgogICAgICAgICMKICAgICAgICAjIENsaWNrIEFkZCBuZXcgY2FsZW5kYXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuU2lkZWJhckNvbHVtbiB1bC5BY3Rpb25MaXN0IGEjQWRkJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdyaXRlIGNhbGVuZGFyIG5hbWUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBpbnB1dCNDYWxlbmRhck5hbWUnLCAnY3NzJyApLT5zZW5kX2tleXMoIkNhbGVuZGFyICRSYW5kb21JRCIpOwoKICAgICAgICAjIFNldCBpdCB0byB0ZXN0IGdyb3VwLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0dyb3VwSUQnKS52YWwoJEdyb3VwSUQpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgU3VibWl0LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnZm9ybSNDYWxlbmRhckZyb20gYnV0dG9uI1N1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBXYWl0IGZvciBzZXJ2ZXIgc2lkZSBlcnJvci4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCdkaXYuRGlhbG9nIGJ1dHRvbiNEaWFsb2dCdXR0b24xJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgQ2xpY2sgb2sgdG8gZGlzbWlzcy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Rpdi5EaWFsb2cgYnV0dG9uI0RpYWxvZ0J1dHRvbjEnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV2FpdCBmb3IgdG9vbHRpcCBtZXNzYWdlLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJ2RpdiNPVFJTX1VJX1Rvb2x0aXBzX0Vycm9yVG9vbHRpcCcpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIFVwZGF0ZSBjYWxlbmRhciBuYW1lLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnZm9ybSNDYWxlbmRhckZyb20gaW5wdXQjQ2FsZW5kYXJOYW1lJywgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGlucHV0I0NhbGVuZGFyTmFtZScsICdjc3MnICktPnNlbmRfa2V5cygiQ2FsZW5kYXIgJFJhbmRvbUlEIDIiKTsKCiAgICAgICAgIyBTZXQgaXQgdG8gaW52YWxpZC4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNWYWxpZElEJykudmFsKDIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgQWRkIHRpY2tldCBhcHBvaW50bWVudCBydWxlLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLldpZGdldFNpbXBsZS5Db2xsYXBzZWQgLldpZGdldEFjdGlvbi5Ub2dnbGUgYScsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNBZGRSdWxlQnV0dG9uJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgU2V0IGEgcXVldWUuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUXVldWVJRF8xJykudmFsKCckUXVldWVJRCcpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgQWRkIHRpdGxlIGFzIHNlYXJjaCBwYXJhbWV0ZXIuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjU2VhcmNoUGFyYW1zJykudmFsKCdUaXRsZScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQWRkQnV0dG9uJywgICAgICAgICAgICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNTZWFyY2hQYXJhbV8xX1RpdGxlJywgJ2NzcycgKS0+c2VuZF9rZXlzKCdUZXN0KicpOwoKICAgICAgICAjIFN1Ym1pdC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGJ1dHRvbiNTdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgVmVyaWZ5IHR3byBjYWxlbmRhcnMgYXJlIHNob3duLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5Db250ZW50Q29sdW1uIHRhYmxlIHRib2R5IHRyOnZpc2libGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAyLAogICAgICAgICAgICAnQWxsIGNhbGVuZGFycyBhcmUgZGlzcGxheWVkJywKICAgICAgICApOwoKICAgICAgICAjIEZpbHRlciBqdXN0IGFkZGVkIGNhbGVuZGFyLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnaW5wdXQjRmlsdGVyQ2FsZW5kYXJzJywgJ2NzcycgKS0+c2VuZF9rZXlzKCJDYWxlbmRhciAkUmFuZG9tSUQgMiIpOwoKICAgICAgICBzbGVlcCAxOwoKICAgICAgICAjIFZlcmlmeSBvbmx5IG9uZSBjYWxlbmRhciBpcyBzaG93bi4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjp2aXNpYmxlJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgJ0NhbGVuZGFycyBhcmUgZmlsdGVyZWQgY29ycmVjdGx5JywKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSB0aGUgY2FsZW5kYXIgaXMgaW52YWxpZC4KICAgICAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSBLZXJuZWw6Okxhbmd1YWdlLT5uZXcoCiAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkNvbnRlbnRDb2x1bW4gdGFibGUgdGJvZHkgdHI6bnRoLW9mLXR5cGUoMikgdGQ6bnRoLW9mLXR5cGUoNCknLCAnY3NzJyApCiAgICAgICAgICAgICAgICAtPmdldF90ZXh0KCksCiAgICAgICAgICAgICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdpbnZhbGlkJyksCiAgICAgICAgICAgICdDYWxlbmRhciBpcyBtYXJrZWQgaW52YWxpZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBFZGl0IGludmFsaWQgY2FsZW5kYXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjpudGgtb2YtdHlwZSgyKSB0ZCBhJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFNldCBpdCB0byBpbnZhbGlkLXRlbXBvcmFyaWx5LgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1ZhbGlkSUQnKS52YWwoMykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgcnVsZSBoYXMgYmVlbiBzdG9yZWQgcHJvcGVybHkuCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnc2VsZWN0W2lkKj1cIlF1ZXVlSURfXCJdJykudmFsKCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICBbJFF1ZXVlSURdLAogICAgICAgICAgICAnUXVldWUgc3RvcmVkIHByb3Blcmx5JywKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ2lucHV0W2lkKj1cIl9UaXRsZVwiXScpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ1Rlc3QqJywKICAgICAgICAgICAgJ1NlYXJjaCBwYXJhbSBzdG9yZWQgcHJvcGVybHknLAogICAgICAgICk7CgogICAgICAgICMgUmVtb3ZlIHRoZSBydWxlLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLlJlbW92ZUJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBTdWJtaXQuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBidXR0b24jU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFZlcmlmeSB0aGUgY2FsZW5kYXIgaXMgaW52YWxpZCB0ZW1wb3JhcmlseS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkNvbnRlbnRDb2x1bW4gdGFibGUgdGJvZHkgdHI6bnRoLW9mLXR5cGUoMikgdGQ6bnRoLW9mLXR5cGUoNCknLCAnY3NzJyApCiAgICAgICAgICAgICAgICAtPmdldF90ZXh0KCksCiAgICAgICAgICAgICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdpbnZhbGlkLXRlbXBvcmFyaWx5JyksCiAgICAgICAgICAgICdDYWxlbmRhciBpcyBtYXJrZWQgaW52YWxpZCB0ZW1wb3JhcmlseScsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGVhbnVwCgogICAgICAgIG15ICREQk9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgIG15ICRTY2hlZHVsZXJEQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgY2FsZW5kYXJzLgogICAgICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgbmFtZSA9ID8gT1IgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCJDYWxlbmRhciAkUmFuZG9tSUQiLCBcIkNhbGVuZGFyICRSYW5kb21JRCAyIiwgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBjYWxlbmRhcnMgLSBDYWxlbmRhciAkUmFuZG9tSUQgKDIpIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IHF1ZXVlLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gcXVldWUgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUXVldWVJRCwgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBxdWV1ZSAtICRRdWV1ZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIFJlbW92ZSBzY2hlZHVsZWQgYXN5bmNocm9ub3VzIHRhc2tzIGZyb20gREIsIGFzIHRoZXkgbWF5IGludGVyZmVyZSB3aXRoIHRlc3RzIHJ1biBsYXRlci4KICAgICAgICBteSBAVGFza0lEczsKICAgICAgICBteSBAQWxsVGFza3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tMaXN0KAogICAgICAgICAgICBUeXBlID0+ICdBc3luY2hyb25vdXNFeGVjdXRvcicsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFRhc2sgKEBBbGxUYXNrcykgewogICAgICAgICAgICBpZiAoICRUYXNrLT57TmFtZX0gZXEgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhci1UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcigpJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRhc2tJRHMsICRUYXNrLT57VGFza0lEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFRhc2tJRCAoQFRhc2tJRHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJFRhc2tJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJUYXNrRGVsZXRlIC0gUmVtb3ZlZCBzY2hlZHVsZWQgYXN5bmNocm9ub3VzIHRhc2sgJFRhc2tJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhDYWxlbmRhciBRdWV1ZSkpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgpteSAkRWxlbWVudFJlYWRPbmx5ID0gc3ViIHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgIyBWYWx1ZSBpcyBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVW5pdFRlc3RPYmplY3QgRWxlbWVudCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjJFBhcmFte0VsZW1lbnR9JykubGVuZ3RoIiApOwoKICAgICRQYXJhbXtVbml0VGVzdE9iamVjdH0tPklzKAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyMkUGFyYW17RWxlbWVudH0uUmVhZE9ubHlWYWx1ZScpLmxlbmd0aDsiCiAgICAgICAgKSwKICAgICAgICAkUGFyYW17VmFsdWV9LAogICAgICAgICIkUGFyYW17RWxlbWVudH0gcmVhZCBvbmx5ICgkUGFyYW17VmFsdWV9KSIsCiAgICApOwp9OwoKbXkgJEVsZW1lbnRFeGlzdHMgPSBzdWIgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICAjIFZhbHVlIGlzIG9wdGlvbmFsIHBhcmFtZXRlci4KICAgIGZvciBteSAkTmVlZGVkIChxdyhVbml0VGVzdE9iamVjdCBFbGVtZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRMZW5ndGggPSAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICJyZXR1cm4gXCQoJyMkUGFyYW17RWxlbWVudH0nKS5sZW5ndGg7IgogICAgKTsKCiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFBhcmFte1VuaXRUZXN0T2JqZWN0fS0+VHJ1ZSgKICAgICAgICAgICAgJExlbmd0aCwKICAgICAgICAgICAgIiRQYXJhbXtFbGVtZW50fSBleGlzdHMiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VW5pdFRlc3RPYmplY3R9LT5GYWxzZSgKICAgICAgICAgICAgJExlbmd0aCwKICAgICAgICAgICAgIiRQYXJhbXtFbGVtZW50fSBub3QgZXhpc3RzIiwKICAgICAgICApOwogICAgfQp9OwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkVGltZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwogICAgICAgIG15ICRUaWNrZXRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBncm91cC4KICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGdyb3VwLgogICAgICAgIG15ICRHcm91cE5hbWUyID0gInRlc3QtY2FsZW5kYXItZ3JvdXAyLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQyICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUyLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpLgogICAgICAgICRTZWxlbml1bS0+c2V0X3dpbmRvd19zaXplKCA3NjgsIDEwNTAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICkgfHwgZGllICdEaWQgbm90IGdldCB0ZXN0IHVzZXInOwoKICAgICAgICAjIEdldCBVc2VySUQuCiAgICAgICAgbXkgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbjIgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lMiBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CgogICAgICAgICMgR2V0IFVzZXJJRC4KICAgICAgICBteSAkVXNlcklEMiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbjIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBjdXN0b21lciB1c2VyLgogICAgICAgIG15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCkKICAgICAgICAgICAgfHwgZGllICdEaWQgbm90IGdldCB0ZXN0IGN1c3RvbWVyIHVzZXInOwoKICAgICAgICAjIENyZWF0ZSBhIGZldyB0ZXN0IGNhbGVuZGFycy4KICAgICAgICBteSAlQ2FsZW5kYXIxID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhcjEgJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgIkNhbGVuZGFyMSAkUmFuZG9tSUQgY3JlYXRlZCBzdWNjZXNzZnVsLiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUNhbGVuZGFyMiA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIyICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0VDOTA3MycsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICJDYWxlbmRhcjIgJFJhbmRvbUlEIGNyZWF0ZWQgc3VjY2Vzc2Z1bC4iLAogICAgICAgICk7CgogICAgICAgIG15ICVDYWxlbmRhcjMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMyAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyM2QkFENTQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2FsZW5kYXIze0NhbGVuZGFySUR9LAogICAgICAgICAgICAiQ2FsZW5kYXIzICRSYW5kb21JRCBjcmVhdGVkIHN1Y2Nlc3NmdWwuIiwKICAgICAgICApOwoKICAgICAgICBteSAlQ2FsZW5kYXI0ID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhcjQgJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjNzhBN0ZDJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQyLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2FsZW5kYXI0e0NhbGVuZGFySUR9LAogICAgICAgICAgICAiQ2FsZW5kYXI0ICRSYW5kb21JRCBjcmVhdGVkIHN1Y2Nlc3NmdWwuIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBhIHRlc3QgdGlja2V0LgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICJMaW5rIFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIEN1c3RvbWVyTm8gICA9PiAnMTIzNDY1JywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICdjdXN0b21lckBleGFtcGxlLmNvbScsCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldE51bWJlciwKICAgICAgICAgICAgIlRpY2tldE51bWJlckxvb2t1cCgpIC0gJFRpY2tldE51bWJlciIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBHbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgR28gdG8gcHJldmlvdXMgd2Vlay4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgVmVyaWZ5IGFsbCB0aHJlZSBjYWxlbmRhcnMgYXJlIHZpc2libGUuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLkNhbGVuZGFyU3dpdGNoOnZpc2libGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAzLAogICAgICAgICAgICAnQWxsIHRocmVlIGNhbGVuZGFycyB2aXNpYmxlJywKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSBjb3B5LXRvLWNsaXBib2FyZCBsaW5rLgogICAgICAgIG15ICRVUkwgPSAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5Db3B5VG9DbGlwYm9hcmQnKS5hdHRyKCdkYXRhLWNsaXBib2FyZC10ZXh0Jyk7Iik7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVVJMLAogICAgICAgICAgICAnQ29weVRvQ2xpcGJvYXJkIFVSTCBwcmVzZW50JwogICAgICAgICk7CgogICAgICAgICMgVVJMIHNob3VsZCBub3QgY29udGFpbiBPVFJTIHNwZWNpZmljIFVSTCBkZWxpbWl0ZXIgb2Ygc2VtaWNvbG9uICg7KS4KICAgICAgICAjICAgRm9yIGJldHRlciBjb21wYXRpYmlsaXR5LCB1c2Ugc3RhbmRhcmQgYW1wZXJzYW5kICgmKSBpbnN0ZWFkLgogICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjY2NyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICggJFVSTCA9fiAvWztdLyApID8gMSA6IDAsCiAgICAgICAgICAgICdDb3B5VG9DbGlwYm9hcmQgVVJMIGRvZXMgbm90IGNvbnRhaW4gZm9yYmlkZGVuIGNoYXJhY3RlcnMnCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBvbiB0aGUgdGltZWxpbmUgdmlldyBmb3IgYW4gYXBwb2ludG1lbnQgZGlhbG9nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICMgRWxlbWVudHMgdGhhdCBhcmUgbm90IGFsbG93ZWQgaW4gZGlhbG9nLgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1EZWxldGUgRWRpdEZvcm1Db3B5KSkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEVudGVyIHNvbWUgZGF0YS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaXRsZSIsICAgICdjc3MnICktPnNlbmRfa2V5cygnQXBwb2ludG1lbnQgMScpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0xvY2F0aW9uIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCdTdHJhdWJpbmcnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VuZEhvdXInLCAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCcxOCcpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLlBsdWdpbkZpZWxkJywgJ2NzcycgKS0+c2VuZF9rZXlzKCRUaWNrZXROdW1iZXIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aDsnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGlja2V0TnVtYmVyKScpLmNsaWNrKCk7Iik7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcuUGx1Z2luQ29udGFpbmVyIGRpdiBhW3RhcmdldD1cIl9ibGFua1wiXScpLmxlbmd0aDsiCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgY29ycmVjdCB0aWNrZXQgaXMgbGlzdGVkLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5QbHVnaW5Db250YWluZXIgZGl2IGFbdGFyZ2V0PVwiX2JsYW5rXCJdJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIiRUaWNrZXROdW1iZXIgTGluayBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICAgICAgJ0xpbmsgdGlja2V0IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgbG9jYXRpb24gbGluayBjb250YWlucyBjb3JyZWN0IHZhbHVlLgogICAgICAgIG15ICRMb2NhdGlvbkxpbmtVUkwgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5Mb2NhdGlvbkxpbmsnLCAnY3NzJyApLT5nZXRfYXR0cmlidXRlKCdocmVmJyk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhdGlvbkxpbmtVUkwgPX4gL1N0cmF1YmluZyQvLAogICAgICAgICAgICAnTG9jYXRpb24gbGluayBjb250YWlucyBjb3JyZWN0IHZhbHVlJywKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIFNhdmUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBhbGwgQUpBWCBjYWxscyBmaW5pc2hlZC4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJC5hY3RpdmUgPT0gMCIgKTsKCiAgICAgICAgIyBWZXJpZnkgZmlyc3QgYXBwb2ludG1lbnQgaXMgdmlzaWJsZS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDEnLAogICAgICAgICAgICAnRmlyc3QgYXBwb2ludG1lbnQgdmlzaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyB0byB0aGUgdGlja2V0IHpvb20gc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0ke1RpY2tldElEfSIpOwoKICAgICAgICAjIEZpbmQgbGluayB0byB0aGUgYXBwb2ludG1lbnQgb24gcGFnZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2EuTGlua09iamVjdExpbmsnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNUaXRsZScpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDEnLAogICAgICAgICAgICAnVGl0bGUgbWF0Y2hlcycsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgJ0NhbGVuZGFyIG1hdGNoZXMnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLlBsdWdpbkNvbnRhaW5lciBkaXYgYVt0YXJnZXQ9XCJfYmxhbmtcIl0nKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAiJFRpY2tldE51bWJlciBMaW5rIFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgICAgICAnTGluayB0aWNrZXQgbWF0Y2hlcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBsb2NhdGlvbiBsaW5rIGNvbnRhaW5zIGNvcnJlY3QgdmFsdWUuCiAgICAgICAgJExvY2F0aW9uTGlua1VSTCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkxvY2F0aW9uTGluaycsICdjc3MnICktPmdldF9hdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJExvY2F0aW9uTGlua1VSTCA9fiAvU3RyYXViaW5nJC8sCiAgICAgICAgICAgICdMb2NhdGlvbiBsaW5rIGNvbnRhaW5zIGNvcnJlY3QgdmFsdWUnLAogICAgICAgICk7CgogICAgICAgICMgQ2FuY2VsIHRoZSBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1DYW5jZWwnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgR28gdG8gcHJldmlvdXMgd2Vlay4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgQ2xpY2sgb24gdGhlIHRpbWVsaW5lIHZpZXcgZm9yIGFub3RoZXIgYXBwb2ludG1lbnQgZGlhbG9nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICMgRW50ZXIgc29tZSBkYXRhLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdBcHBvaW50bWVudCAyJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQWxsRGF5JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0FsbERheSIpLnByb3AoImNoZWNrZWQiKSA9PT0gdHJ1ZTsnICk7CgogICAgICAgICMgQ2xpY2sgb24gU2F2ZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgIyBIaWRlIHRoZSBmaXJzdCBjYWxlbmRhciBmcm9tIHZpZXcuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LCAnaWQnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDYWxlbmRhcicKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAnIikucHJvcCgiY2hlY2tlZCIpID09PSBmYWxzZTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLnRleHQoKSA9PT0gJ0FwcG9pbnRtZW50IDInOyIKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSBzZWNvbmQgYXBwb2ludG1lbnQgaXMgdmlzaWJsZS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDInLAogICAgICAgICAgICAnU2Vjb25kIGFwcG9pbnRtZW50IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IHNlY29uZCBhcHBvaW50bWVudCBpcyBhbiBhbGwgZGF5IGFwcG9pbnRtZW50LgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmEtc3VuLW8nKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnMScsCiAgICAgICAgICAgICdTZWNvbmQgYXBwb2ludG1lbnQgaW4gYW4gYWxsIGRheSBhcHBvaW50bWVudCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBhZ2FpbiBvbiB0aGUgdGltZWxpbmUgdmlldyBmb3IgYW4gYXBwb2ludG1lbnQgZGlhbG9nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICMgRW50ZXIgc29tZSBkYXRhLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdBcHBvaW50bWVudCAzJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjN7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0VuZEhvdXInLCAnbmFtZScgKS0+c2VuZF9rZXlzKCcxOCcpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgQ2xpY2sgb24gU2F2ZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIGFsbCBBSkFYIGNhbGxzIGZpbmlzaGVkLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkLmFjdGl2ZSA9PSAwIiApOwoKICAgICAgICAjIEhpZGUgdGhlIHNlY29uZCBjYWxlbmRhciBmcm9tIHZpZXcuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LCAnaWQnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDYWxlbmRhcicKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAnIikucHJvcCgiY2hlY2tlZCIpID09PSBmYWxzZTsnCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgYWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VyZW5jZXMgYXJlIHZpc2libGUuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICc0JywKICAgICAgICAgICAgJ0FsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cnJlbmNlcyB2aXNpYmxlJywKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIGFuIGFwcG9pbnRtZW50LgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnLmZjLXRpbWVsaW5lLWV2ZW50OmVxKDApIC5mYy10aXRsZScpLnRyaWdnZXIoJ2NsaWNrJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBDbGljayBvbiBEZWxldGUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1EZWxldGUnLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEFsZXJ0UHJlc2VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5hY2NlcHRfYWxlcnQoKTsKCiAgICAgICAgIyBXYWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIGFsbCBBSkFYIGNhbGxzIGZpbmlzaGVkLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkLmFjdGl2ZSA9PSAwOyIgKTsKCiAgICAgICAgIyBWZXJpZnkgYWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VyZW5jZXMgaGF2ZSBiZWVuIHJlbW92ZWQuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICcwJywKICAgICAgICAgICAgJ0FsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cnJlbmNlcyByZW1vdmVkJywKICAgICAgICApOwoKICAgICAgICAjIFNob3cgYWxsIHRocmVlIGNhbGVuZGFycy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sICdpZCcgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0sICdpZCcgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycgKTsKCiAgICAgICAgIyBWZXJpZnkgb25seSB0d28gYXBwb2ludG1lbnRzIGFyZSB2aXNpYmxlLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnMicsCiAgICAgICAgICAgICdGaXJzdCBhbmQgc2Vjb25kIGFwcG9pbnRtZW50IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgT3BlbiBkYXRlcGlja2VyLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLWp1bXAtYnV0dG9uJywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNEYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIC5IaWdobGlnaHQiKS5sZW5ndGggPT09IDE7JwogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IGV4YWN0bHkgb25lIGRheSB3aXRoIGFwcG9pbnRtZW50cyBpcyBoaWdobGlnaHRlZC4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjRGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1jYWxlbmRhciAuSGlnaGxpZ2h0JykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgJ0RhdGVwaWNrZXIgcHJvcGVybHkgaGlnaGxpZ2h0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgZGF0ZXBpY2tlci4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2RpdiNEYXRlcGlja2VyT3ZlcmxheScsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIjRGF0ZXBpY2tlck92ZXJsYXkiKS5sZW5ndGg7JyApOwoKICAgICAgICAjIEZpbHRlciBqdXN0IHRoaXJkIGNhbGVuZGFyLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnaW5wdXQjRmlsdGVyQ2FsZW5kYXJzJywgJ2NzcycgKS0+c2VuZF9rZXlzKCdDYWxlbmRhcjMnKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbGVuZGFyU3dpdGNoOnZpc2libGUiKS5sZW5ndGggPT09IDE7JwogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IG9ubHkgb25lIGNhbGVuZGFyIGlzIHNob3duIGluIHRoZSBsaXN0LgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5DYWxlbmRhclN3aXRjaDp2aXNpYmxlJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgJ0NhbGVuZGFycyBhcmUgZmlsdGVyZWQgY29ycmVjdGx5JywKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBuZXcgQXBwb2ludG1lbnQgKGFzIHJvb3QpLgogICAgICAgIG15ICRTdGFydFRpbWUgICAgICAgPSAkVGltZU9iamVjdC0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkVGltZU9iamVjdC0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CiAgICAgICAgJFN0YXJ0VGltZSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtIC0gNyAqIDI0ICogNjAgKiA2MCwgICAgIyBsYXN0IHdlZWsKICAgICAgICApOwoKICAgICAgICBteSAkRW5kVGltZSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtIC0gNyAqIDI0ICogNjAgKiA2MCArIDIgKiA2MCAqIDYwLCAgICAjIDIgaG91cnMgYWZ0ZXIgc3RhcnQgdGltZQogICAgICAgICk7CgogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFyNHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJ1Blcm1pc3Npb25zIGNoZWNrIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgIEVuZFRpbWUgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICA9PiAwLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgJ1Blcm1pc3Npb24gQXBwb2ludG1lbnQgY3JlYXRlZC4nLAogICAgICAgICk7CgogICAgICAgICMgQWRkIHJvIHBlcm1pc3Npb25zIHRvIHRoZSB1c2VyLgogICAgICAgICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBJRDIsCiAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFJlbG9hZCBwYWdlLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgU2hvdyB0aGUgZm91cnRoIGNhbGVuZGFyIGFuZCBoaWRlIGFsbCBvdGhlcnMuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXI0e0NhbGVuZGFySUR9LCAnaWQnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDYWxlbmRhcicKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyNHtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAnIikucHJvcCgiY2hlY2tlZCIpID09PSB0cnVlOycKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwgJ2lkJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjQ2FsZW5kYXInCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gJyIpLnByb3AoImNoZWNrZWQiKSA9PT0gZmFsc2U7JwogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LCAnaWQnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDYWxlbmRhcicKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAnIikucHJvcCgiY2hlY2tlZCIpID09PSBmYWxzZTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjN7Q2FsZW5kYXJJRH0sICdpZCcgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0NhbGVuZGFyJwogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIze0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICciKS5wcm9wKCJjaGVja2VkIikgPT09IGZhbHNlOycKICAgICAgICApOwoKICAgICAgICAjIEdvIHRvIHByZXZpb3VzIHdlZWsuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtcHJldi1idXR0b24nLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoICYmICQoIi5mYy1ldmVudC1jb250YWluZXIgYSIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgIyBGaW5kIHRoZSBhcHBvaW50bWVudCBsaW5rLgogICAgICAgIG15ICRBcHBvaW50bWVudExpbmsgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy1ldmVudC1jb250YWluZXIgYScsICdjc3MnICk7CgogICAgICAgICMgQ2xpY2sgb24gYXBwb2ludG1lbnQuCiAgICAgICAgJEFwcG9pbnRtZW50TGluay0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGg7IiApOwoKICAgICAgICBteSAkVGVhbU9iamVjdFJlZ2lzdGVyZWQKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKTsKCiAgICAgICAgIyBDaGVjayBpZiBmaWVsZHMgYXJlIGRpc2FibGVkLgogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICgKICAgICAgICAgICAgcXcoVGl0bGUgRGVzY3JpcHRpb24gTG9jYXRpb24gQ2FsZW5kYXJJRCBUZWFtSUQgUmVzb3VyY2VJRCBTdGFydERheSBFbmREYXkgQWxsRGF5CiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBDaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkLgogICAgICAgICAgICBpZiAoICEkVGVhbU9iamVjdFJlZ2lzdGVyZWQgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgJEVsZW1lbnQgZXEgJ1RlYW1JRCcgfHwgJEVsZW1lbnQgZXEgJ1Jlc291cmNlSUQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRWxlbWVudFJlYWRPbmx5LT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRWxlbWVudHMgdGhhdCBhcmUgbm90IGFsbG93ZWQgb24gcGFnZS4KICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KEVkaXRGb3JtU3VibWl0IEVkaXRGb3JtRGVsZXRlIEVkaXRGb3JtQ29weSkpIHsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBFbGVtZW50cyB0aGF0IHNob3VsZCBiZSBvbiBwYWdlLgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1DYW5jZWwpKSB7CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyMkRWxlbWVudCcpLmxlbmd0aDsiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzLT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2xpY2sgb24gY2FuY2VsLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtQ2FuY2VsJywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIEFkZCBtb3ZlX2ludG8gcGVybWlzc2lvbnMgdG8gdGhlIHVzZXIuCiAgICAgICAgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ2xpY2sgb24gYXBwb2ludG1lbnQuCiAgICAgICAgJEFwcG9pbnRtZW50TGluay0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIENoZWNrIGlmIGZpZWxkcyBhcmUgZGlzYWJsZWQuCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyggQ2FsZW5kYXJJRCApKSB7CiAgICAgICAgICAgICRFbGVtZW50UmVhZE9ubHktPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiBmaWVsZHMgYXJlIGVuYWJsZWQuCiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKAogICAgICAgICAgICBxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbiBUZWFtSUQgUmVzb3VyY2VJRCBTdGFydERheSBFbmREYXkgQWxsRGF5IFJlY3VycmVuY2VUeXBlKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIENoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQuCiAgICAgICAgICAgIGlmICggISRUZWFtT2JqZWN0UmVnaXN0ZXJlZCApIHsKICAgICAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAkRWxlbWVudCBlcSAnVGVhbUlEJyB8fCAkRWxlbWVudCBlcSAnUmVzb3VyY2VJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbGVtZW50UmVhZE9ubHktPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBFbGVtZW50cyB0aGF0IGFyZSBub3QgYWxsb3dlZCBvbiBwYWdlLgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1EZWxldGUgRWRpdEZvcm1Db3B5KSkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIG9uIHBhZ2UuCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhFZGl0Rm9ybVN1Ym1pdCBFZGl0Rm9ybUNhbmNlbCkpIHsKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnIyRFbGVtZW50JykubGVuZ3RoOyIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDbGljayBvbiBjYW5jZWwuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1DYW5jZWwnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgQWRkIGNyZWF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgdXNlci4KICAgICAgICAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJBZGQoCiAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQyLAogICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIGFwcG9pbnRtZW50LgogICAgICAgICRBcHBvaW50bWVudExpbmstPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBDaGVjayBpZiBmaWVsZHMgYXJlIGVuYWJsZWQuCiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKAogICAgICAgICAgICBxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbiBDYWxlbmRhcklEIFRlYW1JRCBSZXNvdXJjZUlEIFN0YXJ0RGF5IEVuZERheSBBbGxEYXkKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIENoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQuCiAgICAgICAgICAgIGlmICggISRUZWFtT2JqZWN0UmVnaXN0ZXJlZCApIHsKICAgICAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAkRWxlbWVudCBlcSAnVGVhbUlEJyB8fCAkRWxlbWVudCBlcSAnUmVzb3VyY2VJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbGVtZW50UmVhZE9ubHktPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBFbGVtZW50cyB0aGF0IHNob3VsZCBiZSBvbiBwYWdlLgogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1Db3B5IEVkaXRGb3JtU3VibWl0IEVkaXRGb3JtRGVsZXRlIEVkaXRGb3JtQ2FuY2VsKSkgewogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjJEVsZW1lbnQnKS5sZW5ndGg7IgogICAgICAgICAgICApOwogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyBDbGVhbnVwCiAgICAgICAgIwoKICAgICAgICBteSAkU2NoZWR1bGVyREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpOwogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgICAgICBteSAkREJPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBEZWxldGUgYXBwb2ludG1lbnRzIGFuZCBjYWxlbmRhcnMuCiAgICAgICAgZm9yIG15ICRDYWxlbmRhcklEICgKICAgICAgICAgICAgJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgJENhbGVuZGFyMntDYWxlbmRhcklEfSwKICAgICAgICAgICAgJENhbGVuZGFyM3tDYWxlbmRhcklEfSwKICAgICAgICAgICAgJENhbGVuZGFyNHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEIChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBEZWxldGUgdGVzdCBjYWxlbmRhcnMuCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgaWQgPSAkQ2FsZW5kYXJJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IGNhbGVuZGFyIC0gJENhbGVuZGFySUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgdGVzdCB0aWNrZXQuCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCB0aWNrZXQgLSAkVGlja2V0SUQiLAogICAgICAgICk7CgogICAgICAgICMgUmVtb3ZlIHNjaGVkdWxlZCBhc3luY2hyb25vdXMgdGFza3MgZnJvbSBEQiwgYXMgdGhleSBtYXkgaW50ZXJmZXJlIHdpdGggdGVzdHMgcnVuIGxhdGVyLgogICAgICAgIG15IEBUYXNrSURzOwogICAgICAgIG15IEBBbGxUYXNrcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0xpc3QoCiAgICAgICAgICAgIFR5cGUgPT4gJ0FzeW5jaHJvbm91c0V4ZWN1dG9yJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkVGFzayAoQEFsbFRhc2tzKSB7CiAgICAgICAgICAgIGlmICggJFRhc2stPntOYW1lfSBlcSAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyLVRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1RpY2tldCgpJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRhc2tJRHMsICRUYXNrLT57VGFza0lEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFRhc2tJRCAoQFRhc2tJRHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJFRhc2tJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJUYXNrRGVsZXRlIC0gUmVtb3ZlZCBzY2hlZHVsZWQgYXN5bmNocm9ub3VzIHRhc2sgJFRhc2tJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBncm91cC11c2VyIHJlbGF0aW9ucy4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gZ3JvdXBfdXNlciBXSEVSRSBncm91cF9pZCA9ICRHcm91cElEIE9SIGdyb3VwX2lkID0gJEdyb3VwSUQyIiwKICAgICAgICApOwogICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkdyb3VwVXNlckRlbGV0ZSAtICRSYW5kb21JRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBncm91cHMuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGdyb3VwcyBXSEVSRSBpZCA9ICRHcm91cElEIE9SIGlkID0gJEdyb3VwSUQyIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkdyb3VwRGVsZXRlIC0gJFJhbmRvbUlEIiwKICAgICAgICApOwoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhBcHBvaW50bWVudCBDYWxlbmRhciBHcm91cCBUaWNrZXQpKSB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9LAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIG92ZXJyaWRlIGxvY2FsIHRpbWUgem9uZSBmb3IgZHVyYXRpb24gb2YgdGhlIHRlc3QKbG9jYWwgJEVOVntUWn0gPSAnVVRDJzsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgZ3JvdXAKICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gdGltZQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwoKICAgICAgICAjIGFkZCAxIG1vbnRoCiAgICAgICAgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgVGltZSAgID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICBNb250aHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkYXRlIGluZm8gKFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyLCBEYXlPZldlZWspCiAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICk7CgogICAgICAgICMgY2hhbmdlIHJlc29sdXRpb24gKGRlc2t0b3AgbW9kZSkKICAgICAgICAkU2VsZW5pdW0tPnNldF93aW5kb3dfc2l6ZSggNzY4LCAxMDUwICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAjIGdldCBVc2VySUQKICAgICAgICBteSAkVXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGZldyB0ZXN0IGNhbGVuZGFycwogICAgICAgIG15ICVDYWxlbmRhcjEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiTXkgQ2FsZW5kYXIgJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkLmFjdGl2ZSA9PSAwIiApOwoKICAgICAgICAjIGNsaWNrIG9uIHRoZSBtb250aCB2aWV3CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtbW9udGgtYnV0dG9uJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuZmMtbW9udGgtdmlldyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgZ28gdG8gbmV4dCBtb250aAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLW5leHQtYnV0dG9uJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JyApOwoKICAgICAgICAjIGdldCBkYXRlIGluZm8gKFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyLCBEYXlPZldlZWspCiAgICAgICAgbXkgJERhdGFEYXRlID0gIiREYXRlSW5mb1s1XS0iOwogICAgICAgIGlmICggJERhdGVJbmZvWzRdIDwgMTAgKSB7CiAgICAgICAgICAgICREYXRhRGF0ZSAuPSAiMCI7CiAgICAgICAgfQogICAgICAgICREYXRhRGF0ZSAuPSAiJERhdGVJbmZvWzRdLTAxIjsKCiAgICAgICAgIyBjcmVhdGUgZXZlcnkgZGF5IGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSBkYXknKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzMSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSA0IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMxLAogICAgICAgICAgICA0LAogICAgICAgICAgICAiQ3JlYXRlIGRhaWx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgJERlbGV0ZTEgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHMxWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTEsCiAgICAgICAgICAgICJEZWxldGUgZGFpbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGV2ZXJ5IHdlZWsgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS5sZW5ndGggJiYgXCQoJyNFZGl0Rm9ybVN1Ym1pdCcpLmxlbmd0aDsiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IHdlZWsnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdXZWVrbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAzIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzMiA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMyLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15ICRTdGFydEFwcG9pbnRtZW50ICAgICAgID0gIiREYXRhRGF0ZSAwMDowMDowMCI7CiAgICAgICAgbXkgJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQyU3RhcnRUaW1lcyA9ICgKICAgICAgICAgICAgJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSArIDcgKiAyNCAqIDM2MDAsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSArIDE0ICogMjQgKiAzNjAwLAogICAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHMyWyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50MlN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgJERlbGV0ZTIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHMyWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTIsCiAgICAgICAgICAgICJEZWxldGUgd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBldmVyeSBtb250aCBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLmxlbmd0aCAmJiBcJCgnI0VkaXRGb3JtU3VibWl0JykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgbW9udGgnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdNb250aGx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzMywKICAgICAgICAgICAgMywKICAgICAgICAgICAgIkNyZWF0ZSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50M1N0YXJ0VGltZXMgPSAoCiAgICAgICAgICAgICRTdGFydEFwcG9pbnRtZW50LAogICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgICAgICAgICAgTW9udGhzID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVGltZSAgID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICAgICAgICAgIE1vbnRocyA9PiAyLAogICAgICAgICAgICAgICAgICAgIFRpbWUgICA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMiApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czNbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQzU3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICBteSAkRGVsZXRlMyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czNbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlMywKICAgICAgICAgICAgIkRlbGV0ZSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBldmVyeSB5ZWFyIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSB5ZWFyJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnWWVhcmx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzNCwKICAgICAgICAgICAgMywKICAgICAgICAgICAgIkNyZWF0ZSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQ0U3RhcnRUaW1lcyA9ICgKICAgICAgICAgICAgJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgICAgICAgICBZZWFycyA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRpbWUgID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICAgICAgICAgIFllYXJzID0+IDIsCiAgICAgICAgICAgICAgICAgICAgVGltZSAgPT4gJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHM0WyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50NFN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgJERlbGV0ZTQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHM0WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTQsCiAgICAgICAgICAgICJEZWxldGUgeWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhcHBvaW50bWVudCBldmVyeSBzZWNvbmQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSAybmQgZGF5Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzNSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM1LAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudDVTdGFydFRpbWVzID0gKAogICAgICAgICAgICAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtICsgMiAqIDI0ICogMzYwMCwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtICsgNCAqIDI0ICogMzYwMCwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNVskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDVTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU1ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNVswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU1LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS5sZW5ndGggJiYgXCQoJyNFZGl0Rm9ybVN1Ym1pdCcpLmxlbmd0aDsiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IDJuZCBNb25kYXksIFdlZG5lc2RheSBhbmQgU3VuZGF5Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJykudmFsKCdDdXN0b21XZWVrbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgZm9yIGpzCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdjp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGl0J3MgZGVzZWxlY3RlZAogICAgICAgIG15ICREZXNlbGVjdGVkNiA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiAhJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlc2VsZWN0ZWQ2LAogICAgICAgICAgICAiQ2hlY2sgaWYgbm90aGluZyBpcyBzZWxlY3RlZCAoIzYpLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBNb24KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjFcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlbGVjdGVkIHN1Y2Nlc3NmdWwKICAgICAgICBteSAkV2FpdDZGb3IxID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b25bdmFsdWU9XCIxXCJdIikuaGFzQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV2FpdDZGb3IxLAogICAgICAgICAgICAiQ3VzdG9tIHdlZWtseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIE1vbmRheSBpcyBzZWxlY3RlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZWxlY3QgV2VkCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b25bdmFsdWU9XCIzXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ2Rm9yMyA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiM1wiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ2Rm9yMywKICAgICAgICAgICAgIkN1c3RvbSB3ZWVrbHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBXZWRuZXNkYXkgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IFN1bgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiN1wiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0NkZvcjcgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjdcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0NkZvcjcsCiAgICAgICAgICAgICJDdXN0b20gd2Vla2x5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgU3VuZGF5IGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNldCBlYWNoIDJuZCB3ZWVrCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUludGVydmFsJykudmFsKDIpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCc2Jyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzNiA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM2LAogICAgICAgICAgICA2LAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lczsKICAgICAgICBteSAkU3lzdGVtVGltZTYgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdENXNjsKCiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQEFwcG9pbnRtZW50NlN0YXJ0VGltZXMgIT0gNiApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAoICRUbXAsICRDVzYgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lNiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIGN1cnJlbnQgZGF5CiAgICAgICAgICAgIGlmICggISRMYXN0Q1c2ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzYgPSAkQ1c2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggZ3JlcCB7ICREYXlPZldlZWsgPT0gJF8gfSAoIDEsIDMsIDcgKSApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJENXNiAtICRMYXN0Q1c2ICkgJSAyID09IDAgKSAgICAgICAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzYgPSAkQ1c2OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lNiArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiA1ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNlskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDZTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU2ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNlswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU2LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQpCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdDdXN0b20gd2Vla2x5IHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdDdXN0b20nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgdW50aWwganMgc2hvd3MgSW50ZXJ2YWwKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlSW50ZXJ2YWw6dmlzaWJsZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVR5cGUnKS52YWwoJ0N1c3RvbVdlZWtseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCBmb3IganMKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2OnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgZGVzZWxlY3Qgc2VsZWN0ZWQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQ3ID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuICEkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikubGVuZ3RoOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVzZWxlY3RlZDcsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjNykuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHM3ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czcsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgICJDcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQod2l0aG91dCBhbnkgZGF5IHNlbGVjdGVkKS4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50N1N0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWU3ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RDVzc7CiAgICAgICAgbXkgJERheU9mV2Vlazc7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDdTdGFydFRpbWVzICE9IDMgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgKCAkVG1wLCAkQ1c3ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGRheQogICAgICAgICAgICBpZiAoICEkTGFzdENXNyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50N1N0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0Q1c3ICAgID0gJENXNzsKICAgICAgICAgICAgICAgICREYXlPZldlZWs3ID0gJERheU9mV2VlazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoICREYXlPZldlZWsgPT0gJERheU9mV2VlazcgKSAgICAjIGNoZWNrIGlmIGRheSBpcyB2YWxpZAogICAgICAgICAgICAgICAgJiYgKCAoICRDVzcgLSAkTGFzdENXNyApICUgMiA9PSAwICkgICAgIyBjaGVjayBpZiBJbnRlcnZhbCBtYXRjaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50N1N0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0Q1c3ID0gJENXNzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZTcgKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMiApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czdbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQ3U3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlNyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czdbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlNywKICAgICAgICAgICAgIkRlbGV0ZSBjdXN0b20gd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS5sZW5ndGggJiYgXCQoJyNFZGl0Rm9ybVN1Ym1pdCcpLmxlbmd0aDsiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IDJuZCBtb250aCwgb24gM3RoLCAxMHRoIGFuZCAzMXRoIG9mIG1vbnRoLicpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tTW9udGhseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCBmb3IganMKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdjp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUnKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBpdCdzIGRlc2VsZWN0ZWQKICAgICAgICBteSAkRGVzZWxlY3RlZDggPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikubGVuZ3RoOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVzZWxlY3RlZDgsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjOCkuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IDN0aAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjNcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlbGVjdGVkIHN1Y2Nlc3NmdWwKICAgICAgICBteSAkV2FpdDhGb3IzID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uW3ZhbHVlPVwiM1wiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ4Rm9yMywKICAgICAgICAgICAgIkN1c3RvbSBtb250aGx5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgMyBpcyBzZWxlY3RlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZWxlY3QgMTB0aAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjEwXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ4Rm9yMTAgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9XCIxMFwiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ4Rm9yMTAsCiAgICAgICAgICAgICJDdXN0b20gbW9udGhseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIDEwIGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCAzMQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjMxXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ4Rm9yMzEgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9XCIzMVwiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ4Rm9yMzEsCiAgICAgICAgICAgICJDdXN0b20gbW9udGhseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIDMxIGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNldCBlYWNoIDJuZCB3ZWVrCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUludGVydmFsJykudmFsKDIpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAyMCBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMjAnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHM4ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDIwIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM4LAogICAgICAgICAgICAyMCwKICAgICAgICAgICAgIkNyZWF0ZSBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudDhTdGFydFRpbWVzOwogICAgICAgIG15ICRTeXN0ZW1UaW1lOCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICIkRGF0YURhdGUgMDA6MDA6MDAiLAogICAgICAgICk7CgogICAgICAgIG15ICRMYXN0TW9udGg4OwoKICAgICAgICB3aGlsZSAoIHNjYWxhciBAQXBwb2ludG1lbnQ4U3RhcnRUaW1lcyAhPSAyMCApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTgsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkTGFzdE1vbnRoOCApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50OFN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU4LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0TW9udGg4ID0gJE1vbnRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggZ3JlcCB7ICREYXkgPT0gJF8gfSAoIDMsIDEwLCAzMSApICkgICAgIyBjaGVjayBpZiBkYXkgaXMgdmFsaWQKICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAoICRNb250aCAtICRMYXN0TW9udGg4ICkgJSAyID09IDAgICAgIyBjaGVjayBpZiBJbnRlcnZhbCBtYXRjaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50OFN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU4LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZTggKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMTkgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHM4WyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50OFN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZTggPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHM4WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTgsCiAgICAgICAgICAgICJEZWxldGUgY3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQpCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykubGVuZ3RoICYmIFwkKCcjRWRpdEZvcm1TdWJtaXQnKS5sZW5ndGg7IiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdDdXN0b20gbW9udGhseSB3aXRob3V0IGFueXRoaW5nIHNlbGVjdGVkJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJykudmFsKCdDdXN0b21Nb250aGx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IGZvciBqcwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2OnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICMgZGVzZWxlY3Qgc2VsZWN0ZWQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGl0J3MgZGVzZWxlY3RlZAogICAgICAgIG15ICREZXNlbGVjdGVkOSA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiAhJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5sZW5ndGg7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZXNlbGVjdGVkOSwKICAgICAgICAgICAgIkNoZWNrIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKCM5KS4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZWFjaCAybmQgeWVhcgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMycpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czkgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzOSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgIkNyZWF0ZSBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnQod2l0aG91dCBhbnkgZGF5IHNlbGVjdGVkKS4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50OVN0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWU5ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RNb250aDk7CiAgICAgICAgbXkgJERheTk7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDlTdGFydFRpbWVzICE9IDMgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU5LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgY3VycmVudCBkYXkKICAgICAgICAgICAgaWYgKCAhJExhc3RNb250aDkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudDlTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lOSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdE1vbnRoOSA9ICRNb250aDsKICAgICAgICAgICAgICAgICREYXk5ICAgICAgID0gJERheTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoICREYXkgPT0gJERheTkgKSAgICAjIGNoZWNrIGlmIGRheSBpcyB2YWxpZAogICAgICAgICAgICAgICAgJiYgKCAoICRNb250aCAtICRMYXN0TW9udGg5ICkgJSAyID09IDAgKSAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ5U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RNb250aDkgPSAkTW9udGg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIG9uZSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWU5ICs9IDI0ICogMzYwMDsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHM5WyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50OVN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZTkgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHM5WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTksCiAgICAgICAgICAgICJEZWxldGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgY3VzdG9tIHllYXJseSByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS5sZW5ndGggJiYgXCQoJyNFZGl0Rm9ybVN1Ym1pdCcpLmxlbmd0aDsiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IDJuZCB5ZWFyLCBpbiBGZWJydWFyeSwgT2N0b2JlciBhbmQgRGVjZW1iZXIuJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJykudmFsKCdDdXN0b21ZZWFybHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgZm9yIGpzCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdjp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQxMCA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiAhJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlc2VsZWN0ZWQxMCwKICAgICAgICAgICAgIkNoZWNrIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKCMxMCkuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IEZlYnJ1YXJ5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIyXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQxMEZvcjIgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvblt2YWx1ZT1cIjJcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0MTBGb3IyLAogICAgICAgICAgICAiQ3VzdG9tIHllYXJseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIEZlYnJ1YXJ5IGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBPY3RvYmVyCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIxMFwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0MTBGb3IxMCA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMTBcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0MTBGb3IxMCwKICAgICAgICAgICAgIkN1c3RvbSB5ZWFybHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBPY3RvYmVyIGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBEZWNlbWJlcgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMTJcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlbGVjdGVkIHN1Y2Nlc3NmdWwKICAgICAgICBteSAkV2FpdDEwRm9yMTIgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvblt2YWx1ZT1cIjEyXCJdIikuaGFzQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV2FpdDEwRm9yMTIsCiAgICAgICAgICAgICJDdXN0b20geWVhcmx5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgRGVjZW1iZXIgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDYgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzYnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHMxMCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMxMCwKICAgICAgICAgICAgNiwKICAgICAgICAgICAgIkNyZWF0ZSBjdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50MTBTdGFydFRpbWVzOwogICAgICAgIG15ICRTeXN0ZW1UaW1lMTAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdFllYXIxMDsKICAgICAgICBteSAkRGF5MTA7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDEwU3RhcnRUaW1lcyAhPSA2ICkgewogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkTGFzdFllYXIxMCApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50MTBTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RZZWFyMTAgPSAkWWVhcjsKICAgICAgICAgICAgICAgICREYXkxMCAgICAgID0gJERheTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkRGF5ID09ICREYXkxMAogICAgICAgICAgICAgICAgJiYgKCBncmVwIHsgJE1vbnRoID09ICRfIH0gKCAyLCAxMCwgMTIgKSApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJFllYXIgLSAkTGFzdFllYXIxMCApICUgMiA9PSAwICkgICAgICAgIyBjaGVjayBpZiBJbnRlcnZhbCBtYXRjaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50MTBTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lMTAgKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gNSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czEwWyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50MTBTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGUxMCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czEwWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTEwLAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBjdXN0b20gd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudCh3aXRob3V0IGFueXRoaW5nIHNlbGVjdGVkKQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLmxlbmd0aCAmJiBcJCgnI0VkaXRGb3JtU3VibWl0JykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnQ3VzdG9tIHllYXJseSB3aXRob3V0IGFueXRoaW5nIHNlbGVjdGVkJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJykudmFsKCdDdXN0b21ZZWFybHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgZm9yIGpzCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdjp2aXNpYmxlIikubGVuZ3RoOycKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQxMSA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiAhJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlc2VsZWN0ZWQxMSwKICAgICAgICAgICAgIkNoZWNrIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKCMxMSkuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHllYXIKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHMxMSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMxMSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgIkNyZWF0ZSBjdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudCh3aXRob3V0IGFueSBtb250aCBzZWxlY3RlZCkuIgogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudDExU3RhcnRUaW1lczsKICAgICAgICBteSAkU3lzdGVtVGltZTExID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RZZWFyMTE7CiAgICAgICAgbXkgJERheTExOwogICAgICAgIG15ICRNb250aDExOwoKICAgICAgICB3aGlsZSAoIHNjYWxhciBAQXBwb2ludG1lbnQxMVN0YXJ0VGltZXMgIT0gMyApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTExLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgY3VycmVudCBkYXkKICAgICAgICAgICAgaWYgKCAhJExhc3RZZWFyMTEgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudDExU3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTExLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0WWVhcjExID0gJFllYXI7CiAgICAgICAgICAgICAgICAkRGF5MTEgICAgICA9ICREYXk7CiAgICAgICAgICAgICAgICAkTW9udGgxMSAgICA9ICRNb250aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoICREYXkgPT0gJERheTExICkgICAgIyBjaGVjayBpZiBkYXkgaXMgdmFsaWQKICAgICAgICAgICAgICAgICYmICRNb250aCA9PSAkTW9udGgxMQogICAgICAgICAgICAgICAgJiYgKCAoICRZZWFyIC0gJExhc3RZZWFyMTEgKSAlIDIgPT0gMCApICAgICMgY2hlY2sgaWYgSW50ZXJ2YWwgbWF0Y2hlcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudDExU3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTExLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZTExICs9IDI0ICogMzYwMDsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHMxMVskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDExU3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlMTEgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHMxMVswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGUxMSwKICAgICAgICAgICAgIkRlbGV0ZSBjdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudHMod2l0aG91dCBhbnkgbW9udGggc2VsZWN0ZWQpLiIsCiAgICAgICAgKTsKICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHcm91cE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgIG15ICRDYWxlbmRhck9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgICAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICAgICAjIERhc2hib2FyZCB3aWRnZXQgY29uZmlnIGtleS4KICAgICAgICBteSAkRGFzaGJvYXJkQ29uZmlnS2V5ID0gJzA1MDAtQXBwb2ludG1lbnRDYWxlbmRhcic7CgogICAgICAgICMgVHVybiBvbiBkYXNoYm9hcmQgd2lkZ2V0IGJ5IGRlZmF1bHQuCiAgICAgICAgbXkgJERhc2hib2FyZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGFzaGJvYXJkQmFja2VuZCcpLT57JERhc2hib2FyZENvbmZpZ0tleX07CiAgICAgICAgJERhc2hib2FyZENvbmZpZy0+e0RlZmF1bHR9ID0gMTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAiRGFzaGJvYXJkQmFja2VuZCMjIyREYXNoYm9hcmRDb25maWdLZXkiLAogICAgICAgICAgICBWYWx1ZSA9PiAkRGFzaGJvYXJkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEdyb3VwSUQsCiAgICAgICAgICAgICJDcmVhdGVkIHRlc3QgZ3JvdXAgLSAkR3JvdXBJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbJEdyb3VwTmFtZV0sCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CiAgICAgICAgbXkgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVXNlcklELAogICAgICAgICAgICAiQ3JlYXRlZCB0ZXN0IHVzZXIgLSAkVXNlcklEIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBhIHRlc3QgY2FsZW5kYXIuCiAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhciAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICJDcmVhdGVkIHRlc3QgY2FsZW5kYXIgLSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGN1cnJlbnQgdGltZS4KICAgICAgICBteSAkU3RhcnRUaW1lICAgICAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CiAgICAgICAgbXkgJFN0YXJ0VGltZXN0YW1wID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwoKICAgICAgICAjIEp1c3QgYmVmb3JlIG1pZG5pZ2h0IHRvZGF5LgogICAgICAgIG15ICRUb2RheSA9IHN1YnN0ciggJFN0YXJ0VGltZXN0YW1wLCAwLCAxMCApIC4gJyAyMzo1OTo1OSc7CgogICAgICAgIG15ICRUb21vcnJvdyA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUgKyA2MCAqIDYwICogMjQsICAgICMgKzI0IGhvdXJzCiAgICAgICAgKTsKICAgICAgICBteSAkRGF5QWZ0ZXJUb21vcnJvdyA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUgKyA2MCAqIDYwICogNDgsICAgICMgKzQ4IGhvdXJzCiAgICAgICAgKTsKICAgICAgICBteSAkVHdvRGF5c0FmdGVyVG9tb3Jyb3cgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICsgNjAgKiA2MCAqIDcyLCAgICAjICs3MiBob3VycwogICAgICAgICk7CgogICAgICAgICMgU2FtcGxlIGFwcG9pbnRtZW50cy4KICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gKAoKICAgICAgICAgICAgIyBUb2RheS4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICRUb2RheSwKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJFRvZGF5LAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiVG9kYXkgJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIEZpbHRlciAgICAgPT4gJ1RvZGF5JywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgVG9tb3Jyb3cuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAkVG9tb3Jyb3csCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgID0+ICRUb21vcnJvdywKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIlRvbW9ycm93ICRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBGaWx0ZXIgICAgID0+ICdUb21vcnJvdycsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIERheSBhZnRlciB0b21vcnJvdy4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICREYXlBZnRlclRvbW9ycm93LAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAkRGF5QWZ0ZXJUb21vcnJvdywKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkRheSBhZnRlciB0b21vcnJvdyAkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRmlsdGVyICAgICA9PiAnU29vbicsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIFR3byBkYXlzIGFmdGVyIHRvbW9ycm93LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJFR3b0RheXNBZnRlclRvbW9ycm93LAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAkVHdvRGF5c0FmdGVyVG9tb3Jyb3csCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgID0+ICJUd28gZGF5cyBhZnRlciB0b21vcnJvdyAkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRmlsdGVyICAgICA9PiAnU29vbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgYXBwb2ludG1lbnRzLgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJXskQXBwb2ludG1lbnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgIkNyZWF0ZWQgdGVzdCBhcHBvaW50bWVudCAtICRBcHBvaW50bWVudElEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRJRDsKICAgICAgICB9CgogICAgICAgICMgTG9naW4gYXMgdGVzdCB1c2VyLgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSB3aWRnZXQgaXMgcHJlc2VudC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEYXNoYm9hcmQkRGFzaGJvYXJkQ29uZmlnS2V5IiwgJ2NzcycgKTsKCiAgICAgICAgIyBDaGVjayBhcHBvaW50bWVudHMuCiAgICAgICAgbXkgJUZpbHRlckNvdW50OwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICMgUmVtZW1iZXIgZmlsdGVyLgogICAgICAgICAgICAkRmlsdGVyQ291bnR7ICRBcHBvaW50bWVudC0+e0ZpbHRlcn0gfSArPSAxOwoKICAgICAgICAgICAgIyBTd2l0Y2ggZmlsdGVyLgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcuQXBwb2ludG1lbnRGaWx0ZXIgI0Rhc2hib2FyZCR7RGFzaGJvYXJkQ29uZmlnS2V5fSRBcHBvaW50bWVudC0+e0ZpbHRlcn0nKS50cmlnZ2VyKCdjbGljaycpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgV2FpdCB1bnRpbCBhbGwgQUpBWCBjYWxscyBmaW5pc2hlZC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQuYWN0aXZlID09IDAiICk7CgogICAgICAgICAgICAjIFZlcmlmeSBhcHBvaW50bWVudCBpcyB2aXNpYmxlLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBcHBvaW50bWVudElEPSRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9XCcpXSIpOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBmaWx0ZXIgY291bnQuCiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlckNvdW50ICkgewogICAgICAgICAgICBteSAkRmlsdGVyTGluayA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0Rhc2hib2FyZCR7RGFzaGJvYXJkQ29uZmlnS2V5fSR7RmlsdGVyfSIsICdjc3MnICk7CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkRmlsdGVyTGluay0+Z2V0X3RleHQoKSwKICAgICAgICAgICAgICAgICIkRmlsdGVyICgkRmlsdGVyQ291bnR7JEZpbHRlcn0pIiwKICAgICAgICAgICAgICAgICJGaWx0ZXIgY291bnQgLSAkRmlsdGVyIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRlc3QgYXBwb2ludG1lbnRzLgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEZWxldGVkIHRlc3QgYXBwb2ludG1lbnQgLSAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSB0ZXN0IGNhbGVuZGFyLgogICAgICAgIGlmICggJENhbGVuZGFye0NhbGVuZGFySUR9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNhbGVuZGFyIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRDYWxlbmRhcntDYWxlbmRhcklEfSBdLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBjYWxlbmRhciAtICRDYWxlbmRhcntDYWxlbmRhcklEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhDYWxlbmRhciBBcHBvaW50bWVudCkpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIEdldCBTZWxlbml1bSBvYmplY3QuCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJFVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRDYWNoZU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICAgICAjIFNldCBsaW5rIG9iamVjdCB2aWV3IG1vZGUgdG8gJ0NvbXBsZXgnLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdMaW5rT2JqZWN0OjpWaWV3TW9kZScsCiAgICAgICAgICAgIFZhbHVlID0+ICdDb21wbGV4JywKICAgICAgICApOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGdyb3VwLgogICAgICAgIG15ICRHcm91cE5hbWUgPSAiZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkR3JvdXBJRCwKICAgICAgICAgICAgIkdyb3VwSUQgJEdyb3VwSUQgLSBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJExhbmd1YWdlICAgICAgPSAnZW4nOwogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyAgID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CgogICAgICAgICMgR2V0IHRlc3QgdXNlciBJRC4KICAgICAgICBteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGNhbGVuZGFyLgogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiTXkgQ2FsZW5kYXIgJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkQ2FsZW5kYXJJRCA9ICRDYWxlbmRhcntDYWxlbmRhcklEfTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENhbGVuZGFySUQsCiAgICAgICAgICAgICJDYWxlbmRhcklEICRDYWxlbmRhcklEIC0gY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB0aWNrZXQuCiAgICAgICAgbXkgJFRpY2tldFRpdGxlICA9ICJUaWNrZXQtJFJhbmRvbUlEIjsKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlTnVtYmVyKCk7CiAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVE4gICAgICAgICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkVGlja2V0VGl0bGUsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdvcGVuJywKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICcxMjM0NjUnLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJ2N1c3RvbWVyT25lQGV4YW1wbGUuY29tJywKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlRpY2tldElEICRUaWNrZXRJRCAtIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgTG9naW4gYXMgdGVzdCB1c2VyLgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKCiAgICAgICAgbXkgJEFwcG9pbnRtZW50TmFtZSA9ICJBcHBvaW50bWVudC0kUmFuZG9tSUQiOwoKICAgICAgICAjIEFkZCBhcHBvaW50bWVudHMgYW5kIGxpbmsgd2l0aCB0ZXN0IHRpY2tldC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RpdGxlIiwgICAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCIkQXBwb2ludG1lbnROYW1lIik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGVzY3JpcHRpb24iLCAnY3NzJyApLT5zZW5kX2tleXMoJ1Rlc3QgcmVwZWF0aW5nIGFwcG9pbnRtZW50Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgkQ2FsZW5kYXJJRCkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnRGFpbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNSZWN1cnJlbmNlTGltaXQnKS5sZW5ndGgiICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjUmVjdXJyZW5jZUNvdW50JykubGVuZ3RoIiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JlY3VycmVuY2VDb3VudCIsICdjc3MnICktPnNlbmRfa2V5cygnMycpOwoKICAgICAgICBteSAkQXV0b0NvbXBsZXRlU3RyaW5nID0gIiRUaWNrZXROdW1iZXIgJFRpY2tldFRpdGxlIjsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggImlucHV0LlBsdWdpbkZpZWxkLnVpLWF1dG9jb21wbGV0ZS1pbnB1dCIsICdjc3MnICktPnNlbmRfa2V5cygkUmFuZG9tSUQpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW0iKS5sZW5ndGggPT09IDEnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkQXV0b0NvbXBsZXRlU3RyaW5nKScpLmNsaWNrKCkiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nLk1vZGFsIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgR2V0IHRlc3QgYXBwb2ludG1lbnRzLgogICAgICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICApOwoKICAgICAgICAjIEdldCBwYXJlbnQgYW5kIGNoaWxkIGFwcG9pbnRtZW50cy4KICAgICAgICBteSAkUGFyZW50QXBwb2ludG1lbnQ7CiAgICAgICAgbXkgQENoaWxkQXBwb2ludG1lbnRzOwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQXBwb2ludG1lbnQtPntSZWN1cnJpbmd9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQ2hpbGRBcHBvaW50bWVudHMsICRBcHBvaW50bWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJlbnRBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdGhlIGxhc3QgY2hpbGQgYXBwb2ludG1lbnQgSUQuCiAgICAgICAgbXkgJExhc3RDaGlsZEFwcG9pbnRtZW50SUQgPSAkQ2hpbGRBcHBvaW50bWVudHNbLTFdLT57QXBwb2ludG1lbnRJRH07CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRab29tLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBDaGVjayBhcHBvaW50bWVudCBsaW5rcyAtIGFsbCBhcHBvaW50bWVudHMgc2hvdWxkIGJlIGluIHRoZSB0YWJsZS4KICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQXBwb2ludG1lbnQgdGJvZHkgYVtocmVmKj1cIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAuICJcIl0nKS5sZW5ndGg7IgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJBZGRlZCBhcHBvaW50bWVudCAtIEFwcG9pbnRtZW50SUQgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gLSBmb3VuZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRoZSBsYXN0IHJlY3VycmluZyBhcHBvaW50bWVudCBsaW5rLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0kTGFzdENoaWxkQXBwb2ludG1lbnRJRCcgKV0iCiAgICAgICAgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5SZW1vdmVCdXR0b24iLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgIVwkKCcuUGx1Z2luQ29udGFpbmVyOnZpc2libGUnKS5sZW5ndGgiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nLk1vZGFsIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRab29tLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBDaGVjayBhcHBvaW50bWVudCBsaW5rcyAtIG9ubHkgdGhlIGxhc3QgYXBwb2ludG1lbnQgc2hvdWxkIG5vdCBiZSBpbiB0aGUgdGFibGUuCiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgICAgICAgICBteSAkTGVuZ3RoICAgICAgICA9ICRBcHBvaW50bWVudElEICE9ICRMYXN0Q2hpbGRBcHBvaW50bWVudElEID8gMSA6IDA7CiAgICAgICAgICAgIG15ICRJc0ZvdW5kICAgICAgID0gJExlbmd0aCA/ICdmb3VuZCcgOiAnbm90IGZvdW5kJzsKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnI0FwcG9pbnRtZW50IHRib2R5IGFbaHJlZio9XCJBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0kQXBwb2ludG1lbnRJRFwiXScpLmxlbmd0aDsiCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJExlbmd0aCwKICAgICAgICAgICAgICAgICJBZnRlciBkZWxldGUgY2hpbGQgYXBwb2ludG1lbnQgbGluayAtIEFwcG9pbnRtZW50SUQgJEFwcG9pbnRtZW50SUQgLSAkSXNGb3VuZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRWRpdCBwYXJlbnQgYXBwb2ludG1lbnQgbmFtZSB0byBjaGVjayBpZiBhbGwgY2hpbGQgYXBwb2ludG1lbnRzIHdpbGwgYmUgcmVjcmVhdGVkLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0iCiAgICAgICAgICAgICAgICAuICRQYXJlbnRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAuICInKV0iCiAgICAgICAgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaXRsZSIsICAgICAgICAgICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGl0bGUiLCAgICAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoIiRBcHBvaW50bWVudE5hbWUtRWRpdCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2cuTW9kYWwiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKCiAgICAgICAgIyBDbGVhbiB0aGUgY2FjaGUgYW5kIGdldCB0aGUgc2FtZSBwYXJlbnQgYXBwb2ludG1lbnQgd2l0aCBuZXcgY2hpbGRyZW4uCiAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICdBcHBvaW50bWVudExpc3QnIC4gJENhbGVuZGFySUQgKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFpvb20uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIFdhaXQgdW50aWwgQXBwb2ludG1lbnQgdGFibGUgaXMgc2hvd24uCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNBcHBvaW50bWVudCB0Ym9keSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBWZXJpZnkgdGhlIHRhYmxlIGV4aXN0cyBvbiBBZ2VudFRpY2tldFpvb20uCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI0FwcG9pbnRtZW50IHRib2R5JykubGVuZ3RoIiksCiAgICAgICAgICAgICJUYWJsZSB3aXRoIGFwcG9pbnRtZW50cyBvbiBBZ2VudFRpY2tldFpvb20gLSBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBpZiB0aGVyZSBhcmUgbm8gcHJldmlvdXMgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBDaGlsZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNBcHBvaW50bWVudCB0Ym9keSBhW2hyZWYqPVwiQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9IgogICAgICAgICAgICAgICAgICAgICAgICAuICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlwiXScpLmxlbmd0aDsiCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgIkFmdGVyIGNoYW5nZSBwYXJlbnQgYXBwb2ludG1lbnQgLSBPbGQgY2hpbGQgYXBwb2ludG1lbnRJRCAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSAtIG5vdCBmb3VuZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIG5ldyBjaGlsZCBhcHBvaW50bWVudHMgYXJlIGxpbmtlZCB0byB0aGUgdGlja2V0LgogICAgICAgIEFQUE9JTlRNRU5UOgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVCBpZiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSA9PSAkUGFyZW50QXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQXBwb2ludG1lbnQgdGJvZHkgYVtocmVmKj1cIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAuICJcIl0nKS5sZW5ndGg7IgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJBZnRlciBjaGFuZ2UgcGFyZW50IGFwcG9pbnRtZW50IC0gTmV3IGNoaWxkIGFwcG9pbnRtZW50ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IC0gZm91bmQiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCB0aWNrZXQuCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldElEICRUaWNrZXRJRCAtIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHBhcmVudCB3aXRoIGFsbCBjaGlsZCBhcHBvaW50bWVudHMuCiAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJlbnRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJQYXJlbnQgQXBwb2ludG1lbnRJRCAkUGFyZW50QXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSBhbmQgYWxsIGl0cyBjaGlsZHJlbiAtIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgY2FsZW5kYXIuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBjYWxlbmRhciBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDYWxlbmRhcklEIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJDYWxlbmRhcklEICRDYWxlbmRhcklEIC0gZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgZ3JvdXAtdXNlciByZWxhdGlvbi4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGdyb3VwX3VzZXIgV0hFUkUgZ3JvdXBfaWQgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkR3JvdXBJRCBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiR3JvdXAtdXNlciByZWxhdGlvbiBmb3IgZ3JvdXAgSUQgJEdyb3VwSUQgLSBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IGdyb3VwLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gZ3JvdXBzIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEdyb3VwSUQgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkdyb3VwSUQgJEdyb3VwSUQgLSBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIE1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgpOwoKICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIEdldCBjdXJyZW50IHN5c3RlbSB0aW1lLgogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwoKICAgICAgICAjIEFkZCAxIG1vbnRoLgogICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgICA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgTW9udGhzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgZGF0ZSBpbmZvIChTZWNvbmQsIE1pbnV0ZSwgSG91ciwgRGF5LCBNb250aCwgWWVhciwgRGF5T2ZXZWVrKS4KICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGFuZ2UgcmVzb2x1dGlvbiAoZGVza3RvcCBtb2RlKS4KICAgICAgICAkU2VsZW5pdW0tPnNldF93aW5kb3dfc2l6ZSggNzY4LCAxMDUwICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdXNlci4KICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBHZXQgVXNlcklELgogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgU3RhcnQgdGVzdC4KICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgYSBmZXcgdGVzdCBjYWxlbmRhcnMuCiAgICAgICAgbXkgJUNhbGVuZGFyMSA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiTXkgQ2FsZW5kYXIgJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgV2FpdCBmb3IgQUpBWCB0byBmaW5pc2guCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgQ2xpY2sgb24gdGhlIG1vbnRoIHZpZXcuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtbW9udGgtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdhaXQgZm9yIEFKQVggdG8gZmluaXNoLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGg7JyApOwoKICAgICAgICAjIEdvIHRvIG5leHQgbW9udGguCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtbmV4dC1idXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV2FpdCBmb3IgQUpBWCB0byBmaW5pc2guCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgR2V0IGRhdGUgaW5mbyAoU2Vjb25kLCBNaW51dGUsIEhvdXIsIERheSwgTW9udGgsIFllYXIsIERheU9mV2VlaykuCiAgICAgICAgbXkgJERhdGFEYXRlID0gIiREYXRlSW5mb1s1XS0iOwogICAgICAgIGlmICggJERhdGVJbmZvWzRdIDwgMTAgKSB7CiAgICAgICAgICAgICREYXRhRGF0ZSAuPSAiMCI7CiAgICAgICAgfQogICAgICAgICREYXRhRGF0ZSAuPSAiJERhdGVJbmZvWzRdLTAxIjsKCiAgICAgICAgIwogICAgICAgICMgUHJlLURlZmluZWQgVGVtcGxhdGVzCiAgICAgICAgIwoKICAgICAgICAjIERlZmluZSBhcHBvaW50bWVudCB0ZXN0IHdpdGggcHJlLWRlZmluZWQgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy4KICAgICAgICBteSBAVGVtcGxhdGVDcmVhdGVUZXN0cyA9ICgKCiAgICAgICAgICAgICMgTm8gYWN0aXZlIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZS4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ05vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIE5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSBzdGFydCAoYXBwb2ludG1lbnQgc3RhcnQgdGltZSkuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdBcHBvaW50bWVudCBzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIE5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSA1IG1pbnV0ZXMgYmVmb3JlLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnNSBtaW51dGVzIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMzAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDMwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMzAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIE5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxNSBtaW51dGVzIGJlZm9yZS4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJzE1IG1pbnV0ZXMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA5MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gOTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA5MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgTm90aWZpY2F0aW9uIHRlbXBsYXRlIDMwIG1pbnV0ZXMgYmVmb3JlLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMzAgbWludXRlcyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE4MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBOb3RpZmljYXRpb24gdGVtcGxhdGUgMSBob3VyIGJlZm9yZS4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJzEgaG91ciBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDM2MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBOb3RpZmljYXRpb24gdGVtcGxhdGUgMiBob3VycyBiZWZvcmUuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcyIGhvdXJzIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNzIwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiA3MjAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA3MjAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIE5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxMiBob3VycyBiZWZvcmUuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcxMiBob3VycyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDQzMjAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDQzMjAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA0MzIwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBOb3RpZmljYXRpb24gdGVtcGxhdGUgMSBkYXkgYmVmb3JlLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMSBkYXkgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA4NjQwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiA4NjQwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gODY0MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgTm90aWZpY2F0aW9uIHRlbXBsYXRlIDIgZGF5cyBiZWZvcmUuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcyIGRheXMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxNzI4MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMTcyODAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAxNzI4MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgTm90aWZpY2F0aW9uIHRlbXBsYXRlIDEgd2VlayBiZWZvcmUuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcxIHdlZWsgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA2MDQ4MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gNjA0ODAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA2MDQ4MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIE5vdGlmaWNhdGlvbiBwcmUtZGVmaW5lZCB0ZW1wbGF0ZSB0ZXN0IGV4ZWN1dGlvbi4KICAgICAgICBmb3IgbXkgJFRlc3QgKEBUZW1wbGF0ZUNyZWF0ZVRlc3RzKSB7CgogICAgICAgICAgICAjIENyZWF0ZSBhcHBvaW50bWVudAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICAgICAjIEVudGVyIHNvbWUgZGF0YS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoIiRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0iKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcjTm90aWZpY2F0aW9uVGVtcGxhdGUnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2xpY2sgb24gU2F2ZS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIFdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2guCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcG9pbnRtZW50LgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiQXBwb2ludG1lbnQgbGlzdCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gKSB7CgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0QXBwb2ludG1lbnQgICAgICAgPSAiJERhdGFEYXRlIDAwOjAwOjAwIjsKICAgICAgICAgICAgICAgIG15ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkRhdGUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0gLSAkVGVzdC0+e0RhdGF9LT57T2Zmc2V0fSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50TGlzdFswXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRlLAogICAgICAgICAgICAgICAgICAgICJWZXJpZnkgbm90aWZpY2F0aW9uIGRhdGUgLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFZlcmlmeSByZXN1bHRzLgogICAgICAgICAgICBmb3IgbXkgJFJlc3VsdEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Jlc3VsdH0gfSApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50TGlzdFswXS0+eyRSZXN1bHRLZXl9IC8vICcnLAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAgICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgcmVzdWx0OiAnIC4gJFJlc3VsdEtleSAuICcgLSAnIC4gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREZWxldGUgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIERlbGV0ZSBhcHBvaW50bWVudC4KICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRGVsZXRlLAogICAgICAgICAgICAgICAgIkRlbGV0ZSBhcHBvaW50bWVudCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIwogICAgICAgICMgQ3VzdG9tIFJlbGF0aXZlIFRlbXBsYXRlcwogICAgICAgICMKCiAgICAgICAgIyBEZWZpbmUgYXBwb2ludG1lbnQgdGVzdCB3aXRoIGN1c3RvbSBub3RpZmljYXRpb24gdGVtcGxhdGVzLgogICAgICAgIG15IEBUZW1wbGF0ZUN1c3RvbVJlbGF0aXZlQ3JlYXRlVGVzdHMgPSAoCgogICAgICAgICAgICAjIEN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGJlZm9yZSBzdGFydC4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHJlbGF0aXZlIDAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBDdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIC0yIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgLTIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IC0yLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQ3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIEN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGFmdGVyIHN0YXJ0LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgMCBtaW51dGVzIGFmdGVyIHN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIEN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGJlZm9yZSBlbmQuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAwIG1pbnV0ZXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQ3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYWZ0ZXIgZW5kLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgMCBtaW51dGVzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBOb3RpZmljYXRpb24gY3VzdG9tIHJlbGF0aXZlIHRlbXBsYXRlIHRlc3QgZXhlY3V0aW9uLgogICAgICAgIGZvciBteSAkVGVzdCAoQFRlbXBsYXRlQ3VzdG9tUmVsYXRpdmVDcmVhdGVUZXN0cykgewoKICAgICAgICAgICAgIyBDcmVhdGUgYXBwb2ludG1lbnQKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyBXYWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoOyIgKTsKCiAgICAgICAgICAgICMgRW50ZXIgc29tZSBkYXRhLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygiJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSIpOwogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2VsZWN0IGN1c3RvbSB0ZW1wbGF0ZS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvblRlbXBsYXRlJykudmFsKCckVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEFjdGl2YXRlIHRoZSByZWxhdGl2ZSBub3RpZmljYXRpb25zLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0IiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgICAgICMgRmlsbCBvdXQgdGhlIGN1c3RvbSB1bml0IGNvdW50IGZpZWxkLgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcjTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0nKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEZpbGwgb3V0IHRoZSBjdXN0b20gdW5pdCBmaWVsZC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcpLnZhbCgnJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgRmlsbCBvdXQgdGhlIGN1c3RvbSB1bml0IHBvaW50IG9mIHRpbWUgZmllbGQuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJykudmFsKCckVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2xpY2sgb24gU2F2ZS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIFdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2guCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aDsnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcG9pbnRtZW50LgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiQXBwb2ludG1lbnQgbGlzdCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEdldCB0aGUgbmVlZGVkIG5vdGlmaWNhdGlvbiBwYXJhbXMKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRDb3VudCA9ICRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH07CgogICAgICAgICAgICAjIFRoZSBiYWNrZW5kIHRyZWF0cyBuZWdhdGl2ZSB2YWx1ZXMgYXMgMC4KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdENvdW50IDwgMCApIHsKICAgICAgICAgICAgICAgICRDdXN0b21Vbml0Q291bnQgPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdCAgICAgID0gJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH07CiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0UG9pbnQgPSAkVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX07CgogICAgICAgICAgICAjIFNldHVwIHRoZSBjb3VudCB0byBjb21wdXRlIGZvciB0aGUgb2Zmc2V0LgogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25Mb2NhbFRpbWU7CgogICAgICAgICAgICAjIENvbXB1dGUgZnJvbSBzdGFydCB0aW1lLgogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcnN0YXJ0JyApIHsKCiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uTG9jYWxUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcHV0ZSBmcm9tIGVuZCB0aW1lLgogICAgICAgICAgICBlbHNpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJlbmQnICkgewoKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudExpc3RbMF0tPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGJlIHVzZWQuCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIFNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcuCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25EYXRlID0gJyc7CgogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnICkgewogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkRhdGUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJE5vdGlmaWNhdGlvbkxvY2FsVGltZSAtICRPZmZzZXQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0ZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkTm90aWZpY2F0aW9uTG9jYWxUaW1lICsgJE9mZnNldCApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50TGlzdFswXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkRhdGUsCiAgICAgICAgICAgICAgICAiVmVyaWZ5IG5vdGlmaWNhdGlvbiBkYXRlIC0gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSAuIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJERlbGV0ZSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudExpc3RbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgRGVsZXRlIGFwcG9pbnRtZW50LgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICREZWxldGUsCiAgICAgICAgICAgICAgICAiRGVsZXRlIGFwcG9pbnRtZW50IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyBDdXN0b20gRGF0ZVRpbWUgVGVtcGxhdGVzCiAgICAgICAgIwoKICAgICAgICAjIERlZmluZSBhcHBvaW50bWVudCB0ZXN0IHdpdGggY3VzdG9tIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuCiAgICAgICAgbXkgQFRlbXBsYXRlQ3VzdG9tRGF0ZVRpbWVDcmVhdGVUZXN0cyA9ICgKCiAgICAgICAgICAgICMgQ3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyMDE2LTA5LTAxIDEwOjEwOjAwLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gZGF0ZXRpbWUgMjAxNi0wOS0wMSAxMDoxMDowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNb250aCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnOScsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVZZWFyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNicsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVIb3VyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTAnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEwJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDEwOjEwOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMTA6MTA6MDAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBDdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIwMTYtMTAtMTggMDA6MDM6MDAuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBkYXRldGltZSAyMDE2LTEwLTE4IDAxOjAzOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZURheSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxOCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNb250aCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTAnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lWWVhciAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lSG91ciAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMTAtMTggMDE6MDM6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0xMC0xOCAwMTowMzowMCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIEN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMjAxNy0xMC0xOCAwMDowMzowMC4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIGRhdGV0aW1lIDIwMTctMTAtMTggMDM6MDM6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzE4JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxMCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVZZWFyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNycsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVIb3VyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNy0xMC0xOCAwMzowMzowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE3LTEwLTE4IDAzOjAzOjAwJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQ3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyMDE2LTEwLTE4IDAyOjAzOjAwLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gZGF0ZXRpbWUgMjAxNi0xMC0xOCAwMjowMzowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTgnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEwJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZVllYXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUhvdXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTEwLTE4IDAyOjAzOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMTAtMTggMDI6MDM6MDAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgTm90aWZpY2F0aW9uIGRhdGV0aW1lIHRlbXBsYXRlIHRlc3QgZXhlY3V0aW9uLgogICAgICAgIGZvciBteSAkVGVzdCAoQFRlbXBsYXRlQ3VzdG9tRGF0ZVRpbWVDcmVhdGVUZXN0cykgewoKICAgICAgICAgICAgIyBDcmVhdGUgYXBwb2ludG1lbnQuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgV2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkuCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aDsiICk7CgogICAgICAgICAgICAjIEVudGVyIHNvbWUgZGF0YS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoIiRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0iKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNlbGVjdCBjdXN0b20gdGVtcGxhdGUuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNOb3RpZmljYXRpb25UZW1wbGF0ZScpLnZhbCgnJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBBY3RpdmF0ZSB0aGUgcmVsYXRpdmUgbm90aWZpY2F0aW9ucy4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgU2VsZWN0IGRheS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5JykudmFsKCckVGVzdC0+e0RhdGF9LT57RGF0ZVRpbWVEYXl9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNlbGVjdCBtb250aC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKS52YWwoJyRUZXN0LT57RGF0YX0tPntEYXRlVGltZU1vbnRofScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTZWxlY3QgeWVhci4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcicpLnZhbCgnJFRlc3QtPntEYXRhfS0+e0RhdGVUaW1lWWVhcn0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2VsZWN0IGhvdXIuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXInKS52YWwoJyRUZXN0LT57RGF0YX0tPntEYXRlVGltZUhvdXJ9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNlbGVjdCBtaW51dGUuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZScpLnZhbCgnJFRlc3QtPntEYXRhfS0+e0RhdGVUaW1lTWludXRlfScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBDbGljayBvbiBTYXZlLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgV2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlcmUgaXMgYW4gYXBwb2ludG1lbnQuCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRMaXN0LAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJBcHBvaW50bWVudCBsaXN0IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVmVyaWZ5IHJlc3VsdHMuCiAgICAgICAgICAgIGZvciBteSAkUmVzdWx0S2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57UmVzdWx0fSB9ICkgewoKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRMaXN0WzBdLT57JFJlc3VsdEtleX0sCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57JFJlc3VsdEtleX0sCiAgICAgICAgICAgICAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCByZXN1bHQ6ICcgLiAkUmVzdWx0S2V5IC4gJyAtICcgLiAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBEZWxldGUgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIG15ICREZWxldGUgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICREZWxldGUsCiAgICAgICAgICAgICAgICAiRGVsZXRlIGFwcG9pbnRtZW50IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkSGVscGVyICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgICAgICBteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICAjIHR1cm4gb24gdXNlciB0aW1lIHpvbmVzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlcicsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBncm91cAogICAgICAgIG15ICRHcm91cE5hbWUgPSAidGVzdC1jYWxlbmRhci1ncm91cC0kUmFuZG9tSUQiOwogICAgICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBjaGFuZ2UgcmVzb2x1dGlvbiAoZGVza3RvcCBtb2RlKQogICAgICAgICRTZWxlbml1bS0+c2V0X3dpbmRvd19zaXplKCA3NjgsIDEwNTAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyCiAgICAgICAgbXkgJExhbmd1YWdlICAgICAgPSAnZW4nOwogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyAgID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CgogICAgICAgICMgZ2V0IFVzZXJJRAogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIHRlc3QgY2FsZW5kYXIKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGdvIHRvIHByZXZpb3VzIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgY2xpY2sgb24gdGhlIHRpbWVsaW5lIHZpZXcgZm9yIGFuIGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApCiAgICAgICAgICAgIC0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdUaW1lIFpvbmUgQXBwb2ludG1lbnQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFye0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdFbmRIb3VyJywgJ25hbWUnICktPnNlbmRfa2V5cygnMTgnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnVGltZSBab25lIEFwcG9pbnRtZW50JywKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IHZpc2libGUgKENhbGVuZGFyIE92ZXJ2aWV3KScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBhZ2VuZGEgb3ZlcnZpZXcgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldztGaWx0ZXI9V2VlaztKdW1wPVByZXYiKTsKCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ1RpbWUgWm9uZSBBcHBvaW50bWVudCcgKSA+IC0xLAogICAgICAgICAgICAnQXBwb2ludG1lbnQgdmlzaWJsZSAoQWdlbmRhIE92ZXJ2aWV3KScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXBwb2ludG1lbnQgaWQKICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJy5NYXN0ZXJBY3Rpb25MaW5rJykuZGF0YSgnYXBwb2ludG1lbnRJZCcpOyIKICAgICAgICApOwoKICAgICAgICAjIGdldCBkaXNwbGF5ZWQgc3RhcnQgZGF0ZQogICAgICAgIG15ICRTdGFydERhdGUKICAgICAgICAgICAgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi8vKltcQGlkPSdBcHBvaW50bWVudElEXyRBcHBvaW50bWVudElEJ10vdGRbNF0iLCAneHBhdGgnICktPmdldF90ZXh0KCk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZQogICAgICAgICRTdGFydERhdGUgPX4gLyhcZHsyfTpcZHsyfTpcZHsyfSkkLzsKICAgICAgICBteSAkU3RhcnRUaW1lID0gJDE7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU3RhcnRUaW1lLAogICAgICAgICAgICAnMDg6MDA6MDAnLAogICAgICAgICAgICAnU3RhcnQgdGltZSBpbiBsb2NhbCB0aW1lJywKICAgICAgICApOwoKICAgICAgICAjIHR1cm4gb24gdXNlciB0aW1lIHpvbmVzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlcicsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB0dXJuIG9mZiBicm93c2VyIGF1dG8gb2Zmc2V0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlckJyb3dzZXJBdXRvT2Zmc2V0JywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNldCB1c2VyJ3MgdGltZSB6b25lCiAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJUaW1lWm9uZScsCiAgICAgICAgICAgIFZhbHVlICA9PiAnKzInLCAgICAgICAgICAgICAjIEV1cm9wZS9CZXJsaW4KICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3Qgc2V0IHByZWZlcmVuY2UgVXNlclRpbWVab25lJzsKCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFByZWZlcmVuY2Vze1VzZXJUaW1lWm9uZX0sCiAgICAgICAgICAgICcrMicsCiAgICAgICAgICAgICdQcmVmZXJlbmNlIFVzZXJUaW1lWm9uZSBjb3JyZWN0JywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcoQ2FsZW5kYXIgQXBwb2ludG1lbnQpKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KCiAgICAgICAgIyBsb2cgaW4gYWdhaW4KICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBhZ2VuZGEgb3ZlcnZpZXcgcGFnZSBhZ2FpbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldztGaWx0ZXI9V2VlaztKdW1wPVByZXYiKTsKCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyBnZXQgZGlzcGxheWVkIHN0YXJ0IGRhdGUKICAgICAgICBteSAkU3RhcnREYXRlVFoKICAgICAgICAgICAgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi8vKltcQGlkPSdBcHBvaW50bWVudElEXyRBcHBvaW50bWVudElEJ10vdGRbNF0iLCAneHBhdGgnICktPmdldF90ZXh0KCk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZSBhZ2FpbgogICAgICAgICRTdGFydERhdGVUWiA9fiAvKFxkezJ9OlxkezJ9OlxkezJ9XHNcKFwrMlwpKSQvOwogICAgICAgIG15ICRTdGFydFRpbWVUWiA9ICQxOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFN0YXJ0VGltZVRaLAogICAgICAgICAgICAnMTA6MDA6MDAgKCsyKScsCiAgICAgICAgICAgICJTdGFydCB0aW1lIGluIHVzZXIncyB0aW1lIHpvbmUiLAogICAgICAgICk7CgogICAgICAgICMgZ28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZSBhZ2FpbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkLmFjdGl2ZSA9PSAwIiApOwoKICAgICAgICAjIGdvIHRvIHByZXZpb3VzIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnLmZjLXRpbWVsaW5lLWV2ZW50JylbMF0uc2Nyb2xsSW50b1ZpZXcodHJ1ZSk7IiwKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uIGFuIGFwcG9pbnRtZW50LgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcuZmMtdGltZWxpbmUtZXZlbnQnKS5jbGljaygpOyIpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnLkRpYWxvZycpLmxlbmd0aCAmJiBcJCgnI1N0YXJ0SG91cicpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHN0YXJ0IGhvdXIKICAgICAgICBteSAkU3RhcnRIb3VyVFogPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1N0YXJ0SG91cicsICduYW1lJyApLT5nZXRfdmFsdWUoKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTdGFydEhvdXJUWiwKICAgICAgICAgICAgMTAsCiAgICAgICAgICAgICJTdGFydCBob3VyIGluIHVzZXIncyB0aW1lIHpvbmUiLAogICAgICAgICk7CgogICAgICAgICMgY2xlYW51cAoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGFwcG9pbnRtZW50CiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJEZWxldGVkIHRlc3QgYXBwb2ludG1lbnQgLSAkQXBwb2ludG1lbnRJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjYWxlbmRhcgogICAgICAgIGlmICggJENhbGVuZGFye0NhbGVuZGFySUR9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNhbGVuZGFyIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRDYWxlbmRhcntDYWxlbmRhcklEfSBdLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBjYWxlbmRhciAtICRDYWxlbmRhcntDYWxlbmRhcklEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcoQ2FsZW5kYXIgQXBwb2ludG1lbnQpKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewogICAgICAgIG15ICRIZWxwZXIgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJExpbWl0ICAgID0gMTA7CgogICAgICAgICMgU2V0IENhbGVuZGFyTGltaXRPdmVydmlldy4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnQXBwb2ludG1lbnRDYWxlbmRhcjo6Q2FsZW5kYXJMaW1pdE92ZXJ2aWV3JywKICAgICAgICAgICAgVmFsdWUgPT4gJExpbWl0LAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICkgfHwgZGllICdEaWQgbm90IGdldCB0ZXN0IHVzZXInOwoKICAgICAgICBteSAkVXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY2FsZW5kYXJzLgogICAgICAgIG15IEBDYWxlbmRhcklEczsKICAgICAgICBteSAkTGFzdENhbGVuZGFySW5kZXggPSAxNTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMCAuLiAkTGFzdENhbGVuZGFySW5kZXggKSB7CiAgICAgICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyJENvdW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAiQ2FsZW5kYXJJRCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gaXMgY3JlYXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQENhbGVuZGFySURzLCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CgogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICB9CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgR28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgVmVyaWZ5IHRoYXQgb25seSBmaXJzdCBjYWxlbmRhcnMgKGxpbWl0ZWQgYnkgQ2FsZW5kYXJMaW1pdE92ZXJ2aWV3IHNldHRpbmcpIGFyZSBjaGVja2VkLgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uICRMYXN0Q2FsZW5kYXJJbmRleCApIHsKICAgICAgICAgICAgbXkgJExlbmd0aCAgPSAoICRJbmRleCA8ICRMaW1pdCApID8gMSAgICAgICAgIDogMDsKICAgICAgICAgICAgbXkgJENoZWNrZWQgPSAkTGVuZ3RoICAgICAgICAgICAgID8gJ2NoZWNrZWQnIDogJ3VuY2hlY2tlZCc7CiAgICAgICAgICAgIG15ICRDYWxlbmRhcklEID0gJENhbGVuZGFySURzWyRJbmRleF07CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNDYWxlbmRhciRDYWxlbmRhcklEOmNoZWNrZWQnKS5sZW5ndGg7IiksCiAgICAgICAgICAgICAgICAkTGVuZ3RoLAogICAgICAgICAgICAgICAgIkJ5IGRlZmF1bHQgLSBDYWxlbmRhcklEICRDYWxlbmRhcklEIC0gJENoZWNrZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgQENoZWNrZWRJbmRpY2VzID0gKCAxLCAyLCA1LCA4LCAxMSwgMTIsIDE0ICk7CgogICAgICAgICMgVW5jaGVjayBhbGwgYW5kIHRoZW4gY2hlY2sgY2FsZW5kYXJzIGZyb20gdGhlIGFycmF5LgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjQ2FsZW5kYXJzIHRib2R5IGlucHV0W3R5cGU9Y2hlY2tib3hdJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsiKTsKCiAgICAgICAgZm9yIG15ICRJbmRleCAoQENoZWNrZWRJbmRpY2VzKSB7CiAgICAgICAgICAgIG15ICRDYWxlbmRhcklEID0gJENhbGVuZGFySURzWyRJbmRleF07CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NhbGVuZGFyJENhbGVuZGFySUQiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0NhbGVuZGFyJENhbGVuZGFySUQ6Y2hlY2tlZCcpLmxlbmd0aDsiICk7CiAgICAgICAgICAgIHNsZWVwIDE7CiAgICAgICAgfQoKICAgICAgICAjIEdvIGFnYWluIHRvIGNhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoOycgKTsKCiAgICAgICAgIyBWZXJpZnkgdGhhdCBvbmx5IGNhbGVuZGFycyBmcm9tIHRoZSBhcnJheSBhcmUgY2hlY2tlZCAoc2VlIGJ1ZyMxNDA1NCkuCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJExhc3RDYWxlbmRhckluZGV4ICkgewogICAgICAgICAgICBteSAkTGVuZ3RoID0gKCBncmVwIHsgJF8gPT0gJEluZGV4IH0gQENoZWNrZWRJbmRpY2VzICkgPyAxIDogMDsKICAgICAgICAgICAgbXkgJENoZWNrZWQgPSAkTGVuZ3RoID8gJ2NoZWNrZWQnIDogJ3VuY2hlY2tlZCc7CiAgICAgICAgICAgIG15ICRDYWxlbmRhcklEID0gJENhbGVuZGFySURzWyRJbmRleF07CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNDYWxlbmRhciRDYWxlbmRhcklEOmNoZWNrZWQnKS5sZW5ndGg7IiksCiAgICAgICAgICAgICAgICAkTGVuZ3RoLAogICAgICAgICAgICAgICAgIkFmdGVyIGNoYW5nZXMgLSBDYWxlbmRhciAkQ2FsZW5kYXJJRCAtICRDaGVja2VkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2xlYW51cC4KICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBjYWxlbmRhcnMuCiAgICAgICAgZm9yIG15ICRDYWxlbmRhcklEIChAQ2FsZW5kYXJJRHMpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJENhbGVuZGFySUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDYWxlbmRhcklEICRDYWxlbmRhcklEIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgZ3JvdXAtdXNlciByZWxhdGlvbnMuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBncm91cF91c2VyIFdIRVJFIGdyb3VwX2lkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEdyb3VwSUQgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkdyb3VwLXVzZXIgcmVsYXRpb24gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBncm91cC4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGdyb3VwcyBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRHcm91cElEIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJHcm91cElEICRHcm91cElEIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICAgICAjIE1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KENhbGVuZGFyIEdyb3VwKSkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoIFR5cGUgPT4gJENhY2hlICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
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=
LyoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIEFwcG9pbnRtZW50IENhbGVuZGFyCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCiAgICAjRWRpdEFwcG9pbnRtZW50Rm9ybSB7CiAgICAgICAgd2lkdGg6IDU2MHB4OwogICAgfQoKICAgIC5JbmxpbmVCdXR0b24gewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcGFkZGluZzogMDsKICAgIH0KCiAgICAuRmlsdGVyTWVzc2FnZSB0ZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRiAhaW1wb3J0YW50OwogICAgfQoKICAgIC5DYWxlbmRhckNvbG9yIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQkJCOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yNSk7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIH0KCiAgICAuZmMtY29udGVudCAuSWNvbnMsCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gLkljb25zIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICB9CgogICAgLmZjLWNvbnRlbnQgaSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAwLjllbTsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBvcGFjaXR5OiAwLjM7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICB9CgogICAgdHI6aG92ZXIgdGQgLmZjLWNvbnRlbnQgaSB7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICB9CgogICAgLmZjIGJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogI0VFRTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQkJCOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbiAwLjJzOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAzcHggN3B4IDZweDsKICAgICAgICBsaW5lLWhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjRkZGOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIH0KCiAgICAjRGF0ZXBpY2tlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDEwMDsKICAgIH0KCiAgICAjRGF0ZXBpY2tlck92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiA1MDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgICAgIHdpZHRoOiAzNzVweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IC5JY29ucyBpIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDAuOWVtOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gZmllbGRzZXQ6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IGxhYmVsIHsKICAgICAgICBsaW5lLWhlaWdodDogMS4yZW07CiAgICAgICAgY29sb3I6ICM5MjkyOTI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWluLWhlaWdodDogMTdweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMXB4OwogICAgICAgIHBhZGRpbmctdG9wOiAwLjNlbTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICB3aWR0aDogMzAlOwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IC5WYWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjRlbTsKICAgICAgICBwYWRkaW5nLXRvcDogMC4yZW07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA1LjZlbTsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gZmllbGRzZXQgPiAuVmFsdWU6ZW1wdHksCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gZmllbGRzZXQgPiAuVmFsdWU6ZW1wdHkgKyBsYWJlbCwKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IC5WYWx1ZTplbXB0eSB+IGRpdi5DbGVhciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwIC5GbGFnIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB9CgogICAgLkNhbGVuZGFyV2lkZ2V0IC51aS1kYXRlcGlja2VyLXRyaWdnZXIgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICB9CgogICAgLlJlYWRPbmx5VmFsdWUgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgIH0KCiAgICAuUmVhZE9ubHlWYWx1ZSNMb2NhdGlvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgfQoKICAgICNSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdiAuRmllbGRFeHBsYW5hdGlvbjpudGgtY2hpbGQoMikgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICB9CgogICAgI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgLkZpZWxkRXhwbGFuYXRpb24sCiAgICAjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgLkZpZWxkRXhwbGFuYXRpb24sCiAgICAjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiAuRmllbGRFeHBsYW5hdGlvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgIH0KCiAgICAuUGx1Z2luQ29udGFpbmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjJGMkYyOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGJveC1zaGFkb3c6IDFweCAxcHggNXB4ICNDQ0MgaW5zZXQ7CiAgICAgICAgcGFkZGluZzogMnB4IDhweCA0cHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgIH0KCiAgICAuUGx1Z2luQ29udGFpbmVyOmVtcHR5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5QbHVnaW5Db250YWluZXIgYSB7CiAgICAgICAgbGluZS1oZWlnaHQ6IDFlbTsKICAgIH0KCiAgICAuUGx1Z2luQ29udGFpbmVyIGE6Zmlyc3QtY2hpbGQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA5NiU7CiAgICB9CgogICAgLmZjLWFnZW5kYS12aWV3IHRoLmZjLXJlc291cmNlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNEI0QjRCOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgfQoKICAgIC5mYy1zdGF0ZS1kZWZhdWx0LmZjLWNvcm5lci1sZWZ0IHsKICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwOwogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7CiAgICB9CgogICAgLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLXJpZ2h0IHsKICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDsKICAgIH0KCiAgICAuZmMtc3RhdGUtaG92ZXIsCiAgICAuZmMtc3RhdGUtZG93biwKICAgIC5mYy1zdGF0ZS1hY3RpdmUsCiAgICAuZmMtc3RhdGUtZGlzYWJsZWQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFNUU1RTUgIWltcG9ydGFudDsKICAgICAgICBib3JkZXItY29sb3I6ICM5OTkgIWltcG9ydGFudDsKICAgIH0KCiAgICAuZmMtc3RhdGUtZG93biwKICAgIC5mYy1zdGF0ZS1hY3RpdmUgewogICAgICAgIGJveC1zaGFkb3c6IDFweCAxcHggM3B4ICNCMEIwQjAgaW5zZXQsIC0xcHggLTFweCAzcHggI0IwQjBCMCBpbnNldDsKICAgIH0KCiAgICAuZmMtdG9vbGJhciBoMiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgbWFyZ2luLXRvcDogNnB4OwogICAgfQoKICAgIC5mYy12aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGREZEOwogICAgfQoKICAgIC5mYy12aWV3IHRhYmxlIHRoZWFkLmZjLWhlYWQgewogICAgICAgIGJhY2tncm91bmQ6ICNFRUVFRUU7CiAgICB9CgogICAgLmZjLXZpZXcgdGFibGUgdGhlYWQuZmMtaGVhZCB0aC5mYy13aWRnZXQtaGVhZGVyIHsKICAgICAgICBjb2xvcjogIzRCNEI0QjsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CiAgICB9CgogICAgLmZjLWZvbGxvd2luZyB7CiAgICAgICAgcGFkZGluZy10b3A6IDJweCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYy13aWRnZXQtaGVhZGVyIC5mYy1mb2xsb3dpbmcgewogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgcGFkZGluZy10b3A6IDFweCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5XZWVrTnVtYmVyLAogICAgLmZjLXdlZWstbnVtYmVyIHsKICAgICAgICBjb2xvcjogI0IwQjBCMCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYy1yZXNvdXJjZS1hcmVhIH4gLmZjLXRpbWUtYXJlYSAuZmMtZm9sbG93aW5nIHsKICAgICAgICBwYWRkaW5nLXRvcDogMXB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZjLW1vbnRoLXZpZXcgdGguZmMtd2lkZ2V0LWhlYWRlciwKICAgIC5mYy1hZ2VuZGEtdmlldyB0aC5mYy13aWRnZXQtaGVhZGVyIHsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAzcHg7CiAgICB9CgogICAgLmZjLWx0ciAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgfQoKICAgIC5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lciB7CiAgICAgICAgdG9wOiAycHg7CiAgICB9CgogICAgLmZjIC5mYy10b2RheSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjFBQjsKICAgIH0KCiAgICAudWktYXV0b2NvbXBsZXRlIHsKICAgICAgICB6LWluZGV4OiA0MDAwICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkJ1dHRvblRhYmxlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgIH0KCiAgICAuQnV0dG9uVGFibGUgYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgIH0KCiAgICAuQnV0dG9uVGFibGUgLmZjIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgfQoKICAgIC5GaWVsZElubGluZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiAjMDAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICB9CgogICAgI0NvbnRleHRTZXR0aW5nc0RpYWxvZ1Jlc291cmNlT3ZlcnZpZXcgewogICAgICAgIG1heC1oZWlnaHQ6IDYwMHB4OwogICAgICAgIHdpZHRoOiA5NTBweDsKICAgIH0KCiAgICAjUmVzdG9yZURlZmF1bHRTZXR0aW5ncyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgfQoKICAgIHRyOmhvdmVyIHRkIGEjUmVzdG9yZURlZmF1bHRTZXR0aW5ncyBpIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgIH0KCiAgICB0ciB0ZCBhI1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3M6aG92ZXIgaSB7CiAgICAgICAgY29sb3I6ICMwMDA7CiAgICB9CgogICAgLkZpZWxkLkluZm8gYSB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICB9CgogICAgLkZpZWxkIGEuQnV0dG9uOmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgIH0KCiAgICAuRmllbGQgYS5CdXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgfQoKICAgIC5GaWVsZCBhLkJ1dHRvbjpob3ZlciB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgfQoKICAgIC5GaWVsZC5JbmZvIGEuQnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM0U2QzdDOwogICAgfQoKICAgIC5GaWVsZC5JbmZvIGEuQnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNEI3QzhFOwogICAgfQoKICAgIC5GaWVsZC5JbmZvIGEuQnV0dG9uIGkgewogICAgICAgIGNvbG9yOiAjODlDNkQxOwogICAgfQoKICAgIC8qKgogICAgICogRm9udC1Bd2Vzb21lIGNoYXJhY3RlciBjbGFzc2VzCiAgICAgKi8KICAgIC5mYS1jaGFyLWE6YmVmb3JlLCAuZmEtY2hhci1iOmJlZm9yZSwgLmZhLWNoYXItYzpiZWZvcmUsIC5mYS1jaGFyLWQ6YmVmb3JlLCAuZmEtY2hhci1lOmJlZm9yZSwKICAgIC5mYS1jaGFyLWY6YmVmb3JlLCAuZmEtY2hhci1nOmJlZm9yZSwgLmZhLWNoYXItaDpiZWZvcmUsIC5mYS1jaGFyLWk6YmVmb3JlLCAuZmEtY2hhci1qOmJlZm9yZSwKICAgIC5mYS1jaGFyLWs6YmVmb3JlLCAuZmEtY2hhci1sOmJlZm9yZSwgLmZhLWNoYXItbTpiZWZvcmUsIC5mYS1jaGFyLW46YmVmb3JlLCAuZmEtY2hhci1vOmJlZm9yZSwKICAgIC5mYS1jaGFyLXA6YmVmb3JlLCAuZmEtY2hhci1xOmJlZm9yZSwgLmZhLWNoYXItcjpiZWZvcmUsIC5mYS1jaGFyLXM6YmVmb3JlLCAuZmEtY2hhci10OmJlZm9yZSwKICAgIC5mYS1jaGFyLXU6YmVmb3JlLCAuZmEtY2hhci12OmJlZm9yZSwgLmZhLWNoYXItdzpiZWZvcmUsIC5mYS1jaGFyLXg6YmVmb3JlLCAuZmEtY2hhci15OmJlZm9yZSwKICAgIC5mYS1jaGFyLXo6YmVmb3JlLCAuZmEtY2hhci0wOmJlZm9yZSwgLmZhLWNoYXItMTpiZWZvcmUsIC5mYS1jaGFyLTI6YmVmb3JlLCAuZmEtY2hhci0zOmJlZm9yZSwKICAgIC5mYS1jaGFyLTQ6YmVmb3JlLCAuZmEtY2hhci01OmJlZm9yZSwgLmZhLWNoYXItNjpiZWZvcmUsIC5mYS1jaGFyLTc6YmVmb3JlLCAuZmEtY2hhci04OmJlZm9yZSwKICAgIC5mYS1jaGFyLTk6YmVmb3JlIHsKICAgICAgICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgIH0KICAgIC5mYS1jaGFyLWE6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiQSI7CiAgICB9CiAgICAuZmEtY2hhci1iOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkIiOwogICAgfQogICAgLmZhLWNoYXItYzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJDIjsKICAgIH0KICAgIC5mYS1jaGFyLWQ6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiRCI7CiAgICB9CiAgICAuZmEtY2hhci1lOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkUiOwogICAgfQogICAgLmZhLWNoYXItZjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJGIjsKICAgIH0KICAgIC5mYS1jaGFyLWc6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiRyI7CiAgICB9CiAgICAuZmEtY2hhci1oOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkgiOwogICAgfQogICAgLmZhLWNoYXItaTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJJIjsKICAgIH0KICAgIC5mYS1jaGFyLWo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiSiI7CiAgICB9CiAgICAuZmEtY2hhci1rOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIksiOwogICAgfQogICAgLmZhLWNoYXItbDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJMIjsKICAgIH0KICAgIC5mYS1jaGFyLW06YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiTSI7CiAgICB9CiAgICAuZmEtY2hhci1uOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIk4iOwogICAgfQogICAgLmZhLWNoYXItbzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJPIjsKICAgIH0KICAgIC5mYS1jaGFyLXA6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiUCI7CiAgICB9CiAgICAuZmEtY2hhci1xOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlEiOwogICAgfQogICAgLmZhLWNoYXItcjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJSIjsKICAgIH0KICAgIC5mYS1jaGFyLXM6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiUyI7CiAgICB9CiAgICAuZmEtY2hhci10OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlQiOwogICAgfQogICAgLmZhLWNoYXItdTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJVIjsKICAgIH0KICAgIC5mYS1jaGFyLXY6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiViI7CiAgICB9CiAgICAuZmEtY2hhci13OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlciOwogICAgfQogICAgLmZhLWNoYXIteDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJYIjsKICAgIH0KICAgIC5mYS1jaGFyLXk6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiWSI7CiAgICB9CiAgICAuZmEtY2hhci16OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIloiOwogICAgfQogICAgLmZhLWNoYXItMDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIwIjsKICAgIH0KICAgIC5mYS1jaGFyLTE6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiMSI7CiAgICB9CiAgICAuZmEtY2hhci0yOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjIiOwogICAgfQogICAgLmZhLWNoYXItMzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIzIjsKICAgIH0KICAgIC5mYS1jaGFyLTQ6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiNCI7CiAgICB9CiAgICAuZmEtY2hhci01OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjUiOwogICAgfQogICAgLmZhLWNoYXItNjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI2IjsKICAgIH0KICAgIC5mYS1jaGFyLTc6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiNyI7CiAgICB9CiAgICAuZmEtY2hhci04OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjgiOwogICAgfQogICAgLmZhLWNoYXItOTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI5IjsKICAgIH0KCn0gLyogZW5kIEBtZWRpYSAqLwoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIHsKCiAgICAjQ29udGV4dFNldHRpbmdzRGlhbG9nUmVzb3VyY2VPdmVydmlldywKICAgICNFZGl0QXBwb2ludG1lbnRGb3JtIHsKICAgICAgICB3aWR0aDogYXV0bzsKICAgIH0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
LyoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIEFwcG9pbnRtZW50IENhbGVuZGFyIEFnZW5kYSBPdmVydmlldwogKi8KCkBtZWRpYSBzY3JlZW4scHJvamVjdGlvbix0dixoYW5kaGVsZCB7CgogICAgLkNvbG9yIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIH0KCiAgICAuQnV0dG9ucyB7CiAgICAgICAgbWFyZ2luOiA0cHggM3B4IDJweDsKICAgIH0KCiAgICAuSGVhZGVyTGVmdCwKICAgIC5SVEwgLkhlYWRlclJpZ2h0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgIH0KCiAgICAuSGVhZGVyTGVmdC5CdXR0b25zIGEsCiAgICAuUlRMIC5IZWFkZXJSaWdodC5CdXR0b25zIGEgewogICAgICAgIG1hcmdpbi1yaWdodDogM3B4OwogICAgfQoKICAgIC5IZWFkZXJDZW50ZXIgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW4tdG9wOiA5cHg7CiAgICB9CgogICAgLkhlYWRlckNlbnRlciBoMiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICB9CgogICAgLkhlYWRlclJpZ2h0LAogICAgLlJUTCAuSGVhZGVyTGVmdCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgfQoKICAgIC5IZWFkZXJSaWdodC5CdXR0b25zIGEsCiAgICAuUlRMIC5IZWFkZXJMZWZ0LkJ1dHRvbnMgYSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgIH0KCiAgICAuRGF0ZURpdmlkZXIgewogICAgICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5EYXRlRGl2aWRlciB0ZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgICAgICBib3JkZXItdG9wOiAxcHggZG90dGVkICNDQ0M7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjQ0NDOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyZW07CiAgICB9CgogICAgLkRhdGVEaXZpZGVyLkZpcnN0ID4gdGQgewogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICB9CgogICAgLlRhYmxlU21hbGwgdGJvZHkgdHIuRGF0ZURpdmlkZXI6aG92ZXIgdGQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUU7CiAgICB9CgogICAgLk92ZXJ2aWV3Q29udHJvbC5Mb2FkaW5nIC5Db250cm9sUm93IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjREREIHVybCgiLi4vaW1nL2xvYWRlci5naWYiKSBuby1yZXBlYXQgcmlnaHQgNXB4IGNlbnRlcjsKICAgIH0KCiAgICAuUlRMIC5PdmVydmlld0NvbnRyb2wuTG9hZGluZyAuQ29udHJvbFJvdyB7CiAgICAgICAgYmFja2dyb3VuZDogI0RERCB1cmwoIi4uL2ltZy9sb2FkZXIuZ2lmIikgbm8tcmVwZWF0IGxlZnQgNXB4IGNlbnRlcjsKICAgIH0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
LyoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KKi8KCi8qKgogKiBAcGFja2FnZSAgICAgU2tpbiAiRGVmYXVsdCIKICogQHNlY3Rpb24gICAgIEFwcG9pbnRtZW50IENhbGVuZGFyIE1hbmFnZQogKi8KCkBtZWRpYSBzY3JlZW4scHJvamVjdGlvbix0dixoYW5kaGVsZCB7CgogICAgLldpZGdldFNpbXBsZSBmaWVsZHNldC5TZXBhcmF0ZWQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKICAgICAgICBtYXJnaW46IDlweCAwOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgIH0KCiAgICAuSW5saW5lQnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICB9CgogICAgdHIuSW52YWxpZCAuRG93bmxvYWRMaW5rLAogICAgdHIuSW52YWxpZCAuSW5saW5lQnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5DYWxlbmRhckNvbG9yIHsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQkJCOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yNSk7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIH0KCiAgICAuSW52YWxpZCAuQ2FsZW5kYXJDb2xvciB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgfQoKICAgIC8qKgogICAgICogU3BlY3RydW0gQ29sb3IgcGlja2VyCiAgICAgKi8KICAgIC5Db2xvclBhbGV0dGVCdXR0b24uc3AtcmVwbGFjZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkY7CiAgICAgICAgYm94LXNoYWRvdzogMXB4IDFweCAzcHggI0VFRSBpbnNldCwgLTFweCAtMXB4IDNweCAjRUVFIGluc2V0OwogICAgICAgIGJvcmRlci1jb2xvcjogI0MwQzBDMCAjQzlDOUM5ICNDOUM5Qzk7CiAgICAgICAgcGFkZGluZzogM3B4IDRweCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVCdXR0b24uc3AtcmVwbGFjZXI6aG92ZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogI0MwQzBDMCAjQzlDOUM5ICNDOUM5Qzk7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbi5zcC1yZXBsYWNlcjpmb2N1cywKICAgIC5Db2xvclBhbGV0dGVCdXR0b24uc3AtcmVwbGFjZXIuc3AtYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6ICNGOTI7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbiAuc3AtcHJldmlldyB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQnV0dG9uIC5zcC1wcmV2aWV3LWlubmVyLAogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtdGh1bWItaW5uZXIgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC10aHVtYi1pbm5lcjpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjRjkyOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVCdXR0b24gLnNwLWRkIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICBsaW5lLWhlaWdodDogOHB4OwogICAgICAgIHBhZGRpbmc6IDRweCAwOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyLAogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgYnV0dG9uLAogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgaW5wdXQgewogICAgICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICNDMEMwQzAgI0M5QzlDOSAjQzlDOUM5OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkY7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzMzMzsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDEycHg7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICAgIGJhY2tncm91bmQ6ICNFRUU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQkJCOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4gMC4yczsKICAgICAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjRUVFOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTVFNUU1OwogICAgICAgIGJvcmRlci1jb2xvcjogIzk5OTsKICAgICAgICBjb2xvcjogIzAwMDsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyLnNwLWNvbnRhaW5lciBpbnB1dCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgIH0KICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIC5zcC1pbnB1dC5zcC12YWxpZGF0aW9uLWVycm9yIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjRkZGOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIC5zcC1jYW5jZWwgewogICAgICAgIGNvbG9yOiAjRjkyICFpbXBvcnRhbnQ7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIC5zcC1jYW5jZWw6aG92ZXIgewogICAgICAgIGNvbG9yOiAjRjcyICFpbXBvcnRhbnQ7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIgLnNwLXBhbGV0dGUtY29udGFpbmVyLAogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtcGlja2VyLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogNXB4IDVweCAyOTVweDsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC1wYWxldHRlLXRvZ2dsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogM3B4OwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIgLnNwLXBhbGV0dGUgewogICAgICAgIG1heC13aWR0aDogMjQwcHg7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtcGFsZXR0ZSAuc3AtdGh1bWItZWwgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBtYXJnaW46IDJweDsKICAgIH0KCiAgICBpbnB1dFtyZWFkb25seV0gKyAuQ29sb3JQYWxldHRlQnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREREOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKfSAvKiBlbmQgQG1lZGlhICovCg==
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==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIGFwcG9pbnRtZW50IGNhbGVuZGFyIGZ1bmN0aW9ucy4KICovCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhciA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvLyBBcHBvaW50bWVudCBkYXlzIGNhY2hlIGFuZCByZWFkeSBmbGFnCiAgICB2YXIgQXBwb2ludG1lbnREYXlzQ2FjaGUsCiAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGVSZWZyZXNoZWQgPSBmYWxzZSwKICAgICAgICBBSkFYQ291bnRlciA9IDAsCiAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5ncywKICAgICAgICBDdXJyZW50VmlldzsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiAtIFVzZXIgY2hhbGxlbmdlIHRva2VuLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5BbGxEYXlUZXh0IC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIkFsbC1kYXkiLgogICAgICogQHBhcmFtIHtCb29sZWFufSBQYXJhbXMuSXNSVEwgLSBJcyBjdXJyZW50IGxvY2FsZSBpcyByaWdodCB0ZXh0IGJhc2VkPwogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk1vbnRoTmFtZXMgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZWFjaCBtb250aC4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5Nb250aE5hbWVzU2hvcnQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZWFjaCBtb250aCBvbiBzaG9ydGggZm9ybWF0LgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRheU5hbWVzIC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGVhY2ggd2VlayBkYXkuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuRGF5TmFtZXNTaG9ydCAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciBlYWNoIHdlZWsgZGF5IG9uIHNob3J0IGZvcm1hdC4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5CdXR0b25UZXh0IC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGVhY2ggd2VlayBkYXkgb24gc2hvcnQgZm9ybWF0LgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5CdXR0b25UZXh0LnRvZGF5IC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIlRvZGF5Ii4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC5tb250aCAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJNb250aCIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkJ1dHRvblRleHQud2VlayAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJXZWVrIi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC5kYXkgLSBMb2NhbGl6ZWQgc3RyaW5nIGZvciB0aGUgd29yZCAiRGF5Ii4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC50aW1lbGluZSAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJUaW1lbGluZSIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkJ1dHRvblRleHQuanVtcCAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJKdW1wIi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRmlyc3REYXkgLSBGaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDA6IFN1bmRheSkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRlZmF1bHRWaWV3IC0gRGVmYXVsdCB2aWV3IHRvIGRpc3BsYXkgKG1vbnRofGFnZW5kYVdlZWt8YWdlbmRhRGF5fHRpbWVsaW5lTW9udGh8dGltZWxpbmVXZWVrfHRpbWVsaW5lRGF5KS4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5IZWFkZXIgLSBBcnJheSBjb250YWluaW5nIHZpZXcgYnV0dG9ucyBpbiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5IZWFkZXIubGVmdCAtIFN0cmluZyB3aXRoIHZpZXcgbmFtZXMgZm9yIGxlZnQgc2lkZSBvZiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5IZWFkZXIuY2VudGVyIC0gU3RyaW5nIHdpdGggdmlldyBuYW1lcyBmb3IgaGVhZGVyIGNlbnRlci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuSGVhZGVyLnJpZ2h0IC0gU3RyaW5nIHdpdGggdmlldyBuYW1lcyBmb3IgcmlnaHQgc2lkZSBvZiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRpYWxvZ1RleHQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZGlhbG9ncy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5FZGl0VGl0bGUgLSBUaXRsZSBvZiB0aGUgYWRkL2VkaXQgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUaXRsZSAtIFRpdGxlIG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCAtIFRleHQgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwgLSBUZXh0IG9mICdhbGwnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMgLSBUZXh0IG9mICdqdXN0IHRoaXMnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5EaXNtaXNzIC0gVGV4dCBvZiAnRGlzbWlzcycgYnV0dG9uIGluIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5PdmVydmlld1NjcmVlbiAtIE5hbWUgb2YgdGhlIHNjcmVlbiAoQ2FsZW5kYXJPdmVydmlld3xSZXNvdXJjZU92ZXJ2aWV3KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbiAtIElEIG9mIHRoZSBzZXR0aW5ncyBidXR0b24uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXIgLSBJRCBvZiB0aGUgc2V0dGluZ3MgZGlhbG9nIGNvbnRhaW5lci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc1Nob3cgLSBTaG93IHRoZSBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRNYXNrU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBtYXNrIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdFN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5BZGRTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBhZGQgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5MaXN0QWN0aW9uIC0gTmFtZSBvZiB0aGUgbGlzdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkRheXNTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBhcHBvaW50bWVudCBkYXlzIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuVGlja2V0QXBwb2ludG1lbnRUeXBlcyAtIE9iamVjdCB3aXRoIHRpY2tldCBhcHBvaW50bWVudCB0eXBlcy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuV29ya2luZ0hvdXJzIC0gT2JqZWN0IHdpdGggd29ya2luZyBob3VyIGFwcG9pbnRtZW50cy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuUmVzb3VyY2VzIC0gT2JqZWN0IHdpdGggcmVzb3VyY2UgcGFyYW1ldGVycyAob3B0aW9uYWwpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5BcHBvaW50bWVudCAtIE9iamVjdCB3aXRoIGFwcG9pbnRtZW50IHNjcmVlbiByZWxhdGVkIGRhdGEgKG9wdGlvbmFsKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUgLSBBdXRvIG9wZW4gYXBwb2ludG1lbnQgY3JlYXRlIHNjcmVlbiBwYXJhbWV0ZXJzIChvcHRpb25hbCkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlN0YXJ0IC0gU3RhcnQgZGF0ZSBvZiBuZXcgYXBwb2ludG1lbnQgKG1vbWVudCByZWFkeSkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLkVuZCAtIEVuZCBkYXRlIG9mIG5ldyBhcHBvaW50bWVudCAobW9tZW50IHJlYWR5KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuUGx1Z2luS2V5IC0gTmFtZSBvZiB0aGUgcGx1Z2luIG1vZHVsZSB0byB1c2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlNlYXJjaCAtIFNlYXJjaCBzdHJpbmcgZm9yIHRoZSBwbHVnaW4gbW9kdWxlIHNlYXJjaC4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuT2JqZWN0SUQgLSBPYmplY3QgSUQgZm9yIHRoZSBwbHVnaW4gbW9kdWxlIHNlYXJjaC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50SUQgLSBBdXRvIG9wZW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4gd2l0aCBzcGVjaWZpZWQgYXBwb2ludG1lbnQgKG9wdGlvbmFsKS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGVCdXR0b24gLSBJRCBvZiB0aGUgYWRkIGFwcG9pbnRtZW50IGJ1dHRvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuQ2FsZW5kYXJzIC0gT2JqZWN0IHdpdGggY2FsZW5kYXIgcGFyYW1ldGVycy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxlbmRhcnMuU291cmNlcyAtIEFycmF5IG9mIGNhbGVuZGFyIHNvdXJjZXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdHN9IFBhcmFtcy5DYWxlbmRhcnMuU3dpdGNoZXMgLSBBcnJheSBvZiBjYWxlbmRhciBzd2l0Y2ggZWxlbWVudHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdHN9IFBhcmFtcy5DYWxlbmRhcnMuTGltaXQgLSBNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXIgc3dpdGNoZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZXMgdGhlIGFwcG9pbnRtZW50IGNhbGVuZGFyIGNvbnRyb2wuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoUGFyYW1zKSB7CiAgICAgICAgdmFyICRDYWxlbmRhck9iaiA9ICQoJyNjYWxlbmRhcicpLAogICAgICAgICAgICAkRGF0ZXBpY2tlck9iaiA9ICQoJzxkaXYgLz4nKQogICAgICAgICAgICAgICAgLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXInKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdIaWRkZW4nKQogICAgICAgICAgICAgICAgLmluc2VydEFmdGVyKCQoJyNjYWxlbmRhcicpKSwKICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50ID0gW107CgogICAgICAgIGlmICghUGFyYW1zLkNoYWxsZW5nZVRva2VuKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFBhcmFtcy5SZXNvdXJjZXMgPSBQYXJhbXMuUmVzb3VyY2VzIHx8IHsKICAgICAgICAgICAgUmVzb3VyY2VDb2x1bW5zOiBudWxsLAogICAgICAgICAgICBSZXNvdXJjZVRleHQ6IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlU2V0dGluZ3NCdXR0b246IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlU2V0dGluZ3NEaWFsb2dDb250YWluZXI6IG51bGwsCiAgICAgICAgICAgIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3M6IGZhbHNlLAogICAgICAgICAgICBSZXNvdXJjZUpTT046IG51bGwKICAgICAgICB9OwoKICAgICAgICAvLyBJbml0aWFsaXplIGNhbGVuZGFyCiAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcih7CiAgICAgICAgICAgIGhlYWRlcjogUGFyYW1zLkhlYWRlciwKICAgICAgICAgICAgY3VzdG9tQnV0dG9uczogewogICAgICAgICAgICAgICAganVtcDogewogICAgICAgICAgICAgICAgICAgIHRleHQ6IFBhcmFtcy5CdXR0b25UZXh0Lmp1bXAsCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBTaG93RGF0ZXBpY2tlcigkQ2FsZW5kYXJPYmosICREYXRlcGlja2VyT2JqLCAkKHRoaXMpLCBQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGVmYXVsdFZpZXc6IFBhcmFtcy5EZWZhdWx0VmlldywKICAgICAgICAgICAgYWxsRGF5VGV4dDogUGFyYW1zLkFsbERheVRleHQsCiAgICAgICAgICAgIGlzUlRMOiBQYXJhbXMuSXNSVEwsCiAgICAgICAgICAgIGNvbHVtbkZvcm1hdDogJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICB0aW1lRm9ybWF0OiAnSEg6bW0nLAogICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6ICdISDptbScsCiAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgIHdlZWtOdW1iZXJzOiB0cnVlLAogICAgICAgICAgICB3ZWVrTnVtYmVyVGl0bGU6ICcjJywKICAgICAgICAgICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiAnSVNPJywKICAgICAgICAgICAgZXZlbnRMaW1pdDogdHJ1ZSwKICAgICAgICAgICAgZXZlbnRMaW1pdFRleHQ6IFBhcmFtcy5FdmVudExpbWl0VGV4dCwKICAgICAgICAgICAgaGVpZ2h0OiA2MDAsCiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLAogICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLAogICAgICAgICAgICBmaXJzdERheTogUGFyYW1zLkZpcnN0RGF5LAogICAgICAgICAgICBtb250aE5hbWVzOiBQYXJhbXMuTW9udGhOYW1lcywKICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBQYXJhbXMuTW9udGhOYW1lc1Nob3J0LAogICAgICAgICAgICBkYXlOYW1lczogUGFyYW1zLkRheU5hbWVzLAogICAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBQYXJhbXMuRGF5TmFtZXNTaG9ydCwKICAgICAgICAgICAgYnV0dG9uVGV4dDogUGFyYW1zLkJ1dHRvblRleHQsCiAgICAgICAgICAgIHNjaGVkdWxlckxpY2Vuc2VLZXk6ICdHUEwtTXktUHJvamVjdC1Jcy1PcGVuLVNvdXJjZScsCiAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAwOjMwOjAwJywKICAgICAgICAgICAgZm9yY2VFdmVudER1cmF0aW9uOiB0cnVlLAogICAgICAgICAgICBub3dJbmRpY2F0b3I6IHRydWUsCiAgICAgICAgICAgIHRpbWV6b25lOiAnbG9jYWwnLAogICAgICAgICAgICByZXNvdXJjZUFyZWFXaWR0aDogJzIxJScsCiAgICAgICAgICAgIHZpZXdzOiB7CiAgICAgICAgICAgICAgICBtb250aDogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnTU1NTSBZWVlZJywKICAgICAgICAgICAgICAgICAgICBjb2x1bW5Gb3JtYXQ6ICdkZGRkJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFnZW5kYURheTogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBmYWxzZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lTW9udGg6IHsKICAgICAgICAgICAgICAgICAgICBzbG90RHVyYXRpb246ICcyNDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lV2VlazogewogICAgICAgICAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAyOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICB3ZWVrOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSEgnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lRGF5OiB7CiAgICAgICAgICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMDA6MzA6MDAnLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRheXM6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogWwogICAgICAgICAgICAgICAgICAgICAgICAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgICAgICAgICAgICAgICdISDptbScKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxvYWRpbmc6IGZ1bmN0aW9uKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgaWYgKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpZXdSZW5kZXI6IGZ1bmN0aW9uKFZpZXcpIHsKCiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgb24gYSB0aW1lbGluZSB2aWV3LgogICAgICAgICAgICAgICAgaWYgKFZpZXcubmFtZSA9PT0gJ3RpbWVsaW5lV2VlaycgfHwgVmlldy5uYW1lID09PSAndGltZWxpbmVEYXknKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjYWxlbmRhciB3ZWVrIG51bWJlciB0byB0aW1lbGluZSB2aWV3IHRpdGxlcy4KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5maW5kKCcuZmMtdG9vbGJhciA+IGRpdiA+IGgyJykuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZmMtd2Vlay1udW1iZXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KFZpZXcuc3RhcnQuZm9ybWF0KCcgI1cnKSkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSByZXN0b3JlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAgICAgICAgICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzSW5pdCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHZpZXcgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICBpZiAoQ3VycmVudFZpZXcgIT09IHVuZGVmaW5lZCAmJiBDdXJyZW50VmlldyAhPT0gVmlldy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gPyBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gOiAnQ2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmlldzogVmlldy5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ3VycmVudFZpZXcgPSBWaWV3Lm5hbWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlbGVjdDogZnVuY3Rpb24oU3RhcnQsIEVuZCwgSlNFdmVudCwgVmlldywgUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBTdGFydCwKICAgICAgICAgICAgICAgICAgICBFbmQ6IEVuZCwKICAgICAgICAgICAgICAgICAgICBKU0V2ZW50OiBKU0V2ZW50LAogICAgICAgICAgICAgICAgICAgIFZpZXc6IFZpZXcsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IFJlc291cmNlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ3Vuc2VsZWN0Jyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50Q2xpY2s6IGZ1bmN0aW9uKENhbEV2ZW50LCBKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBTdGFydDogQ2FsRXZlbnQuc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgRW5kOiBDYWxFdmVudC5lbmQsCiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgICAgIEpTRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50RHJvcDogZnVuY3Rpb24oQ2FsRXZlbnQsIERlbHRhLCBSZXZlcnRGdW5jKSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBDYWxFdmVudDogQ2FsRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgUHJldmlvdXNBcHBvaW50bWVudDogQ3VycmVudEFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIERlbHRhOiBEZWx0YSwKICAgICAgICAgICAgICAgICAgICBSZXZlcnRGdW5jOiBSZXZlcnRGdW5jCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVXBkYXRlQXBwb2ludG1lbnQoUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRSZXNpemU6IGZ1bmN0aW9uKENhbEV2ZW50LCBEZWx0YSwgUmV2ZXJ0RnVuYykgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50LAogICAgICAgICAgICAgICAgICAgIFByZXZpb3VzQXBwb2ludG1lbnQ6IEN1cnJlbnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBEZWx0YTogRGVsdGEsCiAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0RnVuYzogUmV2ZXJ0RnVuYwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFVwZGF0ZUFwcG9pbnRtZW50KFBhcmFtcywgRGF0YSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVuZGVyOiBmdW5jdGlvbihDYWxFdmVudCwgJEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkSWNvbkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAkSWNvbjsKCiAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5CiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucmVjdXJyaW5nCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucGFyZW50SWQKICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5ub3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbnRhaW5lciBhbmQgaWNvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgJEljb25Db250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ0ljb25zJyk7CiAgICAgICAgICAgICAgICAgICAgJEljb24gPSAkKCc8aSAvPicpLmFkZENsYXNzKCdmYScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFwcG9pbnRtZW50IHdpdGggYXBwcm9wcmlhdGUgaWNvbihzKQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1zdW4tbycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucmVjdXJyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtcmVwZWF0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWxpbmsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50Lm5vdGlmaWNhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWJlbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWNoYXItJyArIFBhcmFtcy5UaWNrZXRBcHBvaW50bWVudE1hcmtzW0NhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBjb250YWluZXIgdG8gdGhlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZmluZCgnLmZjLWNvbnRlbnQnKQogICAgICAgICAgICAgICAgICAgICAgICAucHJlcGVuZCgkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVzaXplU3RhcnQ6IGZ1bmN0aW9uKENhbEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuc3RhcnQgPSBDYWxFdmVudC5zdGFydDsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5lbmQgPSBDYWxFdmVudC5lbmQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50RHJhZ1N0YXJ0OiBmdW5jdGlvbihDYWxFdmVudCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnN0YXJ0ID0gQ2FsRXZlbnQuc3RhcnQ7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuZW5kID0gQ2FsRXZlbnQuZW5kOwogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnJlc291cmNlSWRzID0gQ2FsRXZlbnQucmVzb3VyY2VJZHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50TW91c2VvdmVyOiBmdW5jdGlvbihDYWxFdmVudCwgSlNFdmVudCkgewogICAgICAgICAgICAgICAgdmFyICRUb29sdGlwT2JqLAogICAgICAgICAgICAgICAgICAgIFBvc1ggPSAwLAogICAgICAgICAgICAgICAgICAgIFBvc1kgPSAwLAogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBIVE1MID0gJCgnI0FwcG9pbnRtZW50VG9vbHRpcFRlbXBsYXRlJykuaHRtbCgpIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZUxlZnQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyAkKHdpbmRvdykud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVUb3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgJEljb25Db250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgJEljb247CgogICAgICAgICAgICAgICAgaWYgKCFKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgSlNFdmVudCA9IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChKU0V2ZW50LnBhZ2VYIHx8IEpTRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICBQb3NYID0gSlNFdmVudC5wYWdlWDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5wYWdlWTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSlNFdmVudC5jbGllbnRYIHx8IEpTRXZlbnQuY2xpZW50WSkgewogICAgICAgICAgICAgICAgICAgIFBvc1ggPSBKU0V2ZW50LmNsaWVudFggKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICBQb3NZICs9IDEwOwoKICAgICAgICAgICAgICAgIGlmIChUb29sdGlwSFRNTC5sZW5ndGggPiAwKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggYXBwb2ludG1lbnQgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAgICAgICBUb29sdGlwSFRNTCA9IFJlcGxhY2VBcHBvaW50bWVudEluZm9ybWF0aW9uKFRvb2x0aXBIVE1MLCBDYWxFdmVudCk7CgogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0b29sdGlwIG9iamVjdAogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqID0gJCgnPGRpdi8+JykuYWRkQ2xhc3MoJ0FwcG9pbnRtZW50VG9vbHRpcCBIaWRkZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogUG9zWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IFBvc1gKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoVG9vbHRpcEhUTUwpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygnYm9keScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdG9wIHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RZUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IFBvc1kgLSAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgbGVmdCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RYUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVMZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBQb3NYIC0gJFRvb2x0aXBPYmoud2lkdGgoKSAtIDMwOwogICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIGFwcG9pbnRtZW50IGljb25zCiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LmFsbERheQogICAgICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5yZWN1cnJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucGFyZW50SWQKICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQubm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbkNvbnRhaW5lciA9ICRUb29sdGlwT2JqLmZpbmQoJy5JY29ucycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGljb24gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbiA9ICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFwcG9pbnRtZW50IHdpdGggYXBwcm9wcmlhdGUgaWNvbihzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1zdW4tbycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucmVjdXJyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1yZXBlYXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnBhcmVudElkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1saW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5ub3RpZmljYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWJlbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtY2hhci0nICsgUGFyYW1zLlRpY2tldEFwcG9pbnRtZW50TWFya3NbQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHRoZSB0b29sdGlwCiAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIENvbGxhcHNlIGZpZWxkc2V0IGxlZ2VuZCBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmZpbmQoJ2ZpZWxkc2V0JykuZWFjaChmdW5jdGlvbiAoSW5kZXgsIEZpZWxkc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKEZpZWxkc2V0KS5maW5kKCc6dmlzaWJsZScpLmxlbmd0aCA8PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEZpZWxkc2V0KS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRNb3VzZW91dDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKCcuQXBwb2ludG1lbnRUb29sdGlwJykuZmFkZU91dCgiZmFzdCIpLnJlbW92ZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudHM6IFBhcmFtcy5Xb3JraW5nSG91cnMsCiAgICAgICAgICAgIHJlc291cmNlczogUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZUpTT04sCiAgICAgICAgICAgIHJlc291cmNlQ29sdW1uczogUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZUNvbHVtbnMsCiAgICAgICAgICAgIHJlc291cmNlTGFiZWxUZXh0OiBQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlVGV4dAogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGRhdGVwaWNrZXIKICAgICAgICAkRGF0ZXBpY2tlck9iai5kYXRlcGlja2VyKHsKICAgICAgICAgICAgc2hvd09uOiAnYnV0dG9uJywKICAgICAgICAgICAgYnV0dG9uVGV4dDogUGFyYW1zLkJ1dHRvblRleHQuanVtcCwKICAgICAgICAgICAgY29uc3RyYWluSW5wdXQ6IHRydWUsCiAgICAgICAgICAgIHByZXZUZXh0OiBQYXJhbXMuQnV0dG9uVGV4dC5wcmV2RGF0ZXBpY2tlciwKICAgICAgICAgICAgbmV4dFRleHQ6IFBhcmFtcy5CdXR0b25UZXh0Lm5leHREYXRlcGlja2VyLAogICAgICAgICAgICBmaXJzdERheTogUGFyYW1zLkZpcnN0RGF5LAogICAgICAgICAgICBzaG93TW9udGhBZnRlclllYXI6IDAsCiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFBhcmFtcy5Nb250aE5hbWVzLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFBhcmFtcy5Nb250aE5hbWVzU2hvcnQsCiAgICAgICAgICAgIGRheU5hbWVzOiBQYXJhbXMuRGF5TmFtZXMsCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFBhcmFtcy5EYXlOYW1lc1Nob3J0LAogICAgICAgICAgICBkYXlOYW1lc01pbjogUGFyYW1zLkRheU5hbWVzTWluLAogICAgICAgICAgICBpc1JUTDogUGFyYW1zLklzUlRMLAogICAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24oRGF0ZVRleHQpIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ2dvdG9EYXRlJywgbmV3IERhdGUoRGF0ZVRleHQpKTsKICAgICAgICAgICAgICAgICQoJyNEYXRlcGlja2VyT3ZlcmxheScpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmouaGlkZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBiZWZvcmVTaG93RGF5OiBmdW5jdGlvbihEYXRlT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAoQXBwb2ludG1lbnREYXlzQ2FjaGVSZWZyZXNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tEYXRlKERhdGVPYmplY3QpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RydWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24oWWVhciwgTW9udGgpIHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgUGFyYW1zLkNhbGVuZGFycy5Td2l0Y2hlcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ2FsZW5kYXJTd2l0Y2hJbml0KCQodGhpcyksIFBhcmFtcyk7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChQYXJhbXMuQXBwb2ludG1lbnQpIHsKCiAgICAgICAgICAgIC8vIEF1dG8gb3BlbiBhcHBvaW50bWVudCBjcmVhdGUgc2NyZWVuCiAgICAgICAgICAgIGlmIChQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUpIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKFBhcmFtcywgewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU3RhcnQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlN0YXJ0KSA6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgRW5kOiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuRW5kID8gJC5mdWxsQ2FsZW5kYXIubW9tZW50KFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5FbmQpIDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXk6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5QbHVnaW5LZXkgPyBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuUGx1Z2luS2V5IDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBTZWFyY2g6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5TZWFyY2ggPyBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU2VhcmNoIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRDogUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLk9iamVjdElEID8gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLk9iamVjdElEIDogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEF1dG8gb3BlbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbgogICAgICAgICAgICBlbHNlIGlmIChQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRJRCkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCB7IENhbEV2ZW50OiB7IGlkOiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRJRCB9IH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZUJ1dHRvbikpCiAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgIC5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQ6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbikgewogICAgICAgICAgICBDYWxlbmRhclNldHRpbmdzSW5pdChQYXJhbXMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFBhcmFtcy5SZXNvdXJjZXMuUmVzb3VyY2VTZXR0aW5nc0J1dHRvbikgewogICAgICAgICAgICBSZXNvdXJjZVNldHRpbmdzSW5pdChQYXJhbXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2hvd0RhdGVwaWNrZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkQ2FsZW5kYXJPYmogLSBDYWxlbmRhciBjb250cm9sIG9iamVjdC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRGF0ZXBpY2tlck9iaiAtIERhdGVwaWNrZXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEp1bXBCdXR0b24gLSBEYXRlcGlja2VyIGJ1dHRvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93IGRhdGUgcGlja2VyIGNvbnRyb2wuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dEYXRlcGlja2VyKCRDYWxlbmRhck9iaiwgJERhdGVwaWNrZXJPYmosICRKdW1wQnV0dG9uLCBQYXJhbXMpIHsKICAgICAgICB2YXIgQ3VycmVudERhdGUgPSAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKCdnZXREYXRlJyksCiAgICAgICAgICAgIFllYXIgPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVknKSwKICAgICAgICAgICAgTW9udGggPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ00nKTsKCiAgICAgICAgJCgnPGRpdiAvPicpLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXJPdmVybGF5JykKICAgICAgICAgICAgLmFwcGVuZFRvKCQoJ2JvZHknKSkKICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmhpZGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcyk7CgogICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3NldERhdGUnLCBDdXJyZW50RGF0ZS50b0RhdGUoKSkKICAgICAgICAgICAgLmNzcyh7CiAgICAgICAgICAgICAgICBsZWZ0OiBwYXJzZUludCgkSnVtcEJ1dHRvbi5vZmZzZXQoKS5sZWZ0IC0gJERhdGVwaWNrZXJPYmoub3V0ZXJXaWR0aCgpICsgJEp1bXBCdXR0b24ub3V0ZXJXaWR0aCgpLCAxMCksCiAgICAgICAgICAgICAgICB0b3A6IHBhcnNlSW50KCRKdW1wQnV0dG9uLm9mZnNldCgpLnRvcCAtICREYXRlcGlja2VyT2JqLm91dGVySGVpZ2h0KCkgKyAkSnVtcEJ1dHRvbi5vdXRlckhlaWdodCgpLCAxMCkKICAgICAgICAgICAgfSkuZmFkZUluKCdmYXN0Jyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tEYXRlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7RGF0ZU9iamVjdH0gRGF0ZU9iamVjdCAtIEEgSlMgZGF0ZSBvYmplY3QgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRydWUsIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgQ1NTCiAgICAgKiAgICAgICAgICAgICAgICAgIGNsYXNzLCB0aGlyZCBlbGVtZW50IGEgZGVzY3JpcHRpb24gZm9yIHRoZSBkYXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENoZWNrIGlmIGRhdGUgaGFzIGFuIGFwcG9pbnRtZW50LgogICAgICovCiAgICBmdW5jdGlvbiBDaGVja0RhdGUoRGF0ZU9iamVjdCkgewogICAgICAgIHZhciBEYXRlTW9tZW50ID0gJC5mdWxsQ2FsZW5kYXIubW9tZW50KERhdGVPYmplY3QpLAogICAgICAgICAgICBEYXlBcHBvaW50bWVudHMgPSBBcHBvaW50bWVudERheXNDYWNoZVtEYXRlTW9tZW50LmZvcm1hdCgnWVlZWS1NTS1ERCcpXSwKICAgICAgICAgICAgRGF5Q2xhc3MgPSBEYXlBcHBvaW50bWVudHMgPyAnSGlnaGxpZ2h0JyA6ICcnLAogICAgICAgICAgICBEYXlEZXNjcmlwdGlvbiA9IERheUFwcG9pbnRtZW50cyA/IERheUFwcG9pbnRtZW50cy50b1N0cmluZygpIDogJyc7CgogICAgICAgIHJldHVybiBbdHJ1ZSwgRGF5Q2xhc3MsIERheURlc2NyaXB0aW9uXTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBBcHBvaW50bWVudERheXMKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRGF0ZXBpY2tlck9iaiAtIERhdGVwaWNrZXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IFllYXIgLSBTZWxlY3RlZCB5ZWFyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBNb250aCAtIFNlbGVjdGVkIG1vbnRoICgxLTEyKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENhY2hlcyB0aGUgbGlzdCBvZiBhcHBvaW50bWVudCBkYXlzIGZvciBsYXRlciB1c2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcykgewogICAgICAgIHZhciBTdGFydFRpbWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoWWVhciArICctJyArIE1vbnRoLCAnWVlZWS1NJykuc3RhcnRPZignbW9udGgnKSwKICAgICAgICAgICAgRW5kVGltZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChZZWFyICsgJy0nICsgTW9udGgsICdZWVlZLU0nKS5hZGQoMSwgJ21vbnRocycpLnN0YXJ0T2YoJ21vbnRoJyksCiAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkxpc3RBY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRGF5c1N1YmFjdG9uLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lOiBTdGFydFRpbWUuZm9ybWF0KCdZWVlZLU1NLUREJyksCiAgICAgICAgICAgICAgICBFbmRUaW1lOiBFbmRUaW1lLmZvcm1hdCgnWVlZWS1NTS1ERCcpCiAgICAgICAgICAgIH07CgogICAgICAgICREYXRlcGlja2VyT2JqLmFkZENsYXNzKCdBSkFYTG9hZGluZycpOwogICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gZmFsc2U7CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGUgPSBSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmoucmVtb3ZlQ2xhc3MoJ0FKQVhMb2FkaW5nJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIGRhdGUgcGlja2VyIGJlY2F1c2UgdGhpcyBjYWxsIGlzIGFzeW5jaHJvbm91cwogICAgICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3JlZnJlc2gnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBTaG93V2FpdGluZ0RpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3dzIHdhaXRpbmcgZGlhbG9nLgogICAgICovCiAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygnPGRpdiBjbGFzcz0iU3BhY2luZyBDZW50ZXIiPjxzcGFuIGNsYXNzPSJBSkFYTG9hZGVyIiB0aXRsZT0iJyArIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc0xvYWRpbmcnKSArICciPjwvc3Bhbj48L2Rpdj4nLCBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNMb2FkaW5nJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFJlcGxhY2VBcHBvaW50bWVudEluZm9ybWF0aW9uCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUmVwbGFjZUhUTUwgLSBTdHJpbmcgY29udGFpbmluZyAlcGxhY2Vob2xkZXJzJS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBDYWxFdmVudCAtIENhbGVuZGFyIGFwcG9pbnRtZW50IG9iamVjdC4KICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge1N0cmluZ30gU3RyaW5nIHdpdGggcmVwbGFjZWQgcGxhY2Vob2xkZXJzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBpbiBzdXBwbGllZCBzdHJpbmcgd2l0aCBjYWxlbmRhciBhcHBvaW50bWVudCBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gUmVwbGFjZUFwcG9pbnRtZW50SW5mb3JtYXRpb24oUmVwbGFjZUhUTUwsIENhbEV2ZW50KSB7CiAgICAgICAgdmFyIFBsYWNlaG9sZGVyLAogICAgICAgICAgICBTZWFyY2hQbGFjZWhvbGRlciwKICAgICAgICAgICAgUmVwbGFjZVZhbHVlOwoKICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHByb3BlcnRpZXMKICAgICAgICBmb3IgKFBsYWNlaG9sZGVyIGluIENhbEV2ZW50KSB7CiAgICAgICAgICAgIFNlYXJjaFBsYWNlaG9sZGVyID0gbmV3IFJlZ0V4cCgnJScgKyBQbGFjZWhvbGRlciArICclJywgJ2cnKTsKICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gQ2FsRXZlbnRbUGxhY2Vob2xkZXJdOwoKICAgICAgICAgICAgLy8gU3BlY2lhbCBwcm9wZXJ0aWVzCiAgICAgICAgICAgIGlmIChQbGFjZWhvbGRlciA9PT0gJ3JlY3VycmluZycpIHsKICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoUGxhY2Vob2xkZXIgPT09ICdzdGFydCcgfHwgUGxhY2Vob2xkZXIgPT09ICdlbmQnKSB7CiAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFBsYWNlaG9sZGVyID09PSAnZW5kJykgewogICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUmVwbGFjZVZhbHVlKS5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChSZXBsYWNlVmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUmVwbGFjZVZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChQbGFjZWhvbGRlciA9PT0gJ3BsdWdpbkRhdGEnKSB7CiAgICAgICAgICAgICAgICAkLmVhY2goQ2FsRXZlbnQucGx1Z2luRGF0YSwgZnVuY3Rpb24gKEtleSwgVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IENvcmUuQXBwLkVzY2FwZUhUTUwoVmFsdWUpOwogICAgICAgICAgICAgICAgICAgIFZhbHVlID0gVmFsdWUucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7CiAgICAgICAgICAgICAgICAgICAgUmVwbGFjZUhUTUwgPSBSZXBsYWNlSFRNTC5yZXBsYWNlKCclJyArIEtleSArICclJywgVmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRGVmYXVsdCBKU09OIHZhbHVlcwogICAgICAgICAgICBpZiAoUmVwbGFjZVZhbHVlID09PSBudWxsIHx8IFJlcGxhY2VWYWx1ZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9ICcnOwogICAgICAgICAgICB9IGVsc2UgaWYgKFJlcGxhY2VWYWx1ZSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zWWVzJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9IENvcmUuQXBwLkVzY2FwZUhUTUwoU3RyaW5nKFJlcGxhY2VWYWx1ZSkpOwoKICAgICAgICAgICAgLy8gUmVwbGFjZSBuZXdsaW5lcwogICAgICAgICAgICBpZiAoUmVwbGFjZVZhbHVlLnJlcGxhY2UpIHsKICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9IFJlcGxhY2VWYWx1ZS5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUmVwbGFjZSBwbGFjZWhvbGRlcnMKICAgICAgICAgICAgUmVwbGFjZUhUTUwgPSBSZXBsYWNlSFRNTC5yZXBsYWNlKFNlYXJjaFBsYWNlaG9sZGVyLCBSZXBsYWNlVmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFJlcGxhY2VIVE1MOwogICAgfQoKICAgIC8qKgogICAgICogQHB1YmxpYwogICAgICogQG5hbWUgT3BlbkVkaXREaWFsb2cKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggY29uZmlndXJhdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5EaWFsb2dUZXh0IC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGRpYWxvZ3MuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuRWRpdFRpdGxlIC0gVGl0bGUgb2YgdGhlIGFkZC9lZGl0IGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGl0bGUgLSBUaXRsZSBvZiB0aGUgb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRleHQgLSBUZXh0IG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlQWxsIC0gVGV4dCBvZiAnYWxsJyBidXR0b24gaW4gb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUp1c3RUaGlzIC0gVGV4dCBvZiAnanVzdCB0aGlzJyBidXR0b24gaW4gb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRNYXNrU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBtYXNrIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEgLSBIYXNoIHdpdGggYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7TW9tZW50fSBBcHBvaW50bWVudERhdGEuU3RhcnQgLSBNb21lbnQgb2JqZWN0IHdpdGggc3RhcnQgZGF0ZS90aW1lLgogICAgICogQHBhcmFtIHtNb21lbnR9IEFwcG9pbnRtZW50RGF0YS5FbmQgLSBNb21lbnQgb2JqZWN0IHdpdGggZW5kIGRhdGUvdGltZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgLSBDYWxlbmRhciBldmVudCBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gQXBwb2ludG1lbnREYXRhLlJlc291cmNlIC0gQ2FsZW5kYXIgcmVzb3VyY2Ugb2JqZWN0IChGdWxsQ2FsZW5kYXIpLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIG9wZW5zIHRoZSBhcHBvaW50bWVudCBkaWFsb2cgYWZ0ZXIgc2VsZWN0aW5nIGEgdGltZSBwZXJpb2Qgb3IgYW4gYXBwb2ludG1lbnQuCiAgICAgKi8KICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nID0gZnVuY3Rpb24gKFBhcmFtcywgQXBwb2ludG1lbnREYXRhKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBQYXJhbXMuQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgU3ViYWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRNYXNrU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0TWFza1N1YmFjdGlvbiA6ICdFZGl0TWFzaycsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0WWVhcjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC55ZWFyKCkgOiBudWxsLAogICAgICAgICAgICBTdGFydE1vbnRoOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0Lm1vbnRoKCkgKyAxIDogbnVsbCwKICAgICAgICAgICAgU3RhcnREYXk6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQuZGF0ZSgpIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRIb3VyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0LmhvdXIoKSA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0Lm1pbnV0ZSgpIDogbnVsbCwKICAgICAgICAgICAgRW5kWWVhcjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQueWVhcigpIDogbnVsbCwKICAgICAgICAgICAgRW5kTW9udGg6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLm1vbnRoKCkgKyAxIDogbnVsbCwKICAgICAgICAgICAgRW5kRGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5kYXRlKCkgOiBudWxsLAogICAgICAgICAgICBFbmRIb3VyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5ob3VyKCkgOiBudWxsLAogICAgICAgICAgICBFbmRNaW51dGU6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLm1pbnV0ZSgpIDogbnVsbCwKICAgICAgICAgICAgQWxsRGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gKEFwcG9pbnRtZW50RGF0YS5FbmQuaGFzVGltZSgpID8gJzAnIDogJzEnKSA6IG51bGwsCiAgICAgICAgICAgIFRlYW1JRDogQXBwb2ludG1lbnREYXRhLlJlc291cmNlID8gWyBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UuVGVhbUlEIF0gOiBudWxsLAogICAgICAgICAgICBSZXNvdXJjZUlEOiBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgPyBbIEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZS5pZCBdIDogbnVsbCwKICAgICAgICAgICAgUGx1Z2luS2V5OiBBcHBvaW50bWVudERhdGEuUGx1Z2luS2V5ID8gQXBwb2ludG1lbnREYXRhLlBsdWdpbktleSA6IG51bGwsCiAgICAgICAgICAgIFNlYXJjaDogQXBwb2ludG1lbnREYXRhLlNlYXJjaCA/IEFwcG9pbnRtZW50RGF0YS5TZWFyY2ggOiBudWxsLAogICAgICAgICAgICBPYmplY3RJRDogQXBwb2ludG1lbnREYXRhLk9iamVjdElEID8gQXBwb2ludG1lbnREYXRhLk9iamVjdElEIDogbnVsbAogICAgICAgIH07CgogICAgICAgIC8vIE1ha2UgZW5kIHRpbWUgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnRzIGluY2x1c2l2ZQogICAgICAgIGlmIChEYXRhLkFsbERheSAmJiBEYXRhLkFsbERheSA9PT0gJzEnKSB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5FbmQuc3VidHJhY3QoMSwgJ2RheScpOwogICAgICAgICAgICBEYXRhLkVuZFllYXIgPSBBcHBvaW50bWVudERhdGEuRW5kLnllYXIoKTsKICAgICAgICAgICAgRGF0YS5FbmRNb250aCA9IEFwcG9pbnRtZW50RGF0YS5FbmQubW9udGgoKSArIDE7CiAgICAgICAgICAgIERhdGEuRW5kRGF5ID0gQXBwb2ludG1lbnREYXRhLkVuZC5kYXRlKCk7CiAgICAgICAgICAgIERhdGEuRW5kSG91ciA9IEFwcG9pbnRtZW50RGF0YS5FbmQuaG91cigpOwogICAgICAgICAgICBEYXRhLkVuZE1pbnV0ZSA9IEFwcG9pbnRtZW50RGF0YS5FbmQubWludXRlKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBFZGl0RGlhbG9nKCkgewogICAgICAgICAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoSFRNTCkgewogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKEhUTUwsIFBhcmFtcy5EaWFsb2dUZXh0LkVkaXRUaXRsZSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICAgICAgICAgIH0sICdodG1sJwogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVwZWF0aW5nIGV2ZW50CiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAmJiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICBUaXRsZTogUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRpdGxlLAogICAgICAgICAgICAgICAgSFRNTDogUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRleHQsCiAgICAgICAgICAgICAgICBNb2RhbDogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25DbGlja091dHNpZGU6IHRydWUsCiAgICAgICAgICAgICAgICBDbG9zZU9uRXNjYXBlOiB0cnVlLAogICAgICAgICAgICAgICAgUG9zaXRpb25Ub3A6ICcyMCUnLAogICAgICAgICAgICAgICAgUG9zaXRpb25MZWZ0OiAnQ2VudGVyJywKICAgICAgICAgICAgICAgIEJ1dHRvbnM6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlQWxsLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnkgQ2FsbEZvckFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuQXBwb2ludG1lbnRJRCA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXREaWFsb2coKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUp1c3RUaGlzLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ0NhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogRWRpdERpYWxvZwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogUGFyYW1zLkRpYWxvZ1RleHQuQ2xvc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEVkaXREaWFsb2coKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgVXBkYXRlQXBwb2ludG1lbnQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggY29uZmlndXJhdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5EaWFsb2dUZXh0IC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGRpYWxvZ3MuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRpdGxlIC0gVGl0bGUgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUZXh0IC0gVGV4dCBvZiB0aGUgb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUFsbCAtIFRleHQgb2YgJ2FsbCcgYnV0dG9uIGluIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VKdXN0VGhpcyAtIFRleHQgb2YgJ2p1c3QgdGhpcycgYnV0dG9uIGluIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcyAtIEFycmF5IGNvbnRhaW5pbmcgbmFtZXMgb2YgdGhlIGNhbGxiYWNrcy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0U3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gQXBwb2ludG1lbnREYXRhIC0gSGFzaCB3aXRoIGFwcG9pbnRtZW50IGRhdGEuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50IC0gQ2FsZW5kYXIgZXZlbnQgb2JqZWN0IChGdWxsQ2FsZW5kYXIpLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGFwcG9pbnRtZW50IHdpdGggc3VwcGxpZWQgZGF0YS4KICAgICAqLwogICAgZnVuY3Rpb24gVXBkYXRlQXBwb2ludG1lbnQoUGFyYW1zLCBBcHBvaW50bWVudERhdGEpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdFN1YmFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdFN1YmFjdGlvbiA6ICdFZGl0QXBwb2ludG1lbnQnLAogICAgICAgICAgICBBcHBvaW50bWVudElEOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuaWQsCiAgICAgICAgICAgIFN0YXJ0WWVhcjogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0LnllYXIoKSwKICAgICAgICAgICAgU3RhcnRNb250aDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0Lm1vbnRoKCkgKyAxLAogICAgICAgICAgICBTdGFydERheTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0LmRhdGUoKSwKICAgICAgICAgICAgU3RhcnRIb3VyOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQuaG91cigpLAogICAgICAgICAgICBTdGFydE1pbnV0ZTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0Lm1pbnV0ZSgpLAogICAgICAgICAgICBFbmRZZWFyOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLnllYXIoKSwKICAgICAgICAgICAgRW5kTW9udGg6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQubW9udGgoKSArIDEsCiAgICAgICAgICAgIEVuZERheTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kYXRlKCksCiAgICAgICAgICAgIEVuZEhvdXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuaG91cigpLAogICAgICAgICAgICBFbmRNaW51dGU6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQubWludXRlKCksCiAgICAgICAgICAgIEFsbERheTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5oYXNUaW1lKCkgPyAnMCcgOiAnMScsCiAgICAgICAgICAgIFJlY3VycmluZzogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlY3VycmluZyA/ICcxJyA6ICcwJywKICAgICAgICAgICAgVGVhbUlEOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQudGVhbUlkcyA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC50ZWFtSWRzIDogdW5kZWZpbmVkLAogICAgICAgICAgICBSZXNvdXJjZUlEOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZHMgPyBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZHMgOgogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWQgPyBbIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkIF0gOiB1bmRlZmluZWQKICAgICAgICB9OwoKICAgICAgICAvLyBBc3NpZ25lZCByZXNvdXJjZSBkaWRuJ3QgY2hhbmdlCiAgICAgICAgaWYgKAogICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZAogICAgICAgICAgICAmJiBBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5yZXNvdXJjZUlkcwogICAgICAgICAgICAmJiAkLmluQXJyYXkoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZCwKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnJlc291cmNlSWRzCiAgICAgICAgICAgICkgIT09IC0xCiAgICAgICAgKSB7CiAgICAgICAgICAgIERhdGEuUmVzb3VyY2VJRCA9IEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnJlc291cmNlSWRzOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gVXBkYXRlKCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVmZXRjaEV2ZW50cycpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5SZXZlcnRGdW5jKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGlhbG9nCiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gTWFrZSBlbmQgdGltZSBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgaW5jbHVzaXZlCiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgIERhdGEuRW5kWWVhciA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpOwogICAgICAgICAgICBEYXRhLkVuZE1vbnRoID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMTsKICAgICAgICAgICAgRGF0YS5FbmREYXkgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKTsKICAgICAgICAgICAgRGF0YS5FbmRIb3VyID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTWludXRlID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlcGVhdGluZyBldmVudAogICAgICAgIGlmIChBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICBUaXRsZTogUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRpdGxlLAogICAgICAgICAgICAgICAgSFRNTDogUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRleHQsCiAgICAgICAgICAgICAgICBNb2RhbDogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25DbGlja091dHNpZGU6IHRydWUsCiAgICAgICAgICAgICAgICBDbG9zZU9uRXNjYXBlOiB0cnVlLAogICAgICAgICAgICAgICAgUG9zaXRpb25Ub3A6ICcyMCUnLAogICAgICAgICAgICAgICAgUG9zaXRpb25MZWZ0OiAnQ2VudGVyJywKICAgICAgICAgICAgICAgIEJ1dHRvbnM6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlQWxsLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnkgQ2FsbEZvckFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuQXBwb2ludG1lbnRJRCA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuUmVjdXJyaW5nID0gJzEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVEZWx0YSA9IEFwcG9pbnRtZW50RGF0YS5EZWx0YS5hc1NlY29uZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQuZGlmZihBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5zdGFydCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRpZmYoQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQuZW5kLCAnc2Vjb25kcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IERhdGEuVXBkYXRlRGVsdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuVXBkYXRlVHlwZSA9ICdCb3RoJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnN0YXJ0LmRpZmYoQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0LCAnc2Vjb25kcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IERhdGEuVXBkYXRlRGVsdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuVXBkYXRlVHlwZSA9ICdTdGFydFRpbWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuVXBkYXRlRGVsdGEgPSBEYXRhLlVwZGF0ZURlbHRhICogLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRpZmYoQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQuZW5kLCAnc2Vjb25kcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IERhdGEuVXBkYXRlRGVsdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuVXBkYXRlVHlwZSA9ICdFbmRUaW1lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnQ2FsbEZvckFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogUGFyYW1zLkRpYWxvZ1RleHQuQ2xvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5SZXZlcnRGdW5jKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFVwZGF0ZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclN3aXRjaEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkQ2FsZW5kYXJTd2l0Y2ggLSBjYWxlbmRhciBjaGVja2JveCBlbGVtZW50LgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBkaWZmZXJlbnQgY29uZmlnIG9wdGlvbnMuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIHByZWZlcmVuY2VzIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5PdmVydmlld1NjcmVlbiAtIE5hbWUgb2YgdGhlIHNjcmVlbiAoQ2FsZW5kYXJPdmVydmlld3xSZXNvdXJjZU92ZXJ2aWV3KS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuQ2FsZW5kYXJzIC0gT2JqZWN0IHdpdGggY2FsZW5kYXIgcGFyYW1ldGVycy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxlbmRhcnMuU291cmNlcyAtIEFycmF5IG9mIGNhbGVuZGFyIHNvdXJjZXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdHN9IFBhcmFtcy5DYWxlbmRhcnMuU3dpdGNoZXMgLSBBcnJheSBvZiBjYWxlbmRhciBzd2l0Y2ggZWxlbWVudHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdHN9IFBhcmFtcy5DYWxlbmRhcnMuTGltaXQgLSBNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXIgc3dpdGNoZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgY2FsZW5kYXIgY2hlY2tib3ggYmVoYXZpb3IgYW5kIGxvYWRzIG11bHRpcGxlIGNhbGVuZGFycyB0byB0aGUKICAgICAqICAgICAgRnVsbENhbGVuZGFyIGNvbnRyb2wuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhbGVuZGFyU3dpdGNoSW5pdCgkQ2FsZW5kYXJTd2l0Y2gsIFBhcmFtcykgewoKICAgICAgICAvLyBJbml0aWFsaXplIGVuYWJsZWQgc291cmNlcwogICAgICAgIGlmICgkQ2FsZW5kYXJTd2l0Y2gucHJvcCgnY2hlY2tlZCcpKSB7CiAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcignYWRkRXZlbnRTb3VyY2UnLCBQYXJhbXMuQ2FsZW5kYXJzLlNvdXJjZXNbJENhbGVuZGFyU3dpdGNoLmRhdGEoJ2lkJyldKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlZ2lzdGVyIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgICAgJENhbGVuZGFyU3dpdGNoLm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCQoJy5DYWxlbmRhclN3aXRjaCBpbnB1dDpjaGVja2VkJykubGVuZ3RoID4gUGFyYW1zLkNhbGVuZGFycy5MaW1pdCkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyU3dpdGNoLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93QWxlcnQoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zVG9vTWFueUNhbGVuZGFyc0hlYWRsaW5lJyksIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1Rvb01hbnlDYWxlbmRhcnNUZXh0JykpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJTd2l0Y2hTb3VyY2UoJENhbGVuZGFyU3dpdGNoLCBQYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2FsZW5kYXJTd2l0Y2hTb3VyY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkQ2FsZW5kYXJTd2l0Y2ggLSBjYWxlbmRhciBjaGVja2JveCBlbGVtZW50LgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBkaWZmZXJlbnQgY29uZmlnIG9wdGlvbnMuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIHByZWZlcmVuY2VzIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5PdmVydmlld1NjcmVlbiAtIE5hbWUgb2YgdGhlIHNjcmVlbiAoQ2FsZW5kYXJPdmVydmlld3xSZXNvdXJjZU92ZXJ2aWV3KS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuQ2FsZW5kYXJzIC0gT2JqZWN0IHdpdGggY2FsZW5kYXIgcGFyYW1ldGVycy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxlbmRhcnMuU291cmNlcyAtIEFycmF5IG9mIGNhbGVuZGFyIHNvdXJjZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgZW5hYmxlcy9kaXNhYmxlcyBjYWxlbmRhciBzb3VyY2UgaW4gRnVsbENhbGVuZGFyIGNvbnRyb2wgYW5kIHN0b3JlcwogICAgICogICAgICBzZWxlY3Rpb24gdG8gdXNlciBwcmVmZXJlbmNlcy4KICAgICAqLwogICAgZnVuY3Rpb24gQ2FsZW5kYXJTd2l0Y2hTb3VyY2UoJENhbGVuZGFyU3dpdGNoLCBQYXJhbXMpIHsKICAgICAgICB2YXIgQ2FsZW5kYXJTZWxlY3Rpb24gPSBbXTsKCiAgICAgICAgLy8gU2hvdy9oaWRlIHRoZSBjYWxlbmRhciBhcHBvaW50bWVudHMKICAgICAgICBpZiAoJENhbGVuZGFyU3dpdGNoLnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ2FkZEV2ZW50U291cmNlJywgUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzWyRDYWxlbmRhclN3aXRjaC5kYXRhKCdpZCcpXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdyZW1vdmVFdmVudFNvdXJjZScsIFBhcmFtcy5DYWxlbmRhcnMuU291cmNlc1skQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKV0pOwogICAgICAgIH0KCiAgICAgICAgLy8gR2V0IGFsbCBjaGVja2VkIGNhbGVuZGFycwogICAgICAgICQuZWFjaCgkKCcuQ2FsZW5kYXJTd2l0Y2ggaW5wdXQ6Y2hlY2tlZCcpLCBmdW5jdGlvbiAoSW5kZXgsIEVsZW1lbnQpIHsKICAgICAgICAgICAgQ2FsZW5kYXJTZWxlY3Rpb24ucHVzaCgkKEVsZW1lbnQpLmRhdGEoJ2lkJykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBTdG9yZSBzZWxlY3Rpb24gaW4gdXNlciBwcmVmZXJlbmNlcwogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBQYXJhbXMuQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA6ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiA6ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICBPdmVydmlld1NjcmVlbjogUGFyYW1zLk92ZXJ2aWV3U2NyZWVuID8gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIDogJ0NhbGVuZGFyT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgQ2FsZW5kYXJTZWxlY3Rpb246IEpTT04uc3RyaW5naWZ5KENhbGVuZGFyU2VsZWN0aW9uKQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgIENvcmUuRGVidWcuTG9nKCdFcnJvciB1cGRhdGluZyB1c2VyIHByZWZlcmVuY2VzIScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIExvY2F0aW9uTGlua0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkTG9jYXRpb25PYmogLSBsb2NhdGlvbiBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkTG9jYXRpb25MaW5rcyAtIGxvY2F0aW9uIGxpbmtzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGxvY2F0aW9uIGxpbmsgYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLkxvY2F0aW9uTGlua0luaXQgPSBmdW5jdGlvbiAoJExvY2F0aW9uT2JqLCAkTG9jYXRpb25MaW5rcykgewogICAgICAgIHZhciBMb2NhdGlvblZhbHVlID0gJExvY2F0aW9uT2JqLnZhbCgpIHx8ICRMb2NhdGlvbk9iai50ZXh0KCk7CgogICAgICAgICRMb2NhdGlvbkxpbmtzLmVhY2goZnVuY3Rpb24gKEluZGV4LCBFbGVtZW50KSB7CiAgICAgICAgICAgIHZhciAkTGlua09iaiA9ICQoRWxlbWVudCksCiAgICAgICAgICAgICAgICBCYXNlVVJMICA9ICRMaW5rT2JqLmRhdGEoJ2Jhc2VVcmwnKTsKCiAgICAgICAgICAgIC8vIFVwZGF0ZSBsaW5rIFVSTCBhbmQgc2hvdyBpdCBpZiBsb2NhdGlvbiBpcyBzZXQKICAgICAgICAgICAgaWYgKExvY2F0aW9uVmFsdWUubGVuZ3RoID4gMCAmJiBMb2NhdGlvblZhbHVlICE9PSAnLScpIHsKICAgICAgICAgICAgICAgICRMaW5rT2JqLmF0dHIoJ2hyZWYnLCBCYXNlVVJMICsgZW5jb2RlVVJJQ29tcG9uZW50KExvY2F0aW9uVmFsdWUpKQogICAgICAgICAgICAgICAgICAgIC5mYWRlSW4oJ2Zhc3QnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBoaWRlIHRoZSBsaW5rCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExpbmtPYmouZmFkZU91dCgnZmFzdCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIFJlZ2lzdGVyIGtleSB1cCBldmVudCBoYW5kbGVyCiAgICAgICAgJExvY2F0aW9uT2JqLm9mZigna2V5dXAuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdrZXl1cC5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFRhcmdldE5TLkxvY2F0aW9uTGlua0luaXQoJExvY2F0aW9uT2JqLCAkTG9jYXRpb25MaW5rcyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBBbGxEYXlJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEFsbERheSAtIGFsbCBkYXkgY2hlY2tib3ggZWxlbWVudC4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBhbGwgZGF5IGNoZWNrYm94IGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5BbGxEYXlJbml0ID0gZnVuY3Rpb24gKCRBbGxEYXkpIHsKICAgICAgICBpZiAoJCgnI1N0YXJ0TW9udGg6ZGlzYWJsZWQnKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNob3cvaGlkZSB0aGUgc3RhcnQgaG91ci9taW51dGUgYW5kIGNvbXBsZXRlIGVuZCB0aW1lCiAgICAgICAgaWYgKCRBbGxEYXkucHJvcCgnY2hlY2tlZCcpKSB7CiAgICAgICAgICAgICQoJyNTdGFydEhvdXIsI1N0YXJ0TWludXRlLCNFbmRIb3VyLCNFbmRNaW51dGUnKS52YWwoJzAnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wcm9wKCdyZWFkb25seScsIHRydWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoJyNTdGFydEhvdXIsI1N0YXJ0TWludXRlLCNFbmRIb3VyLCNFbmRNaW51dGUnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpCiAgICAgICAgICAgICAgICAucHJvcCgncmVhZG9ubHknLCBmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWdpc3RlciBjaGFuZ2UgZXZlbnQgaGFuZGxlcgogICAgICAgICRBbGxEYXkub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBUYXJnZXROUy5BbGxEYXlJbml0KCRBbGxEYXkpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgUmVjdXJyaW5nSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEZpZWxkcyAtIEFycmF5IHdpdGggcmVmZXJlbmNlcyB0byByZWN1cnJpbmcgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyaW5nIC0gZmllbGQgd2l0aCByZWN1cnJpbmcgZmxhZy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VUeXBlIC0gZHJvcCBkb3duIHdpdGggcmVjdXJyZW5jZSB0eXBlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAtIFJlY3VycmVuY2UgcGF0dGVybgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYgLSBDdXN0b20gdHlwZSBkcm9wLWRvd24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQgLSBpbnRlcnZhbCB0ZXh0CiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IC0gY29udGFpbnMgd2VlayBkYXlzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiAtIGNvbnRhaW5zIG1vbnRoIGRheXMgdGFibGUKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgLSBjb250YWlucyBtb250aHMgdGFibGUKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdiAtIGxheWVyIHdpdGggcmVjdXJyZW5jZSBsaW1pdCBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlTGltaXQgLSBkcm9wIGRvd24gd2l0aCByZWN1cnJlbmNlIGxpbWl0IGZpZWxkLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2IC0gbGF5ZXIgd2l0aCByZWNjdXJlbmNlIGNvdW50IGZpZWxkLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2IC0gbGF5ZXIgd2l0aCByZWNjdXJlbmNlIHVudGlsIGZpZWxkcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheSAtIHNlbGVjdCBmaWVsZCBmb3IgcmVjY3VyZW5jZSB1bnRpbCBkYXkuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgcmVjdXJyZW5jZSBmaWVsZHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLlJlY3VycmluZ0luaXQgPSBmdW5jdGlvbiAoRmllbGRzKSB7CgogICAgICAgIGZ1bmN0aW9uIFJlY0luaXQoRmllbGRzKSB7CiAgICAgICAgICAgIHZhciBEYXlzID0gW10sCiAgICAgICAgICAgICAgICBNb250aERheXMgPSBbXSwKICAgICAgICAgICAgICAgIE1vbnRocyA9IFtdLAogICAgICAgICAgICAgICAgSW5kZXg7CgogICAgICAgICAgICBpZiAoJCgnaW5wdXQjRGF5cycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgRGF5cyA9ICQoJ2lucHV0I0RheXMnKS52YWwoKS5zcGxpdCgnLCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkKCdpbnB1dCNNb250aERheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIE1vbnRoRGF5cyA9ICQoJ2lucHV0I01vbnRoRGF5cycpLnZhbCgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQoJ2lucHV0I01vbnRoRGF5cycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgTW9udGhzID0gJCgnaW5wdXQjTW9udGhzJykudmFsKCkuc3BsaXQoJywnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgRGF5cy5sZW5ndGg7IEluZGV4KyspIHsKICAgICAgICAgICAgICAgIGlmIChEYXlzW0luZGV4XSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT0iICsgRGF5c1tJbmRleF0gKyAiXSIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IE1vbnRoRGF5cy5sZW5ndGg7IEluZGV4KyspIHsKICAgICAgICAgICAgICAgIGlmIChNb250aERheXNbSW5kZXhdICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT0iICsgTW9udGhEYXlzW0luZGV4XSArICJdIikKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTW9udGhzLmxlbmd0aDsgSW5kZXgrKykgewogICAgICAgICAgICAgICAgaWYgKE1vbnRoc1tJbmRleF0gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9IiArIE1vbnRoc1tJbmRleF0gKyAiXSIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChGaWVsZHMuJFJlY3VycmVuY2VUeXBlLnZhbCgpID09IDApIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgwKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LmFkZENsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRzLiRSZWN1cnJlbmNlVHlwZS52YWwoKSA9PSAnQ3VzdG9tJykgewogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJpbmcudmFsKDEpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21EYWlseSIpIHsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0LmZpbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgICAgICAgICAuaGlkZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLlRleHREYXknKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS52YWwoKT09IkN1c3RvbVdlZWtseSIpIHsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5UZXh0V2VlaycpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tTW9udGhseSIpIHsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5UZXh0TW9udGgnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS52YWwoKT09IkN1c3RvbVllYXJseSIpIHsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5UZXh0WWVhcicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYuc2hvdygpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN1bWUgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LnJlbW92ZUNsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJyk7CgogICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZShGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2KTsKICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJpbmcudmFsKDEpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykudmFsKCkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3VtZSB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkucmVtb3ZlQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LmFkZENsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkudHJpZ2dlcignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLlJlY3VycmluZ0luaXQoRmllbGRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VUeXBlLm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgUmVjSW5pdChGaWVsZHMpOwogICAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBOb3RpZmljYXRpb25Jbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRmllbGRzIC0gQXJyYXkgd2l0aCByZWZlcmVuY2VzIHRvIHJlbWluZGVyIGZpZWxkcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJE5vdGlmaWNhdGlvbiAtIGRyb3AgZG93biB3aXRoIHN5c3RlbSBub3RpZmljYXRpb24gc2VsZWN0aW9uLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2IC0gY3VzdG9tIHNlbGVjdGlvbiBvZiBzeXN0ZW0gbm90aWZpY2F0aW9uIGRhdGUKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgcmVtaW5kZXIgc2VjdGlvbiBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuTm90aWZpY2F0aW9uSW5pdCA9IGZ1bmN0aW9uIChGaWVsZHMpIHsKICAgICAgICB2YXIgTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2ID0gRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYuYXR0cignaWQnKTsKCiAgICAgICAgaWYgKEZpZWxkcy4kTm90aWZpY2F0aW9uVGVtcGxhdGUudmFsKCkgIT09ICdDdXN0b20nKSB7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSBjdXN0b20gZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAvLyBjdXN0b20gZmllbGQgaXMgbmVlZGVkCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2LnNob3coKTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbW9kZXJuIGZpZWxkcyBvbiBjdXN0b20gc2VsZWN0aW9uCiAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuSW5pdFNlbGVjdCgkKCdzZWxlY3QuTW9kZXJuaXplJykpOwogICAgICAgIH0KCiAgICAgICAgLy8gZGlzYWJsZSBlbmFibGUgdGhlIGRpZmZlcmVudCBjdXN0b20gZmllbGRzCiAgICAgICAgaWYgKEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJykpIHsKCiAgICAgICAgICAgIC8vIGVuYWJsZSByZWxhdGl2ZSBkYXRlIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQudmFsKDEpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgY3VzdG9tIGRhdGUgdGltZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0LnZhbCgnJyk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1vbnRoLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAvLyBlbmFibGUgdGhlIGN1c3RvbSBkYXRlIHRpbWUgaW5wdXQKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0LnZhbCgxKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1vbnRoLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhci5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXIucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGUucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHJlbGF0aXZlIGRhdGUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC52YWwoJycpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLnByb3AoJ3JlYWRvbmx5JywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETzogV29ya2Fyb3VuZCBmb3IgSW5wdXRGaWVsZHMgYnVnIGluIHRoZSBmcmFtZXdvcmsgKGRpc2FibGVkIGF0dHJpYnV0ZSBub3QgY2hlY2tlZCBhZnRlciBpbml0aWFsaXphdGlvbikKICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkRlYWN0aXZhdGUoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2KSk7CiAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYpKTsKCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvblRlbXBsYXRlLm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuTm90aWZpY2F0aW9uSW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gaGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBwcm9jZXNzIGNoYW5nZXMKICAgICAgICAgICAgVGFyZ2V0TlMuTm90aWZpY2F0aW9uSW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gaGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBwcm9jZXNzIGNoYW5nZXMKICAgICAgICAgICAgVGFyZ2V0TlMuTm90aWZpY2F0aW9uSW5pdChGaWVsZHMpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgVGVhbUluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkVGVhbUlET2JqIC0gZmllbGQgd2l0aCBsaXN0IG9mIHRlYW1zLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRSZXNvdXJjZUlET2JqIC0gZmllbGQgd2l0aCBsaXN0IG9mIHJlc291cmNlcy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDaGFsbGVuZ2VUb2tlbiAtIFVzZXIgY2hhbGxlbmdlIHRva2VuLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtVmFsdWVPYmogLSBmaWVsZCB3aXRoIHJlYWQgb25seSB2YWx1ZXMgZm9yIHRlYW0uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlVmFsdWVPYmogLSBmaWVsZCB3aXRoIHJlYWQgb25seSB2YWx1ZXMgZm9yIHJlc291cmNlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0ZWFtIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuVGVhbUluaXQgPSBmdW5jdGlvbiAoJFRlYW1JRE9iaiwgJFJlc291cmNlSURPYmosIENoYWxsZW5nZVRva2VuLCAkVGVhbVZhbHVlT2JqLCAkUmVzb3VyY2VWYWx1ZU9iaikgewogICAgICAgICRUZWFtSURPYmoub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdUZWFtVXNlckxpc3QnLAogICAgICAgICAgICAgICAgVGVhbUlEOiAkVGVhbUlET2JqLnZhbCgpCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBUb2dnbGVBSkFYTG9hZGVyKCRSZXNvdXJjZUlET2JqLCB0cnVlKTsKCiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBTZWxlY3RlZElEID0gJFJlc291cmNlSURPYmoudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLlRlYW1Vc2VyTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRE9iai5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzcG9uc2UuVGVhbVVzZXJMaXN0LCBmdW5jdGlvbiAoSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgTmV3T3B0aW9uID0gbmV3IE9wdGlvbihWYWx1ZSwgSW5kZXgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSBvcHRpb24gdGV4dCwgYmVjYXVzZSBvZiB3cm9uZyBodG1sIHF1b3Rpbmcgb2YgdGV4dCBjb250ZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFRoaXMgaXMgbmVlZGVkIGZvciBJRS4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdPcHRpb24uaW5uZXJIVE1MID0gQ29yZS5BcHAuRXNjYXBlSFRNTChWYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTZWxlY3RlZElEICYmIFNlbGVjdGVkSUQuaW5kZXhPZihJbmRleCkgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld09wdGlvbi5zZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlc291cmNlSURPYmouYXBwZW5kKE5ld09wdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBjdXN0b20gcmVkcmF3IGV2ZW50IGZvciBJbnB1dEZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRE9iai50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBUb2dnbGVBSkFYTG9hZGVyKCRSZXNvdXJjZUlET2JqLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CgogICAgICAgIGZ1bmN0aW9uIENvbGxhcHNlVmFsdWVzKCRWYWx1ZU9iaiwgVmFsdWVzKSB7CiAgICAgICAgICAgICRWYWx1ZU9iai5odG1sKCcnKTsKICAgICAgICAgICAgJC5lYWNoKFZhbHVlcywgZnVuY3Rpb24gKEluZGV4LCBWYWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIENvdW50ID0gVmFsdWVzLmxlbmd0aDsKCiAgICAgICAgICAgICAgICBpZiAoSW5kZXggPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJFZhbHVlT2JqLmh0bWwoKSArIFZhbHVlICsgJzxicj4nKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWVzLnNwbGljZSgtQ291bnQsIDIpOwogICAgICAgICAgICAgICAgICAgICQoJzxhIC8+JykuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdEaWFsb2dUb29sdGlwTGluaycpCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KCcrJyArIChDb3VudC0yKSArICcgbW9yZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKQogICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkVG9vbHRpcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb29sdGlwSFRNTCA9ICc8cD4nICsgVmFsdWVzLmpvaW4oJzxicj4nKSArICc8L3A+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVMZWZ0ID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpICsgJCh3aW5kb3cpLndpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWaXNpYmxlVG9wID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkgKyAkKHdpbmRvdykuaGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFhQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0WVBvc2l0aW9uOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIGV4aXN0aW5nIHRvb2x0aXBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuRGlhbG9nVG9vbHRpcCcpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFdmVudC5wYWdlWCB8fCBFdmVudC5wYWdlWSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBFdmVudC5wYWdlWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZID0gRXZlbnQucGFnZVk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEV2ZW50LmNsaWVudFggfHwgRXZlbnQuY2xpZW50WSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBFdmVudC5jbGllbnRYICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEV2ZW50LmNsaWVudFkgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5jcmVhc2UgcG9zaXRpb25zIHNvIHRoZSB0b29sdGlwIGRvIG5vdCBvdmVybGFwIHdpdGggbW91c2UgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCArPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgKz0gNTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdG9vbHRpcCBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqID0gJCgnPGRpdi8+JykuYWRkQ2xhc3MoJ0FwcG9pbnRtZW50VG9vbHRpcCBEaWFsb2dUb29sdGlwIEhpZGRlbicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9mZnNldCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogUG9zWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogUG9zWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoVG9vbHRpcEhUTUwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygnei1pbmRleCcsIDQwMDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygnd2lkdGgnLCAnYXV0bycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCdib2R5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRvcCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFlQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZVRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBQb3NZIC0gJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIGxlZnQgcG9zaXRpb24gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFhQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZUxlZnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gUG9zWCAtICRUb29sdGlwT2JqLndpZHRoKCkgLSAzMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdG9vbHRpcCBvbiBhbnkgb3V0c2lkZSBjbGljawogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkKEV2ZW50LnRhcmdldCkuY2xvc2VzdCgnLkRpYWxvZ1Rvb2x0aXBMaW5rJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuRGlhbG9nVG9vbHRpcCcpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRWYWx1ZU9iaik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIENvbGxhcHNlIHJlYWQgb25seSB2YWx1ZXMKICAgICAgICBpZiAoJFRlYW1WYWx1ZU9iai5sZW5ndGgpIHsKICAgICAgICAgICAgQ29sbGFwc2VWYWx1ZXMoJFRlYW1WYWx1ZU9iaiwgJFRlYW1WYWx1ZU9iai5odG1sKCkuc3BsaXQoJzxicj4nKSk7CiAgICAgICAgfQogICAgICAgIGlmICgkUmVzb3VyY2VWYWx1ZU9iai5sZW5ndGgpIHsKICAgICAgICAgICAgQ29sbGFwc2VWYWx1ZXMoJFJlc291cmNlVmFsdWVPYmosICRSZXNvdXJjZVZhbHVlT2JqLmh0bWwoKS5zcGxpdCgnPGJyPicpKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2FsZW5kYXJTZXR0aW5nc0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcyAtIEFycmF5IGNvbnRhaW5pbmcgbmFtZXMgb2YgdGhlIGNhbGxiYWNrcy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIC0gTmFtZSBvZiB0aGUgc2NyZWVuIChSZXNvdXJjZU92ZXJ2aWV3KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbiAtIElEIG9mIHRoZSBzZXR0aW5ncyBidXR0b24uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXIgLSBJRCBvZiB0aGUgc2V0dGluZ3MgZGlhbG9nIGNvbnRhaW5lci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc1Nob3cgLSBTaG93IHRoZSBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgY2FsZW5kYXIgc2V0dGluZ3MgYmVoYXZpb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhbGVuZGFyU2V0dGluZ3NJbml0KFBhcmFtcykgewogICAgICAgIHZhciAkQ2FsZW5kYXJTZXR0aW5nc09iaiA9ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NCdXR0b24pKSwKICAgICAgICAgICAgJENhbGVuZGFyU2V0dGluZ3NEaWFsb2cgPSAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBhcmFtcy5DYWxlbmRhclNldHRpbmdzRGlhbG9nQ29udGFpbmVyKSk7CgogICAgICAgIC8vIENhbGVuZGFyIHNldHRpbmdzIGJ1dHRvbgogICAgICAgICRDYWxlbmRhclNldHRpbmdzT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKCRDYWxlbmRhclNldHRpbmdzRGlhbG9nLCBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNTZXR0aW5ncycpLCAnMTBweCcsICdDZW50ZXInLCB0cnVlLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkU2hvd25BcHBvaW50bWVudHMgPSAkKCcjU2hvd25BcHBvaW50bWVudHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA6ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IFBhcmFtcy5PdmVydmlld1NjcmVlbiA/IFBhcmFtcy5PdmVydmlld1NjcmVlbiA6ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25BcHBvaW50bWVudHM6ICRTaG93bkFwcG9pbnRtZW50cy52YWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyAnQWN0aW9uPUFnZW50QXBwb2ludG1lbnQnICsgKFBhcmFtcy5PdmVydmlld1NjcmVlbiA/IFBhcmFtcy5PdmVydmlld1NjcmVlbiA6ICdDYWxlbmRhck92ZXJ2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sIHRydWUpOwoKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFNob3cgc2V0dGluZ3MgZGlhbG9nIGltbWVkaWF0ZWx5CiAgICAgICAgaWYgKFBhcmFtcy5DYWxlbmRhclNldHRpbmdzU2hvdykgewogICAgICAgICAgICAkQ2FsZW5kYXJTZXR0aW5nc09iai50cmlnZ2VyKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFJlc291cmNlU2V0dGluZ3NJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MgLSBBcnJheSBjb250YWluaW5nIG5hbWVzIG9mIHRoZSBjYWxsYmFja3MuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIHByZWZlcmVuY2VzIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5PdmVydmlld1NjcmVlbiAtIE5hbWUgb2YgdGhlIHNjcmVlbiAoUmVzb3VyY2VPdmVydmlldykuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zLlJlc291cmNlcyAtIE9iamVjdCB3aXRoIHJlc291cmNlcyBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5SZXNvdXJjZXMuUmVzb3VyY2VTZXR0aW5nc0J1dHRvbiAtIElEIG9mIHRoZSBlbGVtZW50IGZvciBzZXR0aW5ncyBidXR0b24uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZVNldHRpbmdzRGlhbG9nQ29udGFpbmVyIC0gSUQgb2YgdGhlIGVsZW1lbnQgd2l0aCBkaWFsb2cgY29udGVudC4KICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gUGFyYW1zLlJlc291cmNlcy5SZXN0b3JlRGVmYXVsdFNldHRpbmdzIC0gd2hldGhlciB0byBkaXNwbGF5IHJlc3RvcmUgc2V0dGluZ3MgYnV0dG9uLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHJlc291cmNlIHNldHRpbmdzIGJlaGF2aW9yLgogICAgICovCiAgICBmdW5jdGlvbiBSZXNvdXJjZVNldHRpbmdzSW5pdChQYXJhbXMpIHsKICAgICAgICB2YXIgJFJlc291cmNlU2V0dGluZ3NPYmogPSAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBhcmFtcy5SZXNvdXJjZXMuUmVzb3VyY2VTZXR0aW5nc0J1dHRvbikpLAogICAgICAgICAgICAkUmVzb3VyY2VTZXR0aW5nc0RpYWxvZyA9ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZVNldHRpbmdzRGlhbG9nQ29udGFpbmVyKSk7CgogICAgICAgIC8vIFJlc291cmNlIHNldHRpbmdzIGJ1dHRvbgogICAgICAgICRSZXNvdXJjZVNldHRpbmdzT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKCRSZXNvdXJjZVNldHRpbmdzRGlhbG9nLCBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNTZXR0aW5ncycpLCAnMTBweCcsICdDZW50ZXInLCB0cnVlLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkTGlzdENvbnRhaW5lciA9ICQoJy5BbGxvY2F0aW9uTGlzdENvbnRhaW5lcicpLmZpbmQoJy5Bc3NpZ25lZEZpZWxkcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3duUmVzb3VyY2VzID0gW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiA6ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gPyBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gOiAnUmVzb3VyY2VPdmVydmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW1JRDogJCgnI1RlYW0nKS52YWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRMaXN0Q29udGFpbmVyKSAmJiAkTGlzdENvbnRhaW5lci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goJExpc3RDb250YWluZXIuZmluZCgnbGknKSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3duUmVzb3VyY2VzLnB1c2goJCh0aGlzKS5hdHRyKCdkYXRhLWZpZWxkbmFtZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuU2hvd25SZXNvdXJjZXMgPSBKU09OLnN0cmluZ2lmeShTaG93blJlc291cmNlcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sIHRydWUpOwoKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5TZXRBbGxvY2F0aW9uTGlzdCgpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzID0gUGFyYW1zLlJlc291cmNlcy5SZXN0b3JlRGVmYXVsdFNldHRpbmdzOwoKICAgICAgICAvLyBJbml0aWFsaXplIHJlc3RvcmUgc2V0dGluZ3MgYnV0dG9uLgogICAgICAgIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3NJbml0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgUmVzdG9yZURlZmF1bHRTZXR0aW5nc0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBBZGRzIHJlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncyBidXR0b24gKHRyYXNoIGNhbikgdG8gdmlldyBhbmQgaW5pdGlhbGl6ZXMgaXRzIGJlaGF2aW9yLgogICAgICovCiAgICBmdW5jdGlvbiBSZXN0b3JlRGVmYXVsdFNldHRpbmdzSW5pdCgpIHsKICAgICAgICB2YXIgJFJlc3RvcmVTZXR0aW5nc09iajsKCiAgICAgICAgLy8gU2tpcCBpZiBidXR0b24gaXMgbm90IG5lZWRlZCBvciB3ZSBhbHJlYWR5IGhhdmUgb25lLgogICAgICAgIGlmICgKICAgICAgICAgICAgIVJlc3RvcmVEZWZhdWx0U2V0dGluZ3MKICAgICAgICAgICAgfHwgJCgnI1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3MnKS5sZW5ndGggPiAwCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSB0aGUgYnV0dG9uLgogICAgICAgICRSZXN0b3JlU2V0dGluZ3NPYmogPSAkKCc8YSAvPicpLmF0dHIoJ2lkJywgJ1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3MnKQogICAgICAgICAgICAuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zUmVzdG9yZScpKQogICAgICAgICAgICAuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLXRyYXNoJykpOwoKICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGNvbHVtbiBoZWFkZXIuCiAgICAgICAgJCgndHIuZmMtc3VwZXIgKyB0ciAuZmMtY2VsbC1jb250ZW50JykuYXBwZW5kKCRSZXN0b3JlU2V0dGluZ3NPYmopOwoKICAgICAgICAvLyBSZWdpc3RlciBjbGljayBoYW5kbGVyLgogICAgICAgICRSZXN0b3JlU2V0dGluZ3NPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzOiAnU2hvd25SZXNvdXJjZXMnLAogICAgICAgICAgICAgICAgICAgIFRlYW1JRDogJCgnI1RlYW0nKS52YWwoKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBUb2dnbGVBSkFYTG9hZGVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCAtIE9iamVjdCByZWZlcmVuY2Ugb2YgdGhlIGZpZWxkIHdoaWNoIGlzIHVwZGF0ZWQKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gU2hvdyAtIFNob3cgb3IgaGlkZSB0aGUgQUpBWCBsb2FkZXIgaW1hZ2UKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93cyBhbmQgaGlkZXMgYW4gYWpheCBsb2FkZXIgZm9yIGV2ZXJ5IGVsZW1lbnQgd2hpY2ggaXMgdXBkYXRlcyB2aWEgYWpheC4KICAgICAqLwogICAgZnVuY3Rpb24gVG9nZ2xlQUpBWExvYWRlcigkRWxlbWVudCwgU2hvdykgewogICAgICAgIHZhciAkTG9hZGVyID0gJCgnI0FKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSksCiAgICAgICAgICAgIExvYWRlckhUTUwgPSAnPHNwYW4gaWQ9IkFKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSArICciIGNsYXNzPSJBSkFYTG9hZGVyIj48L3NwYW4+JzsKCiAgICAgICAgLy8gRWxlbWVudCBub3QgcHJlc2VudAogICAgICAgIGlmICghJEVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNob3cgb3IgaGlkZSB0aGUgbG9hZGVyCiAgICAgICAgaWYgKFNob3cpIHsKICAgICAgICAgICAgaWYgKCEkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQuYWZ0ZXIoTG9hZGVySFRNTCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkTG9hZGVyLnNob3coKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJExvYWRlci5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBQbHVnaW5Jbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFBsdWdpbkZpZWxkcyAtIGZpZWxkcyB3aXRoIGRpZmZlcmVudCBwbHVnaW4gc2VhcmNoZXMuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ2hhbGxlbmdlVG9rZW4gLSBVc2VyIGNoYWxsZW5nZSB0b2tlbi4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBwbHVnaW4gZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5QbHVnaW5Jbml0ID0gZnVuY3Rpb24gKCRQbHVnaW5GaWVsZHMsIENoYWxsZW5nZVRva2VuKSB7CgogICAgICAgIGZ1bmN0aW9uIEluaXRSZW1vdmVCdXR0b25zKCkgewogICAgICAgICAgICAkKCcuUmVtb3ZlQnV0dG9uJykub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJFJlbW92ZU9iaiA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ID0gJFJlbW92ZU9iai5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgICAgIFBsdWdpbkRhdGEgPSBKU09OLnBhcnNlKCRQbHVnaW5EYXRhT2JqLnZhbCgpKSwKICAgICAgICAgICAgICAgICAgICBMaW5rSUQgPSAkUmVtb3ZlT2JqLmRhdGEoJ2xpbmtJZCcpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgJFBhcmVudCA9ICRSZW1vdmVPYmoucGFyZW50KCk7CgogICAgICAgICAgICAgICAgUGx1Z2luRGF0YS5zcGxpY2UoUGx1Z2luRGF0YS5pbmRleE9mKExpbmtJRCksIDEpOwogICAgICAgICAgICAgICAgJFBsdWdpbkRhdGFPYmoudmFsKEpTT04uc3RyaW5naWZ5KFBsdWdpbkRhdGEpKTsKCiAgICAgICAgICAgICAgICAkUGFyZW50LnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBBZGRMaW5rKFBsdWdpbktleSwgUGx1Z2luVVJMLCBMaW5rSUQsIExpbmtOYW1lKSB7CiAgICAgICAgICAgIHZhciAkUGx1Z2luQ29udGFpbmVyT2JqID0gJCgnI1BsdWdpbkNvbnRhaW5lcl8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGx1Z2luS2V5KSksCiAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgUGx1Z2luRGF0YSA9IEpTT04ucGFyc2UoJFBsdWdpbkRhdGFPYmoudmFsKCkpLAogICAgICAgICAgICAgICAgJEV4aXN0aW5nTGlua3MgPSAkUGx1Z2luQ29udGFpbmVyT2JqLmZpbmQoJy5MaW5rXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihMaW5rSUQpKSwKICAgICAgICAgICAgICAgICRMaW5rQ29udGFpbmVyT2JqID0gJCgnPGRpdiAvPicpLAogICAgICAgICAgICAgICAgJFVSTE9iaiA9ICQoJzxhIC8+JyksCiAgICAgICAgICAgICAgICAkUmVtb3ZlT2JqID0gJCgnPGEgLz4nKSwKICAgICAgICAgICAgICAgIExpbmtVUkwgPSBQbHVnaW5VUkwucmVwbGFjZSgnJXMnLCBMaW5rSUQpOwoKICAgICAgICAgICAgaWYgKCRFeGlzdGluZ0xpbmtzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUGx1Z2luRGF0YS5wdXNoKExpbmtJRCk7CiAgICAgICAgICAgICRQbHVnaW5EYXRhT2JqLnZhbChKU09OLnN0cmluZ2lmeShQbHVnaW5EYXRhKSk7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hZGRDbGFzcygnTGlua18nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTGlua0lEKSk7CgogICAgICAgICAgICAkVVJMT2JqLmF0dHIoJ2hyZWYnLCBMaW5rVVJMKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKQogICAgICAgICAgICAgICAgLnRleHQoTGlua05hbWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJExpbmtDb250YWluZXJPYmopOwoKICAgICAgICAgICAgJFJlbW92ZU9iai5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdSZW1vdmVCdXR0b24nKQogICAgICAgICAgICAgICAgLmRhdGEoJ3BsdWdpbktleScsIFBsdWdpbktleSkKICAgICAgICAgICAgICAgIC5kYXRhKCdsaW5rSWQnLCBMaW5rSUQpCiAgICAgICAgICAgICAgICAuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLW1pbnVzLXNxdWFyZS1vJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkTGlua0NvbnRhaW5lck9iaik7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hcHBlbmRUbygkUGx1Z2luQ29udGFpbmVyT2JqKTsKICAgICAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgICAgICB9CgogICAgICAgICRQbHVnaW5GaWVsZHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkRWxlbWVudCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPSAkRWxlbWVudC5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgIFBsdWdpblVSTCA9ICRFbGVtZW50LmRhdGEoJ3BsdWdpblVybCcpOwoKICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGluaXRpYWxpemVkIGZpZWxkcwogICAgICAgICAgICBpZiAoJEVsZW1lbnQuaGFzQ2xhc3MoJ3VpLWF1dG9jb21wbGV0ZS1pbnB1dCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEVsZW1lbnQuYXV0b2NvbXBsZXRlKHsKICAgICAgICAgICAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgICAgICAgICAgIGRlbGF5OiA1MDAsCiAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChSZXF1ZXN0LCBSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50QUpBWE51bWJlciA9ICsrQUpBWENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50UGx1Z2luU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleTogUGx1Z2luS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtICsgJyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4UmVzdWx0czogMjAKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkwsIERhdGEsIGZ1bmN0aW9uIChSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSByZXN1bHQgaXMgZnJvbSB0aGUgbGF0ZXN0IGFqYXggcmVxdWVzdAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQUpBWENvdW50ZXIgIT09IEN1cnJlbnRBSkFYTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAgdGhpcy5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICBBZGRMaW5rKFBsdWdpbktleSwgUGx1Z2luVVJMLCBVSS5pdGVtLmtleSwgVUkuaXRlbS5sYWJlbCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIEluaXRSZW1vdmVCdXR0b25zKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBFZGl0QXBwb2ludG1lbnQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBEYXRhIC0gSGFzaCB3aXRoIGNhbGwgYW5kIGFwcG9pbnRtZW50IGRhdGEuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQ2FsZW5kYXJJRCAtIEFwcG9pbnRtZW50IGNhbGVuZGFyIElELgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkFwcG9pbnRtZW50SUQgLSBBcHBvaW50bWVudCBJRC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BY3Rpb24gLSBFZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdWJhY3Rpb24gLSBFZGl0IHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5UaXRsZSAtIEFwcG9pbnRtZW50IHRpdGxlLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkRlc2NyaXB0aW9uIC0gQXBwb2ludG1lbnQgZGVzY3JpcHRpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuTG9jYXRpb24gLSBBcHBvaW50bWVudCBsb2NhdGlvbi4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydFllYXIgLSBBcHBvaW50bWVudCBzdGFydCB5ZWFyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlN0YXJ0TW9udGggLSBBcHBvaW50bWVudCBzdGFydCBtb250aC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydERheSAtIEFwcG9pbnRtZW50IHN0YXJ0IGRheS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydEhvdXIgLSBBcHBvaW50bWVudCBzdGFydCBob3VyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlN0YXJ0TWludXRlIC0gQXBwb2ludG1lbnQgc3RhcnQgbWludXRlLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkVuZFllYXIgLSBBcHBvaW50bWVudCBlbmQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRNb250aCAtIEFwcG9pbnRtZW50IGVuZCBtb250aC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmREYXkgLSBBcHBvaW50bWVudCBlbmQgZGF5LgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkVuZEhvdXIgLSBBcHBvaW50bWVudCBlbmQgaG91ci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRNaW51dGUgLSBBcHBvaW50bWVudCBlbmQgbWludXRlLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkFsbERheSAtIElzIGFwcG9pbnRtZW50IGFuIGFsbC1kYXkgYXBwb2ludG1lbnQgKDB8MSk/CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2Qgc3VibWl0cyBhbiBlZGl0IGFwcG9pbnRtZW50IGNhbGwgdG8gdGhlIGJhY2tlbmQgYW5kIHJlZnJlc2hlcyB0aGUgdmlldy4KICAgICAgKi8KICAgIFRhcmdldE5TLkVkaXRBcHBvaW50bWVudCA9IGZ1bmN0aW9uIChEYXRhKSB7CiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhckFnZW5kYU92ZXJ2aWV3JykpIHsKICAgICAgICAgICAgJCgnLk92ZXJ2aWV3Q29udHJvbCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgfQoKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICBEYXRhLAogICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdyZWZldGNoRXZlbnRzJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkaWFsb2cKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlbG9hZCBwYWdlIGlmIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJBZ2VuZGFPdmVydmlldycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoUmVzcG9uc2UuRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTkgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyID0gQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyIHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZQogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgbWFuYWdlbWVudCBmdW5jdGlvbnMuCiAqLwpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIHZhciBSdWxlQ291bnQgPSAwOwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdFRpY2tldEFwcG9pbnRtZW50cwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UKICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gSW5pdGlhbFJ1bGVDb3VudCAtIEZyb20gd2hpY2ggcnVsZSB0aGUgY291bnQgc2hvdWxkIHN0YXJ0IChvcHRpb25hbCkKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0VGlja2V0QXBwb2ludG1lbnRzID0gZnVuY3Rpb24gKEluaXRpYWxSdWxlQ291bnQpIHsKICAgICAgICB2YXIgJEFkZFJ1bGVPYmogPSAkKCcjQWRkUnVsZUJ1dHRvbicpLAogICAgICAgICAgICAkVGVtcGxhdGVPYmogPSAkKCcjVGlja2V0QXBwb2ludG1lbnRSdWxlc1RlbXBsYXRlJyk7CgogICAgICAgIGlmIChJbml0aWFsUnVsZUNvdW50KSB7CiAgICAgICAgICAgIFJ1bGVDb3VudCA9IHBhcnNlSW50KEluaXRpYWxSdWxlQ291bnQsIDEwKTsKICAgICAgICB9CgogICAgICAgICRBZGRSdWxlT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgUnVsZUlEID0gKytSdWxlQ291bnQsCiAgICAgICAgICAgICAgICAkUnVsZU9iaiA9ICQoJFRlbXBsYXRlT2JqLmh0bWwoKSksCiAgICAgICAgICAgICAgICAkQ29udGFpbmVyT2JqID0gJEFkZFJ1bGVPYmoucGFyZW50cygnZmllbGRzZXQnKTsKCiAgICAgICAgICAgICRSdWxlT2JqCgogICAgICAgICAgICAgICAgLy8gUnVsZSBudW1iZXIKICAgICAgICAgICAgICAgIC5maW5kKCcuUnVsZU51bWJlcicpCiAgICAgICAgICAgICAgICAudGV4dChSdWxlSUQpCiAgICAgICAgICAgICAgICAuZW5kKCkKCiAgICAgICAgICAgICAgICAvLyBTdGFydCBkYXRlIGZpZWxkIGFuZCBsYWJlbAogICAgICAgICAgICAgICAgLmZpbmQoJyNTdGFydERhdGUnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1N0YXJ0RGF0ZV8nICsgUnVsZUlEKQogICAgICAgICAgICAgICAgLmF0dHIoJ25hbWUnLCAnU3RhcnREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAucGFyZW50KCkKICAgICAgICAgICAgICAgIC5wcmV2KCdsYWJlbCcpCiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgJ1N0YXJ0RGF0ZV8nICsgUnVsZUlEKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC8vIEVuZCBkYXRlIGZpZWxkIGFuZCBsYWJlbAogICAgICAgICAgICAgICAgLmZpbmQoJyNFbmREYXRlJykKICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICdFbmREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdFbmREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAucGFyZW50KCkKICAgICAgICAgICAgICAgIC5wcmV2KCdsYWJlbCcpCiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgJ0VuZERhdGVfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZW5kKCkKCiAgICAgICAgICAgICAgICAvLyBRdWV1ZXMgZmllbGQsIGxhYmVsIGFuZCBlcnJvcgogICAgICAgICAgICAgICAgLmZpbmQoJyNRdWV1ZUlEJykKICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICdRdWV1ZUlEXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdRdWV1ZUlEXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5maW5kKCdsYWJlbFtmb3I9IlF1ZXVlSUQiXScpCiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgJ1F1ZXVlSURfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmZpbmQoJyNRdWV1ZUlERXJyb3InKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1F1ZXVlSURfJyArIFJ1bGVJRCArICdFcnJvcicpCiAgICAgICAgICAgICAgICAuZW5kKCkKCiAgICAgICAgICAgICAgICAuaW5zZXJ0QmVmb3JlKCRDb250YWluZXJPYmopOwoKICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkUnVsZU9iaik7CgogICAgICAgICAgICAvLyBJbml0aWFsaXplIHJ1bGUgYnV0dG9ucwogICAgICAgICAgICBUYXJnZXROUy5Jbml0VGlja2V0QXBwb2ludG1lbnRSdWxlKFJ1bGVJRCwgJFJ1bGVPYmopOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdFRpY2tldEFwcG9pbnRtZW50UnVsZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UKICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gUnVsZUlEIC0gSUQgb2YgdGhlIHJ1bGUgKDEsIDIsIDMuLi4pCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJ1bGVPYmogLSBSdWxlIG9iamVjdAogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemUgdGhlIHRpY2tldCBhcHBvaW50bWVudCBydWxlIGJ1dHRvbnMgYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRUaWNrZXRBcHBvaW50bWVudFJ1bGUgPSBmdW5jdGlvbiAoUnVsZUlELCAkUnVsZU9iaikgewogICAgICAgIHZhciAkUmVtb3ZlT2JqID0gJFJ1bGVPYmouZmluZCgnbGVnZW5kIC5SZW1vdmVCdXR0b24nKSwKICAgICAgICAgICAgJFJlbW92ZVBhcmFtT2JqID0gJFJ1bGVPYmouZmluZCgnLkZpZWxkID4gLlJlbW92ZUJ1dHRvbicpLAogICAgICAgICAgICAkQWRkUGFyYW1PYmogPSAkUnVsZU9iai5maW5kKCcuQWRkQnV0dG9uJyksCiAgICAgICAgICAgICRQYXJhbU9iaiA9ICRSdWxlT2JqLmZpbmQoJy5TZWFyY2hQYXJhbXMnKSwKICAgICAgICAgICAgJFRlbXBsYXRlT2JqID0gJCgnI1RpY2tldEFwcG9pbnRtZW50U2VhcmNoUGFyYW1UZW1wbGF0ZScpOwoKICAgICAgICAkUGFyYW1PYmoudmFsKCRQYXJhbU9iai5maW5kKCdvcHRpb246ZW5hYmxlZCcpLmZpcnN0KCkuYXR0cigndmFsdWUnKSk7CgogICAgICAgICRSZW1vdmVPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRSdWxlT2JqLnJlbW92ZSgpOwogICAgICAgICAgICBVcGRhdGVSdWxlQ291bnQoKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJFJlbW92ZVBhcmFtT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJFNlYXJjaFBhcmFtT2JqID0gJCh0aGlzKS5wYXJlbnQoKSwKICAgICAgICAgICAgICAgIFBhcmFtTmFtZSA9ICRTZWFyY2hQYXJhbU9iai5maW5kKCcuU2VhcmNoUGFyYW0nKS5kYXRhKCdwYXJhbScpOwoKICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqLnJlbW92ZSgpOwogICAgICAgICAgICAkUGFyYW1PYmouZmluZCgnb3B0aW9uW3ZhbHVlPSInICsgUGFyYW1OYW1lICsgJyJdJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAudmFsKCRQYXJhbU9iai5maW5kKCdvcHRpb246ZW5hYmxlZCcpLmZpcnN0KCkuYXR0cigndmFsdWUnKSkKICAgICAgICAgICAgICAgIC50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkQWRkUGFyYW1PYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkU2VhcmNoUGFyYW1PYmogPSAkKCRUZW1wbGF0ZU9iai5odG1sKCkpLAogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtQ29udGFpbmVyT2JqID0gJFJ1bGVPYmouZmluZCgnLlNlYXJjaFBhcmFtc0NvbnRhaW5lcicpLAogICAgICAgICAgICAgICAgJFJlbW92ZVBhcmFtT2JqID0gJFNlYXJjaFBhcmFtT2JqLmZpbmQoJy5SZW1vdmVCdXR0b24nKSwKICAgICAgICAgICAgICAgIFBhcmFtTmFtZSA9ICRQYXJhbU9iai52YWwoKTsKCiAgICAgICAgICAgIGlmICghUGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbU9iai5maW5kKCdvcHRpb25bdmFsdWU9IicgKyBQYXJhbU5hbWUgKyAnIl0nKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLnZhbCgkUGFyYW1PYmouZmluZCgnb3B0aW9uOmVuYWJsZWQnKS5maXJzdCgpLmF0dHIoJ3ZhbHVlJykpCiAgICAgICAgICAgICAgICAudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKTsKCiAgICAgICAgICAgIC8vIExhYmVsCiAgICAgICAgICAgICRTZWFyY2hQYXJhbU9iagogICAgICAgICAgICAgICAgLmZpbmQoJ2xhYmVsJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSkKICAgICAgICAgICAgICAgIC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgIC5hZnRlcignICcgKyAkUGFyYW1PYmouZmluZCgnb3B0aW9uW3ZhbHVlPSInICsgUGFyYW1OYW1lICsgJyJdJykudGV4dCgpICsgJzonKTsKCiAgICAgICAgICAgIC8vIE93bmVySURzIGFuZCBSZXNwb25zaWJsZUlEcyBhcmUgbXVsdGktc2VsZWN0IGZpZWxkcy4KICAgICAgICAgICAgaWYgKFBhcmFtTmFtZSA9PT0gJ093bmVySURzJyB8fCBQYXJhbU5hbWUgPT09ICdSZXNwb25zaWJsZUlEcycpIHsKICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbU9iagogICAgICAgICAgICAgICAgICAgIC5maW5kKCdzZWxlY3QnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICdTZWFyY2hQYXJhbV8nICsgUnVsZUlEICsgJ18nICsgUGFyYW1OYW1lKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ1NlYXJjaFBhcmFtXycgKyBSdWxlSUQgKyAnXycgKyBQYXJhbU5hbWUpCiAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJyNTZWFyY2hQYXJhbUVycm9yJykKICAgICAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSArICdFcnJvcicpCiAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2lucHV0JykKICAgICAgICAgICAgICAgICAgICAucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElucHV0IGZpZWxkIGFuZCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2lucHV0JykKICAgICAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSkKICAgICAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdTZWFyY2hQYXJhbV8nICsgUnVsZUlEICsgJ18nICsgUGFyYW1OYW1lKQogICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcjU2VhcmNoUGFyYW1FcnJvcicpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1NlYXJjaFBhcmFtXycgKyBSdWxlSUQgKyAnXycgKyBQYXJhbU5hbWUgKyAnRXJyb3InKQogICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCdzZWxlY3QnKQogICAgICAgICAgICAgICAgICAgIC5yZW1vdmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqLmFwcGVuZFRvKCRTZWFyY2hQYXJhbUNvbnRhaW5lck9iaik7CiAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJFNlYXJjaFBhcmFtQ29udGFpbmVyT2JqKTsKCiAgICAgICAgICAgICRSZW1vdmVQYXJhbU9iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbU9iai5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICRQYXJhbU9iai5maW5kKCdvcHRpb25bdmFsdWU9IicgKyBQYXJhbU5hbWUgKyAnIl0nKQogICAgICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgIC52YWwoJFBhcmFtT2JqLmZpbmQoJ29wdGlvbjplbmFibGVkJykuZmlyc3QoKS5hdHRyKCd2YWx1ZScpKQogICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gVXBkYXRlUnVsZUNvdW50KCkgewogICAgICAgIHZhciAkUnVsZU51bWJlck9iaiA9ICQoJy5SdWxlTnVtYmVyOnZpc2libGUnKTsKCiAgICAgICAgJFJ1bGVOdW1iZXJPYmouZWFjaChmdW5jdGlvbiAoSW5kZXgsIEVsZW1lbnQpIHsKICAgICAgICAgICAgJChFbGVtZW50KS50ZXh0KEluZGV4ICsgMSk7CiAgICAgICAgfSk7CgogICAgICAgIFJ1bGVDb3VudCA9ICRSdWxlTnVtYmVyT2JqLmxlbmd0aDsKICAgIH0KCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZSB8fCB7fSkpOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpPVFJTQXBwb2ludG1lbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpPVFJTQnVzaW5lc3MucG0gLSBjb2RlIHRvIGV4ZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fQXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpOwogICAgJFNlbGYtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvbkFkZCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZS1pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9BcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCk7CiAgICAkU2VsZi0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uQWRkKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0FwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9BcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCkKClVwZGF0ZSBwb3NzaWJsZSBjaGFuZ2VzIG9uIHRoZSBjYWxlbmRhciBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MuCgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhIGxvY2FsIGFwcG9pbnRtZW50IG9iamVjdAogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgICMgdXBkYXRlIHRoZSBmdXR1cmUgdGFza3MKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgdXBkYXRlIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpCgpEZWxldGUgYWxsIGNhbGVuZGFyIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcy4KCj1jdXQKCnN1YiBfQXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGEgbG9jYWwgYXBwb2ludG1lbnQgb2JqZWN0CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9BcHBvaW50bWVudE5vdGlmaWNhdGlvbkFkZCgpCgpBZGQgYmFzaWMgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIGZvciByZW1pbmRlcnMuCgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUFwcG9pbnRtZW50Tm90aWZpY2F0aW9ucyA9ICgKICAgICAgICAnQXBwb2ludG1lbnQgcmVtaW5kZXIgbm90aWZpY2F0aW9uJyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVHlwZSAgICAgICA9PiBbJ0FwcG9pbnRtZW50J10sCiAgICAgICAgICAgICAgICBWaXNpYmxlRm9yQWdlbnQgICAgICAgID0+IFsxXSwKICAgICAgICAgICAgICAgIFZpc2libGVGb3JBZ2VudFRvb2x0aXAgPT4gWwogICAgICAgICAgICAgICAgICAgICdZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLicKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBFdmVudHMgICAgICAgICAgICAgICAgPT4gWydBcHBvaW50bWVudE5vdGlmaWNhdGlvbiddLAogICAgICAgICAgICAgICAgUmVjaXBpZW50cyAgICAgICAgICAgID0+IFsnQXBwb2ludG1lbnRBZ2VudFJlYWRQZXJtaXNzaW9ucyddLAogICAgICAgICAgICAgICAgU2VuZE9uT3V0T2ZPZmZpY2UgICAgID0+IFsxXSwKICAgICAgICAgICAgICAgIFRyYW5zcG9ydHMgICAgICAgICAgICA9PiBbJ0VtYWlsJ10sCiAgICAgICAgICAgICAgICBBZ2VudEVuYWJsZWRCeURlZmF1bHQgPT4gWydFbWFpbCddLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNZXNzYWdlID0+IHsKICAgICAgICAgICAgICAgICdkZScgPT4gewogICAgICAgICAgICAgICAgICAgICdCb2R5JyA9PiAnSGFsbG8gJmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRmlyc3RuYW1lJmd0Oyw8YnIgLz4KPGJyIC8+ClRlcm1pbiAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsgaGF0IHNlaW5lIEJlbmFjaHJpY2h0aWd1bmdzemVpdCBlcnJlaWNodC48YnIgLz4KPGJyIC8+CkJlc2NocmVpYnVuZzogJmx0O09UUlNfQVBQT0lOVE1FTlRfREVTQ1JJUFRJT04mZ3Q7PGJyIC8+ClN0YW5kb3J0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9MT0NBVElPTiZndDs8YnIgLz4KS2FsZW5kZXI6IDxzcGFuIHN0eWxlPSJjb2xvcjogJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7OyI+4pagPC9zcGFuPiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7PGJyIC8+ClN0YXJ0emVpdHB1bmt0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9TVEFSVFRJTUUmZ3Q7PGJyIC8+CkVuZHplaXRwdW5rdDogJmx0O09UUlNfQVBQT0lOVE1FTlRfRU5EVElNRSZndDs8YnIgLz4KR2FuenTDpGdpZzogJmx0O09UUlNfQVBQT0lOVE1FTlRfQUxMREFZJmd0OzxiciAvPgpXaWVkZXJob2x1bmc6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ0VyaW5uZXJ1bmc6IDxPVFJTX0FQUE9JTlRNRU5UX1RJVExFPicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2VuJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICdIaSAmbHQ7T1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UX1VzZXJGaXJzdG5hbWUmZ3Q7LDxiciAvPgo8YnIgLz4KYXBwb2ludG1lbnQgJnF1b3Q7Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7JnF1b3Q7IGhhcyByZWFjaGVkIGl0cyBub3RpZmljYXRpb24gdGltZS48YnIgLz4KPGJyIC8+CkRlc2NyaXB0aW9uOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4KTG9jYXRpb246ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0xPQ0FUSU9OJmd0OzxiciAvPgpDYWxlbmRhcjogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4KU3RhcnQgZGF0ZTogJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OzxiciAvPgpFbmQgZGF0ZTogJmx0O09UUlNfQVBQT0lOVE1FTlRfRU5EVElNRSZndDs8YnIgLz4KQWxsLWRheTogJmx0O09UUlNfQVBQT0lOVE1FTlRfQUxMREFZJmd0OzxiciAvPgpSZXBlYXQ6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ1JlbWluZGVyOiA8T1RSU19BUFBPSU5UTUVOVF9USVRMRT4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdodScgPT4gewogICAgICAgICAgICAgICAgICAgICdCb2R5JyA9PiAnS2VkdmVzICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDshPGJyIC8+CjxiciAvPgpBIGvDtnZldGtlesWRIGVzZW3DqW55IGVsw6lydGUgYXogw6lydGVzw610w6lzaSBpZGVqw6l0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDs8YnIgLz4KPGJyIC8+Ckxlw61yw6FzOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4KSGVseTogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7PGJyIC8+Ck5hcHTDoXI6IDxzcGFuIHN0eWxlPSJjb2xvcjogJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7OyI+4pagPC9zcGFuPiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7PGJyIC8+CktlemTDqXNpIGTDoXR1bTogJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OzxiciAvPgpCZWZlamV6w6lzaSBkw6F0dW06ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7PGJyIC8+CkVnw6lzeiBuYXBvczogJmx0O09UUlNfQVBQT0lOVE1FTlRfQUxMREFZJmd0OzxiciAvPgpJc23DqXRsxZFkw6lzOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9SRUNVUlJJTkcmZ3Q7PGJyIC8+CjxiciAvPgo8YSBocmVmPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyIgdGl0bGU9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7Ij4mbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OzwvYT48YnIgLz4KPGJyIC8+Ci0tICZsdDtPVFJTX0NPTkZJR19Ob3RpZmljYXRpb25TZW5kZXJOYW1lJmd0OycsCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnRUeXBlJyA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgICAgICAnU3ViamVjdCcgICAgID0+ICdFbWzDqWtlenRldMWROiA8T1RSU19BUFBPSU5UTUVOVF9USVRMRT4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdzcl9DeXJsJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICfQl9C00YDQsNCy0L4gJmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRmlyc3RuYW1lJmd0Oyw8YnIgLz4KPGJyIC8+CtCy0YDQtdC80LUg0ZjQtSDQt9CwINC+0LHQsNCy0LXRiNGC0LXRmtC1INGDINCy0LXQt9C4INGC0LXRgNC80LjQvdCwICZxdW90OyZsdDtPVFJTX0FQUE9JTlRNRU5UX1RJVExFJmd0OyZxdW90Oy48YnIgLz4KPGJyIC8+CtCe0L/QuNGBOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4K0JvQvtC60LDRhtC40ZjQsDogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7PGJyIC8+CtCa0LDQu9C10L3QtNCw0YA6IDxzcGFuIHN0eWxlPSJjb2xvcjogJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7OyI+4pagPC9zcGFuPiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7PGJyIC8+CtCU0LDRgtGD0Lwg0L/QvtGH0LXRgtC60LA6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDs8YnIgLz4K0JTQsNGC0YPQvCDQutGA0LDRmNCwOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9FTkRUSU1FJmd0OzxiciAvPgrQptC10LvQvtC00L3QtdCy0L3QvjogJmx0O09UUlNfQVBQT0lOVE1FTlRfQUxMREFZJmd0OzxiciAvPgrQn9C+0L3QsNCy0ZnQsNGa0LU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ9Cf0L7QtNGB0LXRgtC90LjQujogPE9UUlNfQVBQT0lOVE1FTlRfVElUTEU+JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnc3JfTGF0bicgPT4gewogICAgICAgICAgICAgICAgICAgICdCb2R5JyA9PiAnWmRyYXZvICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDssPGJyIC8+CjxiciAvPgp2cmVtZSBqZSB6YSBvYmF2ZcWhdGVuamUgdSB2ZXppIHRlcm1pbmEgJnF1b3Q7Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7JnF1b3Q7LjxiciAvPgo8YnIgLz4KT3BpczogJmx0O09UUlNfQVBQT0lOVE1FTlRfREVTQ1JJUFRJT04mZ3Q7PGJyIC8+Ckxva2FjaWplOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9MT0NBVElPTiZndDs8YnIgLz4KS2FsZW5kYXI6IDxzcGFuIHN0eWxlPSJjb2xvcjogJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7OyI+4pagPC9zcGFuPiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7PGJyIC8+CkRhdHVtIHBvxI1ldGthOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9TVEFSVFRJTUUmZ3Q7PGJyIC8+CkRhdHVtIGtyYWphOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9FTkRUSU1FJmd0OzxiciAvPgpDZWxvZG5ldm5vOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+ClBvbmF2bGphbmplOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9SRUNVUlJJTkcmZ3Q7PGJyIC8+CjxiciAvPgo8YSBocmVmPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyIgdGl0bGU9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7Ij4mbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OzwvYT48YnIgLz4KPGJyIC8+Ci0tICZsdDtPVFJTX0NPTkZJR19Ob3RpZmljYXRpb25TZW5kZXJOYW1lJmd0OycsCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnRUeXBlJyA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgICAgICAnU3ViamVjdCcgICAgID0+ICdQb2RzZXRuaWs6IDxPVFJTX0FQUE9JTlRNRU5UX1RJVExFPicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50Jyk7CgogICAgIyBHZXQgYWxsIG5vdGlmaWNhdGlvbnMgb2YgYXBwb2ludG1lbnQgdHlwZS4KICAgIG15ICVOb3RpZmljYXRpb25MaXN0ID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25MaXN0KAogICAgICAgIFR5cGUgPT4gJ0FwcG9pbnRtZW50JywKICAgICk7CiAgICBteSAlTm90aWZpY2F0aW9uTGlzdFJldmVyc2UgPSByZXZlcnNlICVOb3RpZmljYXRpb25MaXN0OwoKICAgIE5FV05PVElGSUNBVElPTjoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uTmFtZSAoIHNvcnQga2V5cyAlQXBwb2ludG1lbnROb3RpZmljYXRpb25zICkgewoKICAgICAgICAjIERvIG5vdCBhZGQgbmV3IG5vdGlmaWNhdGlvbiBpZiBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0cy4KICAgICAgICBuZXh0IE5FV05PVElGSUNBVElPTiBpZiAkTm90aWZpY2F0aW9uTGlzdFJldmVyc2V7JE5vdGlmaWNhdGlvbk5hbWV9OwoKICAgICAgICAjIEFkZCBuZXcgZXZlbnQgbm90aWZpY2F0aW9uLgogICAgICAgIG15ICRJRCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICROb3RpZmljYXRpb25OYW1lLAogICAgICAgICAgICBEYXRhICAgID0+ICRBcHBvaW50bWVudE5vdGlmaWNhdGlvbnN7JE5vdGlmaWNhdGlvbk5hbWV9LT57RGF0YX0sCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJEFwcG9pbnRtZW50Tm90aWZpY2F0aW9uc3skTm90aWZpY2F0aW9uTmFtZX0tPntNZXNzYWdlfSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRJRDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwczovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTMuMC50eHQ+LgoKPWN1dAo=
JVBERi0xLjQKJaqrrK0KMSAwIG9iago8PAovQ3JlYXRvciAoQXBhY2hlIEZPUCBWZXJzaW9uIDIuMSkKL1Byb2R1Y2VyIChBcGFjaGUgRk9QIFZlcnNpb24gMi4xKQovQ3JlYXRpb25EYXRlIChEOjIwMTkwNDA5MDcxMDQzWikKPj4KZW5kb2JqCjIgMCBvYmoKPDwKICAvTiAzCiAgL0xlbmd0aCAzIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nO2ZZ1BUWRaA73uvc6Chu2kyNDlJlNCA5JwkSBYV6G4yLTQ5mJDBERhBRCQpgogCDjg6BBlFRRQDoqCAeRoZBJRxcBRRUVnAH7NVu7VbW7W1f7bPj/e+OufWO+e+ulXvq3oAyJDi2QnJsD4ACbwUvq+zHTMoOISJvQ9wgAxIgAow4ezkRFtvbw+wHCtrwT/E+1EArdzv6fzz+r8MEieBxwEAoi9zLIebzF7mncsczUngrOSnVzg9JTEFANh7men85QGXmbPCEd84Y4WjvnHR6ho/X/tlPgoAjhS1yoRTKxyxytSuFWZH8xMAkO5bXq/CTuQvP196pZfitxlWQ3RlP8woLo/LD0/hcpj/4db+ffxdL3Ty8sv/rzf4H/dZOTvf6K3l6pmAGBV/5baWAcB6DQBS8ldO5TAAlN0AdPT8lYs4DkBnCQCSz9ip/LRvOdTq7IAAKIAOpIA8UAYaQAcYAlNgAWyAI3ADXsAPBIPNgA2iQQLgg3SQA3aBfFAISsBBUAVqQQNoAq3gDOgE58FlcA3cAnfBCHgMBGASvAJz4D1YhCAIC5EhGiQFKUCqkDZkCLEgK8gR8oB8oWAoDIqCeFAqlAPthgqhUqgKqoOaoJ+gc9Bl6AY0BD2ExqEZ6E/oE4zAJJgOy8FqsB7Mgm1hd9gP3gRHwUlwFpwH74Mr4Hr4FNwBX4ZvwSOwAH4FzyMAISIMRBHRQViIPeKFhCCRCB/ZjhQg5Ug90op0I/3IPUSAzCIfURgUDcVE6aAsUC4ofxQblYTajipCVaFOojpQfah7qHHUHOormoyWRWujzdGu6CB0FDodnY8uRzei29FX0SPoSfR7DAbDwKhjTDEumGBMLCYbU4Q5jGnDXMIMYSYw81gsVgqrjbXEemHDsSnYfGwl9hT2InYYO4n9gCPiFHCGOCdc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IG9iagpbL0lDQ0Jhc2VkIDIgMCBSXQplbmRvYmoKNSAwIG9iago8PAogIC9UeXBlIC9NZXRhZGF0YQogIC9TdWJ0eXBlIC9YTUwKICAvTGVuZ3RoIDYgMCBSCj4+CnN0cmVhbQo8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPgo8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgo8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgcmRmOmFib3V0PSIiPgo8ZGM6Zm9ybWF0PmFwcGxpY2F0aW9uL3BkZjwvZGM6Zm9ybWF0Pgo8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgo8ZGM6ZGF0ZT4yMDE5LTA0LTA5VDA3OjEwOjQzWjwvZGM6ZGF0ZT4KPC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24geG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIiByZGY6YWJvdXQ9IiI+CjxwZGY6UHJvZHVjZXI+QXBhY2hlIEZPUCBWZXJzaW9uIDIuMTwvcGRmOlByb2R1Y2VyPgo8cGRmOlBERlZlcnNpb24+MS40PC9wZGY6UERGVmVyc2lvbj4KPC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24geG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiByZGY6YWJvdXQ9IiI+Cjx4bXA6Q3JlYXRvclRvb2w+QXBhY2hlIEZPUCBWZXJzaW9uIDIuMTwveG1wOkNyZWF0b3JUb29sPgo8eG1wOk1ldGFkYXRhRGF0ZT4yMDE5LTA0LTA5VDA3OjEwOjQzWjwveG1wOk1ldGFkYXRhRGF0ZT4KPHhtcDpDcmVhdGVEYXRlPjIwMTktMDQtMDlUMDc6MTA6NDNaPC94bXA6Q3JlYXRlRGF0ZT4KPC9yZGY6RGVzY3JpcHRpb24+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L0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjU3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNjY3LjYyOSAxNTUuNzU0IDY3Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2NjcuNjI5IDUzOS45OTggNjc3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1NiAwIFIKL0ggL0kKCj4+CmVuZG9iago1OSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDcwMC44IG51bGxdCj4+CmVuZG9iago2MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2NTUuNjI5IDI5NC42NzcgNjY1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1OSAwIFIKL0ggL0kKCj4+CmVuZG9iago2MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDY1NS42MjkgNTM5Ljk5OCA2NjUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDU5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjYyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgNjI0LjI3IG51bGxdCj4+CmVuZG9iago2MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2NDMuNjI5IDIyMS40ODcgNjUzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2MiAwIFIKL0ggL0kKCj4+CmVuZG9iago2NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDY0My42MjkgNTM5Ljk5OCA2NTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDYyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjY1IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgNDc3LjY5IG51bGxdCj4+CmVuZG9iago2NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2MzEuNjI5IDMxNy41OTMgNjQxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2NSAwIFIKL0ggL0kKCj4+CmVuZG9iago2NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDYzMS42MjkgNTM5Ljk5OCA2NDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDY1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjY4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgMjI3LjAxIG51bGxdCj4+CmVuZG9iago2OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2MTkuNjI5IDI0MS45NzYgNjI5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2OCAwIFIKL0ggL0kKCj4+CmVuZG9iago3MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDYxOS42MjkgNTM5Ljk5OCA2MjkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDY4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjcxIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgMTI2LjQ4IG51bGxdCj4+CmVuZG9iago3MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2MDcuNjI5IDE4MC41NiA2MTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDcxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjczIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNjA3LjYyOSA1MzkuOTk4IDYxNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNzEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNzQgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzEgMCBSIC9YWVogNzIuMCA2NjIuMCBudWxsXQo+PgplbmRvYmoKNzUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTk1LjYyOSAzNTkuNTU1IDYwNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNzYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA1OTUuNjI5IDUzOS45OTcgNjA1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA3NCAwIFIKL0ggL0kKCj4+CmVuZG9iago3NyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszMSAwIFIgL1hZWiA3Mi4wIDU0OS42IG51bGxdCj4+CmVuZG9iago3OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1ODMuNjI5IDI2OS4zNzIgNTkzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA3NyAwIFIKL0ggL0kKCj4+CmVuZG9iago3OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg4IDU4My42MjkgNTQwLjM0OCA1OTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDc3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjgwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMxIDAgUiAvWFlaIDcyLjAgNDcxLjIgbnVsbF0KPj4KZW5kb2JqCjgxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU3MS42MjkgMjYzLjMwOSA1ODEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDgwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjgyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODggNTcxLjYyOSA1NDAuMzQ4IDU4MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODAgMCBSCi9IIC9JCgo+PgplbmRvYmoKODMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzEgMCBSIC9YWVogNzIuMCAzMDQuOCBudWxsXQo+PgplbmRvYmoKODQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTU5LjYyOSAzNTMuOTE4IDU2OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODMgMCBSCi9IIC9JCgo+PgplbmRvYmoKODUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA1NTkuNjI5IDUzOS45OTggNTY5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA4MyAwIFIKL0ggL0kKCj4+CmVuZG9iago4NiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszNCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago4NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDU0Ny42MjkgMjA0Ljk3NiA1NTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDg2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjg4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNTQ3LjYyOSA1MzkuOTk4IDU1Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODYgMCBSCi9IIC9JCgo+PgplbmRvYmoKODkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzQgMCBSIC9YWVogNzIuMCA3MDAuOCBudWxsXQo+PgplbmRvYmoKOTAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTM1LjYyOSAxNzMuNDA4IDU0NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODkgMCBSCi9IIC9JCgo+PgplbmRvYmoKOTEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA1MzUuNjI5IDUzOS45OTggNTQ1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA4OSAwIFIKL0ggL0kKCj4+CmVuZG9iago5MiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszNCAwIFIgL1hZWiA3Mi4wIDYyNi40IG51bGxdCj4+CmVuZG9iago5MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1MjMuNjI5IDE2NC45MTMgNTMzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA5MiAwIFIKL0ggL0kKCj4+CmVuZG9iago5NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuODA3IDUyMy42MjkgNTQwLjE2NyA1MzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDkyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjk1IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzM0IDAgUiAvWFlaIDcyLjAgNTU4LjAgbnVsbF0KPj4KZW5kb2JqCjk2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDUxMS42MjkgMjA5LjU1MiA1MjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDk1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjk3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNTExLjYyOSA1MzkuOTk4IDUyMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgOTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKOTggMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzQgMCBSIC9YWVogNzIuMCA0ODkuNiBudWxsXQo+PgplbmRvYmoKOTkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDk5LjYyOSAyMjEuNzk0IDUwOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgOTggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTAwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNDk5LjYyOSA1MzkuOTk4IDUwOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgOTggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTAxIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQwIDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjEwMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDQ4Ny42MjkgMTQ5LjM5IDQ5Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTAxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwMyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQ4Ny42MjkgNTM5Ljk5OCA0OTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEwMSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMDQgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDAgMCBSIC9YWVogNzIuMCA2NzguOCBudWxsXQo+PgplbmRvYmoKMTA1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQ3NS42MjkgMTk5LjAwNiA0ODUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEwNCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMDYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA0NzUuNjI5IDUzOS45OTggNDg1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMDQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTA3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQwIDAgUiAvWFlaIDcyLjAgNjAyLjQgbnVsbF0KPj4KZW5kb2JqCjEwOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0NjMuNjI5IDE5NC42NDEgNDczLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMDcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTA5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNDYzLjYyOSA1MzkuOTk4IDQ3My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTA3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjExMCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iagoxMTEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA0NTEuNjI5IDE2MS43ODQgNDYxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMTAgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTEyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNDUxLjYyOSA1MzkuOTk4IDQ2MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTEwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjExMyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDY2Ny42NTIgbnVsbF0KPj4KZW5kb2JqCjExNCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0MzkuNjI5IDMzNS45OTQgNDQ5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMTMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTE1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNDM5LjYyOSA1MzkuOTk3IDQ0OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTEzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjExNiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDYwNS40NjcgbnVsbF0KPj4KZW5kb2JqCjExNyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0MjcuNjI5IDQxNy45NTkgNDM3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMTYgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTE4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNDI3LjYyOSA1MzkuOTk4IDQzNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTE2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjExOSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDU0My4yODIgbnVsbF0KPj4KZW5kb2JqCjEyMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0MTUuNjI5IDM0Ni41MzIgNDI1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMTkgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTIxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNDE1LjYyOSA1MzkuOTk4IDQyNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTE5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyMiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDQ4MS4wOTcgbnVsbF0KPj4KZW5kb2JqCjEyMyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0MDMuNjI5IDM0NC42NiA0MTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEyMiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMjQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA0MDMuNjI5IDUzOS45OTcgNDEzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTI1IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQzIDAgUiAvWFlaIDcyLjAgNDE4LjkxMiBudWxsXQo+PgplbmRvYmoKMTI2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDM5MS42MjkgMzkxLjkxMyA0MDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEyNSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMjcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAzOTEuNjI5IDUzOS45OTcgNDAxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTI4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQzIDAgUiAvWFlaIDcyLjAgMzU2LjcyNyBudWxsXQo+PgplbmRvYmoKMTI5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDM3OS42MjkgNDExLjUzNSAzODkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEyOCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMzAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAzNzkuNjI5IDUzOS45OTcgMzg5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTMxIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQzIDAgUiAvWFlaIDcyLjAgMjk0LjU0MiBudWxsXQo+PgplbmRvYmoKMTMyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDM2Ny42MjkgMzYwLjI5OCAzNzcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEzMSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMzMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAzNjcuNjI5IDUzOS45OTcgMzc3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTM0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQzIDAgUiAvWFlaIDcyLjAgMjMyLjM1NyBudWxsXQo+PgplbmRvYmoKMTM1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDM1NS42MjkgMzUyLjYxOCAzNjUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEzNCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMzYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAzNTUuNjI5IDUzOS45OTcgMzY1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTM3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQzIDAgUiAvWFlaIDcyLjAgMTQ2LjE3MiBudWxsXQo+PgplbmRvYmoKMTM4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDM0My42MjkgMzEzLjE1NSAzNTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEzNyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMzkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAzNDMuNjI5IDUzOS45OTcgMzUzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjE0MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzMzEuNjI5IDM1Ni44NzMgMzQxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDAgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODcgMzMxLjYyOSA1NDAuMzQ3IDM0MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0MyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDY2Mi4zNSBudWxsXQo+PgplbmRvYmoKMTQ0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDMxOS42MjkgMjk4LjA2NCAzMjkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE0MyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNDUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCAzMTkuNjI5IDUzOS45OTggMzI5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQ2IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2IDAgUiAvWFlaIDcyLjAgNTk4LjkyNSBudWxsXQo+PgplbmRvYmoKMTQ3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDMwNy42MjkgMzkyLjI5MiAzMTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE0NiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNDggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjgwNyAzMDcuNjI5IDU0MC4xNjcgMzE3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDYgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQ5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2IDAgUiAvWFlaIDcyLjAgNDk5LjUgbnVsbF0KPj4KZW5kb2JqCjE1MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyOTUuNjI5IDUwNy44MjYgMzA1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDkgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTUxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC4wNDUgMjk1LjYyOSA1NDAuNDA1IDMwNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQ5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1MiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDQwOS42NzUgbnVsbF0KPj4KZW5kb2JqCjE1MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyODMuNjI5IDQ3NS4xMjQgMjkzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTU0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODcgMjgzLjYyOSA1NDAuMzQ3IDI5My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTUyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDMxOS44NSBudWxsXQo+PgplbmRvYmoKMTU2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDI3MS42MjkgNDc5LjYwNiAyODEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE1NSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNTcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4OCAyNzEuNjI5IDU0MC4zNDggMjgxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTU4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2IDAgUiAvWFlaIDcyLjAgMjMwLjAyNSBudWxsXQo+PgplbmRvYmoKMTU5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDI1OS42MjkgNDc4Ljg2OSAyNjkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE1OCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4NyAyNTkuNjI5IDU0MC4zNDcgMjY5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTYxIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2IDAgUiAvWFlaIDcyLjAgMTQwLjIgbnVsbF0KPj4KZW5kb2JqCjE2MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyNDcuNjI5IDQ4MS41NzkgMjU3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNjEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTYzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODcgMjQ3LjYyOSA1NDAuMzQ3IDI1Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTYxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2NCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDcwOC4wIG51bGxdCj4+CmVuZG9iagoxNjUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjM1LjYyOSA0MDguODU3IDI0NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTY0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg3IDIzNS42MjkgNTQwLjM0NyAyNDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2NCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA2MzAuNDk4IG51bGxdCj4+CmVuZG9iagoxNjggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjIzLjYyOSA0NDguMTIgMjMzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNjcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTY5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMjIzLjYyOSA1MzkuOTk3IDIzMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTY3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3MCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDU2NC45OTYgbnVsbF0KPj4KZW5kb2JqCjE3MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyMTEuNjI5IDI1MS4wMjEgMjIxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzAgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTcyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMjExLjYyOSA1MzkuOTk3IDIyMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTcwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3MyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDQ5OS40OTQgbnVsbF0KPj4KZW5kb2JqCjE3NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxOTkuNjI5IDQzMy43ODcgMjA5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTc1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMTk5LjYyOSA1MzkuOTk3IDIwOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTczIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3NiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDQzMy45OTIgbnVsbF0KPj4KZW5kb2JqCjE3NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxODcuNjI5IDQ3NS4zMTMgMTk3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzYgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTc4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODggMTg3LjYyOSA1NDAuMzQ4IDE5Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTc2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3OSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDM0Mi4wOSBudWxsXQo+PgplbmRvYmoKMTgwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDE3NS42MjkgMzg2Ljc4NCAxODUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE3OSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4NyAxNzUuNjI5IDU0MC4zNDcgMTg1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzkgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTgyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ5IDAgUiAvWFlaIDcyLjAgMjI4LjU4OCBudWxsXQo+PgplbmRvYmoKMTgzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDE2My42MjkgMzkwLjM0IDE3My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTgyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE4NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg3IDE2My42MjkgNTQwLjM0NyAxNzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4MiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCAxMTUuMDg2IG51bGxdCj4+CmVuZG9iagoxODYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMTUxLjYyOSA0MTcuNTIxIDE2MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTg1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE4NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDE1MS42MjkgNTM5Ljk5NyAxNjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4NSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODggMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCA3MDguMCBudWxsXQo+PgplbmRvYmoKMTg5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDEzOS42MjkgNDEzLjAxOSAxNDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4OCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxOTAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAxMzkuNjI5IDUzOS45OTcgMTQ5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTkxIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgNjMxLjUwMSBudWxsXQo+PgplbmRvYmoKMTkyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDEyNy42MjkgNDQyLjkyMyAxMzcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE5MSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxOTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjI4NyAxMjcuNjI5IDU0MC42NDcgMTM3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTk0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgNTU1LjAwMiBudWxsXQo+PgplbmRvYmoKMTk1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDExNS42MjkgNDI0LjI3NCAxMjUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE5NCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxOTYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAxMTUuNjI5IDUzOS45OTcgMTI1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTk3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgNDc4LjUwMyBudWxsXQo+PgplbmRvYmoKMTk4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDEwMy42MjkgNDAyLjExMiAxMTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE5NyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxOTkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAxMDMuNjI5IDUzOS45OTcgMTEzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMjAwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgNDAyLjAwNCBudWxsXQo+PgplbmRvYmoKMjAxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDkxLjYyOSA0MDIuMTEyIDEwMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMjAwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDkxLjYyOSA1MzkuOTk3IDEwMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMjAwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwMyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDMyNS41MDUgbnVsbF0KPj4KZW5kb2JqCjIwNCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA3OS42MjkgMzU2LjA0NSA4OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMjAzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDc5LjYyOSA1MzkuOTk3IDg5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAyMDMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMjA2IDAgb2JqCjw8IC9M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/5wD3PWX//7tP//wP35w3/7DD//wj/bT/2I/z9/+1w/zGF8+5j/Z6Z8XMH8tnu0o9ypf/+mOvypneMBxdu7bf/vhpz/+8Pff7Tv17tsf/+txk151lnK3b94bCAuCUO/FDNYw7vE2hQTvqfL7vin43/8G4/04FwplbmRzdHJlYW0KZW5kb2JqCjIwNyAwIG9iagoyMjU3MwplbmRvYmoKMjA4IDAgb2JqClsKNTQgMCBSCjU1IDAgUgo1NyAwIFIKNTggMCBSCjYwIDAgUgo2MSAwIFIKNjMgMCBSCjY0IDAgUgo2NiAwIFIKNjcgMCBSCjY5IDAgUgo3MCAwIFIKNzIgMCBSCjczIDAgUgo3NSAwIFIKNzYgMCBSCjc4IDAgUgo3OSAwIFIKODEgMCBSCjgyIDAgUgo4NCAwIFIKODUgMCBSCjg3IDAgUgo4OCAwIFIKOTAgMCBSCjkxIDAgUgo5MyAwIFIKOTQgMCBSCjk2IDAgUgo5NyAwIFIKOTkgMCBSCjEwMCAwIFIKMTAyIDAgUgoxMDMgMCBSCjEwNSAwIFIKMTA2IDAgUgoxMDggMCBSCjEwOSAwIFIKMTExIDAgUgoxMTIgMCBSCjExNCAwIFIKMTE1IDAgUgoxMTcgMCBSCjExOCAwIFIKMTIwIDAgUgoxMjEgMCBSCjEyMyAwIFIKMTI0IDAgUgoxMjYgMCBSCjEyNyAwIFIKMTI5IDAgUgoxMzAgMCBSCjEzMiAwIFIKMTMzIDAgUgoxMzUgMCBSCjEzNiAwIFIKMTM4IDAgUgoxMzkgMCBSCjE0MSAwIFIKMTQyIDAgUgoxNDQgMCBSCjE0NSAwIFIKMTQ3IDAgUgoxNDggMCBSCjE1MCAwIFIKMTUxIDAgUgoxNTMgMCBSCjE1NCAwIFIKMTU2IDAgUgoxNTcgMCBSCjE1OSAwIFIKMTYwIDAgUgoxNjIgMCBSCjE2MyAwIFIKMTY1IDAgUgoxNjYgMCBSCjE2OCAwIFIKMTY5IDAgUgoxNzEgMCBSCjE3MiAwIFIKMTc0IDAgUgoxNzUgMCBSCjE3NyAwIFIKMTc4IDAgUgoxODAgMCBSCjE4MSAwIFIKMTgzIDAgUgoxODQgMCBSCjE4NiAwIFIKMTg3IDAgUgoxODkgMCBSCjE5MCAwIFIKMTkyIDAgUgoxOTMgMCBSCjE5NSAwIFIK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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8GXgT8+FCmVuZHN0cmVhbQplbmRvYmoKMjM2IDAgb2JqCjEyOTMKZW5kb2JqCjIzNyAwIG9iago8PAogIC9OYW1lIC9JbTE0CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDIzOCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxOTEwCiAgL0hlaWdodCA2ODcKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCAyIDAgUl0KICAvU01hc2sgMjM1IDAgUgo+PgpzdHJlYW0KeJzsve2PHOd9rsnsP3D+geB8OED2W2BsRieAz0nixR6cYx8ICILEjjjMBgm4UOKVEyQ4iVaSSQoQFoeOsUpiOeuVxyJFWtCLHb1aJiV5GJKa2ImkiJJIk5KoJfVmw5GjVUYcUUOKpMbcrqp+qeqq6n76V0/1/eue64Is91RXX1XdfT/d6rufeebqVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIB6HvvdLTk+8eVTITc69eVPTLD3hKfyu4/F9fWI5p3w+FM/LgAAAAAAAAAAAMAUGKpgw1tm/w1z9V2LfcZB50DDDAAAAAAAAAAAAHNHtyXOla69LeN7WOcNc/+O5FS9ynmqHTMAAAAAAAAAAADAXFJZ5ybVbKGC7Xe1xZ3LDXNuznBu62C/wfV1/t99rHRKhYnI/dv1pL/7u8MVefFmddsTf3axfP7D93DohEqH/kTN45DepPwQVz1KQ6cydKPuEZkHDQAAAAAAAAAAAI4IaS6L9XK+Fy02zBX7db0V1wRfW7HORXbN8M2G70P9BOv6irnY65YPXXNPe614tacorXuUis9E/9CF+0rBDAAAAAAAAAAAAJ4IWJEiazd75WnhBoUSt7JkzX4cXq6i15/mq9VSA5uvZ4vXVUvD71q+ry2cdeGHoVY3/2PFoes9VXVz1aNUeYDCY0vBDAAAAAAAAAAAAK6YZM3j/JTecsNc8zf18oXpYDpx7rC1K22UF+7oUWiYaxdUDmuY8x1vVcE8TL4MLhy6zlO5YsaoR6lzuVvqf6JX7ZcW8wAAAAAAAAAAAABwQMjyC1WtaHDDXN3IjmyYC+dUVfSGNcxBq2RczfXBxR63pmGuOed6T1DDnL9HPcMnvvxY+nNpCQ4AAAAAAAAAAAAAJ1TP9E22Dq1aUVgAor5hruyqRzXMo//aXmE9jcpVMuqL14C/9Jf7uftn+0p/SLBKX31dtWfcX/0re0tzlz/xiZH3EwAAAAAAAAAAAEDFUIOc21LVHI9ofIuF7ugyOC8dtQ5z9Z8SDGyYh+5I4ciFkjc3Xbk8lXronlev+jHKU/ln/yr/VGJhivPQlGcKZgAAAAAAAAAAAHDJqBWH666taJir9qz6C30J1bV1xW0rrwptmGvVwzeqqqIrb1xTDI/2FO9s/aNUOOTQGiEUzAAAAAAAAAAAAOCYYpta17T2/wpdzVzeQn06KE7HNMxDh6hrZIf+5l1Qw1y+a5UrVNS68rct3c3y7iMWaC4/HJWnM7S0x9BEagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICfAkAAjCMAAAAAAAAAANg80DADxIVxBAAAAAAAAAAAmwcaZoC4MI4AAAAAAAAAAGDzQMMMEBfGEQAAAAAAAAAAbB5omAHiwjgCAAAAAAAAAIDNAw0zQFwYRwAAAAAAAAAAsHmgYQaIC+MIAAAAAAAAAAA2DzEb5idu+/Snr7/rxUkO/+Jd13/6tiesJw/gkEbjKBkRPUaPjKZjpzNcJxytAAAAAAAAAAAAJeI1zGnhddtt40svWmWYa+zjKPmOpj800q55xEChYQYAAAAAAAAAAAdEa5izviuk9aJhhrnGOo4K/XJCMlLqS2AaZgAAAAAAAAAAcECshrlfdw33Vrnf+u9dn5HulW/JBnv2BOm1d/U2D7R9BxUZ+MM4jkoFc+na4uoZhYa5f3V+NI0cO8nvG/Q2V8qvv+2268cu1QEAAAAAAAAAAJudSA3zE4W2qthndSuqfiE23Cpnl3N79i+mnXNXNri+7lgALrA3zLVhHhodQ9/OFC9lktqxk9uze32dnHIZAAAAAAAAAADGE6dhrmuVK0uzyoZ5eEJmv+YqzGce7qIB/NFCw1y1n2HsDI/T8vGqbg4AAAAAAAAAAFBPjIY5txBG8Xftq2uqyoa5UHf1tlbPdv5p/rf6qZrBG/aGeUScC4Os3DDnqVx/pjeeKhvmEXIAAAAAAAAAAICRRGiYy2VUv8mKMIe5smH+6WBHejBwhvWbmnKae1sK1fDoOcw9xn+PUzlduWroAQAAAAAAAAAA1NO8Ya5seXtF1dA6zGFrXxTWYa7sovN/oYweDHxhbZgLayePWim5fh3m8NXOB/YxcgAAAAAAAAAAgFE0bphrVo8t/rW+4ooW3U1V62Dkfk//p/VzmAeLZLBULLjD3DAnDLKd//IkPzaeqFhDZnCzcWOnZ7r+rrt6I3esHAAAAAAAAAAAoJbGDTMAFGAcAQAAAAAAAADA5oGGGSAujCMAAAAAAAAAANg80DADxIVxBAAAAAAAAAAAmwcaZoC4MI4AAAAAAAAAAGDzQMMMEBfGEQAAAAAAAAAAbB5omAHiwjgCAAAAAAAAAIDNAw0zQFwYRwAAAAAAAAAAsHmgYQaIC+MIAAAAAAAAAAA2D+EN8zoABMA4AgAAAAAAAACAzQMNM0BcGEcAAAAAAAAAALB5oGEGiAvjCAAAAAAAAAAANg80zABxYRwBAAAAAAAAAMDmgYYZIC6MIwAAAAAAAAAA2DzQMAPEhXEEAAAAAAAAAACbBxpmgLgwjgAAAAAAAAAAYPNAwwwQF8M4+jDlvA8++OCD/r83yTlkj7//p0bLiEdp7tk8MdjMzzIAAAAAAAQi/4g0K59cpvNATbNCGfHIN2+YjwFsGkJeQCYdR9mrjfqedXn++ef/6Z/+aROeQ/Y66fmpkbO06VE/A1OiciwAAAAAAABkePik/OCDD37PE8IHavoVSt1nxigNc7gEYHY51lrD/MEHH3Tkaw44d+7c6uqq9mSmfw6dY3WegsqG2c9TI2dpaengwYOdt87Dhw8fPXp0pcfTKfnL5R/dMvq0O3fzyJEjnbv8xBNPdO6++hmYBnVjAQAAAAAAIMPDJ+UHH3zw3ZT/zwEjGuYpPFBTrlBGfGYMr9fqopU1zKsAc017DfP58+ezQaq+iwnvvfde5yVaezLTP4fspbjzRHh+auQsLS113jeffvrpZ5555vnnn39hE9C5m507u7Ky0rnjnbuvfgamQd1YAAAAAAAAyPDwSfnBBx/8l3/5F+cN83QeqClXKCM+M9IwA4TQasN87tw5JzVm56Wp8yotb5infA6dY3WegsqG2c9TI2dpaenw4cPPPPPM8ePHX3755VdfffV0Y15rmYan98orr3TubOcuHzlyZPM0zJVjAQAAAAAAIMPDJ+VZaZin8EBNuUIZ8ZmRhhkgBBrmOT4HGuYQlpaWjh49+vzzz7/88stnz559a9554403zpw588orr3TucueO0zADAAAAAACs+/ikTMPch4YZYLagYZ7jc6BhDmFpaWllZeWFF1549dVX33rrrR/PO2+//fYbb7zx2muvde7y008/TcMMAAAAAACw7uOTMg1zn03TML9z9uTx135c3HDy7DvTuNMAMaFhnuNzoGEOYWlp6emnn37hhRdOnz6dNcw/mWs6d7BzN7OGeWVlhYYZAAAAAABg3ccnZRrmPpukYf7+X332V//n//yr//m//e3ZbMN3d3Z+6vyz87vTueMAsaBhnuNzoGEOoT+HmYZ5jqFhBgAAAACA0Xj4pEzD3Gf+G+Zk8vLxPX+08OePHf+bz/7Gfz94POXuP/rs3xzvbPiju48fn9mpzCfuvG5h4eaDlT9N6/AptUft7HLdnScm107zbswcM98wh6Wi9ZemgNPYRA2zZajKTqDFOczPffVzn/vqc9F0cQ49vYZZHoMcNMwAADF57Z7Pf/rTn959pLQppbA9ln/9yO6e//P3vFZ7y8Fe4/YcvlndWeeM+V1G3l/z+Z/9x8ceO3Tip+vrPz1xqHupeOVjj/3j2eJN0j1LWwEAwMJcNcynD/7lXx48TcMczPQb5mf+6rNZC/pnDz1zR/diymfveKa34bN/9cx07n5kTu7Ztm3b4o6sjT3x9cXOTzuXp3TspAde3Pdm+oSs7FyoaSWSM9xzcjJz5zYLU7sbs4isYc6+Usi1/wdvXqh75qtvnu0clooxL035Kiw5sf4PnZMK+4Ii4DTGn0PuFSXK1yKmhrl4HinX3XzzZFVh9mgYCsbppiKjpmF+7qufG34cPnfjjZM1xi8sLS4uvWDomfM3SU6k/8OjNy7c+Gj4oauuCWuYHcRgKmMBAAAmZdCU5hrUYrHbqGS2+3Ol70QtcyavVA4ft7fXiPNp8vikbXFSFlcUzFm/XOySe9tomAEA4hBQnPY+q7Q2l6amYT598C9vGmJMf3zme1/5yvfO+GuYf/jwjt/65K//95Xxe1oa5pW/+K1fufbP7/+h4cQEDXOvVr7292/43Kdyn4E/+evbt//6J3tls+G+6EnagH379n4jHSZP7ti1b1+vYR6eXtz5+eabby5++K+Ygnww2+XmOzu7H8xvKVUGSZ+9//WLa+kP62fePHr6ZJWz3xoNeUacz3W37Og1zBX3ImlMsp8HV7qZczclZA1z8mzeeuvi1u7jfeLOrcmXGsHfIPTDEKVhXju0a2HHk9mJpF+u9H74xuK2va9OdD7mc0gM+7NvWa6+uX8xRrFmapjXLm50z6F/PhuXL29sdMdnENmj0TFNdKvVaacio98wv/baa7mG+d3zV4YfhysXL165cv7d8KI4q3k7polulRz8qV0LX3w8vfjc1zqPwWLvhzsXt+35Yfihq64Ja5jlMZjSWAAAgEnodrif//znCzVpd3P284i+1uovOOv8vX653OsOOuZ8B53tV2ylh62ZILt97k7W3t8m57+e75XT6jjXGmcTlQtdcnfToUOHaJgBAGIRUJymH5SST0mTzn4MpaZhXv3w0scJ7xz5yleOvJNevPTh6qw1zG8/8eWtv7aw8KkbHnj9w/F7WxrmD19/4E/+0y8v/NrWLz/x9oQnJ2mYP/Xbf3xLws23VLL92llumPcc2rPj6ydWVw/uWNx7aE/WMCclTza9eOXWhXSKczov+HB+S3mfpAVeTDuCwzsW0o73xJ3Xbd2blQYrO4uNwZM7FnYd6lcQa2vra2s1x81mxA15Ks9nYddKZ8Prexd7R6+6F4t7X+9subx+8JZs9861uxZu2VSLalxVNsx7D+/btpgEbjV5Bvbt675KD30ZkM6BvPPm4qatvW8EbtnRudXXa7676DPupWn98K2L/S9Xjh7d1f9h277Ta4VTuq5ffha2FL7+qP6aIqBh7r1Jdd613tyf9ay56ZyZNr/wS+dgo74SabRKRv58smmogy9lOifQPa/umVQ+GoNbDT19VY/n4KDTS0VGTcNcVdVmU4uTf994YzrD+cZHu1OduxOLBxOf01nH+TnM6b+/emP36ur9B7x/6NbFO9Mtj39x15Eju/o/LN798ruVN6w89E/SWc9F+WSrZMhiMKWxAAAAk/DaPZ9P69ahlrT4Y/pT8PoUwf4xxqzcHd4pv7U8xblzgJENc9E5OIva+2s+/1yDnKc7i7m7EMaJwnoYnY2DMpqGGQAgCqHFafm3NUd/VsptH/v5dMwqGUO98WBq8z3PDm+56aZ0z9yGbNZzsqG397P3jJwKHbNh/ucX7/mTT/9yUi9/662NSx8E3MK0SsYHlz5+61s3fGph4Zc//Sf3vPjPE9xS0jB/9qsvXhnBo38+0w3zq4d27nhy9cQ3du47/Wq3Ye58wH99T6+5SYu3tAVKJ3a+undbuqW8TzL5M+vm1g/fmna8T+5YyNFt8DKWd1asZFF93D0ny57S+aRzos+sp5Kj2dGrbdkZprfrDvXly1cvr7f/YPtB2jDvefXi0aTST/r//WdOZ7VSUtFmfX8ye7Hz4pt8F7Cw4/DV7vcDSde0dvH17tTKjTN7S9dWMPalKYnO19Pg7tz76vrhXYvZNy3ZVx+dU9pxNLufb+5Ly67Slv5bzMLOlavVUzYnaJhXB9Oqe3NJ+99+pJnufo2zY+HWoyOmh0ZrmLPL/S9lOo/zwtY9r/cf8JpHY3CroSeo/HgWDjq1VGRM0DBnlzv/XljcczZ7HH57Kbtw3VefS8rcLx7p3q+7t/72V5/r79+91cIXD/VOqXL/3GF/uGdx69eeS2Yt79jzw/cP7Up/ePTmhV1PvfuTihvWHDqpnXesXC1MobY3zNONwXTGAgAAWBjZoDaZxDzKv3v356uL4FFHHWwuTDwOnVU8LMru5Nj7azj/9dwaGYPlmNfXcxVy9YrLNMwAAPGYrGEO/6w0mN+YXTWqY56kYX72nptueuBkd2pz2hoPtqSznZM9e7OfP/745APpPqsfnvjWTfemFfOz9970rRMjpkJHa5jTpTEWknr53jMfBtXLq/Z1mD+49OGZe5OSeeGTv7Xj4eAFMzQN8+gC+aE/m+mG+eT64Z077vz64s5Daye7DXNS7WQ9QGckpONnMI56l0bt0+uPO/9360r/YS90cL2iukCds+wpnU9+oHePPvIMu83Fm/u3BXyjNGdclTbMJ9MvIDrsOnpxrVvSfqP39cDq2ul92xZ2HEx/ZT7bkkRlaBmEymtLjH1pSo6VfLmSZj8Rpd+0LN56eD39uiT/rcbCjifLW9ICLc1Y7TcUkzXM/e9d8mvSZsMkecySWi0p1Q6P+j4kfsOcfSmTPM79C+lTVn408tXi0BNU3n/4oFNKRYalYd6WziT+YecovQtJnXtn8X598fGhhnnb/tPvd+vj6v1zh3335buTpTGe+9rWHU+9m/TNyQ93Lt566P10rYyhG1YeOr1w5OrF9y2rZHiIQZ8WxwIAAFiYuGEurWc8umutnCM9+oZjG+b6icTjG+ah5TZMDfPYO169RkZ6OWubaZgBANomQsNc+VkpP78x+QhT7r8GTNAwn37qK1858qO15OLqW3/3lZvufTa3ZbBnYVbzU8mE5bWXsoo5KZhfWqvtl6M1zId2/2a6qPB//ONvv3/pg/fDbtTkL/29/8Gl97/9x/8xOeYnf3P3obAb0TDHpDs6Xt27c3FxV+ezeq9hThrd9KN75zN8XcNc3ieZddb9TffuKhnJPOGtpV9tTkk7o94Utt4qA3XHLXtK55P6bunNbOv323X3oidKe+aV0aN97lA3zKvrZ/Zvy56bylfpzrNXft2uvLBaLqYGjH9pSudJHnxyR5L9JEE7v3HiyR3Z3Pj8qrAJl9drtqxk02trmKxhzpaAzv8NzMFaT1mtNrZUa6Nhrnrwqx+NfLVY9hT3Lx10OqnIsDTM2ZahC2mHnLtfF98fapgrmuri/vnjJksx3/zo41/clXTK77589447n3v8i4vpIsyVB6rakgSy9IcBYzTMU4pBlzbHAgAAWJh4lYwYDXP3x+Jc5D5jV8mo75FHN8y9dTRy6rH3d+Lzr1sl4x//sXJ7+a/90TADAMQgRsNc91mp/wFneefCqA+oEzTMQ5dvuv9Y+dqkXv7rv3unMKu5VzGPLZhjNczrV9763m2fS+cw//7Xvh+8coW9Yf7n73/t99M5zJ+77XtvXQlcpoCGOSb9dnZvtuZEr2HuTidcWNix89Zsnlm5YS7vs7p+eWVXf1N3nYruluTX3YsTPfPXJcs3JzOT645b9pTPJ/l1+Wx+3NbF7C/9jboX6eF3Dg7/+oR/lmqmuapumNNiP41D9/k91Hl2s68HTnx9MemN6rrELGixGuZ0KeatWxez9VbWDu1Mfsi+ZsydUpfylpPZ8g5JkOpWg52kYU4XhejO4O1+15k8Gr0d1s8k+V7szQmtY0oNc82jUVstlvcvH3QqqcjoN8ynT59u1DAnnfDC//Fo6bZ1DXN5/wLJUszXXZd1yj9596kdW3/7uu4izOUb1hz6h+evrOwYXuK5rYa5jRgktDsWAADAwlCDGu0v/Y30Fxrd8gHG/aW/YrObL6RHnHGFNOT+Ws6/co2MmuaZhhkAoB1Ci9Mndyxkn3F6v4nZ/YQS0jAf7Ny2N5+5igka5tUXHuitv3z6yb9O2uJky18/ebq3pbNnsv/fvbWa25LedO1HR75y0039+c4tN8yrqx9cvLJ+9t7kb/At/FpwyWxsmP/5xW/8wa8tLPzyf/qTe8+uX7kYuCQHDXNc1i5upEtX5P4/q4HXL3enmF2+nM0z6+2Ru1TaZ7DtzN7F7irJ/b2qFhLoX9dfQKP+uEOeivPpr9i5sdEtqkbci+rDbxL0DfPwlvXLb+5fzH+FUNkWpiuwLvT+pluMhjmdZV9cmrv39yfzp5TNsC9t6X/Zkn6zUlkyj2+YBysGJH/MMkvp0d7XKVt37Brcu2Sa/si3pZQpNcx1j0ZdtVjxeFYdtPYm0VKREa1h/sn7F/P363OldZiHPOX9ixXzD/csLnQ75eyHbBHmpHwu3bDm0MmuSSDz7rYa5rgxmNZYAAAAC6WSdHiOcrOCeby/8gDlP+VXmHtc+Zf+ivJha+3yFmPur+H8q9fIKO/CKhkAAC0y7pPywd6fLk8nJg5mNvY+oYxomAcfcHaujCydJlmHee1Csv5yxgMnL6wlW04+kP38V/c9kOy5+uGJ7obelm47/dbf9avnKTTMq+nKFR+fW7njf/3UwsKv/cHdIasjmxrmH96d1Muf/NxfrJz7eIIVOVZpmF3TH3oLi/s21aTgGUPWMBcb/sKWwR/0urw+tGfucvalwMbly5XXDhHy0pQcNq/KfxMyOKXedxBDWwaHTs6r8izGnENemBP0v/so3NODt4z+3jOjUcNcftjzT1D5QvnRGLrViP0rD1p7k2ipyMg3zG+88cbbb7/94zz/cv7KlfP/kr/c31J5oX+/+nsO3WrE/j8ePvLV/E2uXr24mr+ueMPKQye7rl4sud96663OnQ1qmFUxmNZYAAAACxXTcHP9bcN6udqfL2lHHKBYI5eWXc5Jctf1bxSwtkfv2CPvr+H8+73yYC7zMDTMAABtM+6T8uATSXFmY+8TSt1npcIKgbV/uSljTMO8+uGlS7k/zTf4M34X1nqtc/bzpQsXsj17GwZbEp6956bxBXPUhjnh3IUrG29958bPfPJ37gi4qaVhPnbH73zyMzc+fHb9yoVzE54cDbNjNu2k4Bnjqqphni72BXxcnkOy7OzR8eOqUcO8aVhaWjp69Ojzzz//yiuvnDlz5o033nhr3jl79uzLL7/cucudOz6mYXZPw7EAAAAAAACQ0dYn5XG/V5tnTMMciWQJ5hMfjiuYozfMkzHlGmf6DfPb39n1G58pf5ud4zO/ses7b0/n7gM0h4Z5Fs9h/fK4Lz5TaJhDWFpaOnLkyDPPPHP8+PFXXnnltXnn9OnTL7/88okTJzp3+fDhw7PeMDccCwAAAAAAABltfVIe93u1eabTMK9d6E96pmHuMv2G+dzFKxs/G83GlYuTzsUGkEHDPMfnQMMcwtLSUud9c2Vl5Zlnnnn++edf2AR07mbnzj799NOdOz7rDXMgNMwAAAAAADAaD5+Up9MwB0LDnNFSwwwwZ9Awz/E50DCHsLS09MQTT3TeOo8cOXL06NGnn356Zd7p3M3Dhw937nLnjtMwAwAAAAAArPv4pEzD3IeGGWC2aLVhXltbO+SD5eXlp556arOdQ+eZ7TwFlQ2zn6dGztKmR/0MTIO6sQAAAAAAAJDh4ZPygw8++NRTT33PDcIHasoVyojPjDTMACG01zB/+OGHH3zwwblzyaIx/6rmvffe638N17m8Gc6h87B3HvzOU9B5Ijw/NVpGPEpzz+aJwWZ+lgEAAAAAIBD5R6RZ+eQynQdqmhXK6Ee+ecM8tZ4cQEt7DfP58+c7I3Rtbe2cmveLbIZz6DzsnQe/8xRUNsx+nhotIx6luWfzxGAzP8sAAAAAABCI/CPSrHxymc4DNc0KZfQj37xhBoA8hnH0Ycp5H2QvF9m/N8k5ZI+//6dGy4hHae7ZPDHYzM8yAAAAAAAEIv+INCufXKbzQE2zQhnxyNMwA8SFcQQAAAAAAAAAAJsHGmaAuDCOAAAAAAAAAABg80DDDBAXxhEAAAAAAAAAAGweaJgB4sI4AgAAAAAAAACAzQMNM0BcGEcAAAAAAAAAALB5oGEGiAvjCAAAAAAAAAAANg/NG+ZjAJuG5mMq3tgFAAAAAAAAAADQE6VhDpcAzC40zAAAAAAAAAAAAEOE12t1hqxhXgWYa2iYAQAAAAAAAAAAytAwA4TQdsP8OgAAAAAAAAAAgGNomAGaMIWGWX0Xq7m0uHh1y5bKfz76/OfVZwcucJteAOjDOAXwD+MUwD+MUwD/ME5bhYYZoCGbtmHucOVXfqVcL3/8i7/4/ptvqk8NXOA5vQCQwTgF8A/jFMA/jFMA/zBOW4WGGaAhm7lhfv/NNz/+xV/M18sb//bfUi9DH8/pBYAMximAfxinAP5hnAL4h3HaKqqG+cdvHT9+puqf119/Z8oPAUAzNnPD3OHc8eP9evln/+bfrK2sqM8IHOE8vQCwyjgFmAUYpwD+YZwC+KfFcbq8+9oeu5eHr7lh/6nk0qn9N1w7RPeaKt1AU+8uSgtXDrYnmyc4tB1Fw/zO00cXf+Vb//7fV//zyf/y1N/O00vzwZsXrrvzRNU1J+68buHmg6O3jJVMQkdfbTl4cwR7FMlMsskb5g4ffPe7WcN8/t5749vTV8L+K2XFT0Ovpcm2/ktl54fRL5uF1+3+C3f5VdvV6/YM4T+9c0tlFJdzA6I/OHL/vTIursXxMvxj1bEZLLMA43T65AdPMgSHBmZ5VE4wTof0deNx9LWMVncwTjWEv5meqtpYS3VvwH9/zjqMUzHFgZCMgaGhkQ2iMSO04r9va27B8JxJ2hqnyRPdy0GhkUh/3L2/87+hlIzMQfbOkP/PubrdCwdLbta9UX77oOEOOHQjFA3z39747Vyl/NDv/LdDX/zDR/9DrmT+/TvPtHR3p86JO7fu3L9v8Zaq2vjknm0LO5dHbxkrmYS1ixsbF9cqTvIbi9v2nGwojyKZTWiYO3z4ta+t797dijp5BbzhhsHrZP+HmtfS7E08t3/9y+fQ63bvhTf/7jA4CUev2zPETKR3vilEsfLzb11PPEx5vFR+GmawzB6M0+mTi/3y7hv2799dfNMqj8rhznjEoC2Mzdy+5ZsxWmcJxqmW8W+mEzTMxTfQweguj3wG6YzBOBVTHgCFLbnPerXjpOq/b9NPl6VbMDxnlRYb5ponOHtxP1WsmEfmIds396Yw4r/9hkW9WxW3nzq1fGpuG+aH/iw/afl7j3585cpL3/9crmH+7B2vtHR3p83BWxZ2Hb54et/ijlw7nMxU7nDdLTt6fXJ5yxhJMhv55pvTG3UnPZe39LULvfnP2Rzmzr9vvvnmhf6eJ+7c2tspJ7nuzoPdk8pue7B7i8Hh6iRtPZZ+oWFul/QVsEP6Iri8u//138jX0v27y/+5X/aWXrcHv7tSvJWz1+0ZYrOn1wGRGuah8VIaPtXHW2WwzASMUwH9jxmn9u/ef6r/0/Lu3ozlEQ3zqFFbPzbLY43ROlMwTrXEa5hHDNLSRgbprME4FTOmYe4NodpxUjk8k7137y7dguE5s7Q3Tmt+H7omG+PzkIti8mXFDTeM1A+LR/7H4lw3zA91Nj2z8tlCw/xqS3d3yhzcsXDr4fXVtdP7Frf2qteki9210nlcXt+7uJD2yeUtYyXJZOfFva93bvPm/sW04i1v6WuvruxaSG/Z2WfbnpPpROnD6fZbF3YcXF27+Pr+bdv2v7lxca0veXP/toWte7ILi19Pmuete99Mn+uVnf3D1Uim+gi7gIa5XdJXwOXkI3j22Xu5+0G87rU0+//ux/WxL5/F1+2Ki5U/i1+3Z4jNnl4HBDXMob+0F7BKBoNlBmGcKhh8zE3+b6hZLo/K4ggK+M3KgPKK0TpTME61DL+Zln/ffYI5zKuVw6/i94IYpLMG41RMfmxWzDYKmcO8OjTA+p8sh2/B8JxZ2h+nw79Nlp/rHrLsRc6T/4+/7pcVQ3OhvUVR1jA/eMMdLzz8cOefl5O79vb/+0Ry+YX/+48fmp+G+cSdWxf3n1lfTZanOLprIVvk4sTXF7f1N96a9MnlLWMlaVe873RS5q6d3rdt8RsnKrY8mTXTHdYP37qw48lcw7xtb/oAv7o33bG7Pa8tXNhzsqPK0TtcjWTzQcPcLqe6i1Kmv1qSm+o1umHufl6nYRaz2dPrgHirZJR3pWGeExinEnpvUrnJy7mfRk9QmbxhLvyibs1ejFbXME61RF0lY7VumPHfn7MO41RM5Rzm8vLH4Q3z8OfL6r0KuzI83TOdcZoLRPUi3BM3zMPmup+rp0yPMkRF1jA/9tVjH6Wsf9DZdO7DC+kPlx/93tw0zAdvWSiSm0ec7bG8M+mTy1vGSvK36V4sb8m5uhcHDXO2Z+9SoWGuutC5/a0r/ac7mac8QrL5oGFul1O9VSm762OcClklo/uf+slNghvmxqtkVJz1pmezp9cB026YGSwzCONUQvpm1p27PPyTfZWMqutPFf/cTH47o3V2YJxqmU7D7Lw3gLEwTsWMWiUj901rcMNc+fsKNcdieM4MbY3T3GLcWXayX1Kr/ibCsEpGrrQoLxSenyZdsyT48J+VNt7NcehWyfjV/+Wh//pfO/987+HOpmee/t+Syw/9l099e14a5mRxi5Xcg5StN5HOMO7ORO7skRS/5S1jJdmaGMmFZAb0wq5DaxVbXt27bWFHT5tOODY3zIkqq7aTpZ27q2TQMPegYW6X7ivgqf27b+gtfNFfCbbmL/3lX0nH/Np//kV/ufFf+pvS6/YMsdnT64BiFAf/dT2IedyGmcEygzBONaRva/mBcG1+iIxomCvepIYI+9MwjNaZgnGqZXzDXPkOW0vY79AxSGcNxqmYUQ1zbmROskpGnZjhObu0N05Ly7SUyuDVyu8i6j6MFbb3J0PXTBroHXj4N2EqbjWnDXN/HeYHV+dwHeYTd27duXJ5Pbelt8hFsmLxYjYdeTH7u37lLWMlSZ27a0f2x/V2pbuUtwy0CztX0vWR6xrmtUO7sj/SV9cwr13cWNnVnUQ9OFyNZAqPrjNomNtl+LeT8i/UVa+lw/8hMXqaZmlaWNXy+bXHyt9miq/bM8RmT68DKmZYDOW1+MtblWvQ5G48tmFeZbDMHIxTEYXJLoWfyqOysCU/escM1aFfzqz8gMxonQkYp1oCGubKz/9z1RvAWBinYkY3zP3Ct/8bskH/uVst7m1meM4eDsdpuiDonOCgYU7+0t8Pnv7N+WqY1y5uFKrhhPXLVy9nCypvpA/bxsZGtqFiyxhJugzymexG2S7lLQNtb0Pn542La9m/Bz9n0nTxi/6G8oV0l4FrhCTegzgr0DDPBPP0uj1DkN4ZhfGyqWCczi4M1c0D43RGYZBuKhinswXDc3Pib5ye2r9/fpKoaJj//v96JNcwl//59h898I7goZglyktSbOJFKuTQMM8Cc/W6PUOQ3tmE8bK5YJzOLAzVTQTjdDZhkG4uGKczBcNzk8I4bRVFw/zh+bN3/9Gjn/oPVfXyrz70O//nD3/80TnBQzFLDKYQ12+BaUHDDFAH6QXwD+MUwD+MUwD/ME4B/MM4bRVFw7z6/oeXPv7Zz6pdP9u4coGiFGYJGmaAOkgvgH8YpwD+YZwC+IdxCuAfxmmrSBpmgHmChhmgDtIL4B/GKYB/GKcA/mGcAviHcdoqNMwADZlCwwwAAAAAAAAAAOAWGmaAJkyhYY54ttiwYcOGDRs2bNiwYcOGDRs2bNiwRbTRMAM0hIYZGzZs2LBhw4YNGzZs2LBhw4YN26a1tdowHwLYHNAwY8OGDRs2bNiwYcOGDRs2bNiwYductlYbZgDIQ8OMDRs2bNiwYcOGDRs2bNiwYcOGbc5sNMwAUyN+w7y8+9qU3cvdDaf233Dt0KbwV4a4tq4xd8uSv4FtcGpxzq0nvWH/qea2uI9bA1vVo2R/Fsq2Zs9C+UyaJGT4trHPrSe1JIRxyjhlnFbflnEaZusaGadCG+OUcTrO1jUyToU2xinjdJyta2ScCm2M0zkfpzTMAFMjdsPcGcnpy0nycpC+EAxeX/qbwl8Z4tr6LzT5d46iv4Et54hybn3TtaZ38KIt7uPWwFb1KNmfhbKt2bNQPpMmCRm+bexz65sMCWGcxjq3volxyjitPxPG6YQ2xmmIjXEa79z6JsYp4zSyjXEa79z6JsYp4zSyjXEa79z6Jl/jlIYZYGpEbpgLrwPJpVP1X2CNf2Uo2Sq2TPA607lJ55Up911nXFvliTeyJZrduw3fAA7bGj0LkR+3grcYkRi2kVvG2OLmbeRtI5xb77IlIYzTIXEjG+N0ctvILWNsjNORME4Zp4xTk41xOrmt8sQb2Rink9tGbhljY5yOhHHKOGWcmmwexykNM8DUiNww517ms4vJv/f3fr2h+ku2+leGkq37IpG4al9vxr3aV0pr3oknso3ZOLEte10c8dIabmv0LFSdW+NnISeM8CxU3nTyZ6F8Jk3ObdRtY5xbk4QwTkfJGKdVQsap1cY4tdjGbJzYxji12EZtGWdjnDJOJ7cxTi22UVvG2RinjNPJbYxTi23UlnE2xmmMcUrDDDA1ptAw91/mI7wGLu++dvBtVOP33FbewQen2MhW/payga3Rs1A+tzjPQsUJNTi3oQfJ9CxM6R080rk1SQjjlHEaamOcNrMxTm22wRbGKeOUcco4ndjGOA2yMU4rztZ0boxTk41xGmRjnFac7cQ2GmaAqRG5YS79dkP+1aD5b14UDDUvNIZ3yQa//1I8ieQNbdQvc4TbTvW+r8uY7HEr2Ro9C1Xn1uhZGHqUGj4L5cfc/CxM4beQ4p1bo4QwThmnY22MU8Yp47TKxjgNsjFOh65scG6MU4ONcRpkY5wOXdng3BinBhvjNMjGOB260mSjYQaYGpEb5v73X6dyy+TbvwGssvVeXOq+aZvkPbfkb2Krl5jObbVvrXvFl30b3uRZqHiUGjwL5Zs0ehbKZ9IkIaXbRj63LqaEME5HwThlnDJOx9nKZ8E4tdoYpwYb4zTIVj4LxqnVxjg12BinQbbyWTBOrTbGqcG2OcYpDTPA1IjdMKejubhYTv/LLMs7UcnW2xBpvaaS32wbnFiMb3X7xHkHb/gslGzmZ6H6UbI+C2Vb02ehfCZNElK8bfxzSzEmhHHKOGWcVt2WcRpq6woYp01tjFODjXEaausKGKdNbYxTg41xGmrrChinTW2MU4Ntk4xTGmaAqRG/YZ4cbNiwYcOGDRs2bNiwYcOGDRs2bNgi2qI0zADQHBpmbNiwYcOGDRs2bNiwYcOGDRs2bDNno2EGcAINMzZs2LBhw4YNGzZs2LBhw4YNG7aZs9EwAziBhhkbNmzYsGHDhg0bNmzYsGHDhg3bzNlomAGcQMOMDRs2bNiwYcOGDRs2bNiwYcOGbeZsNMwAThjRMAMAAAAAAAAAALiFhhnAAyMa5g/icebMmY14dM6tf/nqli0Rbc3BViYwIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09Gw0zgBNomOfjXdKzLTAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT0bDTOAE2iY5+Nd0rMtMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPRsNM4ATaJjn413Ssy0wIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09Gw0zgBNomOfjXdKzLTAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT0bDTOAE2iY5+Nd0rMtMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPRsNM4ATaJjn413Ssy0wIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09Gw0zgBNomOfjXdKzLTAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT0bDTOAE2iY5+Nd0rMtMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPRsNM4ATaJjn413Ssy0wIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09W5SG+acAEAANc7itOdjKBCYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWejYQaYGjTM4bbmYCsTmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWno2GGWBq0DCH25qDrUxgQuLmDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDVt7NhpmgKlBwxxuaw62MoEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3ZaJgBpgYNc7itOdjKBCYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWejYQaYGjTM4bbmYCsTmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWno2GGWBq0DCH25qDrUxgQuLmDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDVt7tmk0zC/edf2ne9z2xLg9R+8xmidu+/T1d71ovz1Aq9Awh9uag61MYELi5g2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A1be7bWG+YnbsvVymnXPKJCpmGGuYaGOdzWHGxlAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rO13DAX+uWEpEOuL4FpmGGuoWEOtzUHW5nAhMTNGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJG7b2bO02zKWCuXRtcfWMQsPcv7q3Jb32rt6SG4MqebDjbYOGuVJ+/W23Xd/7ebADpTRMCRrmcFtzsJUJTEjcvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGFrz9Z6w1xb3+ba5+Riut+gYS5eyiTpGhtd3+DWg0u56+vk/bb6iUIXTccMU4GGOdzWHGxlAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rPpGuaq/fq98vBk5v61PV1/h8IhKo9XdfMxs6sBWoGGOdzWHGxlAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rO13jCP6HFf7C140V+qotAw5xma4Ty4XFzXOdcwj5DnTq64DAdAu9Awh9uag61MYELi5g2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A1be7Z2G+aKirm3ZXhG8Yg5zD2qGubqOcyj5WPPEaAdaJjDbc3BViYwIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09W8sNc2Ht5FErJdevw1xdOw8uV63DPEZerKBpmGFa0DCH25qDrUxgQuLmDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDVt7trYb5oTBchT5KnewjMX1dz2RW/Miv/xybo2Ln9Y1zAPT9Xfd1ZvQPFaePyv+zh9MCRrmcFtzsJUJTEjcvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGFrzzaNhhkAUmiYw23NwVYmMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPRsNM8DUoGEOtzUHW5nAhMTNGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJG7b2bDTMAFODhjnc1hxsZQITEjdv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Nqz0TADTA0a5nBbc7CVCUxI3Lxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxha89GwwwwNWiYw23NwVYmMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPRsNM8DUoGEOtzUHW5nAhMTNGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJG7b2bDTMAFODhjnc1hxsZQITEjdv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Nqz0TADTA0a5nBbc7CVCUxI3Lxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxha88WpWGuMwBAHhrmcFtzsJUJTEjcvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGFrz0bDDDA1aJjDbc3BViYwIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09Gw0zwNSgYQ63NQdbmcCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZsNMwAU4OGOdzWHGxlAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rPRMANMDRrmcFtzsJUJTEjcvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGFrz0bDDDA1aJjDbc3BViYwIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09Gw0zwNSgYQ63NQdbmcCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZsNMwAU4OGOdzWHGxlAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rO12jA/99xzTwNsDmiYaZj92wITEjdv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Nqztd0wnzt3bm1tLTvWeYC5oxPv999/vxN1GmYaZv+2wITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mxtN8xra2vnz5/vXL5w4cJFgDmiE+lOsLOSmYZ5g4Z5FmyBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2dpumDuH6Fz46KOPLl++fAVgXujk+dKlS51gZyUzDfMGDfMs2AITEjdv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2NqzTaFhvnDhwuXLlz/++ONOfn4GMC908nzp0qVOvGmYM2iY/dsCExI3b9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9jas7XdMJ8/f/7ixYtXrlzZSOvlcCeAczp5vnz5cifeNMwZNMz+bYEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3ZptYwUy/DnNGJdCfYNMz9yzTM/m2BCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2WiYAWzQMG/QMM+aLTAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT2brGFePXb/HcuvT9ToBd4k3Fzec6KzMtyFiW+b7Nfh/uXl7v79GzY5OsSAhnmDhnnWbIEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3ZaJjtDXMTzPeFhtkNNMwbNMyzZgtMSNy8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YWvPpm+Y801p/vLry3d0ybb0fy7WqqN3604Bzt2ssyWdEJyjLxzcdnk5v/+x1eSq5WNdWfLz8F24/9ixivPrCZMj9m5VcV9q7tpg+/3HXh96uMYZBneTFrotaJg3aJhnzRaYkLh5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w9aezWvD/Hq+4u1erJi1O3q3zrVVbfAd5duUzur15e4tuxfSCjfblFwsL1hxR3///jEHF5Ob5BvmwqELuxX3qniUqh63/u2KDwLlcrvQMG/QMM+aLTAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT2b44Z5qGyta5hDdrs66KLrpkyXT6DbLA/Vylf705rDS/LBTSoPVJhEXbPbqIY5f6uquwntkDXMH330EQ1zBg2zf1tgQuLmDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDVt7Nq8Nc36Bi9I85GHPqN0Gq2hM1jBnnXBuKnOu++3WuKPvQqFUrm+YC+cQsFt1w5yn2H5Da9Awb9Awz5otMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPZvfhrlPxRoQVVTslpt4HHi43JbOxeXl5fKKFy7nMFcW7zTM7ULDvEHDPGu2wITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mzTbZjrFinuXhosHjy08ENdwzx6t+HitzS5d2TDPLhJ1577q3pjDlS1wPJU1mEObeMhBqzDvEHDPGu2wITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mzTnsM8WNGhsIREb9Ox5VxrWljdYrBjoTgdvVtuCY3l5fuLS1tUC/NbklnM+dnFiaJyOY7a1rp3dsvHhucwFw7UvxP1U5ErjlVpqD+36nU5wA4N8wYN86zZAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rNNu2GeIfIFc+WfFJxIRak7d9Awb9Awz5otMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPRsNcyXp/OB8pWxomAcTqIeXyIC5gIZ5g4Z51myBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2abTMF++fHm2GmaA0XTy3Hk9pGGmYZ4tW2BC4uYNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNW3u2KTTMFy5cuHTpUic8PwOYFzp5/vjjjy9fvtyJd2cc0TBv0DDPgi0wIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq092xQa5s6Fjz766NKlS5cvX74CMC908twJdifeH9Awp9Aw+7cFJiRu3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rC1Z2u7YV5bW8tK5gsXLlyEKj6aEdSPkzs6ke4EuxPvTshpmDdomGfBFpiQuHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnD1p6t7Yb5/fffz0pmgDkjG0GdeJ87d46GeYOGeRZsgQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dnabpgBNgk0zDTM/m2BCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2VptmAEgDw1zuK052MoEJiRu3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rC1Z6NhBpgaNMzhtuZgKxOYkLh5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w9aejYYZYGrQMIfbmoOtTGBC4uYNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNW3s2GmaAqUHDHG5rDrYygQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dlomAGmBg1zuK052MoEJiRu3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rC1Z6NhBpgaNMzhtuZgKxOYkLh5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w9aejYYZYGrQMIfbmoOtTGBC4uYNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNW3s2GmaAqUHDHG5rDrYygQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dlabZhfB9iU0DA3tzUHW5nAhMTNGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJG7b2bOY2LLAZW22fY8eOTeEo2iPCpAifIxrmKLbmYCsTmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWno2GeSaOCJNCwzzilaGl9w4aZv+2wITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mw0zDNxRJgUGuYRrwwtvXfQMPu3BSYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWejYZ6JI8Kk0DCPeGVo6b2Dhtm/LTAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT0bDfNMHBEmhYZ5xCtDS+8dNMz+bYEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3ZaJhbOeKp/Tdce8P+U/0f+pcTlndfW/g52fna3culnzr7DSjcAsYS9ByVn6L00R+QPSvDT+AYaJij2JqDrUxgQuLmDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDVt7NhrmVo6YFZXd1rhYUHZ+2r2/87/l/M4dcjt3f1jefW1uL5gIe8M8eK56XwXQMIe9d9Aw+7cFJiRu3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rC1Z6NhbuWIaSe5f3d1a7l7Oa2Zl4s77892Wd7d759pmBsQo2HuPQM0zGHvHTTM/m2BCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2WiYWzli1kl2e+R8QdlrjUv15vL+3cnPy7uTizeUVslgkYwJYQ7ziFeGlt47aJj92wITEjdv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Nqz0TC3csReJ5kUxqcGBWVV19zburw7ndu8u19MM4e5CVHWYa542gKgYY5iaw62MoEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3ZaJhbOWK+sUxWvch+KPzpvkGD2d25vz4GDXMEGs9hzv09RhrmsPcOGmb/tsCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZsNMytHDHXSaa1cndCc7Ex7u3U/f9T+3ff0FtVg4a5KQGpGHTIyczl7KEeqp3LS5oEQMMcxdYcbGUCExI3b9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9jas9Ewt3LE4aJysChzgf6f/Sss93uqYh3maymbJyMoFf1HuDyZuX999tRN8kzQMEexNQdbmcCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZsNMwzcUSYFOFzRMMcxdYcbGUCExI3b9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9jas9Ewz8QRYVJomEe8MrT03kHD7N8WmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWno2GeSaOCJNCwzzilaGl9w4aZv+2wITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mw0zDNxRJgUGuYRrwwtvXfQMPu3BSYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWejYZ6JI8Kk0DCPeGVo6b2Dhtm/LTAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT1b2w3zFDh58uR0DiQ8IkyK9jmiYW5uaw62MoEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3ZzG1YYDMWMaV1HDt2bApH0R4RJkX4HNEwR7E1B1uZwITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mzahnkhjIbxBpgmNMxRbM3BViYwIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09m7xhHisf2zAzhxnKMId5xCtD3Dvbv0zD7N8WmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWnm0OGmYAV9AwR7E1B1uZwITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mxz0DAzhxnKBD9Hl9befaeSf103HpqGOYqtOdjKBCYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWebg4bZI6dvv2ZLgWtuPz1i9wPbt2w/UDak2/oXxhyuuM/oW42Rhxxybjj2+NLS0j0PHsjz2AN3Ly3df+QNm5GGOYqtOdjKBCYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWebg4Z57GzVn//an076T8MjljraA9tHdsyjGuYQzA2z6eqZIHgOMw1zI2iYZ8sWmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWnm0OGuax/PzX/vR/fOb/Cf9nbMM8nuGOtvdzfnvuctIwb9+ezXbubqqeZnxge+Wc6DENc/9WpUNX7nbN9u3X5E+jcONBGd65KjuLvn4ma+m0Ya7imwdees9kpGGOYmsOtjKBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2eagYQ6Zwxy3YZ54DnPyY9rG1jfM3c643P0OdiveIN8xj2yYB/v2L1U1zIXdumVx7jD9PQ9s7++WXihUzn465snmMA+4b/lkugrzPzx61569315+2VAy0zBHsTUHW5nAhMTNGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJG7b2bHPQMI9FNIe5QEUJOzSHOTeTuDDbOWRB5tLhKicdDxrjCmd+t8oj9XfoN8v9GcyjF5l2zlDD3Fsb49jj9x95+dh37zGUzDTMUWzNwVYmMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPdscNMwzMIe5cnuhYR6UtKMa5roqd8Qc5sJVPcW4+nqolS5W1pkkd8qDfttR1WydwzxomNPZzGe///Dd3zpy9tIkh6ZhjmJrDrYygQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dnmoGEei4N1mKu2V89hLq3YHDqHuW6VjCZzmJN2uTz7unNx+/btFW3yTE5nrmmY3zt+pP9n//Z998VJjDTMUWzNwVYmMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPdscNMyzNIc5V8KmM39z6zAPrbU8eh3minWeW1iHebgPz6/J3Lucb5U9NcxN5zAPeOPI/Y8HujJomKPYmoOtTGBC4uYNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNW3s2ecMcQsN4//zX/nTSfxoeccR84/6SEtfcfvv2/Bzm7dsLC01UT13uL1lRbHJHNsy5W5WmTw+voZG5t2/Pl9pbhjdms5jzS2oMrTY9U9AwN4KGebZsgQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dm0DXMUgmerzvARfVEomJ0S/BydfGofDbMdGubZsgUmJG7esNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesLVnm4OGGaZJOqvZzVoYsen+fb8CJ5fvo2EedWf7l2mY/dsCExI3b9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9jas81Bw8wcZihje47e+MEj931zmPse+cHwvOaR0DBHsTUHW5nAhMTNGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJG7b2bHPQMAO4goY5iq052MoEJiRu3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rC1Z5uDhpk5zFBG+BzRMEexNQdbmcCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZsc9AwA7iChjmKrTnYygQmJG7esNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesLVna7thrrsqIseOHZvCUbRHhEkRPkc0zFFszcFWJjAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT2btmFeCGO0BMAVNMxRbM3BViYwIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09m7xhHisf2zAzhxnKMId5xCtDS+8dNMz+bYEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3Z5qBhBnAFDXMUW3OwlQlMSNy8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YWvPNgcNM3OYoUzwc7T27o/fruSdVeOhaZij2JqDrUxgQuLmDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDVt7tjlomP3yyO9t6fN7j4y54sSXfmlLgcItoC2efWxpaemev308zyP3711auu/QaZuRhjmKrTnYygQmJG7esNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesLVnm4OGeexs1aN/8HOT/tPwiAlJi9wviZP6+Je+dGLUFcmlfKlc2A0mJXgOMw1ztPcOGmb/tsCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZsc9Awj+XoH/zc1b/4H8L/GdswBzDcFycbapvk9IrSLQY3gRZJG+Yqvvn4P/3EZKRhjmJrDrYygQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dnmoGEOmcMct2EePz+2XBcXr9tSro4rbtIrn2FyJpvDPODeJ19KV2H++4fv2rP3gSePG0pmGuYotuZgKxOYkLh5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w9aebQ4a5rEI5jCPnX48WIm5t19Fw8wk5ikw1DD31sZ49rH7Dh1/9jv3GEpmGuYotuZgKxOYkLh5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w9aebQ4aZu9zmAd/wq+qLu4vxMwc5qhY5zAPGuZ0NvMrRx/ce/+hV9YmOTQNcxRbc7CVCUxI3Lxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxha882Bw3zWFysw9yvizv/X7oi2VB/C2iTmob5J88f6v/Zv33feW4SIw1zFFtzsJUJTEjcvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGFrzzYHDbPHOczr2ToYuYJ48GNyKVcl1/2lv6HdYDKazmEecPrQfY89O8mhaZij2JqDrUxgQuLmDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDVt7NnnDHMJoyViO/sHPTfpPwyN2GayPsWVLqT2uWoe5APXyVKBhjvbeQcPs3xaYkLh5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w9aeTdswRyF4tuoMHxEmJfg5eungPhrmOO8dNMz+bYEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3Z5qBhBohF9+/7FXjpyXtpmIPeO2iY/dsCExI3b9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9jas81Bw8wcZihje45Orzx07zeHufehleF5zSOhYY5iaw62MoEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3Z5qBhBnAFDXMUW3OwlQlMSNy8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YWvPNgcNM3OYoYzwOaJhjmJrDrYygQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dnmoGEGcAUNcxRbc7CVCUxI3Lxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxha8/WdsMcMaV1HDt2bApH0R4RJkX4HNEwR7E1B1uZwITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mzahnkhjIbxBpgmNMxRbM3BViYwIXHzhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhq09m7xhHisf2zAzhxnKMId5xCtD3Dvbv0zD7N8WmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWnm0OGmYAV9AwR7E1B1uZwITEzRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRu29mxz0DAzhxnKBD9Hl9befaeSf103HpqGOYqtOdjKBCYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWebg4bZLwe2b+mz/UB34+nbr8n/2N2r/3PlbaA9jj2+tLR0z4MH8jz2wN1LS/cfecNmpGGOYmsOtjKBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2eagYR47W/UPf+HopP80PGJCUhUXauVrbj/dv3jN9uyHdL9rrrmmu2fdbWBigucw0zA3goZ5tmyBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2eagYR7LH/7C0S//T1fD/xnbMAeQ1MOFKcidDVldnF6zfXuvOz59e/JDtu/wjQ5sp2JunbRhruKbB156z2SkYY5iaw62MoEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3Z5qBhDpnDHLdhHj8/tlQwD191YHt29enbt99+oL9zuoIGpXIMJpvDPOC+5ZPpKsz/8Ohde/Z+e/llQ8lMwxzF1hxsZQITEjdv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2NqzzUHDPBbBHOb+jOXKq7ZsP9D5d1Iqp/83VEcPVmKma54CQw1zb22MY4/ff+TlY9+9x1Ay0zBHsTUHW5nAhMTNGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJG7b2bHPQMHufw5z9ab9+Y9y9Kpm8fHojncpcN+GZhZgbYJ3DPGiY09nMZ7//8N3fOnL20iSHpmGOYmsOtjKBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2eagYR6Li3WY+4sq9645sP2a229Pl2Pu79vZpXSbmrU2IBY1DfN7x4/0/+zfvu++OImRhjmKrTnYygQmJG7esNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesLVnm4OG2eMc5o1ssYvcDOT+j/k+eWhLuqm4XgZzmI00ncM84I0j9z8e6MqgYY5iaw62MoEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3Z5A1zCA3j/Ye/cHTSfxoesctgfYwtWwqLZqSXyxcSBqswsw7zVKBhbgQN82zZAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rNpG+YoBM9WneEjwqQEP0cnn9pHw2yHhnm2bIEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3Z5qBhBohF9+/7FTi5fB8N86g7279Mw+zfFpiQuHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnD1p5tDhpm5jBDGdtz9MYPHrnvm8Pc98gPhuc1j4SGOYqtOdjKBCYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWebg4YZwBU0zFFszcFWJjAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT3bHDTMzGGGMsLniIY5iq052MoEJiRu3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rC1Z5uDhhnAFTTMUWzNwVYmMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPVvbDXPdVRE5duzYFI6iPSJMivA5omGOYmsOtjKBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2bQN80IYoyUArqBhjmJrDrYygQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dnkDfNY+diGmTnMUIY5zCNeGVp676Bh9m8LTEjcvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGFrzzYHDTOAK2iYo9iag61MYELi5g2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A1be7Y5aJiZwwxlgp+jtXd//HYl76waD03DHMXWHGxlAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rPNQcPsl0d+b0uf33uk9qpf+tKJoNtAGzz72NLS0j1/+3ieR+7fu7R036HTNiMNcxRbc7CVCUxI3Lxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxha882Bw3z2NmqW/73o5P+0/CICUlV3K+IT3zplwZFcvJDrj1OduxeV38bmJDgOcw0zNHeO2iY/dsCExI3b9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9jas81BwzyWpDS+/eoE/4xrmANI6uHCFOTOhkGNPFQc93YevlF5T4hO2jBX8c3H/+knJiMNcxRbc7CVCUxI3Lxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxha882Bw1z0BzmqA3z+PmxpYJ5wKjaOJ3dTKkcg8nmMA+498mX0lWY//7hu/bsfeDJ44aSmYY5iq052MoEJiRu3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rDZbJKEYPNgk+QNm80mSQg2DzZJ3rC1Z5uDhnksgjnMgxnLJR75vTHrKw9WYqZrngJDDXNvbYxnH7vv0PFnv3OPoWSmYY5iaw62MoEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3Z5qBh9j6HOZ2YPGiMR5TPFRJKZiPWOcyDhjmdzfzK0Qf33n/olbVJDk3DHMXWHGxlAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rPNQcM8FhfrMA9Wx6hfh7k0vXnsfGdoTE3D/JPnD/X/7N++7zw3iZGGOYqtOdjKBCYkbt6w2WyShGDzYJPkDZvNJkkINg82Sd6w2WyShGDzYJPkDZvNJkkINg82Sd6wtWebg4bZ4xzm9Wyxi1yTnPsxndQ8aI5z1yQXc5Uyf+nPTtM5zANOH7rvsWcnOTQNcxRbc7CVCUxI3Lxhs9kkCcHmwSbJGzabTZIQbB5skrxhs9kkCcHmwSbJGzabTZIQbB5skrxha88mb5hDGC0ZS9IwT/hPwyN2GayPsWVLeXbylsrllmuvgHagYY723kHD7N8WmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWnk3bMEcheLbqDB8RJiX4OXrp4D4a5jjvHTTM/m2BCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2eagYQaIRffv+xV46cl7aZiD3jtomP3bAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rPNQcPMHGYoY3uOTq88dO83h7n3oZXhec0joWGOYmsOtjKBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2eagYQZwBQ1zFFtzsJUJTEjcvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGFrzzYHDTNzmKGM8DmiYY5iaw62MoEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3Z5qBhBnAFDXMUW3OwlQlMSNy8YbPZJAnB5sEmyRs2m02SEGwebJK8YbPZJAnB5sEmyRs2m02SEGwebJK8YWvP1nbDHDGldRw7dmwKR9EeESZF+BzRMEexNQdbmcCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZs2oZ5IYyG8QaYJjTMUWzNwVYmMCFx84bNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8oatPZu8YR4rH9swM4cZyjCHecQrQ9w7279Mw+zfFpiQuHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnD1p5tDhpmAFfQMEexNQdbmcCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZsbhvmH/3oR5/5zGeeeuop5jCDgeDn6NLau+9U8q/rxkPTMEexNQdbmcCExM0bNptNkhBsHmySvGGz2SQJwebBJskbNptNkhBsHmySvGGz2SQJwebBJskbtvZsPhvmrF7+whe+cOHChZmcw3z69mu2bNmy/UB/w4HtxZ+LexauSLZU7RlIeqQu19x+esxJNjhQ49v74NjjS0tL9zx4IM9jD9y9tHT/kTdsRhrmKLbmYCsTmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWns1hw5yvl6/GWIf53/3Nlyb9p+ER0/L1mmu29wveA9uvuaa6js266PxVDYrbobo6KZtHlMxz3TAHz2GmYW4EDfNs2QITEjdv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2Gw2SUKwebBJ8obNZpMkBJsHmyRv2NqzyRvmp5566jOf+cyPfvSjyno5pGEey7/7my/94g8OhP8ztmEeT1q+bt/eq3dP3578kNaxB7b3WtnOPp3rs5p2sHWouO3PSM625K5LS+yuv7NXcrH7f8PnMdi/4Bp5oO7p3T68NbfnNb27VCdPd6ieue2ItGGu4psHXnrPZKRhjmJrDrYygQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dnkDfOFCxe+8IUvZCVzuV4OaZhD5jDHbZjD5jAnvXGvF95++4FenXug1ztnF3o1b6F57l3sV8b9bVktvVFch6O7sVwwD8hdl3fVHyg7QP9Uh8vsjfzCH3VyZbk82RzmAfctn0xXYf6HR+/as/fbyy8bSmYa5ii25mArE5iQuHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnD1p5N3jB3bt4vmcv1ckjDPBbVHOYDnX8nHWv6f4Pqtlsxd/+vtL2wZVAZ9xroXsWc7H17tm2wKazSzalGHyg/n3mwZ/Vk63q5c4Ya5t7aGMcev//Iy8e+e4+hZKZhjmJrDrYygQmJmzdsNpskIdg82CR5w2azSRKCzYNNkjdsNpskIdg82CR5w2azSRKCzYNNkjds7dk8NMz9krlcL4c0zH7nMKeTl5O5xenFawozjst9cq8pLtS5ebIbZBVu+u/unsPlcx05XblhLh2osmEu9sb5urlersE6h3nQMKezmc9+/+G7v3Xk7KVJDk3DHMXWHGxlAhMSN2/YbDZJQrB5sEnyhs1mkyQEmwebJG/YbDZJQrB5sEnyhs1mkyQEmwebJG/Y2rP9/+3dsY6d6Zqe5zkWHYPPwachCJgD2ZEncOawA8HBKGsFtjEwHHSk1IMGlCuYSIGCSRQK0Ca7SVbVXyS//a7vW8/Dn9cDQeAmq66qat6tv/lqoVhyYf7GfuDXMH96pfHru/HH1zR//h7Nry6xH2/E/8+7Lxj+sg8/+79/fnX051cy/4//8c63yfisfzgAv/0uHO+/Mvnyrl99y0W8fF+5MP+333/7/Nf+/fv/+5//FtGFeYv2+GjXLRaytzfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o53TbnBhLn4N8x/H13dfEnz5xsVffunL34736psev/w+Fn/3d9fvxvzpf756jfHl2yu/+OjvfR/m974j89ff8u8+fZeOb+KRPfoa5i/7L7/9h/9r0fpjLsxbtMdHu26xkL290WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0hvtnBa/MK/swbz/zf/xv/2t/+fBj/jOS3nfvlb5nePtl59455tPvHhx8ssD9YuXD799j+s7/fmT/+7f/S+Xy/D1A33lwvxF+ux8H2+eC/NDc2H+sbTFQvb2RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0c1r2wrxly69WrfmILw7MdmjLv0f/+f/99y7M87kw/1jaYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jntBhfmH2sfX+77zb+Qz3L78+/3e7X//P/9owvzt77Yzz92Ye7XFgvZ2xttpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90c5pN7gw/3ivYbbzm/0e/Zf/9B//8f98u3/8j//p7euavzkX5i3a46Ndt1jI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOu8GF2axqLsxbtMdHu26xkL290WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0hvtnHaDC7PXMNt1wd8jF+Yt2uOjXbdYyN7eaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y12TrvBhdmsai7MW7THR7tusZC9vdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIb7Zx2+sJs9hPOhflx7fHRrlssZG9vtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mgzLVIIrUGL9EY7p42vYSuXMTN7ORfmde3x0a5bLGRvb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGO6e5MJs9bS7M69rjo123WMje3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNdk5zYTZ72lyY17XHR7tusZC9vdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIb7Zzmwmz2tLkwr2uPj3bdYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdnsaXNhXtceH+26xUL29kabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtHOaC7PZ0+bCvK49Ptp1i4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOc0F2azp82FeV17fLTrFgvZ2xttpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90c5pLsxmT5sL87r2+GjXLRaytzfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o53TXJjNnjYX5nXt8dGuWyxkb2+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RjunuTCbPW0uzOva46Ndt1jI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZO23JhNrPH58J8j6dks7ZYyN7eaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y12TnNhNiuZC/M9npLN2mIhe3ujzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9o5zYXZrGQuzPd4SjZri4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOc0F2azkrkw3+Mp2awtFrK3N9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjndNcmM1K5sJ8j6dks7ZYyN7eaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y12TnNhNiuZC/M9npLN2mIhe3ujzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9o5zYXZrGQuzPd4SjZri4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOc0F2azkrkw3+Mp2awtFrK3N9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjndNcmM1K5sJ8j6dks7ZYyN7eaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y12TnNhNiuZC/M9npLN2mIhe3ujzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9o5zYXZrGQuzPd4SjZri4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOc0F2azkrkw3+Mp2awtFrK3N9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjndNcmM1K5sJ8j6dks7ZYyN7eaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y12TnNhNiuZC/M9npLN2mIhe3ujzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9o5zYXZrGQuzPd4SjZri4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOe0LRfm/2pmC3NhXtceH+26xUL29kabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtHOaC7PZ0+bCvK49Ptp1i4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOc0F2azp82FeV17fLTrFgvZ2xttpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90c5pLsxmT5sL87r2+GjXLRaytzfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o53TXJjNnjYX5nXt8dGuWyxkb2+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RjunuTCbPW0uzOva46Ndt1jI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2e9pcmNe1x0e7brGQvb3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o820SCG0Bi3SG+2cdvbC/M+//P3/+mp//8s/7z/bffgof/mnvW9pdmAuzOva46Ndt1jI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOO39hfnnR/ae/HDoyf2OuylYzF+Z17fHRrlssZG9vtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mgzLVIIrUGL9EY7pz33wvzHjfm5914XZquZC/O69vho1y0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd0559Yf5wYv78KuYP5+aPe/E2n3/u5YudX3y3jT/f9K8/8/d/+cvff/yJLx/lw8/+8stL9TP3UXv5+XwxP32gj7/6y6effvZrre0nmAvzuvb4aNctFrK3N9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjndOefmH+/FOv7sKf7rkv7s9ffvjidc+v3vvyk39ejf/48afvyPH2qvzlV//82c8//Pje149ptmsuzOva46Ndt1jI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOi12YX/3S52vye4fdl696fsW8eu3xP73+0Zf/8e6F+d2P/r5ptm0uzOva46Ndt1jI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOe/qF+eU59+Wu3zrj+grnr8hfuTD/+aHefctXV+v3jt4uzHZgLszr2uOjXbdYyN7eaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y12Tnv2hfnVt6T45gn381t+9TXM37kwj17D7MJsB+fCvK49Ptp1i4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOe0516YP31v5De/9urw++L7MF+/Z/LnN/j6hfntd1J+/3tffO37MLsw28G5MK9rj4923WIhe3ujzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9o57fyF+dWuL2h+/S0yXn6TjBc/+cK5/O1+l9cw/+Uvr9//z3d+7/tgXN/QhdkOzoV5XXt8tOsWC9nbG22mRQqhNWiR3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RzmlnL8zPnruwVc+FeV17fLTrFgvZ2xttpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90c5pLsxmT5sL87r2+GjXLRaytzfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o53TXJjNnjYX5nXt8dGuWyxkb2+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0Rjun3evCbFY9F+Z17fHRrlssZG9vtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mgzLVIIrUGL9EY7p7kwmz1tLszr2uOjXbdYyN7eaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y12TnNhNnvaXJjXtcdHu26xkL290WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0hvtnObCbPa0uTCva4+Pdt1iIXt7o820SCG0Bi3SG22mRQqhNWiR3mgzLVIIrUGL9EabaZFCaA1apDfaOc2F2expc2Fe1x4f7brFQvb2RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0c9qWC/PXBDN7ORfmde3x0a5bLGRvb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGO6e5MJs9bS7M69rjo123WMje3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNdk5zYTZ72lyY17XHR7tusZC9vdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIb7Zzmwmz2tLkwr2uPj3bdYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdnsaXNhXtceH+26xUL29kabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtHOaC7PZ0+bCvK49Ptp1i4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOc0F2azp82FeV17fLTrFgvZ2xttpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90c5pLsxmT5sL87r2+GjXLRaytzfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o53TXJjNnjYX5nXt8dGuWyxkb2+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RjunuTCbPW0uzOva46Ndt1jI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2e9pcmNe1x0e7brGQvb3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o820SCG0Bi3SG+2c5sJs9rS5MK9rj4923WIhe3ujzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9o5zYXZ7GlzYV7XHh/tusVC9vZGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7Rzmguz2dPmwryuPT7adYuF7O2NNtMihdAatEhvtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mjnNBdms6fNhXlde3y06xYL2dsbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdHOaS7MZk+bC/O69vho1y0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd005emP/lt1/+4e1++e1fPvz0r7+/87aXn3yfXHizkrV/tn/+Bv319+RveY+PX9H8S/v917/lA65+PoNfPfERvzcX5nXt8dGuWyxkb2+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0RjunPeM1zG+Ocu13159mg9+Ixy/Mv//61+07MX9zLsxf+X8ZDj07XJj7tcVC9vZGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7RzWurC/Ouvf76o+c9fePk2v3/6tW+/1Pkbb/bfX72A+suH+OW33379xvv8/uoXP779v3zh/vgfv78FPvzKr7/+8ukV2i/f/veXX/ibd3zxlXz44af3fPsK37/+719/++2t/s5X9/JDfPh8Pr/x5RN++/l89+t670t49zfxWx/u5T/G31+cmN/9Ar/yVb/7Sb74zXr9m/vyjV/98gfx9xc//gb+LXMyF+Z17fHRrlssZG9vtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mgzLVIIrUGL9EY7p4UuzJ8ue58Pql/e5sN18Xp1vlDffLOXh9pXL7u9fNx33+fPH704MX/64Tuf70f27Un6jx+++Myu7/j5rf+4Fn/GXn9eH0+aX27An7/2y1f35vP/xj/g935fLl/7y6/rvXf5yj/Mb3241/8YX/3/E7zzBV5/8muf5Nc/n/d+k97+4/76b9D3zMlcmNe1x0e7brGQvb3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o820SCG0Bi3SG+2clnoN8zuvQb2eT79FrX8730/nzHc/7vXNXuAvj8CvD8zvs2/f/v3P9sU7/ol+fKXsh5+7HJhfHljf+dWXn/bLz//lK64vH/f9f5hvv/b3T6nvfpeMb3+Zr9/7y8H2y2X3+gV+7Se//kl+J6qX/+he/vjzJ/yd39kd34D6w1yY17XHR7tusZC9vdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIb7ZzWd2F++S0gLgfVxTf7uC/fRWPlwvzqZz4dIb9cit98K4kXH/cN+/LtX51eL+/45yXz4//951ter7KvDulvbqxvv7pvfU+P9/5BvX81vX7y33uX73yZr975xd75/yn49AW+95Pf/iQ3XJi/9zvrwvy9Z4cLc7+2WMje3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNdk5rvDB/3vV1yotv9vJFsN85ir58l8tLZD9/O+XLS2+/8im9fvv3XyT8+kP+9tsvn1+9/Nv1rV5+be+9xPf9D/Hu634vO/Ia5m9+uNff9fhyTH73pddPew3zN39nXZgXnh0uzP3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jmt7sL85tsVfO3CvPhmf/746y9JfbF3vs3vp9fdvvOhvvKNeV+9/Xvf5vftZ/4PL5h3/gK5j2/x5tW+73513/s+zN/+p/Tdr+vtu3zlH+Y3Pty//HFKf/mVffjf732B7//kd78P8yMX5u/9E3BhXnh2uDD3a4uF7O2NNtMihdAatEhvtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mjntLoL8/X7P3yF+tabvfoWGr/++svl2yy8fyf8TL75bF+eSj+/zTt/197bt3/1S5d3fPPGL7/38KtP6eMX8Pod3/nqXn6IDy+Mfn3Ffud7Vnzt0/v2P6JPh/Cv/sP82od7e2D+dMl99wt8/6v+1if5/ufz+Wz//Qvzd35n3zEnc2Fe1x4f7brFQvb2RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0c9ozLsw23/pfaPhij73O9rl79wscfdU/wlyY17XHR7tusZC9vdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIb7Zzmwty99Vvry79H7wc6z7owuzC/rz0+2nWLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOnzYV5XXt8tOsWC9nbG22mRQqhNWiR3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RzmkuzGZPmwvzuvb4aNctFrK3N9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjndNcmM2eNhfmde3x0a5bLGRvb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGO6e5MJs9bS7M69rjo123WMje3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNdk57xoX591//YfHvoPvwt9X9+vv3znTn3t/s6FyY17XHR7tusZC9vdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIb7Zx2+sL84eb74uj74dj8jSOzC7Pdei7M69rjo123WMje3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNdk47fGH+/de3B+UXR+CP1+c/9uJnPl+IP7/0+dPP/PVXf/ntt7c/++Itf/n112/jH9/gHxyhLTQX5nXt8dGuWyxkb2+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaDMtUgitQYv0Rjunnb0wXw/M7/7a58Pyiwvz51/+8nMfj8Z/vs+L9/7yw4+X5o9v+zXccdmSc2Fe1x4f7brFQvb2RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0c9rxC/PSSffT2325Jr+8TV9/9c1bfv4Y736XjPfe3SwxF+Z17fHRrlssZG9vtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mgzLVIIrUGL9EY7p529MH/8vhbf+Kv9XvwdgNcL88t9VN69ML++G788N38dN8vMhXlde3y06xYL2dsbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdHOaWcvzN/6PswfDsBvv/3y+69MvrzrV99yETfLzIV5XXt8tOsWC9nbG22mRQqhNWiR3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RzmmHL8xvv/nxh8vv22+v/MeP375K+dV3V37/Xd57yz8+2Pdws8hcmNe1x0e7brGQvb3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o820SCG0Bi3SG+2cdvrC/GEvv+PFi1c0fzw+//GTv/76y+Uy/OXdLn9n35sff5Y+O9/GnZotNBfmde3x0a5bLGRvb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGO6c948JsZh/nwryuPT7adYuF7O2NNtMihdAatEhvtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mjnNBdms6fNhXlde3y06xYL2dsbbaZFCqE1aJHeaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdHOaS7MZk+bC/O69vho1y0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzZ42F+Z17fHRrlssZG9vtJkWKYTWoEV6o820SCG0Bi3SG22mRQqhNWiR3mgzLVIIrUGL9EY7p7kwmz1tLszr2uOjXbdYyN7eaDMtUgitQYv0RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y12TnNhNnvaXJjXtcdHu26xkL290WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0hvtnObCbPa0uTCva4+Pdt1iIXt7o820SCG0Bi3SG22mRQqhNWiR3mgzLVIIrUGL9EabaZFCaA1apDfaOc2F2expc2Fe1x4f7brFQvb2RptpkUJoDVqkN9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0c5oLs9nT5sK8rj0+2nWLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOnzYV5XXt8tOsWC9nbG22mRQqhNWiR3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RzmkuzGZPmwvzuvb4aNctFrK3N9pMixRCa9AivdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjndNcmM2eNhfmde3x0a5bLGRvb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGO6e5MJs9bS7M69rjo123WMje3mgzLVIIrUGL9EabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNdk5zYTZ72lyY17XHR7tusZC9vdFmWqQQWoMW6Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIb7Zzmwmz2tLkwr2uPj3bdYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdnsaXNhXtceH+26xUL29kabaZFCaA1apDfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtHOaC7PZ0+bCvK49Ptp1i4Xs7Y020yKF0Bq0SG+0mRYphNagRXqjzbRIIbQGLdIbbaZFCqE1aJHeaOc0F2azp82FeV17fLTrFgvZ2xttpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90c5pLsxmT5sL87r2+GjXLRaytzfaTIsUQmvQIr3RZlqkEFqDFumNNtMihdAatEhvtJkWKYTWoEV6o53TtlyYzezxuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSuTDf4ynZrC0Wsrc32kyLFEJr0CK90WZapBBagxbpjTbTIoXQGrRIb7SZFimE1qBFeqOd01yYzUrmwnyPp2SztljI3t5oMy1SCK1Bi/RGm2mRQmgNWqQ32kyLFEJr0CK90WZapBBagxbpjXZOc2E2K5kL8z2eks3aYiF7e6PNtEghtAYt0httpkUKoTVokd5oMy1SCK1Bi/RGm2mRQmgNWqQ32jnNhdmsZC7M93hKNmuLheztjTbTIoXQGrRIb7SZFimE1qBFeqPNtEghtAYt0httpkUKoTVokd5o5zQXZrOSfePCnP7UzMzMzMzMzMzM3p8Ls1nJvnFh/tefcv+/mZmZmZlZaOk/D5mZ/UhzYTYrmQvzm6X/i9LMzMzMzH7epf88ZGb2I82F2axkLsxvlv4vSjMzMzMz+3mX/vOQmdmPNBdms5K5ML9Z+r8ozczMzMzs5136z0NmZj/SXJjNSja4MP/bT3vm/6PxtKX/i9LMzMzMzH7epf88ZGZWtO8eoFyYzUr2t16Y731e/lcXZjMzMzMzyy395yEzs659+wzlwmxWsr/pwnz78/K/ujCbmZmZmVlu6T8PmZnV7RvHKBdms5KtX5h/hvPyv7owm5mZmZlZbuk/D5mZNe5rJykXZrOSeQ3zm6X/i9LMzMzMzH7epf88ZGZWN69hNuvf33Rh/va/1/dY+r8ozczMzMzs5136z0NmZl3zfZjNfoj9rRfm7/7b/aMv/V+UZmZmZmb28y795yEzs6J99wDlwmxWssGF+d5L/xelmZmZmZn9vEv/ecjM7EeaC7NZyVyY3yz9X5RmZmZmZvbzLv3nITOzH2kuzGYlc2F+s/R/UZqZmZmZ2c+79J+HzMx+pLkwm5XMhfnN0v9FaWZmZmZmP+/Sfx4yM/uR5sJsVjIXZjMzMzMzMzMz++HmwmxWsm9cmM3MzMzMzMzMzGrnwmzWsK/9m2hmZmZmZmZmZvYjLn1vM/u5lv433szMzMzMzMzMbOfS9zazn2vpf+PNzMzMzMzMzMx2Ln1vM/u5lv433szMzMzMzMzMbOfS9zazn2vpf+PNzMzMzMzMzMx2Ln1vM/u5lv433szMzMzMzMzMbOfS9zazn2vpf+PNzMzMzMzMzMx2Ln1vM/u5lv433szMzMzMzMzMbOfS9zazn2vpf+PNzMzMzMzMzMx2Ln1vM/u5lv433szMzMzMzMzMbOfS9zYzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM7N77n8CENmSowplbmRzdHJlYW0KZW5kb2JqCjIzOCAwIG9iago0ODQzMwplbmRvYmoKMjM5IDAgb2JqCjw8IC9MZW5ndGggMjQwIDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzNWs2OJDUMvvdT5AW2Nv9VkdBIO9vdCG6IkTigPYGAww5oTrw+SSp2HCf103NAy2qoaidxvthf7MTdbxclZPz3IT3moMVvr5e3IlNi1sL4VqScF0ZOi/NSqti0jpTwiIL0SP//ICftxNc8gr5LeK4iCS9/iV8uf1+k+P7y65co/T3Knfj3sqqDgT9ffmJg5DeHjyI0Sn+DCN8us13n1H5SwYUQxKKFnie9Qvr4w6sW13/yYnJ3nbjwKpyV6eVreUn6chO+xGfC8HaxTq4zpJdFCa9BsQXFDc/mTD0p/rw8v1w+3pUTSoqXPyo9F7FMLjgppZ7Fy6v49bv4usS/OZpRx2dqusX3eZVJG//Uk9BuWkTsq+/xYxTJ+NSf2jaUuVauTNHv+rY012abexJqzho+rbNmTff1ae4MWUJ/XdvPoEqrRnl6d6sOFfsYCbM26wAEDcYVu/JlpisbMxdUttgt2daeRHhd9aqMqthp7lee/UQ/2/iuEJ0uPe7l8/z0Rbz8SCmhI8ODjfQ1CjnhVj2r/avGjCPjrz5LNkEfW1hH5UrGr4tM1/a0FrAprDPpyDZ0xXahQ2vtymClNaA1cfXKBwSYjKEni04rDkLw97YPGhDGmAKS9cvjfT826y76wcmZpkBq+GzY2HuPN2O5DebQ3LFAB6Qc9N7eNpyAMOIgABhuL07YIm+2IKyNrcUmAutjnxizbVepO1I435FiZH07r9SDFa/oWlqmtkxZCYEhBgSH2wk0oO+KpqX80Q2huK0e44tUe/wtcywdL0BD2Tq3l5RIfEkkYZm09iHM0WhqVpM2KgSXskZMKqqkq83kEbPcOsJ6g5vvcw0XBEX05QdjpgCbMIG2vm4CbMxYIZTM1Mq0E9kqVW3Zp8jbpfKojiQbCoWJgSZaUifsafTnp5Q7IV7owRqGCPSw55VA6xZC/cj1003VGG/IgMA7XktnWzQNTeExqN/Bb1tIStYwQz2NYDeADPLN3LGIswBpoqe5M3+RNdYvsk1OUGeATi9ZalOun7VxCsgPUizDpNs4fLSuvZx1iKzYUfP+78hTFM8aUVq5URsYThytelKo0JEiJ4tQQAOf7mTCYB7LeDDgQWPYuRmOWueaJRr/k+MpHeJ7EIdZ/f9aIhk6OuODVs66srrmhN+71qg+a4QCOz50wlEOfSkya+CZcqbuaghJ9ThJezSxoI5LDFUS41zeFbYuD8l0G43EyIjSjLhkddmh3DuzbNq8rmBk9jozt3xjG36FIpgesjO/RJH5D9jaO92aPsifZ7GK4WBpgk8j7c2BLedCc+1/4vZbe2tyrLWeGgp76BEqSC6ceD2evRvjmfXvJo/aq0t93eE18DE03GN4ai0j+fZsrdKTxPXnSVw03MJsby4T6tU3G2eWDVFoOzqUyEdgzcCBVI9WdR68qsJ41j/vxWtpg7n8uC+2k+t0o2u0LiCtGcxNbqmGkCrLr2V95FjXzON7bJRmdA4oeWTsaoCRnGzouN14PKCIHxwWH05uJNoUqBjGFenPXEorEPFC5EW8INELkRR6WSblkoqwADrt1/iWDJdnfC4kXdZdlRE+FwNGh6Qu+dLpy/vn9bNZcObBVcwoPS0m87AmVV1dqPykcQvcWxnSECjE28Gdjuk6EStRB9qbje8SCN/cDfLbhnxw3c4pjm1IGJPkELMaPRwdDTgsqNBxWOe6tZsJ+7BjeGNZO9B3eBDE3idyaLeJjLYdWd6zifbqJsqRNmIiqJhomINUUJrKyCG5BvEDdKKpOW0G8zD34RyH+p9EWN3TFyWNXToD62fMr7LCoIzSw0N1kZ6pypthUGVGwfKdobuqlXA+E+3AsKY/32d1JVjQNJh4igZe42W4dmMD6+uqZjlcXd45pt1vFVFTILh3q9jZGIPSo/Gyc/3mad+GqZ64PBfCknz566tqxD047IgpzXWUziXLMZEO6o6cDeIbn5pQN4/sRpFllKjlCCNK1B7qhuUAtfFQSSfH0skIUdtw7l7wmFF7Msx9VsYsq4jZsXQrMW815WXYY3RvDwu6yrvJumSnVAZ3dvJhlvlrwlzRtQcVXTcvZYTFA4zB+vWTsGtJgBygRmnWNnWRKuHeKFLYWEVLXuTgEmhrcWGzyg2VATjOAdF35z8RWu2p0NrqRBqzw0NryzGmzezJIkmrRyliSdN/KxJk51xegN6oL5hayjvaBrQ7v2+9v/hI6zC3M1ARYlvhJh0g2sz9Mjdwv88opOuIMA+vDIIEL+xvras/nnipOyKMjyc5CPrh13xFvPUtH+Y4b3kw2FdoDDqsFOtpTshqdSR9Lhy3oBU9udz76flXTqUJWLhzbyCIMcUUkWMGgxsD6bJxQTk2xaliVFnFRsAYnFC8sp33h981QsxqIy04Ba9QNIBIvKjQ1AWXbH4uf+SbTwvfwfoy/uAcD+OwTrzxDexjRxJrJE287Pc23sZ9pVz70yQpQrwMLJ00/75o8MMkrf1k00L0SCTZx0d+rcTU8J9Vrc0PolVuksHzj5K8PvZ7Khye0O38cklNaplD/M8LpeKgTPX6G6ZUT1mGbtJWTc74b9sp6d9/r/TedgplbmRzdHJlYW0KZW5kb2JqCjI0MCAwIG9iagoxOTM2CmVuZG9iagoyNDEgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDE0IDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxNSAwIFIKICAvQ29udGVudHMgMjM5IDAgUgo+PgplbmRvYmoKMjQyIDAgb2JqCjw8CiAgL05hbWUgL0ltMTUKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMjQzIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDI4MwogIC9IZWlnaHQgNDUyCiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BAQ0AAADCoP6pbw8HFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPBkXQLVdAplbmRzdHJlYW0KZW5kb2JqCjI0MyAwIG9iagoxNDYKZW5kb2JqCjI0NCAwIG9iago8PAogIC9OYW1lIC9JbTE2CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI0NSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAyODMKICAvSGVpZ2h0IDQ1MgogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAyNDIgMCBSCj4+CnN0cmVhbQp4nO2d649Wx32Aaf+OfqrUfqusZsmHRLVcVUpwZCmKKlKzRFairWhUx5GqJJVwgUioKo5VFImkLbaXZQky+MbNsICzKy8mJrKdbGDpYpvWrF3birAsB7NOlptZ03M/M2dmznXO7X2fR2tz3nPmzJzLPOc3M+9l7twBAAAAAAAAAAAAAAAAAAAAAAConyMPrBK469ELeXa68OhdBVIXPJQHjtjNL8RavgXLb7xcaItEjcsvVfeF0p+a7SPOdQwINRwEUgh1LFyTXe06LlR0IkJWoWGNKgXDg7b2ujVRqnFR1ZQTq0IJEUFYG6eLt5vyf+CIckhSmIn2CzN94IHkE0HezbTezd9fVI8/eYaJA1KKvstwHbxd1Eusu0qJQ0nsFJRIlOs6eW6UbJNYDWShNOmCfDVbcm/VNNr8LcndkudgDp9mo+RqrBZtONPwIaDPR87UdJXkOxEVLZ0rPnWeHM0r/2aGdUXaQaqz2jrlv0y2vcLqItYkpcKJtVHeps80/6mJ1VM6aulFohKLLzVFm/PR2aW7StoCpGuLT92nSH9FfGCrQhm6/2L9iIOFUKyx2ai2QkMkoYydoXxCiVVa51MSse5LRZvy0Tb/0q6Ssxw8w+4Kn2RKyxS6Sp62hK4S5BZKXwFThZKOSVev8wmVq8l3R6j+crU1CGU4ZnM+uYQSzyjM4a5Hj3ivlfYkdBn9c9xdm2iCSa0Zs1BaNdOESh8YkBqH2iafuZ7lGJQQXgcjDMqYhy57/TZ9PlkDFGq+SmS6667U84ROkTVsru+nG/tQ2vGKVKHS+lD6UY+cQmnH/xO9fTmdLlAmzlzfhE3LRztCoR3VkQJYIqDhU39I6y2YtmqEyh7l0wtlageZm0h5hTJmndzJ8M5b1iifUrQ+n3yjfIkiEw1efOobaR89irdFHWbDk1qqLer7NgahEkWYKmCie577XeUcHz0y5iXuq5ymmjylc6VeDu3hJNqpiTAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG3xAQDkAKEALIJQABZBKACLIBSARRAKwCIIBWARa0Kd2LpmzYbxs0XKPju+Yc3WE2WPHKCDWBLKc2Pr1mw/kAgGGjtC+ZrkkQWhYKCxIlRkidPuk5p97oaAcLuPl0qUK04ZZuBtHQ9Xx9lGeRRtYQLUjw2hBI0ko9yqHwgTuZOUyF8WUkaLnmJBZvF2U1kAncCCUCaJtBVeK5TUDgx3c1dK0SqpHkD3qCyU0KqLiCzJKZSkXrhWH8s+ENt8mAVdo6pQ6iBDJJKFCKUV6oM4IUpBx6golLZSh0ok+lD5GnJSH0qrntCHQijoGNWEMowLyAMLcvMsWKVr1GlG+TQRilE+6DBVm3wAIIBQABZBKACLIBSARRAKwCIIBWARhAKwCEIBWCSnUMsAkAOEArAIQgFYBKEALIJQABZBKACLIBSARRAKwCIVhZoDGBqaESpnDgC9pkmhrgAMNAgFYBGEArAIQgFYpBtCXb60MP8/78srFi5dbuICANikC0K9/OO1d//1l+7+0veeveSvOLbZeeX8bT7W4JUAsEDLQrmhaX7XQyM/ODL/07Vf+7fj8x67H1r703lnxUO75+d7G6jO77x/ZGTjce2rpor3MJbqJLl/5/ni2TZ5Gr2jXaFe+fFa/6Z//8ArO4JFj7U7XglXrP3xK61cmaos7Fq/fv3oJr/ynX9s1Hm1ebqhst1qPzr5jndDTm8eMWjjHuGuhWI5O/uMNHYafaRloUKL7vvWg1+/RxDqC18dG/vqF0K3WrkyVXGr6+TkxBNeXT65acvkZChUMng4rzdu3CiHE02AOe4n2bjTSX5cXKMEIVffPYvXl7wXy2+9c+rigi7PSKhEPinHc//Dm0KhNGfh7Ha//zreWDgG9pzWhbrn7777sMvGh7WM3ddnoXbN7Nr0mFOhjm8anZjZ5Qt1fue6IHic/uGIF8C8p/6L4ho1jVvpR/e4q17cNOJVaafOrpuIgpCk1MlNI1tmlsJXS0vLS0uGch2h1Hy0xzOy5bSzYnFiNCxddxajE4vOmlvLxx/2kztbt4w8PFQtxNaFWvuTs5+mcPgHvRbqzZnNm05eOf/E5smLbwZCLV1fWdy1Lnh+j7oBzE058aa7z5sT6701aprzT4yun7zoSrL84g+9Ku1YIzD6hBAIpjdrmmX6cnctqPkox+NFvLeWvUxO+aXrc/OP0NsvCF7Ttxy/6r/Y3aF9odJ9OfD9Xgu1sPzi5k07HxvdPLO0EAjltq82nQqe7V6TK+7LhEtpaUJdnH9+eDq67CvXl+KiQy8lTHmq+SjHI3a2gtJTj9DVzdnyzp716aMigwhC1UVQwd6c2Dw6uuXF5SuhUG4FftF9aB93QoNBKDXN0syWkVG39eitcjNyo8A6r4OijLwtXZwMt/lV3+3ImMpV81GOx8vPb7mFpaedRZiRp5Xjmyr3AINQdRFVxgm/ARUK5TbZPDZtdhacBqFGKDXNleVbTnckXBU0uoI1I06HRW5Xidvcrpcbd0zlqvmox7N0fXHPqJdi3ag/KJF2Fl7xm+PiF8XoOeggVF04tcprhwn/+rV++ZZ/pW7dunXH62CEKYQlJU287q2J0aCHE6XSdVOibVFr0FxuIh/N8QSNOCezlRU/VcpZ6IsfEhCqJ0RD2yOjk0P1yO8ZCNUThvaR3zPaFerd57d87d41adz7tS3Pv9vKlQEoQbtCXb3+6cpn6ax8ev1qK1cGoATtCgUwYCAUgEUQCsAijQk1AzAcNCMUAIggFIBFEArAIggFYBGEArAIQgFYBKEALFJRqBom4QHoKM0IlTMHgF7TpFBtfzAEoF4QCsAiCAVgEYQCsAhCAVikC0K9/3/z82/p/hYXezqVDQwtbQt1+aVTo3/19Oc/r//7wpdfeHaxhatSF8c3mmajUOddMs7EZM6kCMbJoY5vtJC7lUx6SdtCPfvPzwgGHfjG92b+5duHvyg49a2db7VwWWrh/M51m/dMjmpno1DnXTLMxJSWSRHk36UU8n9itPCkUfVk0k/aFurA98WQ9PPDtz/99NzLXxeEWrvjjRYuSx24c7y8eP3iZDgJm4dx3iVhTUYm8cRM6lRNmgmngtDhR6jkVFDuvDVBIiGT+3ceDw7K3zdjPikhk7quZXfpmFAHnFWvnF4rCfVm81elDo5v8n5ef8mRIfwdf/28S4k1mZnEEzO9s2c0muBJXhNl607Y5O3p/xR5cioo90fM16/3fgw9ysSdRGPdLn9h9LHz2fNJCZk0eoU7QSeEeu7BHb85eND5e/2Cs+rd/z3hLv/mP757YHCEcicoi6ZYCichU+dd0szElJWJMDGTO0tGOMGTvObkpmCyDO9X/uPf9lenpop+8z/KRFrINZ9UqclGB4ROCHXkJ3M3PJY/cVZd/cM178Wtwz8fGKGclpqMECX8FP68S5qZmLIyEfdR53MKFoW8gsVYKHmiDUko3UKO+aQQqmWhnr77bw585SvO388POqteeenv3eUDX77nmUERym2pnRYukt940sy7pJmJKSsTv4HnTR3lxDdvLlB1jTsJ1KYw23B2nXJC5ZhPCqHaFirqQz13ZQD7UO7AnDyBU9hiU+ddUtdkZuLW3i2b1iUmeJLXxNmObD7t9W1MQrkzu3njCSahcs0nFWbSwNXtGB0Tyh2UOPPS3w6WUNHMUALLwdyzyrxLmjUZmXhdmLf8nfwk6po423CFP2xumppK3KQuZM8nFWZi7yL2hbaF+sW/HzK9q+v9PfPQU3xaIh21fTXELa7WaVuoP/z+0u6HDt/zRZ1Ndx/4xr/+9/s3mHwjHfUtWtObtlA/bQt15eM/3Lz92Wf6vD5b+fQa9QL6ROtCAQwSCAVgEYQCsAhCAVikMaHanrQHoCGaEQoARBAKwCIIBWARhAKwCEIBWAShACyCUAAWQSgAiyAUgEUQCsAiOYUCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAWvkAAHKAUAAWQSgAiyAUgEUQCsAiCAVgEYQCsIgdoc6Ob1gTsvVEVsr0FOmc2Lpmw/jZ8vsD1IoFoZw6HjviqZViDELBQFNZKEknF1cZc51HKBhoqgql+KRslZuCklDR5nCNt3U8bD/G5sQJt8ZCaTPfsHXrhvB1nAAHoSEsCGWsrYJs7qKXLhZKXvIz8RqMQX7x3vGSsN2UeSTnCUk9lIJGqFMoXbpIo2SoiraG2UUJpCK05el2z4idALVQb5NPHP3TCCWSiF/xstwnE4RKyVw4uDxDjwC2qCqUxqhwTTJepESoEJ1Q+giVnnnmMQLUQ2WhpH5PWi/H3IfSWxYv6/pQGZnLxiEUNEV1oVzUATeXuE22YfyE0IBTR/mUfpNm2U83HoarzMwZ5YMWsCMUAHggFIBFEArAIggFYBGEArAIQgFYBKEALIJQABbJKdQyAOQAoQAsglAAFkEoAIsgFIBFEArAIggFYBGEArBIRaFee+21lwCGg2aEunr16tLS0icevwcYOJzq/fHHHztVvRmhnOKcQp3la9euXQcYIJwq7VRs36nGhHICk7Nw48aNW7dufQowKDj1+ebNm07F9p1qUihHZKf027dvr6ysfAYwKDj12XHKqd5NCuWU5QRHx2jfppwZAnQfpz47kcKp3q0IhU0wYDhV2qnYCAVghW4JdWVu/47pxUInkHOX/DmrKQsdVYlTKLyvm85h//R0kD7asUrpYAOEyk7ZWC0tfS4I1Rk6KpRYMcTlxekdAf6a6LVci9KTBQ94YTdnjfe4F4gyjPednhbTz11xN03PBZm5r5OnsH9uTnN8YYZuieFemnMxnFq8fv/cYuJyZeUQnybS1UWvhFoUa3SwqHkmpydztuoq/w51H+WoFqeDPYMFr8b6q9xFtfW1I0oflRkvuruIQklFS8nkVJqrpLtu0X7yRcCleumbUIm6ZRIqT7I7sXqmgKgeQCBSwqI7UdDK/0yId9EWJIVIQ7I0ocS9dKcJ9eALdePGjT4IJbbWlCiTzCctWdwkLCaUr4AQqISqHtTa9FOQHDILJR1DjmR6oURk2aE2eiZUhKZBo0OTTAgrOYsT1jiLTldKbb51MkJpnzMIVS8dEMrUwQiW4oZ/ohVjEio9WbKeK4/u9FG+aJcgd2EAIKMgXeeokT5U3ocP2KATfai4eSK1h8JVc9NCJVFG4fyEUj1JTya0B8M3cpJNrESG4ho3RomxIxwc1A50aCUNj84dINSokjXKl+6RNgfzsekbmVCeTgjVI0SftKMfhbKiDg8cCJUfcSDco4RQcXhMtvdgIGhRqFu3bvVLKIB0/K9vtCLUtWvXbt68yZehYJBw6vPt27edSOFU708++aRJoZa9b+w6TvGlXRgknPrsf2O3SaH4TYlMbvSEtq9T52jlNyU+/vhj3ymAAcP/LS+nel+9erUxoQCGhAaEAgARhAKwCEIBWAShACyCUAAWQSgAiyAUgEUQCsAiFYVaBBhK6hPqSv3Mzc01UEq7JUJRWrxHCNX9EqEoCFUahAIVhCoNQoEKQpUGoUAFoUrTRaEu7Hnwvgf3XIheRMsu09vuk167ie/bNq28ctLFSHtAJrnukXqLvKsf49+V5A3MAKHsl+jfl0AS+X44r7btcf6bFhM7CImDF45QQiooRHmh4nsVPvkQqvUSvVuwZ5v+JjmWXBCN8hPv8ZNMb4t0Q6gK2BAqvAMI1XqJ/i0ItBHvRyiJcjen92xzX09vcxcfVJp8tPgKQoQqTXeF8v24EN8PnVrhWic0uZFrW+QhEaoKVvpQmtuWA4SyX6J4g9wmnP9CGmWIb1iQOGrsIZQFKkcoYegIoVovUbgFnkVBuJIFCRMF/zrR6cGwiYhQVclRK2Jl3LikDuhFaxGq9RKT9yXuUElEIxRSU/2Cpg91H24VI1etiK6w4S0Od7t/64rcCYTqfolQFN7YLQ1CgQpClQahQAWhSoNQoIJQpUEoUBlUoRpgYWGhmYJaLBGK0u49qk+olfpxnkUNlNJuiVCUFu9Ri0KN5KORywBgh3aFysw8UygiFKgMbYSqLhRAp+i7UEQoUMl9j24ufXhZy++WSxbdd6G6yMXtq1dJrN5+MSX51NiqsSk1B29dtJBRnJwmfa+MzPMUOTDMHX388cf3PjclcuSp3Y8/vn/27XI59l2ozGfRn/znPxX9q1iiUiUdY9KUShMqD6WFKrW5F+SOUAhVGEeQP3/lv/L/ZQqVTbJKhq/F9cKyK9TYmB/LglX6IDI1po14GUJFeylFa5OtHhtbLR6GtHPsvrPJP4oo+15a6Aml42dT5z4qlWPfhcoToewKVThCuS+9ymcWKlBErepxMnkHUalUoeK00ZJOKClZ4IZQTJRyaixK5i1IhnVHqWIRKmbf9ILXg/rl4fFdE89Mv17Cqb4LlUlLEUpCU+cSEUqIE1Isy9OZUorThpRYEE2eYjJtSVGCSKQoPqV3EDtOQqiwoTd3dP/s63PH9pZwqu9C9SBCaddLQsV1Mk0oU81NiVDSpjCLLFsTEsqG+pkIhxzr3CGzykaoWCgvVl16+eDup2cv3SxSdN+FyqQDfSjden2EUnpbeSOUqclXJUK5Mqmx1Vl0enwaeXoZrAxCfTQ/G41QTB47WyTHvgvVpwgl1DnvuS70oRL9pPQ+lKaPVkMfKqm/2J8Kl0WJuiRU1QgV8/bs/qOF3ncc+M/yWR82z8YcTaL20ert28fECBWM8imDAM2N8oWHJozyCa05YejPi1Fi+3CARvn6LZQV+KRE00g+dZTc92jhhUmEgtbwYlZnGna2CYYiJBam9w2XUEQoUCl3j94+c2jfz5LsO3Sm0Gcm+i4UQKfou1BEKFAZzu9DAQwetQpl2mQR51nUQCntlghFafEetShUzvehyp8bQOO0K1Rm5plCEaFAZWgjVHWhADpF34UiQoFK7nu09OH772q5fKVk0X0Xqrsc+mb85aRvHsrYcP6Rz8lfZ5L2gLp49Yj7Ffhnj4oc2j/x+OP7Zi6Wy7HvQmU+i079wx8V/atYoosrTeSEa8vnHjmftsFdEh2SkkFRckcohCqMI8idH/1x/r9MoXKQ1MNdYRTH26DsEe8CNeIJpf1NiaO/+m2pHPsuVJ4IZVeo7Kefaoe8bZVqimaX0DUoTrEIFfPkyXNeD+oXB8d3TTx1cr6EU30XKpMWIlRmcIl7UWE6jVCEqAZICBU29F49sm9m/tXn95Zwqu9CdT1CxaMNOjuiThQRyiplI1QslBer3jj13MT+mTeWihTdd6Ey6UQfKrLD+VfZ4K4w7wF1YhDqt7+eiUYoJp9/rUiOfReqixFq2W/UCT7ELxPDd6ZBCUb5KlE1QsVcnNl35NUiRQ/8Z/msD5vnRXprKSmLrg/F+1DNM1BCWYFPSoBK7nt07vgkQgHUQjAUIXHu5JPDJRQRClTK3aOLpw88qfymxJMHThf6zETfhQLoFH0XiggFKsP5fSiAwaPvP9LCrx6BynD+6lHO96EauQwAdhj42TesQ4TqPkMboaoLBdAp+i4UEQpUct+jm0sfXtbyu+WSRfddqO4izJyUnIVJmA4mniPauA/Uhzc/1N7npkSOPLVbN7FNTvouVOaz6Nt/dqroX8USXYTpNKU5/7zF1WPCnLqrVwvzcmr3gcIUm8EQoYrgCPLoX97J/5cpVA6UOQWjKae9LfEUtRe3j0VzAyZ36tIUmwNLYgZD4Tclps4Vnf/dp+9C5YlQdoWqMMduuGlqLJxzc2z7lDSLLg5Zoewcu+GEa788PL5r4pnp10s41XehMmkhQkXxSLvJ0SeYVdP7J2Ff3ItCrQYwzLE7d3T/7Otzx/aWcKrvQnU9QgkTP7uCBJvc0HRxxQtUpnBGJ6oCVWeBDyYHvfTywd1Pz166WaTovguVSSf6UFGHKNwyNebOA++uitJOjan7MNJXMwahPpqfjUYoJo+dLZJj34XqYoRa8VtuQnyJXor6JNbIo3wMSlShaoSK6dMs8M18ls/6sHle4sae8KZSpI+64CK+D4VNDTBQQlmBT0qASu57tPDCJEIB1EIwFCGxML1vuIQiQoFKuXv09plD+5TflNh36Eyhz0z0XSiATtF3oYhQoDKc34cCGDz6/iMt/OoRqAznrx7lfB+q/LkBNM7Az75hHSJU9xnaCFVdKIBO0XehiFCgkvseLX34/rtaLl8pWXTfheou4jRQ6myfygxRWftAHXjzQ+199qjIof0TuoltctJ3oTKfRav+8VTRv4olukgzEEYz6YYvBFmEqQ7N+0BBis1giFBFcB3ZfqfAX5ZQOVBmzI1ndFenzg0Ta2YFxai6ScxgKPymxNFfFZ3/3afvQuWKUFaFKjYLfII0S7zYhUM2KDvHbjjh2i8Oju+aeOrkfAmn+i5UJi1EqDgeKSizwGsS6DpXUA+GOXZfPbJvZv7V5/eWcKrvQnU9QsWzUYezvecUhU5UBarOAh9MDvrGqecm9s+8sVSk6L4LlUkn+lBxU8/ch1KCV2Y0g8oYhPrtr2eiEYrJ518rkmPfhepihFqWBu8SL3OO8jEoUYWqESqmT7PAN/NZPuvD5nmJG3vKm0q53ofCpgYYKKGswCclQCX3PTp3fBKhAGohGIqQOHfyyeESiggFKuXu0cXTB55UflPiyQOnC31mou9CAXSKvgtFhAKV4fw+FMDg0fcfaeFXj0BlOH/1KOf7UI1cBgA7DPzsG9YhQnWfoY1Q1YUC6BTdFOq999679957X3jhBSIUlCD3Pbq59OFlLb9bLll0B4XybfrOd75z7dq1XkYof2ao5MS5pnk/lfniq8xbmH+CqYoFVd6/G3jzQ+19bkrkyFO7dRPb5KRrQok23bHRh/rTnz5S9K9iif70uKvHovo8NbZ6tXkiXdm1CvU0YWdiEkVd6oEVqtgMhgMklNOoc/RxJNLalEeoTBxB/uLMVP6/TKGy8era2FhYmy9ud18EU+uGldCfKd6vleJkuvoJDf01wjZxSutg7lB1CtFEenkyxbSCgsPbnlwrpFwdnpIpcy+BPi53iMQMhsJvSkydKzr/u0+7QjniOPr4Tqk22YpQdoXKOwu8N8e792ps+1Q8tW5Q6aekGasl0cLFyBBx+tB4jaCZ3qcYYZtuKlK1IL+A6FCT7q6IrVhT5m26VHaO3XDCtV8eHt818cz06yWcar3JFzml2tTrCDXl/N+tUt4/4szUXu0L/lHWy3NYR4aEwoVG+ZPIrwryD1blq8FCVukFqfMCrxhDqTnzjmOYY3fu6P7Z1+eO7S3hVOtCRU6pNvU7QnmhyY0c3uJqKZ6o+oRiyJPCC/g7+DXW+3+QMumaCSE7VSilIK1QsiaiXebM26HqLPDB5KCXXj64++nZSzeLFN0FoVLocYQK44isiRexov6VVPE8Jaa04SDGXbs9in1RnFpZ0bT5otzd+p5sUurjjrKrMWXOzDuOQaiP5mejEYrJY2eL5Nh3oTocoYSBtmT9VDod8aa4Iy91WMRG2apVak8qfKkb5dOWrutD6XpT5pSrwiZnauatUDVCxfRpFvhmPstnfdg8G/VBnYxEmroar9C0pITQkxjfS9Rbw/tQ8ThcNDqnH+XTmZ48+OQoX1bmXWaghLJC/z4pIfgENZH7Hi28MIlQPUYcjYauEQxFSCxM7xsuofoXoaB+yt2jt88c2qf8psS+Q2cKfWai70IBdIq+C0WEApXh/D4UwOBRq1AAQ0hNQgGACEIBWAShACyCUAAWQSgAiyAUgEUQCsAiCAVgEYQCsAhCAVgkp1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQKx8AQA4QCsAiCAVgEYQCsAhCAVgEoQAsglAAFqkq1NnxDWskNoyftX+UbilbT9hNCVADNoQSK/CJrTU5lQISQWewLZSvVLPVG6GgM9gXyjUqilGuXR5CmmidGMqEpmOQ1FmzYevWDd6KuBR37fi4mGuUnZebeDxxnmFB3tbxcHXTkRSGgBqEilZJGoTVV9AtXhSimrS3sjKQxF8Om5dJieKtwdpo0dtbLRPAFjUKJW2K5NHVYzGmSdlIkeWEvBS/0AqlLV2fJ4A1amzyJQcA1XagGr8MORuECorSppQk1TmOUFAD9oWS2lepNTZKaYxQGUKVilAIBTViWyhx2FzYJtVzoQ+l9neiBGahkr0gfUPO1IdCKKgRG0JJqOEqOaKWf5TPFKG2blUH79bEcmWM8iEU1EdVoZoGDaDTIBSARRAKwCJ9Ewqg0yAUgEUQCsAiCAVgEYQCsEhOoZYBIAcIBWARhAKwCEIBWAShACyCUAAWQSgAiyAUgEUQCsAiCAVgEYQCsAhCAVgEoQAsglAAFkEoAIsgFIBFqgn13uz4j5KMz77nrj44r0mrrNRnmSNZR+j60QY3yLknRfbwzqj8qc0fLFJg3uMpsbWOErOwE6ESx9D1ajY0lLgR1YWaP+hgz6hUhkmogweDkBVsENPMh9vSA1lKsmUpPMZFjM/OHkzZZ17a6KV/L87OfzGfzMDd4lSRMP6K6efFE0/sKJyJuxjumXx+O68Pzs4mc9ecnViEezxRYuWAk8eTeV66U9DexLTixMs4LxilPUHDWWsPUrhZ8s0VE0ub3RznheWUzNPyLENtQoUnEtWfOI17MVXJlKxSk4n1UnqoKuVq9wmWBKPCRc3xetkmDfQXhSNTd4xS+3JEmcnH5d3BuMpH566cXeL4Uy6w7r4o5y6el24Xw8VMK06+jNJjUXOC6krTQZqPR3eTkpfbfIOy8ixD7U0+TRMitY2dM5lEePe05arJhMzFOi/7pM82mV5/tMKOQabec9Bdp/gk1ifNVvGwxeMX46lSrv5iJs9dX3O0Tb7005T3jutnXJHVEzStNB9kRqUSL524HB1wxp210Xl0aUMosT2j1J+cyTziJmEeoaQ14TWPxUi0i4RyE9mK6aWapuwY3Djv/0FKtRJKz41ElUqeXVoDVXeh9JVEPfisXTJOU9pZQPNgDE9QtzL9IC0IlXVn+ytUhBqFciYTH3EZdUDcRXkARl0h5cFqOCQ5vT4EyEU6XYUoNs2qqcRz0z3A9UVon+oKtUSo1OLkHovijjawNhahUu9sf4VKxF6TUDmTBcvmB46ApokePlU1RRka1VJ6XRM9eeQ/ErLR9HW9FIlnufbssvpQ6Vcp87ySuxguZkpx7/lPDvHM3Ne6E9SvzOxDVREq6wr0Vyi1MWPIKi2Z1B50h6qSbQb9ZdGN4Qg1Vk6jGRZIppc2KTsmEov9BumQ9GOIybMTi3DDniytpgFmOrz0SxR6b7yYpuKSPoUVV3uC+rNOO0j98URPqWyhMu6sJs8y2BEKypN/7EWg2lO0WbQnWOqs+wBCtU3+qiV2+XtUGxEKoQBKglAAFkEoAIsgFIBF7Aglvgud3tesOjzVp+EtGEKqC+WNPcV1XHjL0ZQaoWBgqSxU6tvzwkCv8kGaZf27ePrvX4QpxXc5tZknv48A0ChVhUp7PyHx+R7N5yVyfZxe/4kVU+a4BG1iQahcNVj9wHzuj9MnPxSq/TichU9hAVSnqlDyB4xVzN+wKPlx+owvOCAUtEpVoTI+L57yDYvcH6fXR6isr28AtEFlocyjfFnfsMj7cXptHyrz6xsAbVBdKBfD+1AZ37DI+3F6ISdhlC8tc8yClrAjFAB4IBSARRAKwCIIBWARhAKwCEIBWAShACyCUAAWQSgAiyAUgEUQCsAiCAVgEYQCsAhCAVgEoQAsglAAFkEoAIsgFIBFEArAIjmFAoAq/D9WIShECmVuZHN0cmVhbQplbmRvYmoKMjQ1IDAgb2JqCjg4MTUKZW5kb2JqCjI0NiAwIG9iago8PCAvTGVuZ3RoIDI0NyAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVlLb+Q2DL77V+gPrJd62gaKAEnHU7S3YgP0sNhTi3YPmy1y6t+vXqQpSjOTaS9B4Iwtkp/4EkXZr5NWEP8+pJ9lM+r3l+m1jmm1GGVDO6R9UBbm1QcAHUlFEvAnDqSf9P8DzMarb1mC3wP+liHAm6/qt+n7BOqn6fOXOPpHHPfqn6nAoeCn6VehDLw7/biGVpt3qOHrtLgypwmz3vy2bWo1yiyzKSp9/PnFqNPf2ZjMblIuvCjvIN18qzcJL5PoJv4mHV4n56HMkG5WrYJBYIfATZ4tNfWMNrNZtqRRFrd2m8GFbVvUqqyDGbwByMwRS4cCBuqv6el5+njWXmlQz38eaR2lgitS0VL1/KI+/wBgdQR5BAAfL/0QGbc5qEgw5/icxpZ4ucpwFkwuEm0iJiZTmfYilMYg0rQtfI0grPFZF+aMupTZsrCVzBU9zyBRbk3dIWWhtQgkhnzFR2MYUOOJ5OeTRDpf8Btwf6F1m2C66PWkGBHSva+KRSYLiUM/4h0a0FvoHlTMsszy8EU9/9IkwRK6JIBTRfLVfxkR9LyiqTlW7Sjat4xch1xZznWjNdp5zqvyvZuRYnTNGF9ydTBv6NBq2LNGIusGnDcyy/azmppKPsbIk5daHihzu8Cjd9te0sheRO2s0L5qvPMMJsSA8TnSpcYl+WfvU2dd+9S54aiMVxMoX6aasHXwLlY8CW9+ZLatzHLrqxGyNjSEUC/NUM7VL2x9UhxQuEkfjth4siGsFQpKavaK3nQUZ6bQSIJn8O6CLl354QxU10dOM2agefLgkSNJLVx7WX9eMzhOr5rMbZrAMoOyA/vcMP3WRSs5YYVQsJw5AkVqITEPauYUJGQNsMy1y0FiNGEh4PXIAjRxLLlLSekUDon1hAfT8cpD0DAwipTq5mwtTLafajIMgaU86buUeFGkScpUa5f/7YYuN0ZBz1qGAWSpOn022X4PHNVKZ2Z9T59B/GITHlAvlIuG5yzGhI9wHHdRqmpCJq9UpG0tvWlEWo2Hu0OnI3tOtdrUTiI1hRTowHYVrreutQV1ZImBPLnBtG+v5E0zOigjbrCDdQF9UHrJzvH1utHhmuVwMq5EC6JQi3aFOuKoUeC9AwehfQmZumVC0jV79SOL96n+Ngj7QaBq7yQa3/5I8touR0xv7chpqnBBh3Ef3Uc0QH+mMUx9vc7buLOqhJHjWwZgehNcuywu1X5kb88QiMGLMx+UdlupEkh8UdJxEzxfUAeXe8nzdnM/2nW0v64xPCw1GjZGjloL7oHe9+wgkJd3VTy7qireGU/nROze18NaokkjjvD3KbT0fWeTLaICwrC+Q9Pmpud+R7m2iN64dgYrYOs3s+586fVsckmL9V+fSslqCHggz5Nj4dgF0xs6QStxlwFODEJNvVSvMEtZQu7ME40C2BDt5WjcovJzKh8ceuKWtyntUMBUJEy5jNooByP7R0frqxpjP2bwpLTW8ANbRJsQwoAXHboc8TDY90KZh45WchtemL/PRwofZoqwD/QsFvcFCU+GR3t5REria1wamJXXNwRv+9Vso6t02KjCxcfga1l6BOpjMUeQhlUWn7U7FriWNH19v5e8uD/xuQy2zMAqoXg1wvnvPd6SzVgoeUbvQkcsrqFefSFkp0vS6o3bf+PhvfemXLU0fmOb67PB9edGUgjFaG/XF17t6fBfXY6yeMCk0/5Z0JuNt87HHGgFvzn3+t2uzg33XQGmeQdpTYieLY0Lfj3eI2p6t9r5efg2Ug/excp49eH3g5edgwaLb637s3wlH+JpJGjffr0Ata3zunaj+RPE4NuFMWF2aVozGgLxeM8HDQEjv7wU8p3aaj/DFuQjsNv7PrmQ+KfrHyn0rNf80SMoraNQipFZKHRPMVRPwzAZp2dvw/sOSvr7F0pSiioKZW5kc3RyZWFtCmVuZG9iagoyNDcgMCBvYmoKMTQzOAplbmRvYmoKMjQ4IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDI0NiAwIFIKPj4KZW5kb2JqCjI0OSAwIG9iago8PAogIC9OYW1lIC9JbTE3CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI1MCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA1MTMKICAvSGVpZ2h0IDE2NwogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwTEBAAAAwqD+qedtB6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM4AWKJr3QplbmRzdHJlYW0KZW5kb2JqCjI1MCAwIG9iagoxMDYKZW5kb2JqCjI1MSAwIG9iago8PAogIC9OYW1lIC9JbTE4CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI1MiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA1MTMKICAvSGVpZ2h0IDE2NwogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayAyNDkgMCBSCj4+CnN0cmVhbQp4nO2dQW/UyILH5xu8b/C+wTv19d3fYc4zpHNHeuLOiiE0Epd8gJEQA4Qhh3dH4inABCUhpxEzyxNhAmQVBhY9jbSws4EAUXZh2WzZ7nbbrnK7XFVd5XT9fhpl3G7773LVv+pftpvuoyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOg6/wEAABFABAAARAsRAAAQLUQAAEC0EAEAANFCBAAARAsRAAAQLSYR8I+rJ/8y4sKtpi0nbzGZWxf+cvLqP8z3BwCACbSOADEqj0f1NAwmjPFEAABAh2kZAaUASEgG+fpRmggAAOgw7SJASgDp3fINolIE5G+P1qTvXh3dVRqP9eMNL4wjQCl+8sKFk413owAAQE3rCKidlRfiIVlMtxtHQHkpE0lvIw31xnuPlwrv14kz+gMAmOMuAlTb5QN/9XIgf3ckl29QOoTyeKrdAQCgPS5vBBU/KaSIgCKVa4TxcnlcL0TABHEAADDC9nFwvqY0dk++ChihigD1VcBkcQAAMKJlBJTu30+6W1//LECdC+Nl1bOABnEAADChbQQkyB/OSRjfqTl59Vbhto78iSDp/r9iOdvu6oXik+NJ4gAA0BqTCAAAgJmACAAAiBYiAAAgWogAAIBoIQIAAKKFCAAAiBYiAAAgWogAAIBoUUbAAQAARAARAAAQLUQAAEC0EAEAANFCBAAARAsRAAAQLUQAAEC06EfAh5T33eDdu3f530jKkNV/95smLBNqaeaJxwYxt7JzNCMgs9a/doOff/75p59+irAMmfm73DTBuRw9oVvAE8q+AAboR4CY7oqa3+8Ab9++3dvbC1sY/2UQxxJNoIyA7jRNcMQYuLKy8sMPP6ytrW1sbGyOuJdSXJZfdpbJxRanub6+Lk751q1b4vRDt4AP6voCGKAZASJzs5rf6wC///7769evwxbGfxmyQV40RJebJjhiDBSDoRgYf/zxR3Gl9iACxGmKkxWhIE5cnH7oFvBBXV8AA/QjQMx7OzLOiOH31atXwSPAcxnEsUQTKCOgO00THDEGivm/GBIfPnz4+PHjp0+f7ljzb1PGsnhPnjwRJytOWVwLxBMByr4ABhABx6UMRIAOYgzc2NgQE2Mx/j979uzfZ53nz5/v7u6KFBCnLE6cCIC2EAHHpQxEgA5iDNzc3Hzw4IGY/4sR8p+zzsuXL0UKiEsJccr37t0jAqAtRMBxKQMRoIMYA8VIKMbDnZ2dLAJ+m2nECYrTzCJAZB8RAG0hAo5LGYgAHfKrACJghiECHNKtCNi6dOLEpa2mraY+/GoUI6II0GuUKdKmAFO8Crj/7VdffXvfmZybQ/uLgOA2KEAEOMRNBAh79Hq9Myv5ipUzvZ6+YXJ3/bI0P7/0S9PmDcNv0atJwfIXolCFIk5AoxjNZeiN0TtqA0YRUC5HyokzZ9r15aw2DEYAv67IqIkAMYZW6+Gr06fbDekPLvf7lx8YBEFxl6Qg+Ysbp3unb+gfWvWOXgR0wAZe+gIY4CYCEnucP9+fG5pj69Jcf16/2477uJMI2L876C3czgryXVKO0Ysr/flrT1uVx7gMicLyi6w2Xyz3XTjfKAL2Dz8Py5CX5/PHj58/H+7rHzirDaHUaq89367IyCNAjIqFCHj9/lO1Hj4dHn769P61/kiejcNCqdVeycHvDHpnb6aL9y+KOuiPXlzqzy890j+06h29CAhuA099AQxwFwHX1q7P979LevvKN73B9evDbjueA6Qtn84iLp0pr5obzUy+WRB7fXemYcLQdBPmYO18/0o67NxeGGxsDPIX89d39ktFOpGPTqU1+ZhTP23ViIDRqCV6jXB+OhAWJkSZbLJidJriYJMmWFY3gorlySZyyV8xEczqeViuYUmUtTHeq9J8qvocH9SfKzJqIkA1lmaT8+SvuB5IlE/fGF4sDKfm40uHdN5evApI/357evi2evsxb+6e719K19w8O1hfH+Qv+t8/fq3cUXno39LrhrJ4uxtBwWzgqS+AAe4iYOnp4cag981KMtlb3t3J2j0ZQwebo/wXDSy27PUW1tLDbJ7vJWbYP/x1ODn5vHtNeldB4334p9eyYWfryrlrTw/WBumLlYXe4O5+6q6FjeGc5HrqRmlN7vbeuc0j9aSnRQTsjS9MRrMxcXZJVSUrNs73FlLfi/Kd35gwwXIWAdly0hD9a7+m9dybW/o1r/Ca2hjvVWkguT5LB/XmiowWEZAti7+9/tKzrB6+vpwtnBCjrBhtz64Pz+v7ua+/vZ9vP9yrd/buqEjK7QuHfbTUn7t4P5n3Lyw9enN3kL64caY3uPP6N8WONYdOcmFh86h0EWIeAX5t4KcvgAEOI+CXZPqdhPpAtN5wFL3Sn1/ePUhbfuf6vGjg9KowW5OM1JUrfeW7Eo0RkBxLuGzru/45MegLoeTFlf75tYP0dlCvyMJteU3q8F5i6Y8HNYdoFwF7q+d651b3yvdFs4uTpM4S3yeuX6s7WoL7CMguipJ6zhfSJpNro9j3Kw0kb189qCdXZJhEwHw6F38kjjJaSMbbS+XzOnuzEgHzyztvhuO7evvCYV8//j65+3P/4tyCGPRFICQvLvXP332T3g6q7Kg8dLqwfnT4xuRGUBdskDPFvgAGOI2AvYPd5fms9YqGybcRTS+bULmgcM6Y5k/jpDONldsLg6QoYpg5d2Xr9kL2IKB4ZzLh40HNms1sglpDuwjIHkMknu9fz46U3JXNNsh83+j6aUSAqvLVtVHs+7JOeXvpoH5ckWESAdmaykI6yBfO6/BNJQIUUVLevnjc5HHAmRs3zw6SQV8EwsKl+zfP9tMHAcoDqdYkhpSeHruIAE82GDLNvgAGuI2A9Ooubf3hwyMxFKcXeemT2aRh6zp7Nm1wFQHp44C5uX729Hf/7rnkRfYgoFCkIfKa4R2Mz5vnau9ItomA9L7HcA6cFSKtjdEGYoQUM6j+aFZVh6cIqKmN2r4vby8f1IsrMho+FKofAcmg3fuXG9K+dREgb18ieRxw4kQ26ItAWJj7+sTwQYC8Y82hH73/tLlQfcwwrQiYhg0SptsXwADHEVBdc/Ax/QxAymBTDAPK7pzeBeyNHvy5iIDk8rQ38lj6InsQkLisUKTsSZS0Jp++ftwc1DwPbo6A8UXx3LUX6Qi4n9wWH65aGBSeke1cz/tDPZ4ioK426vq+oj5VB63dxZkrMpxFwG9vDovn9ZX0LKCiI29fzoBHS/3ecNDPXmQPApJ0kHasOXSyaWLIova0IsCtDXz1BTDATQTIHxXL14yf+qTzwOKWheWDj8kWpQ+q1X/8TCcCksMWpYqXpuMiHR1VC5muGR86KZeyFE0fTC0IFgSy06ye6co3vWbX20WAXO3FBpIX5Nqo7DVhe+VBa3dx5oqMYgQ8f/785cuXpa/UeZV8pPNVcTlfo1zIzyvfsrLXhO3/WT3yUXGXo6PDveJ75R2Vh0423TuUtEUEiJPVioBQNvDVF8AAVQLwBRFey9D08YchfEGEDvk3hT558mR3d1ekgL9v7QzEs2fPHj9+PBvfFGrZF8AAIiB4GcR0qPaDRwWIAB3EGLi+vp79XoBIgWl/1X9wxPxfjP9bW1vilNfW1o57BFj2BTCACDguZSACdMh+NWxzczO2Xw27d+9eVL8aRgS4ggg4LmUgAnQQY+CtW7fEYCiuBTY2NvJf2p1hxGmK+X/+28GhW8AHRIBD9CNgf3//bjdYXV29c+dObGWY/NvBPkvSZS5HT+gW8AG/HewQzQj48OHDu3fvRPKKCP6v0IgZ+H+OEMsxlEFUu6h80QSiIbrcNGGZUEszTzw2iLmVp4F+BIjMFdUuwvdtaN6UiaEMotpF5YsmUEZAd5omLBNqaeaJxwYxt/I00IyAg9Rjmc26QOaB7G8kZcjqv/tNE5YJtTTzxGODmFvZOfoRAAAAMwYRAAAQLUQAAEC0EAEAANFCBAAARAsRAAAQLUQAAEC0EAEAANFCBAAAREurCPgVAABmiLYREPIrYuv5n37/6IsvlP/991//Grp00Ak6616AgMxGBAg+/fnP8vj/v3/605sXL0IXDTpBl90LEIqZiQAx1IsBvzj+f/7jHxn/IafL7gUIxcxEgODtw4f5+P9/f/jD/uZm6BJBh+i4ewGCMEsRIHj3979nEfD+b39zr769fOrLLxdX619llNadWt7OX+TLSlYXx3umr8pi1XIo3h6vT1YXthoxuQAzTvfdO7Morbha6BB55xjZXsOu5f5Sfak6Np1FxYxFgODDxYsHi4tTkU6MeurU0EjFF6WxPnHxeHVuvMkRkFk/96h4mW6cKFSMXXOs0vrR7hoHjodj4d7ZpmTF7ZoIUA7kVeT+opwu0Vmamb0ImCKpPwSpRVYXF5eXswio+mbk42z7xey9CebaTnUK7h9vK+018Vj5+u3t1e2IXa0kdvd2AEcRUOkvUvdRH2+PzqKECGhB6o/V5cXEI6uL6aVs6qiq+0Y+yv6fObTVjSD1ovL1SLa+70ToaiWxu7cDaEWA7p0YjRtBdBYNiIAWZP4Q0/9VsbiYD+4NEZDFxTYREJjY3dsB3N0IkjclAgwhAlow9Ed+C2hb50bQ8CZQsot2BFjfCFKUOnpid28H8B0BdBYNiIAWDP0hrgBOje7tND0OLjxzavMJB/vHwS0+ihQJsbu3A5StOH4OO7a52wigs2hABLSgeoMnj4C92g+FFr315eSJjv2HQsc3Uos2jtDVSmJ3bwdQzMorfi19KPRL5W3Wws42HwqlswwhAvyTPkwA3+DeYwr9ZaoQAd7ZXl7G0QHAvccT+st0IQIgEnAvgAwRAJGAewFkiACIBNwLINM2AgAAYGYIeBWAGmqooYZaWDUiADXUUEMtWjUiADXUUEMtWjUiADXUUEMtWjVnESB9oUH5V3lanpRbtaGi5tcvtFWr+xfopmUbidb9Q/VWam7rzUJNVUvmrSCr2bWCXBIbh1T3dV22kaiJQ+in9NOpRID0tWal77pUF8SX2l6b3+RqrVbQcFK2XKn2S+VaqLmtNws1VS2Zt4KsZtcKcklsHFLd13XZciUDh9BPXZUtVzr2/dRNBEhfbqzzbUv6apO+PLlRbfhlbnpfxWygpiy4lVois7hoMLuoqlm1guN6K+mWLeJCbeKaBjW3fpu4r4OyjZZNHEI/rQhbqc1IP3UTAdJPnCR/l0dXI20vbZQ/mDK8tqmtqhYXShN+kMVArWFla7Xt0U+N2V9gWrWCqmzWrVAQdNAKyl3bt4JcEpuyTdrXRdlsHEI/nSQWaT+dXgQUv4/bthOpvllcV61W1Khsstp4jQvby/MpCzWrVpDL5qYVFAWyKFulkoxawVMEOCqbjUPop/RTSW1KN4Iqj2EsL35LCjV1ZNB8Frcg5MyddCWnr1Z4ZFWb4u1mF8atoCqbVStUasmyFeQ6N24FDzeC3JXNyiH0U/qppDatx8FWCa5SK6SkZRVZP2baqxq17uLNpGx7uar97MLxPMqmFRS1ZNEK8i5WrSCXxMYh0r6OyzbEyCH000nE2U8dRUB2MaP+eJhJFUlqq/lv/Di5VybpG6utln7myN72Q9xYy7IVJDXjVlDXkmkryGq2rSCXxMYh5X3dly3F0CH0U/rplCKgPaihhhpqqIVVIwJQQw011KJVIwJQQw011KJVIwJQQw011KJVIwJQQw011KJVaxsBAAAwM7SNgHfu2N3d/ewOUbZ8+eiLLxyq2YOajKZD3PoNNTO1IA5BzY8aEdCoZg9qMpoOces31MzUgjgENT9qRECjmj2oyWg6xK3fUDNTC+IQ1PyoEQGNavagJqPpELd+Q81MLYhDUPOjRgQ0qtmDmoymQ9z6DTUztSAOQc2PGhHQqGYPajKaDnHrN9TM1II4BDU/akRAo5o9qMloOsSt31AzUwviENT8qBEBjWr2oCaj6RC3fkPNTC2IQ1Dzo0YENKrZg5qMpkPc+g01M7UgDkHNjxoR0KhmD2oymg5x6zfUzNSCOAQ1P2pEQKOaPajJaDrErd9QM1ML4hDU/KgRAY1q9qAmo+kQt35DzUwtiENQ86NGBDSq2YOajKZD3PoNNTO1IA5BzY8aEdCoZg9qMpoOces31MzUgjgENT9qRECjmj2oyWg6xK3fUDNTC+IQ1PyoEQGNavagJqPpELd+Q81MLYhDUPOjRgQ0qtmDmoymQ9z6DTUztSAOQc2PGhHQqGYPajKaDnHrN9TM1II4BDU/akRAo5o9qMloOsSt31AzUwviENT8qBEBjWr2oCaj6RC3fkPNTC2IQ1Dzo0YENKrZg5qMpkPc+g01M7UgDkHNjxoR0KhmD2oymg5x6zfUzNSCOAQ1P2pEQKOaPajJaDrErd9QM1ML4hDU/KgRAY1q9qAmo+kQt35DzUwtiENQ86NGBDSq2YOajKZD3PoNNTO1IA5BzY8aEdCoZg9qMpoOces31MzUgjgENT9qRECjmj2oyWg6xK3fUDNTC+IQ1PyoEQGNavagJqPpELd+Q81MLYhDUPOjRgQ0qtmDmoymQ9z6DTUztSAOQc2PGhHQqGYPajKaDnHrN9TM1II4BDU/akRAo5o9qMloOsSt31AzUwviENT8qBEBjWr2oCaj6RC3fkPNTC2IQ1Dzo0YENKrZg5qMpkPc+g01M7UgDkHNjxoR0KhmD2oymg5x6zfUzNSCOAQ1P2pEQKOaPajJaDrErd9QM1ML4hDU/KgRAY1q9qAmo+kQt35DzUwtiENQ86NGBDSq2YOajKZD3PoNNTO1IA5BzY8aEdCoZg9qMpoOces31MzUgjgENT9qRECjmj2oyWg6xK3fUDNTC+IQ1PyoEQGNavagJqPpELd+Q81MLYhDUPOjRgQ0qtmDmoymQ9z6DTUztSAOQc2PGhHQqGYPajKaDnHrN9TM1II4BDU/akRAo5o9qMloOsSt31AzUwviENT8qBEBjWr2oCaj6RC3fkPNTC2IQ1Dzo0YENKrZg5qMpkPc+g01M7UgDkHNjxoR0KhmD2oymg5x6zfUzNSCOAQ1P2pEQKOaPajJaDrErd9QM1ML4hDU/KgRAY1q9qAmo+kQt35DzUwtiENQ86NGBDSq2YOajKZD3PoNNTO1IA5BzY/a/wMNbsAwCmVuZHN0cmVhbQplbmRvYmoKMjUyIDAgb2JqCjUzNDcKZW5kb2JqCjI1MyAwIG9iago8PAogIC9OYW1lIC9JbTE5CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDI1NCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxNDAxCiAgL0hlaWdodCA2NjgKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cExAQAAAMKg/qlnCy+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooST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JN0EqAghK4WQhYiIhCwfTK0LGZIhGpJuAlSEkJVCyEJEREKWD6bWhQzJEA1ON1977bXLLrvswAMP/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//9k2bPvmD16nPOPXfpsmWSp5KQJS8uvPjis1esOO+CC44/8UQJSuFyHnzoobOXLWusWbP6wgvlXX/77beT7Xv27Fl90UVSyCWNxpKzz77vvvucp/verE984hOrV6+eOXOmfABOOOEEvUu+lI2ySw6Qw3zF1phTpjSELERELB+yJmoaPNlT7gohq0KzJ7vXpeg1fbQSVtrJVo/7mNVroOeQJTPeefPmSSD67//+b0lA1bOPlCaTeclZF1xw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AETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQFgmG599ckzNU9+9Vbrwi89HRZ4+qWlqu67+J2bl3/7t37jTMpv/NZvX755p+dWAXicxASAYcr78mU0qP/VsERMyBc90z8mvHXpiSd+5wc/T4WBOz//we888cSlt3rVA8BjJSYADFMUDMogkE8U5fNwUI0J82GIZqwoM0L/mPDihTMXXlxxLgAbIyYADFM9JszDQXdMqKyVGmF46els3lI3HYkJACeSmAAwTI1nE6bd+s6YUMsWrXciiQkAwycmAAzTvMdf3Ck069UvjgkLH3xeISaE/20qysUEgONITAAYpurAQDUo9B9N6K7aaALAoIkJAMNU6/EXHfv8r+QoQ+rZhPbIICYADJ+YADBMqV86qmSC7I+nk790VPk1o5YkICYADJ+YAMBReuvSE7954Y9a/t2EP7rwm/7dBIBjSUwA4Ej5V5gBTiIxAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAg0jMmvA8AAJwaRhMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAAbs5s2br8Opt+kLEU4kMQFgwEJMuHfv3s7Ozv3c38JpEs78u3fvhqtg0xcinEhiAsCAhQ5S6CmF/lKYHo1GYzgdwtkezvkiKYgJsBoxAWDAQgfp/v37YWJvb29/f/8BnALhVJ9MJuGc382TgpgAqxETAAasiAmj0Sh0nB4+fPj+gHwK7Q4ODkJSCGe+mAArExMABix0kEI3aTweP3jwIHScNt21X6dH0C4khRCNw5kvJsDKostq080BYJ2qMSF0nDbdtV+njXQ+OSnC2R7OeTEBDiO6rDbdHIDj5p2XL5defqco+/DNrXK624IlO2f330q7rpjw6qWzZ0pnL726bD89W//81fz/l1776vlilVXWndpI55OTQkyAw4suq003B+BYyTLC9nv7hY9vbF3eevPDUPyrt7Yub7/bp4IFS3bO7r+VdgtiQtlFv3p++aAwiwkrOEQ6KG2k88lJISbA4UWX1aabA3CcZN/nX789nv412rt9PcsJ5fhC/lV/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4PCiy2rTzQE4lrKfFYplPzNU/bmh2k8PzVaYBM0fJErMnW9hXliUFfPHk+iOo3X90tEmbKTfyKkiJsDhRZfVppsDwDqVMSEEDDGBUyKc6gcHB2ICHFJ0ZW26OQCsUxETRqPRZDIJHadN54OpT+EohVP94cOHIRqHM//+/ftiAqxGTAAYsCImhIm9vb3sZqb9/QdwCoRTPZzz4cwXE2BlYgLAgIUO0s7OTpEURqPRmEX2To5NH6pjLZzt4ZwPZ344/8UEWI2YADBgoYN09+7dIinA6XE/F878e/fuiQmwGjEBYMBuAmICrERMAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICAAAQERMAAICImAAwZB+8duVr197uLjnS7R7B5t6+1q/Gw2/68RyrtTmi5mbVBlde+2BNlTXa2NHw7n3qdZqFeT3avsHXuuc+PrYtLlVD50vQ91I9TAOOos5lKz/Kt7sFW1zrok1iAsCQbTwmHAExocXRNHe9ta7cAVu9tmMfE7odz5jQrGpIMWHlFcUEAE6Q7pgQPsWnqsuUpcnPlubcrC/wWvGN8/Qr58oytQY01s17cK81t5duWGV71641Zqcqb910ZV42OetGhqXmPcpolfbD0rYX06/hK4XZkteuXZkdmXJ6xRbW25nX1nhpe9TW1v5aPY1Xdr7v1b3osa35q1ddrPlK5Ssml2++QB01zGNC/npMm9P54naefomXNXEJtBW2HMOykxm/ENWFa7OzGt+uTHdU3lVnx84ufh17jSb0uVS7D2+15un0wmuzx7GKN9TzdOps4Wxino8SIbVxhne9DyxqauvxTL4tLE1MABiyrphQ+yir9njmnarGp8u8l1qbqvYiWzsPiXWjjtt8KtV/rLSh2cREszs3Xe87zteofaR3N762WHIvqv2K8mhU963WF1mlhY3XoXxpl6gt3f5+B6G+F+Uay22r4zXr2bauV3265eranVvuPv1SL2vyEkgXth3D+enRfXCqkx3nebRSe51dO7vodewVE3pdqt2HNxETFl6bC49V54a6Tqd+K759rWxS/ZxNn+HN94Hk/nXvfvJtvPq2sAIxAWDIFsSE5s0YUWcq+niplpRLVvpAZc8i8XGWWjfZAUg3rLURs6/XGs1euOn8/7OP8deK+Y0+eHcNicXaRvibTWp+hb5SC2srVvooS9XW3f7+r2B1laW21dHV7Nm2rs5qtukrV6qv2cKzpedzGOUBSV0CrYXtx3BBf7j66lenq1dix361XZXtO9vndVwUE3pdqt2Hd/EuJHvZ3ceqc0OdO9VrxVk86EgJqZKFB6f7dK2ekM23hVWICQBDtrjfFQ3Fz29BiIboG7VVez7zxd4uexNdH7iLOqiJhs1VP3krfY9Gs7s3PV01/9/pAo3P5QU1tB3SeSWVZnXGhMO3MHnwe9a2bFe87RWsvkRLbas60T6W0TcmxKdMNi/r5tbOmvazZXfB6bfbfFmTl0D3dZE8hmuICQv3K7mhtp3t8TouiAn9LtXuw7tEtPygMgCyOCa0bqjrdOq34nTNOCUsOMPbD077MVn0oi8KY93EBIBBS3313TWG0O/7vdo61U109Hz6jyZ0Nb9eUblOqtkLvm/MS1977Ur5HelrjToW1dBYLP74npZ29wMP08L+owkdtfXsivcfTVh2Wx1dzRViQuJVrNx7FO9IakPV3YhPv9TLmrwEWgvbj+EaYkLnfnV26Vuvte7XcUFM6Hepdh/eBbuw2mhC54a6dqrfivnktWtxSlhwhreOIHQck85Bh/QmlyAmAAxb9daH2Ter0X28telatzLVbWjMfTtxT3zqczOxbrID0NKwxB71rjy9U2/Pbx4vvlKNP0wX1tBYrL1vsyAWrdjCRa9Dr9r6xoRFr2DUrP7bqvWE60suGxOaNaS+Ye7ake7TL/myth76xGhD16YPGxN6X2K9r7XFr+OimNDrUl18eKfL5W3o8cay8Fh1X55LnJDdQa95QDsr7PUKxu1PHs/kabgCMQFg8KrD0tXPrXggOy5O3nFRzq19g1f8VEdllVmfIv6urL5uSyewpWHzWmY/n5Lcm1lh96Z365/j9TRVXaLXLx2l9qJYOW/R7MdGujq9q7Wwsp2uXzrqrK13TFjwCsZr9d5WehN9xpu6T7PGF8u172Cjk3z+WneffomXNX0JJAs7j2F6Z8uGLY4JC66CRJ0Ldnbx67goJvS6VBcc3nlhNJ6x4JeOOo9VakN9TqfO67q24gfFMExD+xnecnC6mtp6PBtvC22XaicxAYDDSX4LCadH2xfxrotTrC0lnChiAgCHozvEKScmUJN/lT+EV19MAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAM2M2bN18Hjp9NvzfAYmICwICFmHDv3r2dnZ37ub8FNipcjHfv3g0X5qbfG2AxMQFgwEJvJHRLQuckTI9GozGwIeECDJdhkRTEBE4EMQFgwEJv5P79+2Fib29vMpk8AB67/Vy4AMNluJsnBTGBE0FMABiwIiaMRqPQS3n48OH7R+lHvX0Kp8/BwUFICuFiFBM4KcQEgAELvZHQJxmPxw8ePAi9lGMSEx7B6ROSQkjr4WIUEzgponN4080BYJ2qMSH0UsQE2JRwAYbLUEzgBInO4U03B+DEuPXVJ8/MPP3SplvToismvHrp7JmK81fFBDg6YgInTnQOb7o5ACfDS0+fOXPuG+8Vjybu/9kzxzUpLIgJZy+9Ov3j6vkz8z/EBFg7MYETJzqHN90cgGPhx//u7JkzZ//dj1tmZwMJz/zZZG80/Xs8CUHhya/ems6aJYbqdB4saiMP/ZeslqVXadU7JmQ5oRhPmA8ylH/PFgvLzAYd6is3YsLt/xY+Uf7mZjZ58292Z5NiAqeYmMCJE53Dm24OwKa9eOHMhRdHf/LZM2c++yd/FdJCKix8/3NnnvnTcbVk/KfPnDn3tZATfvr1c2ee+X5RWJkO3fxi8OG9b5yb9u77L5mVPfNn+bjFvHC0N9mf1NqQsvRowrywmhuKoqvnz56dTiZSQjyaEJJCSAdZXvhvt40mgJjAiROdw5tuDsCGvXjxTOTiH8fL3Kp08Gfe+ca5c1//aVvn/6XPhb7/u9ngw2gvBIrPvbS7zJK73w8Z5OvZWEXPcDDX/9mEea9/Xj4tm2aCkBIuvZr/TzIlNG86ysYR4oEEMYHTqogJe3t7YgInRXQOb7o5ABsWuuHBtc9mveTPXsv/UaS9eJnRD55pxITvh+59e0wI/fyqvM/ff8nd8SQbRSgU9zb11W80ofJgwvy+okphvuTVS2ezGVlOuJpKCY2YkKeEZE7YQBcNNk1M4MSJzuFNNwdg8/IHEz57LYsKLY8nvBM67Z+bPhfw0lezfvutr58rBgFaO//Tu4aKf451b6kld4tRhNnT0ssEhb43HWUjCHk6KG81yvJCdXaQzwiT58+fTz3u3AwJ2d1Gxb1HYgKnnpjAiROdw5tuDsCmvXghH0eY7O1N8jGFCy82lxnt3Q5Boeiuj3/wufxb/mf+NO/RZyMN0xuEbn3t3Jlp5z97dGHau3/p6elU/yXLid3p/Uc/7b03Sz3CfKa4tWj6/PL585UfSc1ixPwWpPSPIsUDCbNHEpqPJ2ykkwab5dkETpzoHN50cwA2Lf/avrjRqDIZG+1V7gM688yfZT+JWvTlx7dn5U9+/RvlzUn5byFN7yP6xu1iiKD3kpWiM+UvLB3+l47WrfEIQquNdNJgs8QETpzoHN50cwBOjPI+oBAlxuNJeYdQWZ4NSMyfNx5PovuIllmyLNovFzv8Lx2JCfAYiQmcONE5vOnmALBOZUwIAePg4EBMgMfv01y4AMUETpboTN50cwBYpyImjEajyWRyfGLCp3DKhKvv4cOHIa2Hi/H+/ftiAieCmAAwYEVMCBN7e3shKYReygNgE8LVFy7DcDGKCZwUYgLAgIXeyM7OTpEURqPRmCOzNyCbPpbDFC7AcBmGizFckmICJ4KYADBgoTdy9+7dIikAG3Q/Fy7Ge/fuiQmcCGICwIDdBI6lTb83wGJiAgAAEBETAACAiJgAAABExAQAACAiJgAAABExAQAAiIgJAAN28+bN12F9Nn1GA4+PmAAwYCEm3Lt3b2dnp/innTb9D0xxUoVT6O7du37tH04VMQFgwEK/rvgnmMP0aDQaw5LCaRNOniIpiAlwqogJAAMW+nX3798PE3t7e/v7+w9gGeGcmUwm4eTZzZOCmACnipgAMGBFTBiNRqG/9/Dhw/fX7VOG7uDgICSFcAqJCXDaiAkAAxb6daF3Nx6PHzx4EPp7a48Jjxi6kBRCxgynkJgAp030brDp5gCwTtWYEPp7YgLLCqdNOHmaMeHOzcu//Vu/cSblN37rty/fvLPB0x5Yi+jdYNPNAUh65+XLpZffWW/dH765tWyd5SrJdSuFod29ql6hDf20xoRXL52NO3dnL129dPbspVffv3o++998mWJCTDjFWmLCW5eeeOJ3fvDzVBi48/Mf/M4TT1x66wjOZ+Bxit4NNt0cgKYsI2y/t1/4+MbW5a03P1xj9b96a+vy9rurrZJcd7Q32Z+M88l3t/tVvUIb+lk4mpCIAmWRmEBrTHjxwpkLL85PtO4/gRMpejfYdHMAGrJv2q/fHk//Gu3dvj7PCeUoQ+Wr+Gz5emko2Xr55a2yoFwrryfvom8nKmqrsDq0MSuubqIyNJDFhFnV88aUG5lOR3uR2qn5NqN1F1guJmR/nD9/djq28Go57+r56YDD+atiwmkjJsCpFb0bbLo5AA2jj268cLkygjCe7E/2sp9yz/rOWzc+ng4xzG/zKcoqpVkQuLx9O/txx3HevZ6OTby3nVWbz52u8971xlBFs8Lx5OPQouvv5SX5xGRc3URlaCDEhLiJ1YGD6XRZYTYG0bJT0ybPCytjFh2WjwmVdBD9mceFKChspOPK4yQmwKkVvRtsujkATVmHeP/29uzr9PlQwvblF258NNqdDjFs573neYjYHd3ent8aNBuPqI5NFMsWc4t1fh2669v1r+jbKmxOzKqtx4Rp1WUTEzGhWpjcqXe3Z3vdLxzMrSEmlEMJs0EGMeFUKWLC3t5eKiaE/20qysUEOPGid4NNNwegReitxw8nvFsmh3p8qN4V1HiCIEy/cOPX1ZqT/fa61gqTDynUYsJ8Y9PnFBbEhOROZcMNW43d7GM9MaFxr5GYcHp0xoTdfn8CJ1L0brDp5gA0RL8WNP+SPfuqfvZkc3a3T/6tff688+1poHihpQ9fGy9YEBM6K1wcE8qN5Tc79YoJzZ2ajqjMb5TqffDWc9PRmfJvNx2dOmICnFrRu8GmmwPQMA6xoPY0b3Zbzq+nM6Zd5uyG/nyqek9R1veeP6Q87ZnnTzpsV58m7o4J3RX2iAnTjZX1ZHcuTVudPxsdrZ7aqXKiqHHrrV/1PnirxITiiWWPMJPzbAKcWtG7waabA9A0nmTfoc/vw7nx8fQ79vGkLN+68dH0EYCP5rfnbG+/0HgcIPtevrLWx7UnjhMxIVlh8VR1iBjlRHtMuL69Pd9W3uqywq23blwvlizrSe5UpSj7adhi79f0S0eHtJGOK49T+7+b8JsX/qjl3034owu/6d9NgJMvejfYdHMAksonEyr34dTK54Xl7Tn7kyB/3jd+7re+VnVu6gnhRIXTsjA5m2ipJHv+eTJpa+Fkr1yyrDC9U5X972pqk5jAIflXmOHUit4NNt0cANapjAkhYIgJLCucMwcHB8mYAAxe9Iaw6eYAsE5FTBiNRpPJJPT31h4TPmXQwjnz8OHDkDHDKXT//n0xAU4VMQFgwIqYECb29vaK258ewDLCORNOnnAKiQlw2ogJAAMW+nU7OztFUhiNRuPh2jsGNn0MjkQ4bcLJE06hcCKJCXCqiAkAAxb6dXfv3i2SAqzgfi6cQvfu3RMT4FQREwAG7Cas1abPaODxERMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAETEBYMg+eO3K12quvd1rhSvXrl1ZuOyhWrVy5bMWvvbBWtvUc8t5sw/V/uU3dxR1Pp5d6GjACnOPYosrL5Zcfr3tP2xtq6z/9rUjPS3WcYB6ncNhXo93iAXN6Zy9qSvo8RITAIYs/iwLvYDOz7bj3wHe4KfzY970BvvMm3L8d/lx5iwxYfU6xIT1EBMAhqz5WVb7/MxSQ2WQofzzymtvV7pDV1577VpzMOLtRNl8E9loRDar2oB0FytVT1kWV15p4Qepdaub7lgxXizVhspATF5aWeaD3gcn20qjuxLXXD8g0+m2l6bcSG3b2Tberkz334XEUe1sat6RfG1aXC6fLGx5gVoPXXXhHnuXfvU76uw4r7obltqdfPlr0WLVo9qxreQx7z4reu1sfcnqiGCy8tSVkr2Qs72az0icBm07mHxbSDWpY5VlXoKWc7h8m8ubPj3GC6+p/gewvm7y+AyCmAAwZImvvMIH3PxTc/5RWizV7MlHH7OzTk1i3dpGOzrAtcJUPfNvNFsqj9et19J5L0ixZH2xljZU+2/NY9Lr4OS9iajv3VnzoqNUmarsQ9FLiV7BnrvQstOtTS06SPOU1lHYeaolD129VZ1717pSe539zquW17TXYj23ldiNBWdF352Nz72yT5usPNGnnZ+w3SdSyw4m3xZSTaptMXkV93sJ2k6LaUyort31dtfWngUHsOP4DISYADBk6f5Q2Z+rfRvc3hNu9GCT6yY3uqADnKyn2TNIVl7d7myV5Md0ckglkRJS+7LiwSkr+aDz5odGza1HKZlpypqr08mj128XulRfnfrXvh90FLa/QAt2eeHedZ69rYexx3nVdvb2WWzZbaU1d6f3zsbnXnMzqdUTs+Ppxvy20yx5OXc0adFV3OclaHmXu3IlGnvqPIaJ9qxwAJNvICeYmAAwZOnPweiOncpg/RI94ca6yY0u7k2l6im+QG7W3NawsifZFhPavpDs3JfKjGViQm1z6ZjQWvPCrcwr7BUTeu1C503ccQ2N+uOvW8vC7hdoDTGh/ezteo2WOa9WjwmLtpU65u1nxUo72+iCt55ytTY0X9zU6ukdXNTOZjd64VXcMybExzObl924lLwUWtrW3Fz/A5g4PoMgJgAMWfLbu/mYeqpH3TcmtH8aLhcTOj9VO245WOdoQvJbwVlpxzHp9Y1u86aj9poXH6X+ownL70Kfg1B7ST5IjUx98LhGEzpf6O4d7HUry+FiQp9t1RbqOCt672z6y/BFp1y9HY1Kk6dBcgc7B+PS6x/haML83qO2tqVfiGUP4KLjc5KJCQBDFn9sVW8OabsruE9POLVueqPz2fm3j3GdiXqS9xOnKu9qf9tRKCYb3wR21VN8MbnEUEu9wgVDLfE+9z1KCzvSPXeheXAWN7U5sJAs7HeCpQsXxoQ+r1q9zp7n1VpiQve2uk/I5ovVf2eTr8miyqvmbxCte5qv3rKDybeF5GlS3WLPXWt/CZrn8AfNQbeebxdLH8D0ZTIQYgLAkOWdzqrGV3n12wZ694QT69Y2Ot9O2YT8x0ua3/4l6ukawU+v296pSG4llZ6iNsyP3PwHT4qy+i8ddR+c7Od/Un3EuObUUSo3l9zTHh3pXrvQsvvtTc3qL34ip363SbOw8wVKH7pylxfvXdfZm66z33nV3UdNHsDUuovuQokbnzjU3a9RaztnNaXOrpbKa82a/dJR97XQtoPJcynRpNShSO1Oz5cg3m7lnJkv1mxb9RLram3XpbTM4T1xxAQAOCpD6S1UJL4cbykETjYxAQDWqjqEM7zOs5gAp4WYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICwID9+JTZ9PEGGA4xAWDAQs/50akhJgCsUfQeu+nmALBORUy4cwqICQDrJSYADJiYAMBqxASAARMTAFiNmAAwYGICAKsREwAGTEwAYDViAsCA9YkJH/7Xt9/+Req/99//+PF08ddBTABYLzEBYMAWxYSPX//LC//jf/p7fy/93//wj/6fP37/8fX0D0VMAFgvMQFgwBbFhD/+X1+s5ILvffaLP7r0L7//9ytJ4XPf/EV6zetfOveZb95Kzbn1zc+c+9L1zpKsoKK+dG2xlm00iQkA6yUmAAzYopjwvX9bHT748+8/fPDg/3vzn1diwj/79++lO/BP/e53v3Phy6n+/Tt/ePHc7/5FZ0kouPjdX04/ed547txT6TCQLfaH7yyOCBkxAWC9xASAAVsyJnwvFP2XN/5ZLSb8dWK1618+95VXxz/7zoVnKzlhOkTwmS8/OwsFzZJU/3/31efOPftKdexgNlUudv1LC8YdxASAdRMTAAasV0z4k3/17//q2rXw3+13Q9Hf/PyH2fRf/d6//l5bTLj+7LnnXt29sxNyQjkOcOubT537yhthY+9fvXAuDwXNknRMCLVdvPrX1cLZVPH/ITQ8dbUYenjjd1uDgpgAsF5iAsCA9YoJP7j8473c7v1QdO/vRvkf+9//83RMCN3/C9/9xW6Y2hn/5VfOFTce3frWhYtl4XNZKGiW1GJC5dGEC999f7zTHhNeebb6HMOFb6cfVhATANZLTAAYsH43Hf2D/+l7/+SfhP/+/Foo+i+v/4ts+nv/6B++mIwJ1798ru6p2v1BwV/8bhYKmiW1mDB9NuGN585d/M7Pdqrh4M6dEAwqMSGs/Nwb5efUwXhHTAB4DMQEgAFb8tmEP7mz8NmE7IajNyqfG7/87sUL37qV3YB0cTqwEJbIQkGzpB4TikSwu//L71wo7iTKhhiyZxTu3Pr2hWpM+OurF6fPODd/Q0lMADgqYgLAgK3wCPNbr//P7TEh+4WjN/Z3KyWzG492xu9/90IxunCheGC5WZKICdNbkrIfVy0mssWf/Ur1pqOd8cEbX5mOXHylvnExAeDIiAkAA7YoJvy//8dLbf+2Wv7fi1/4j7V/iTl02Rv99N39R/vFIwgHxW1BBwdFQaJkXk3l5qFQQXEvUTaRLb6/X8wuF5vOePSoLSSICQDrJiYADNiimPB3f/v//4cvfP8f/v1URvgH3/vs//7TD/futa99nIgJAOslJgAM2KKYcOfu300efvrpo6RPDx6M0s8LH0NiAsB6iQkAA7YwJgyGmACwXmICwICJCQCsRkwAGDAxAYDViAkAAyYmALAaMQFgwMQEAFYjJgAMmJgAwGrEBIAB+9FpIiYArJGYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEDkEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCnzCQAAcOqJCQAAQERMAAAAImICAAAQERMAAICImAAAAETEBAAAILJMTPjJlc//47nnf7hw4QWLrGklAABgvfrHhB8+X40GeWTo6tEfrscvLwAAwOb0jgkhJXz+yk8qBQt68mICAACcVL1jQvvwQbVLP5/Op55/vrhBaRYw8sIrs3uXwoI/qUzPV//hdLUomAAAAI/FMs8mlL33el5ojwmzbn55v1JcOJ3OivOpcnWjCQAAsDkr/dLRLC/UhgA+qU/XOvqznJBedD4tJgAAwDGw+g+iNocAPmmNCY0Y8ImYAAAAx1bfmFD/naNcd98/Hk3oSBRiAgAAHCvLPcJceaS4HEyoRojKc86V5eelS8UEzy8DAMBmLHXTUeUZ5kZkmJZdeX7hLx31iQmzKo0oAADA47f6swkAAMBAiQkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAAAJEoJuwCAACnnpgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYADNiPj41NHwkAliMmAAxY6J8/OgbEBIATJ3on33RzAFinIibc2SgxAeAkEhMABkxMAGA1YgLAgIkJAKxGTAAYMDEBgNWICQADJiYAsBoxAWDAxAQAViMmAAzYEGLC7S8++oMnpv+9+Hvj9R2cml/93qd/8MXJEVUOcAKJCQADtiAmXP/SuYrPfPPWcYsJ4//8Tx9Veu+TV44sKYgJAHViAsCAdcWEIiM890b5EXAw3nlcMeGlp88Unn6pKLj11SeffPrpJyslmesP/+CfPvhVdcXbD1584uHtfDLr2E9HGeYlL/7eg1fqhdN6isKytrJkFg3EBIA6MQFgwDpiwq1vXwgp4eLVv66XfvMz8fjCtOhL1ysLFAMP1cGI9qGIZkwIIeHJr96qTYWYUE8ImdtfbB87qCSIsoefB4dP//Pt+rqVZDErnLwyXSwbrXjleq0SAHJiAsCAdcSEnR99JXHH0c74YPqB8MvvXgzFT33z1s74L5/Llng2ywm3vpWHi+/8bCfPCxe/+8ts2TeeKxbtFxNCNigDwSwnZDEhTglZr/6V6z32MkSGMiY0RgcS/f/qIEVqXQDEBIBB67rpaHd/2r8v5QMG9fGEi3/4Tljy1WyxC9++NU0Jz/3leKeYqnn2lV4xoZYIspuNWmNCfhNRx5MIk9n9RY+6Y0JcSXnHUeVOJDEBoE5MABiwRb90lEWF+dDBhW9fzzNCMUaQR4g8JsxywrduvfJslhJe3b1z550/vFguObW/u+bRhK5nE7KufuUhhWVHExqJQEwAqBMTAAas7w+i5t3/c1/50V88Ww4hTJ9dyGPCnd1fZDniwlNPZcngF1kcmN2z9OXri+ru/WxCMya0/9JRnAgaIwLz6eip56ywfDZh/giDmABQJyYADFhHTKj/GGo+LrC/u7tf3ob01IWL85hwZ+dn37lYLPedn+3MBiKKMYhFDzH3/aWjVEzItPy7CXmCKAq/+LAIAumYsNv5S0eN56AByIkJAAPWERNm9xtNzX4NtSw+ODioFJfPNld/NXX+vHM8Z1FMAOC4ExMABmwI/wozAJsgJgAMmJgAwGrEBIABExMAWI2YADBgYgIAqxETAAZMTABgNWICwICJCQCsRkwAGDAxAYDViAkAA/aj40FMADhxxAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAIo8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACG7r8DemNv6AplbmRzdHJlYW0KZW5kb2JqCjQxMyAwIG9iagoxMjI2NAplbmRvYmoKNDE0IDAgb2JqCjw8CiAgL05hbWUgL0ltNzcKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggNDE1IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDU4MwogIC9IZWlnaHQgMTY5CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BAQEAAACCoP+rbUhAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYCOIdJMKZW5kc3RyZWFtCmVuZG9iago0MTUgMCBvYmoKMTE3CmVuZG9iago0MTYgMCBvYmoKPDwKICAvTmFtZSAvSW03OAogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCA0MTcgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggNTgzCiAgL0hlaWdodCAxNjkKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCAyIDAgUl0KICAvU01hc2sgNDE0IDAgUgo+PgpzdHJlYW0KeJztnU+rHGUWxvMh/AhDQFxe8BNMcCEBSQY0ARfuQhbuApFMXN7VBGYxmEEM3nF2MkszwhUNroRhNuIFlSB+ggkmJgiB4FR1dVXX/z79vuf2c/r27+EldNet+p03dZ7Tp9/qurefPUMIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEkEC/njk9XUh9XhFCCAn037OoqrWpTy1CCKFt6/GZU9HUnjx5QlNDCKE91KMzp6KpFa2tWKypTy1CCKFtS92C/FU0tV9++YWmhhBCeyh1C/IXTQ0hhPZW6hbkL5oaQgjtrdQtyF80NYQQ2lupW5C/aGoIIbS38mkk395988273/qwckVTQwghT/34ybXXXnvt8KvBpoU62734z746rPnXPvlx8sjVXs2ei4Z00NObN29u1qS+++jq1Y++S2ht3eA372/YwMZEU0MIIS+t2kar6XR7SVZfS+e3+mq7sT169Pi3F7+X+vno6tWjnxcPXzx//uLFb4/tjaRqagVpo6OWBy6DFhO44tHXaGoIIeShZdu4du1ap7MsN1fPq/6T1tUm+B3mFL9uaYNW2G9M1eNqzVX+W6zZqjXUck21bDqrFdZibdZeqS3+vXuzu/jq7T8atOiJRV97q/x5awFX7V9uqPvd/ZsHcwtCmhpCCHmoaByLK3q9xtJ9ung2d4kwjb+GWPW0/k7l1vH+Uj0u/j24cu+n33//+v2Dg7c+qh6UTadoK7ceLJdXH5dtqNl/edTBrS8XP53afzRo2de+uH1w6/PV6rEg3D5473654cH7B7cWXe3+rYP3H8wsCGlqCCHkqdmmk7NUm+MfHtZXF8fYE1GLzWua2tWPfyjax/f3Wg+KFdmHVzofwd36vNfUrh49rO5Amdp/qqk9Ov7zwZ+PH3U/a7vyYdkEn31ZdbWyp305d38LTQ0hhDy1cVPrfya25rO30ZXg/IHpTW2xpfeg/UFYqefP+k1tyOnuP9XUivZ39d73ZUe78vHPzSd91Q5VV1vb02hqCCHkqo0vP3o0teXTzgd4KyVffhxtauVFwsVFwd6xU01tuP94U7t/8+Dg9oPfHjcrxKLL/f3KQb3Ds4flnSRX6lUgTQ0hhLahXtNxu1Fklt9pmsMAG94oMt/UHj17vrhTcXUrx3xTG+7fDrq6LPnWvZ8Xq7jHvz24XW+6dbt1J8kPHzfdjqaGEELb0aCvON7Sb+KPBpi8pb9W+4b86nGzZfRBczWx2bN31Mz+7aC/j/zg2fN6U/uXC+6/d7C+p9HUEELIVSOLJddfvl7zsdxMgG5jW/7y9c5o3W2PS9HUEEJob7WNbuSkYvn23DBfmhpCCO2tTr8XbVs0NYQQ2lupW5C/aGoIIbS3+uLMqWhqjx8/pqkhhNAe6n9nS8VKrVimPXny5OnTp+pTixBCaNv65WypWKMVHa1YptHUEEJoD/XrmdPThdTnFSGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghjX5CCCGEzorUXxSD0AbCsQjFF3WKkFEUC0LxRZ0iZBTFglB8UacIGUWxIBRf+16nJ0fXX+/p+tHx0fXrRyfNDtXj48POPicz0GLXw+PJp2OxOz9fbS83j85wLjo6Le17sSjULp6yBHuFOazKDeq0h5+qx/mfUq3hRJ1WOmn1sc6TdlMbbU19VUXVKcSxIind3wQpd1ru0t5ebB6fFJKIYtm+WrY/Prx+dHS4qpNy+7Aq+21qpmg7tdnad3gY1bpLok4rOTW1Yu9ip2bX3tOpeC16d/vJyfEJZRJGFItAVQ0tHhwenTTPyg53MlaV3S3TVTtdm8Nao1p3StRpJVNTs15RMFx+7G+rw8wWIWWiFcWi0LIklu2s18yGVdmtoHVVM1pvg41U606JOq3kd/lxuCtN7YyIYpFo0ce6S7TWs/mV2uZNrXMVcWIvqjW0qNNK225qtgsac0egrYtikWjRwZYrtP6z9MuPYz/vfHTWnQHVujuiTit1Tbh6t7b6zNi3qVk/eu7f7bXp/ws5imLR6OTo8Hrnbebr7RJJv1Gku/fczlTrLok6rTTyXqz38VnnVuHmgv5oFWTe0r+K1J4SZSIXxSJSq430ng2rcvyW/vWl2iUNF2xU686IOs3R8aF18YbOgCiW3RWluj+iTjN0cnREoeyRKJadFaW6R6JOETKKYkEovqhThIyiWBCKL+oUIaMoFoTiS1unp/0lpAghhNDWlN8TXXorNGjQoEGDdtq0LYeDBg0aNGjQTo+25XDQoEGDBg3a6dG2HA4aNGjQoEFzo9V/b2bkm2gn/hjAXDhf2pLY/Uupc7CNaPNfubv53Gro1B/q2Yjme94yaGNnKT0LQ1peFoYzyXFI/1jvudXQFIdQp9QpdTp+bDm37o8XuW3+rOgq2ZN/aXQ6nC+tmX07SV1+Bm32K3cT5taQJr/2bQOa73nLoI2dpfQsDGl5WRjOJMch/WO959aQEhxCnXrNrSFRp2evTusJrk5j+cjyF0Enww1oI1s2mPxJ/0tyfWmjE8+ilZjDw4R3gH1aVhacz1uH27WIB212yxqar99mj3WYW/04xSHUaQ+cRaNON6fNbllD22Kdlmqd0eph+e9RvdDcdJk5oC0jl6zJ5G+wPB9/mEpbs3FjWnWKXS5rZGVhbG7ZWWgBHbIweujmWRjOJGduc8d6zC3HIdTpHIw6HQPuY52O73B8OPelSSmTz1qeT/4f/IrleOQrdxNow/cgGbSsLAzn5pOFkQllzK13kpKysKVicZpbjkOoU+rUStvbOq01WMq1d8tfZnYIE7NPMGTGgnr4vmju+oGddrL6GHXyndZm7wCTszA2t6ws9M5SZhaG5zw5C1u4rOE3tyyHUKfU6Vraftdpa4/j/gd2Wf19jNZ645CZ9BF+Dm0akjS3Rw01/x2g83vdnCyMnKWMLAwPycrCcCY5Dhkc6zy3pZIcQp3OiTqlTvu7dC8JN29mUpI+oB0331Drcs15wE+mrSbm8Z6tkU+xZGZhQEvOwvhZSs3CkJabheFMchzSPdZ/bgslOoQ6pU6p07Fjq2eTO9tkuWcGGjRo0KBBi0Dbcjho0KBBgwbt9GhbDgcNGjRo0KCdHm3L4aBBgwYNGrTTo205HDRo0KBBg5ZD+wkhhBA6K3qSp4cPH77wUzEfaDtEMzok02PQXGgSh0CLQJP4LSzNEk6SJmgRaEaH+PoNWhpN4hBoEWgSv4WlWcJJ0pRD+8O9vzIYDEbm8HpFShNN7ZS0o03tne++YTAYjORBU9tRmiWcJE05NJoag8HIHDS1HaVZwknSlEOjqTEYjMxBU9tRmiWcJE05NJoag8FYN/79xt/+8sfOuPun/6x2oKntKM0STpKmHBpNjcFgrBuLpvaPf73dftrqazS1HaVZwknSlEPrNLUPLp47d+6lG59WD9o6/0Gxw53z5y5eGBj+8o2XFz+dHBduvHu5evzZuy9dutM65NNXX6kDvLLc58Kl6vnLr37WhnRCF4cvj1rQRo+ycKaP6h9YRCxPizlW2nx6sar/ZufcjufFdvIZjPTRa2rfvP353WK99sbXy6c0tR2lWcJJ0pRD6zW15qV7Mca7WG+sa2p3ztcNq+FfuLTAFi/Rra5UQoot1c7Ng++aV/J6JpajjJz+PkWT7TWd1YHLM2OJlTafYazJc2vKS//kMxjpg6aW1RfC0izhJGnKoW3S1FZPV2ulV969sHjhLbcsek2z2Kn7V7Wkuni+t8bovtheriH1BJpYn756486i3axCn79UL1jqdV//qGJJ2DSRZQcc4QxiFS3g5Ze6a8Alqj4zw6PStgznM4z1jq2p9U54s5orDqxP/p0BgcHYaIxefvznlXoHmtqO0izhJGnKoaU0taZlNJfIbiyvK7aXUfULcrNYqF/A64uQ7bjnOpclv+m/2reeli/U3RDjR1Wv7f11Src59o4qD+n9tP4vt5pa76i0LcP5DGO9Y2lqgxN+4dJysXn5s09ZqTGcBjeKZPWFsDRLOEmacmgpTa2723LVVnel9mpssVv1unpnaqXWa1KDFU01RpvRciajK6Mls2ig05yJWB1y77/jt1Ibmc/g1K1vaiNHlf/l3smXvyQydn30Lz/2Bk1tR2mWcJI05dAyV2rVgmi1QOgTvlm9rn727vnlC/XF+nOr8kaR/o0Qw8+elntOrk2GR1mayOgHXpNLpOZHjp+p9eYzlgXLSm1wwhdjmSOaGsNl0NSy+kJYmiWcJE05tNzP1M5dfLV64a07XesGwuaeycW67IOL9R2PrQuJg7XJxF2CnRf/Jvr0HYmr+yq7TaHDmbn7sd8pWmfG9e7H7KY2OOHN087J178qMnZ60NSy+kJYmiWcJE05tNmmxhCPtb8uwWBsZdDUsvpCWJolnCRNObTx31PTFxFj7PfUGIyQg6a2ozRLOEmacmj8RREGg5E5aGo7SrOEk6Qph0ZTYzAYmYOmtqM0SzhJmnJoNDUGg5E5aGo7SrOEk6Qphyb/wlwGg3EGhtcrUppoaqekXWxq0LxoRof4+g1aGk3iEGgRaBK/haVZwknSBC0CzegQX79BS6NJHAItAk3it7A0SzhJmqBFoBkd4us3aGk0iUOgRaBJ/BaWZgknSRO0CDSjQ3z9Bi2NJnEItAg0id/C0izhJGmCFoFmdIiv36Cl0SQOgRaBJvFbWJolnCRN0CLQjA7x9Ru0NJrEIdAi0CR+C0uzhJOkCVoEmtEhvn6DlkaTOARaBJrEb2FplnCSNEGLQDM6xNdv0NJoEodAi0CT+C0szRJOkiZoEWhGh/j6DVoaTeIQaBFoEr+FpVnCSdIELQLN6BBfv0FLo0kcAi0CTeK3sDRLOEmaoEWgGR3i6zdoaTSJQ6BFoEn8FpZmCSdJE7QINKNDfP0GLY0mcQi0CDSJ38LSLOEkaYIWgWZ0iK/foKXRJA6BFoEm8VtYmiWcJE3QItCMDvH1G7Q0msQh0CLQJH4LS7OEk6QJWgSa0SG+foOWRpM4BFoEmsRvYWmWcJI0QYtAMzrE12/Q0mgSh0CLQJP4LSzNEk6SJmgRaEaH+PoNWhpN4hBoEWgSv4WlWcJJ0gQtAs3oEF+/QUujSRwCLQJN4rewNEs4SZqgRaAZHeLrN2hpNIlDoEWgSfwWlmYJJ0kTtAg0o0N8/QYtjSZxCLQINInfwtIs4SRpghaBZnSIr9+gpdEkDoEWgSbxW1iaJZwkTdAi0IwO8fUbtDSaxCHQItAkfgtLs4STpAlaBJrRIb5+g5ZGkzgEWgSaxG9haZZwkjRBi0AzOsTXb9DSaBKHQItAk/gtLM0STpImaBFoRof4+g1aGk3iEGgRaBK/haVZwknSBC0CzegQX79BS6NJHAItAk3it7A0SzhJmqBFoBkd4us3aGk0iUOgRaBJ/BaWZgknSRO0CDSjQ3z9Bi2NJnEItAg0id/C0izhJGmCFoFmdIiv36Cl0SQOgRaBJvFbWJolnCRN0CLQjA7x9Ru0NJrEIdAi0CR+C0uzhJOkCVoEmtEhvn6DlkaTOARaBJrEb2FplnCSNEGLQDM6xNdv0NJoEodAi0CT+C0szRJOkiZoEWhGh/j6DVoaTeIQaBFoEr+FpVnCSdIELQLN6BBfv0FLo0kcAi0CTeK3sDRLOEmaoEWgGR3i6zdoaTSJQ6BFoEn8FpZmCSdJE7QINKNDfP0GLY0mcQi0CDSJ38LSLOEkaYIWgWZ0iK/foKXRJA6BFoEm8VtYmiWcJE3QItCMDvH1G7Q0msQh0CLQJH4LS7OEk6QJWgSa0SG+foOWRpM4BFoEmsRvYWmWcJI0QYtAMzrE12/Q0mgSh0CLQJP4LSzNEk6SJmgRaEaH+PoNWhpN4hBoEWgSv4WlWcJJ0gQtAs3oEF+/QUujSRwCLQJN4rewNEs4SZqgRaAZHeLrN2hpNIlDoEWgSfwWlmYJJ0kTtAg0o0N8/QYtjSZxCLQINInfwtIs4SRpghaBZnSIr9+gpdEkDoEWgSbxW1iaJZwkTdAi0IwO8fUbtDSaxCHQItAkfgtLs4STpAlaBJrRIb5+g5ZGkzgEWgSaxG9haZZwkjRBi0AzOsTXb9DSaBKHQItAk/gtLM0STpImaBFoRof4+g1aGk3iEGgRaBK/haVZwknSBC0CzegQX79BS6NJHAItAk3it7A0SzhJmqBFoBkd4us3aGk0iUOgRaBJ/BaWZgknSRO0CDSjQ3z9Bi2NJnEItAg0id/C0izhJGmCFoFmdIiv36Cl0SQOgRaBJvFbWJolnCRN0CLQjA7x9Ru0NJrEIdAi0CR+C0uzhJOkCVoEmtEhvn6DlkaTOARaBJrEb2FplnCSNEGLQDM6xNdv0NJoEodAi0CT+C0szRJOkiZoEWhGh/j6DVoaTeIQaBFoEr+FpVnCSdIELQLN6BBfv0FLo0kcAi0CTeK3sDRLOEmaoEWgGR3i6zdoaTSJQ6BFoEn8FpZmCSdJE7QINKNDfP0GLY0mcQi0CDSJ38LSLOEkaYIWgWZ0iK/foKXRJA6BFoEm8VtYmiWcJE3QItCMDvH1G7Q0msQh0CLQJH4LS7OEk6QJWgSa0SG+foOWRpM4BFoEmsRvYWmWcJI0QYtAMzrE12/Q0mgSh0CLQJP4LSzNEk6SJmgRaEaH+PoNWhpN4hBoEWgSv4WlWcJJ0gQtAs3oEF+/QUujSRwCLQJN4rewNEs4SZqgRaAZHeLrN2hpNIlDoEWgSfwWlmYJJ0kTtAg0o0N8/QYtjSZxCLQINInfhLT/A2UpcioKZW5kc3RyZWFtCmVuZG9iago0MTcgMCBvYmoKNTA3NQplbmRvYmoKNDE4IDAgb2JqCjw8IC9MZW5ndGggNDE5IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzNWs2OGzcMvvsp5gV2IupfQLFAUttFeiu6QA9BTinaHrIt9tTXr6QRJYrS2OMihyCYeCyREkV9/F2/nWAR8d9T+nBBLl9eT29lDBYnF2X7ITB2UWL1xgoBcWrjFPgRB9JH+v9JrNIsXzMHfRf4uQ0JfPlr+e3090ksP50+fY6jv8dxs/x72pZDxl9PvzBhxHcnH5VQgfwOJXw7Ob3tKe0KwYQQFi8X6Va5ifTu46tczv/kw2RymbDwuhgt0svX8pLWy1P1JX4mGd5O2ohth/TiYbESF9a4cIczl6Enlj9PH15O765gFhDLyx8Nnn7xqwlGCCHd8vK6fPpBCO2fPy8vPzcimFHJH+PXa3xcfHR5h+co0uqXOA+uzKXxyKpMP6/UhF4/L/FE6RvEx26j6V2mVS6MQ8YnDaltF8UkSGPyPZGC8optvbx+eve9tKB21mKnSHRJzjzuy1puk+2WNmSROctvxnUlkHXOk33TvD0mY9NqPplkJ3XjKqgRaZ4XZZAzzyS5w4gPGY0i6Ih4BQgQBZs49YriJqDXbTlU96Ufl7KJX2lNEYgeTzMadnQcr1dDrzq9T/jpVSCU7q6Pa9ryGK7ufEK+GgLMk0t2RAoYNcMl5BrNPPxUbpRWnsvablurgp/y2TJe4AJunGemakZIKLn5DJASIZHVeCbXAkctowisyiPKFV4ohgsftPd2ZfdwPWDaL0atxokI6eg1b3jGCRmEhriktyewq7rlEyvBzGbqJDeaOkGtplHzzffdQNotO5xhjYmHartOXBTaTSdzvhGEHfM6jXCCqYk01AibWhU5U3HEuxthtOBx69ihtWxxh6GoI4sIgMsIFmtGsKARXoqWSARCdUaMeVxWfOjHMlxQw7qfq+hOCom8WvXz1GlUHsdo7jiNyrfjNOj8/IIrxeAdeinueQmurZw/ANHuVQwBgO69eQ6mics4lswteyEg4L/ek3kEg3MDGHDLzqF1WNxJDUb3FWLKpm0ITtxM7CZk6kwWPhM0VpRrX9yV4iNQeLJwqG95w0RRn50Lq6sdzgkJz05W2ChmeSHhR4TcyQwn6w3yS7Rppsmj/Mcyt36lW7nbeP1Rj8P9Y1TFPTaJqY3QkFM0DhNNFRBX+wvb9zHI7XmPniZjixqIIzLp4qVgYkQkbmqLdz6eIb/bmOY41KWgkatICASteYfR9EDBaqQM4WbiMFLlkgoP2a7eF3ikJF2vsrqma3l0CUfMFVGTRb5ZfoFzszEMBpWGGVc3R0sSwg/4iAbQmuHSUqnwaNlMfY9ec9nVt9Zcx0OCQ91xCGcS4eqaKVdqgzDtagNKgVxyghStGFLQdSIgWSHXZfHoimndhDQ1RJLEWsrGR++MlcVm0Iyc10p1PMmrRV8VhZ5GoayMD8MF338/FbsnzQHE0P2PIgZXF4K2KwwGS35+FeeVqBxTt33HK0yKcTBm4llo6gPE9R0/n2AlCHOhd7JwdW37oU84XLzZZj+bewYqPXX2e24aREuTMQAgsnE3xt9bzTzzmjZE4hU4u+rgQ5ChVr85W7o0UWrJpZvzyLntlYhrdxSCdRWNTFq0KmDaTqCKJJd2psAvvEhzFh1YMNZn+SkwaJ6ATkU2elmMV5U8+PKSupm2dDMhwGpl1JaPqlM+xkVQwbnUu3z38dXZrbe528LUQq46codYFvDuU02qdLyQLafipyKT1G4bB8/PKjX2cHqvjv0mRYqzK2NF6FWYdhvaJklN8uqk2+O637ibnsrNxCsTXVeAStDr4U6XbRCxK627ZWcnlugYyq3NVeImExX5vPqKmAE9YGZWSj+lBJmHum6wT91x4mDmLo71KXspuAZvitiFHHRmRJaD5yHCPSAQv9I6MVrNrkhuU8+0mifm1oG8MnfubnrQERnSDsio2QIaih/b8DhW9zyzw/vDDXa6g2t4HFDh543/yns7xwk99eAx/5e8RzP+9GwFG+GdFp5MEujHut4nnvtmQUroEEp0vaFkHwGi/AAQncQ9VxW7zWvpeX2oTVi1jTBRepocxD0xyyl+ONcPVvShmKYHJCcTiJiiLSDWhfc43oLYz8seMMBvnyIot6o0a4r6onE667ZMwYSwWggpzy2Zgr+TKdj8d6q4ud9NFLwpQUXV25RbAp17k6YUSEV4ykFDNlU0LxLqDpMIzOcy2jnfQxcyypdzx5LC1sue7NHx3glQVG4eDjq593TAaPe69Ef2OdggtfkPVDexoLEBwKKfpo0BJgXO7f0FV0/aLZq1WzRpCtzqvVe+nd47nZ/33ulJeO+dSnHkb9f0ZOhWu/Xf75z6gLtjOodRQly58rkWYPb0W1sdWrQ8SY9IifQMKY86RV53jbbP/AQ6Uyta+CfNGorp6CjZzz6sltExmv4XMiL1+r0fRvPPXCa/j5EpD0riytmQYF8f+dEMW4b/umebflBaMKsIln8V5PWxn/VU9iTdjR/QwAo+hqMQqQEiU27h1VY6pJzJTq9J6ljmKvt9X0r69x/UM5b3CmVuZHN0cmVhbQplbmRvYmoKNDE5IDAgb2JqCjE4ODEKZW5kb2JqCjQyMCAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyA0MTggMCBSCj4+CmVuZG9iago0MjEgMCBvYmoKPDwgL0xlbmd0aCA0MjIgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1XS48TMQy+z6/IH9hZ23lLVaVl2yK4ISpxWO0JBBy2oJ74++TlmWQmrFoBUlXNxuP4lc8ex3seUED43cXFehKfT8O58FBYEtK0LNRGSBidNgAYtrIm8BIYcYl/72AkLV6SRk0Dr5kFTHwXn4YfA4i3w9Nz4H4JfC1+DdkcK34cPiyCgZuLr45QIt1ghOfBquyTzIhee++FI0F2pBzS/bsTid3PdJgkTrEWTkIriMRLIaK9tDURYY0xnAelIXuIhENhiA0rNtzUmU2lB+Lb8OY43B9QCwRx/DqXpxNu1F4DAFlxPImnTaAeA4QBRohsF+iwgA0rQX6xeT89WPb34TkEWhc9fpdZJ8qBKbQtOqY8UV5tRTjLptVOYmGl3RwRW6RD3o5RcWRERR9LJDZaDny9FVKz9ei/tpA8PBRvTRzJri2xVJoxhhSTzj4TCpT5Um+fxfF9DbGkjDESMcbKLaSwKwbJYHYq5d/BDnxctwSk1uiBMhXDvkpepFVreYqCi0RWKXyoUiMLpCU9daobO34FpTYXQdkRQ89QboOQTDm+HtJZd4Z25l0C8Sy9hrqyxJXuqm/PVhBhiazjnSNf+ptT0urMqalO103Rn33VeyrG+riNzWdTTqgqi7WV9mvjbJSzJQ39ul95WCffuFXypS+mbftB96pOlmpMbbB82LDrQb/WVbJbtf6yBtARI38LDQC479nc95IXm72yRSie0nvpndwvUwRTrpG7c6e7s5c6SSR79Qb/q8UgrpuHxNY8XwYM1OTSLYt6SsryEpSlqlwHZgn/7AIGvpqKf6qu0AZAtkWzPJWy4Cttf1zOF0bRaMJU0YxiILwbnVtx0zzVGcQojEsq5oh6LFi8XjOdLcwsx8i8fWW0qEfwZvkKFXnd/Dipx+hemdRwRGfDSBmkEYNSO7NhLCPXTRMpHHX4h+OmkxJ/vwHi2pk1CmVuZHN0cmVhbQplbmRvYmoKNDIyIDAgb2JqCjcxNQplbmRvYmoKNDIzIDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDQyMSAwIFIKPj4KZW5kb2JqCjQyNCAwIG9iago8PAogIC9OYW1lIC9JbTc5CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDQyNSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA1OTEKICAvSGVpZ2h0IDcxMAogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwTEBAAAAwqD+qWcLL6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4GFYVxKWCmVuZHN0cmVhbQplbmRvYmoKNDI1IDAgb2JqCjQyOQplbmRvYmoKNDI2IDAgb2JqCjw8CiAgL05hbWUgL0ltODAKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggNDI3IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDU5MQogIC9IZWlnaHQgNzEwCiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgMiAwIFJdCiAgL1NNYXNrIDQyNCAwIFIKPj4Kc3RyZWFtCnic7d1rjGTXYSf2/iZgP+wnf8lXYz8EAYyFwEbgZJG1BcQxDMWKiFWoJ5GYvVo43gheyVQs6hVLMAFRq7G8LWRlKdYLKmWXwVLLUVztKKREaeWe3oEsJJSZ6elxSEFrCTOcITQPeV5dXd059/2oe6tudVd11XT/fmhwqs4999xTr/vvc+4p9s9+BgAAAADAkXz/+99/QBsH4EHx/T98/crKyqNPz6Ptpx9def0fjkub6ODjaxzBXBsH4AES8mjl9a9fVCoIOwDmL8q6R5+ux0I8Ins6HvKtlId9beU/ywaIsaKlfGRX2zEpLO0SWkr68IePFiVPPzpynPajjG8cgFMsS6Na2iUxk4ZEHBvJ7bby0s10rJi0VQ67YsdShdJxy9Op5epFlUonS3c6NA7Ag2On91v/8a/+/sZOcu/y9/7ojauP/Mn3Lx+2uXrUlEdw5fFQfrelPNq5PHwq1y/CrqhR3GvrQbl+drt28OKoHRoH4EHx7/7n/+R10Rjmda9/38bO5e89+Z/+nXiW7hd+588O1141DGr5Uk6JvGJLeX0dymj9jmGXt1JuMa1dmpcsZEcRdgAnRRjJveEXkpP86/7u3/076a3X/8H3Dje0yy+J1cNjecOuObqEHcDJUsq7oyXd6Kxg+XLXoqYxx4VdQ4cbH4mwA3jgXf7eH7z+dUXWvS+7fje1pugoj8gal3yMWwoycYHKUcMuOUqluHPjADwwiut0K0fMu5YcyEIrDoxHs2nO2nW9hvJs18YvBYzLo2y3+jRlY9hVj9JcoaVxAB4U3/zd/yhLuA8/91xx/W72J/O2GcPWmUQAmJGdr/+Tv/e6kHQv/CS6l1y/+4W3fuWlQ3/3oI2wA2CBLv/kJ+Vo+8lPfjKPowg7AAAAAAAAAAAAgNRfAsBJdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ5tKZ1ZWK1TOXpmuhvxb2WusftVq8faVTU0cRHm9ygI7dBuAEiMMuD7jqveMUZ8/cjyzhAE6lWryV0qA85qumYXUIVg6Q0uZ6cOXVkiOura0W1UZaLQryZpI0XF1NCs/E97JGQkH/zGpth5H+VzvX3O1s74ZOAvDAqoZdkQBReVpcLUxLi5FYsbmUH6NDqGrYxbsmt0o7TDxg3mRyr5xhtR409r/5ZtPhmjsJwINp/DW7/ELaaK5U60RF4+cIayO7IsDqYVeJ3+JOtfXmbByZhq31vynsmg/X3EkAHkxN05jFgKYIsaxKER/1gdGEIdDhwq4tSieGXXP/J4VdU6mwA3jgNY6F1vrl4sazfRFtSzmya+m/kR3AqdQysisN00qXxxojpvGa3eiyzs5hVx4itmZOp7Ab6X9j7jUeTtgBnCQj1+xGVyiurZVO96VpzIaBX8NizUz3sKu007B2pl69OWOb+591f63fZTWmsAMAAAAAAAAAAAAAAICT6GUAWAKLzkMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgKV16czqSt3qmUtR8Vo/3V69AQAPmP29wW7kwicfWvmtb8Q3dwd7+1HxYBi27/zzh1Ye+7PyjaP44fsPfv8XDz79/oNP/2J0o/zz6c8fXPn8we+/v2XPlw8+/ZsHVya1X2vha7948MPqvlGF7Ig/zOs9X/RhfINRU8nu5c407V4caOQR1dts2v253yw9ObUW4j5M6PwRCxv7WTt69lT8sLpp9GXtaNyrDzDZS0/9/ZWVv//US2Mr1bIsHcf119LB3lq/UqFUXqk/SQi7rz1f3J3i/HaIsMt3eT4rfL4IqahmcruUHSFiyt1LorkhPeNN6Wm8cffSgUJh+YRfb7Pl6F8rh0hVkoM/HLP7EQtbHnvD0Vv6ebjYEnbAoT376Mqjzw6//s6VlXd+/Ych89ojrxZ26d3hIB3xDYalCiHqHvrkhXQ4mERcPhIcb3zYVe5mI44ikkrZlMbH89WxT2mXxiFG7ejpifr54qDlDnwtbueHtS6Nno2bdg83ioB7vmubxdHbkz1q+f2lkV3j7kcsbOxn49E7ht3zDUPUNExHXzt5B0zt2XfVL8e969+2VG0Ou8ZpzP5jKw/98+39gyjivvFbK49NcSGva9iVRhzpGCo7/4ez63Mvp/Xz2/mopNxgfqywNd+lkA2+6sFUTZlyg0nNr1WnMZt3bx/ZNbbZsHsppivzhKFC6clp3P2IhY39bDz6QbewG32ZyiHb+NoBTCO5HvfMO6OYe+czyeW4lqpThN2fPVbJz4c+dalzhzqGXcN5Lz7TfrqUdJWT8/MNO+YZ13BCfrloqpiQPJgcdr8/kjKtu3e7Fta4ezHFelAZ5aWPaPQ3geruRyxs7Gfj0Q+6hF3TyzR6rNHDAUwjvmD3zmeiwBt72W66sMuWsqTLWTr3pnvY1TMiiafaSKQ8UZnHxPsnrZSId8xDc9qRXa1mW2HeTjRfNzIZOGFkV5UESlFzESO7xqMfdAy7kZfpoLyAp1wi7IBDefbReEw32NsbxOO7R59tqzlF2A2/8VvRtxOim/217FY3RxzZXSnPSTZdQWu47PX8yCFq5+eW61YNJc+3TDmO7D7FiGns0RNJoFTWZ/5iltfzuWY3WtJ89I5hNzbC8udK2AGHFs9jJlOXpZtN2sJufzvcqq3GHA6+kc1kPvTJ7XhgN5PVmI3X7IrBWm2lSuli0OgJMx+JlAcvDUl3UJnSrK1IHO3h10aHVE27dx/ZNe5eycqXozUhox3+YfvuRy1seewNR5/yml3+uMoPUNgBx6m2nLK4m3wRbzCsVBgOanOYx7caszYwqX3rLZnAfH/z6pTR4ckPq8ea/F2zxkWDTbsXqw0nXpwa/z270YnNJfmeXWy61Zilx/K10W8RZq8dwIOuFnY86MZ8HxDg1Er/Dyqd/68aLK/R/4MKAAAAAAAAAAAAAAAAAAAAAJxw58+f/w5wjBb9oYfTKITdjRs3bt68eSv2c2A+wqfs+vXr4RO36A89nEbhoxc+g+GTePv27Tt37twFZi18ssLnK8k7YQcLET56YUAXPon37t27f//+AJid5M9uhU9W+HwleSfsYCGSsAu/eYaP5N7e3nA43AdmKnysQt6FT5mwg0UJH73wAbx79274LTRPukV3Ck6U8JkKv0yGT5mwY0ld2+qtV2zszOMQ7a3mW8dXO4Jy2Ik5mIfwyQqfL2HH8rp2rrfev7Cbu9Cfed7t7w12B8OxHbg4sdoRCDuYN2HHssuzJjUcXN7s9baupXd3NkYHfHlZJRXz0njnMEzrbWz04jrFkC3U2dhKh5LJMUrtV0Z2I8eNGtzaqpV2GwwKO5g3Yceyq4ddeNdu99MkiiKnt3k5jPdCAGapEsrSkWCpMEqdtPRCvHfU7Hp/O9wfDItDXOxHKRe3mI4g42yNdi1XK46btpb2c6Sw22BQ2MG8CTuW3WjYHVwNQ7tz6bCrt/lqlA77eyEBk2ALgZVsLUVNnHXbSeoMQ+HeftxsWlINu/72XtTi8Ep6lHxrUS3K06TWwTBL3qTBpPBqlI/dp1qFHcybsGPZNYTdThZn8UCskBQmY7HSjGXSSG/zaluzlbDL60UDyCixRsOu0qWr9Uxs7vM4wg7mTdix7EaDoxjPhWwqr10ZJOOqeES3OzLHWB1qtYfduWt5aRx8oxkXx2DWpSx5hR0sMWHHsqsHR7QyZGQOMUnAbEVJvnwlz679V6uX7zZ2WsNuvVirkkRqw4CudtxqtYY+TyDsYN6EHcsuXvhRFi8WSTcOBxeymcze5pXkWltRFNVNR3thsFeqebmy2qQ2suv3e5UG46Bcr+Zj6SDZIRobtBoTloOwY9nlc5L5ZGVldeNwUJvDLBVV61ZrltdJFrfja3ZXBtUGkx4MhpWllUVrI42UbluNCctB2EFJ+Zrd8RF2MG/CDkqSryUc91GFHcybsIOFE3Ywb8IOFk7YwbwJO1g4YQfzJuxg4YQdzJuwg4UTdjBvwg4WTtjBvAk7WDhhB/Mm7GDhhB3Mm7CDhRN2MG/CDhZO2MG8CTtYOGEH8ybsYOGEHcybsIOFE3Ywb8IOFk7YwbwJO1g4YQfzJuxg4YQdzFsSdvfu3RN2sCjCDuZN2MHCCTuYN2EHCyfsYN6EHSycsIN5E3awcMIO5k3YwcIJO5g3YQcLJ+xg3oQdLJywg3kTdrBwwg7mTdjBwgk7mDdhBwsn7GDehB0snLCDeRN2sHDCDuZN2MHCCTuYN2EHCyfsYN6EHSycsIN5E3awcMIO5s1fKoeFE3Ywb8IOFk7YwbwJO1g4YQfzJuxg4YQdzJuwg4UTdjBvwg4WTtjBvAk7WDhhB/Mm7GDhhB3Mm7CDhRN2MG/CDhZO2MG8CTtYOGEH8ybsYOGEHcybsIOFE3Ywb8IOFk7YwbwJO1g4YQfzJuxg4YQdzJuwg4UTdjBvwg4WTtjBvAk7WDhhB/Mm7GDhhB3M1QsxYQeLJexgroQdLANhB/NmGhMWTtjBPCQDugMjO1gOwg7mQdjBUsnDbnd3dzgcLro7cKLsx8InS9jBYiVhd+fOnfv374eP5D5wBMk4bvRG+GUyfMpu3bol7GAhkrC7ffv2vXv3Qt6Fj+QAOKx80rJ2I3y+wqdM2MGihI/ezZs3k7wLv3neZXbuPfgW/RSeEOGTFT5f4VMWPmvCDhYifPSuX7+e5B0wD7di4VN248YNYQcLcR44Xov+0AMAAAAAAAAAAAAAAAAAAAAAAAAAAHB8zp8//x2YqUW/qQHqQtjduHHj5s2byV8hWfTfQuEBFt5F169f93/1B5bQeX+8lSPzx0mBJRdOTWFAF85U9+7d293dHcCUwtvm/v374f2T5J2wA5ZQEnbhN/Nwytrb2xsOh/swpfC2CXkX3kXCDlhO4dQUTlB3794Nv6InSbfoHvHgCW+b8MtSeBcJO2A5lcNO0nE44Z0T3j/CDk6La1u99Y2deTQ485Yzwo6jE3Zwulw711vvX5xHg/t7g93BcIYtZ4QdRyfs4HRpDbudjfVEeXSWF/a2riW7h+FbuV5pr8rIbqS1sLW3tVUr7TYYFHYcnbCD06Ul7EI49TYv7wYX+lmyRVHUv7BbKixq7V7ejHNqOIhuhFqDYanlhtairSOF3QaDwo6jE3ZwujSHXUin/vZenCPD7TSK4qzbTqJoGEIpbE7/ieyHanE7eYNFy42tRVvTwqtRPna/uifsOLok7O7duyfs4FRoDLtKYYii3rkknnqbV0cayCco19vCrq21vHDK64bCjqMTdnC6NAZNPkyL7ISxWB5P1fFXFHQb2/k0ZkvGtbcm7FgUYQenS3PQ5LON6fW2V0Ok7L+62auuJEmmIod5O9UUK1puak3YsVCu2cHpEi8UqYjzbDi40M8mJy+k1+X294rC3ublwXB/78pmtnev308GfnEmrmdRmERYQ2uNYWc1JsdF2MHpEi2ArBrka1Aq92uFef5lBdH/XjeumpRFUVhaWjnSWnlrfttqTI6LsAOWXB52ITuFHYeQ/I+ghR2wzJKwu3Pnzv379/3JAw4hvG329vbCL0vhXXTr1i1hByyhJOySv2cX8s6ftOMQwtsm+Xt2wg5YTqfqL5XfW7RFPwHz4i+VA0sunJquX7+e5B0czq1YeBfduHFD2AFL6DzM2qLf1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5qdjfVcb+vamJrXtnrrGzuHP9JR9weAQ4jiZ71/YTd1oT82766d6633Lx7haEfcv+7SmdWVlZW1fl7QX6ver9asbIhKmmp2FB8ptXrm0oROHuFAR94f4NQLg7re5uXBMLs/HFzezAdfcRAmspJyWOUDwmysFur3trbqpaWavY1+vn9D42H3jY1eXNBxCBjlwOrqWp41/bXV1eZkSGKxvOkIGVJLzij3xuSdsANYrDjrXt0vF+3vDXbj8EtyMB7v5QFYCrt8c5GO0dZsnzBEzEaIRUPbYdyY7N/W+Hp/OxQNhnkvxotzYG0tS5pLZ6I7cTKEAEoDItQJ25PEKEprGZKP05KS0rY4T9P2Q63oZvpPvR9F/UpbYw+Udu9MvbRUczV7SG2NxxWax7MABBf7IV32m7cNQ9zsJdv2Q0rFGVWEXRGT+3thaxGF28k+V0OE9XfSmlnh8Mpmun9r49uTE64ki7AsotbO9LNk6WcRmNzIEqcSgtnNPL3ysiQhD6oTpWnhaNYVStvKbbUfKDlA3tV6rh6UZ2bbGpdzAGOFSOqdG7MipbR0pRZ2F/vrZXEr5UnO/HZl5jMPtvGNd5ac88N/o9N9/E+RImnapf+MlFdKivTKwjBLu6j2maSsKOqWLqWmxh+oPMorajYPQdsbB6BFFD619Sj51bIoiza285nG0bArlrXsJsO0xrCr5FteOr7xztJTfTSki0Zc8c3VyjhsNNqy0KokS1myQ5Im8X/TmvUcbFNqbjTsRg7UGHbVCCsnX3vjALSJJxZLS0GiEOptXhlWJxWj27Wx27CIyWhGM77VGHa1mskobkLjnRWTk9H4qxph8Ugvv55XCYU4rvqNw6hCVHomHzPm47uDg4Z5zLz1KIvq06TN47WRXVtrdmwcgFbRSpALpSnJaG3mXnIpLs7BpLDfT67AlfJoOMh3C+kY79IcdukKz6Kdi5Mb7/qFvEoONA6URi5yFZuKRR2VC2TlicaVldErd9ndptWYjUdvumbXdPWuveZKNo06tnEAxhkOavORiSgH08IgXhxZWSSZ75YvNSltrdTMWsrbmdj4NKsx+4030s0NOVIUNMwOloZstXWYtUxp+Z5dsV4yX0XZvBqzKYXrna+vxpzUOACnTynrAODkKa/oBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDuLp1ZXalYPXNp0X0CgJmKwy4PuOo9ADgRavHWXwuDu7V+sak22isPBNNqjTXjdpI7pSaT0tXVvGapuaZjiF0AZqEadkVGlcqLtKoXtm8fE3ZFSNa3RDcbjwsARzFyzS5Jl0oGVpOoFkCVmvmdMWHXlHXNrUk7AGaiNhgbncKsTTMmtUrB2DA0DMUdwi45RFPYWTADwEyVs6oUdxNXquRRNceRHQDMxGhWjVyza7wSV5/brEVk84CxFm+lu3n9xuMCwFE0rcasLCepLbwsFY5fP5lVXFtrG9kdVGctqyO++nEBAAAAAAAAAAAAAAAAZuRlAFgCi85DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4DS4+r0vfKLuC9+7GhU/e6Gh7khhe5uhmWl60aXl42pnVvL+zLBj82hqUpsXnh3ZvGxPNUAXtXPXUU5lh9j3pJ45lzzsOrcp7IAToinsnn02HeqlG8p1LmTb6me8fEMysLvw7Gi10mgyLi3VKR+inBRfePbZL+SNNLU5+ihae9jUz4nHndiHqML3vlcpbXhcRWrE9Yuhb8PutX6Ofey1p7TSeHan/rS3ZPFotaTb2buh4c0w5hUBWCoNYZfNQ4YzWXKrqFM5Z9fPcKWihl2LsqaTbVvoVE+8I22OHnpsD0e7M/G4E/sw/hnLb1x4Nq9TmeZt3L18c9zDHn1KS2mX3uz4tDdVS8Ks7RGN7xrAUhkzjTn+lDiuqXK1hpmwonBy2I3mTFObU/ew4+Pt0IfxLZQ7Fu9ay7qWY5UfYHbQCYmS7pKnXW0E2dzn5jaLo9f6kR6g66sMsDSmC7vyZNfIqbRyGqwtfEmrlDYcIuya22zqdnsPa2VTh91IH7qGXXLsetZ1eODl2ciGQGl4SqPqlYfa6WkfrVaN5qawa39FAJbKtGGXGx1CNQ9Myju0XzPqFHbtY4epe9j58U7sQ9ewi24++2w96442smt6SpOYu5BnXcenvbGpcj+y0gmvMsBSmirsahNX7VEy4ZJTdLt2Ai/2KK6SjYw7Rq9t1Q89voe17IluTjruxD50DrviUbc9/92fwOZ9yw+kfKf9aZ/UzyICx16zGz95DLB4U47sRme6WpqqLc7Mtqdl0frGvOl8IWG2w/caLoe1tDl66HE9bGpkwnEn9qG5cva46hOS3QaGlQOVd68/qKantJ6qDXVaBp6jTZVWYzY93vHPBgCnUFPWAcCJEY+bzPQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPBj+4f/4YT9+TsDPoj9JwFJb+DnKj5+Z/Cz6kwQstYWfo/z4mcnPoj9JwFJb+DnKj5+Z/Cz6kwQstYWfo/z4mcnPoj9JwFI75Lnlk5t/c7DzifElM/757NNXD7Z603es/ecTLxXPw998+7P5Uequbr47arYiqx//9Hby8noPx+/Y5SdufPIDn8nPmAcyVZfCo37p64fufPl12fp2eAJfe/qTWXl4LVr2OvxnADgFDnlWfPDDLj6jpmfRNJKS83Pj+TyukOfUu7/9Wm3feFMSlKNPS8uOy/Yz/oGUfyZE2Ne3ak/m4TqTtBBuXH1tK+nVS6/9jbADDmX8OedXP/4v3/S+bplSlIRz3c7T0Vn9oHpij8+BwdWdratxeXQeC7cP0vNqaRBUOpGW98rLs8L6CblW3latnkENMTQ27CpbR5oad6B8x/hGUh7HbtrDd6fPW+lJyHdJmnppJ3mWijaL563of0M7LYVjnpPW9sc9itLQOATTyBNVaaftEdXC7qXNp1+KBtdhlLcl7IBDGZd0n/jGE9/9v//wm/1/NJp3E8Ium26KznVptXAyTM9mUWEWdgfl/CqfAxv3SivnhdHZuzaCaNu3epJsGGGNibORrZVRYRapzXnXsGPcvcawK1UuDlENu/iBlEZe9V3a22ksbPpVofpAimFa8aRNiOzSyK54GpvaaXxEDWH39Xd/e2frpZ2nP/l1YQccztik+4t/8omPP/yVf/exb/7Zw/9surDLYiKcxJKTajTcy+pnha1Tjnnl2l75abMcNOMGmJ8oGqyc2w8XdmWVkVGxtXkIWVbO7saQqjdSG9lVd6k8kFosNk2ojpucbHogzRO204ddczuNSd0UdvEkQIg5YQcc0tik+9Qj//o7v/snn2rIuwlhV+RIOImlp9/iNNUadqWVCfnJv6iQNlVMTiZGM2t03zxzjxR28dbk6A2R8e6GmdvmZvO8aDjPl5aIlMeAY8OuohymlXbaCsc+kOoTlaXYEcMurzAm7Kb/mf69D5wizaeOJz73lo9/6pGnNz/2fzz3ey98P+Tdb37qf/2NyuCuPlYqxVl5U/eRXWk82Dw6K4/s2s+K3UZ2R7pml0RG4wKM0ZUb9QNV8mLMeT5JnDxQOo3s2pOrdoWusbDxgSxsZCfsgJlqOXU8FSXds/86Crgn/tV7o7x7qlYnOjsVJ/woibJTevVclw3oWq7ZZee3+u1itfmYa3ajF+M6XrP7h7XrVtOtxkwuMKX7loOj44Cxep4vDRVL2VELlLawKxfWrqk1tjP6ZDYmYP2yWts1u+YBb9M1u8Z2hB1wXBrPG//l5779B0nSJSUh77797Ucfr1dr+p5acq57beul9tWYL202TmMWM3KVhZfZ6r7m1Zijg5ryUof21Zjj+j8x7OqDu3HtjFyzG9lrZ6tlGrMeTG3R0PjluNF22gonPiFjVmO2PIq88BNdVmMKO2D+Dn1uaf8ZmTOs/cz9G3l+TuPPoj9JwFKbw2mnMezK/2eSZf1WtZ8H+WeBHyJg+S38HOXHz0x+Fv1JApbaws9RfvzM5GfRnyRgqS38HOXHz0x+Fv1JApbaws9RfvzM5GfRnyQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYhUtnVlfK1voT60+o0l9bWV2tNhpZPXMpbJl8AACYtTjsQhAVd8bFUYe4ClXyCtINgGVQCbtKPJXHfHGFUkGyQ1FQNBDKGlur3I1vrK6trWZ798+sNjQ00jgAHEYt7PK70Y20uBRZ9SxMapQzrTywGx92lQSNKxXVWxoHgMOohV0tW5JUKoZXjXFUK25trD6yG4nSStI2NA4AhzJuZDcaTbWwq69AqWXd0cJupHEAOJymsAvRUy5unMasjwgTlUnMGY3sAOCIqrmSJ09pXWbpAlvLNbtySFUi6rBh19g4ABxS6/fsig1ra7WhXTUGS7vVBnaHD7umxgEAAAAAAAAAAAAAAABm4mUAWAKLzkMAAAAAAAAAAAAAAAAAAAAAAAAAlsUHF0cfpuVtMO8+ACfVoj7ptbPcqe1Dd3Pt4Wl+CZb/pQeObhnOMKe5D90Ju2PoA3BSLcMZ5jT3obumHt577cevvPLj1+5l939+5ZVXXrny89k0fhyW4SVY/pcelsPOxnpuYycpu7bVy2+PN6Hm2M3dj9JuGc4wp7kP3TX08Pyn3vymd7/7TW/+1Pn47o++8o/f9Nh7HnnDP336tRk0fiyW4SVY/pcelkCUdP0Lu4nLm7313ta1UHztXG+9f7FLAxNqjt3c/SjtluEMc5r70F21h6/9xRc/9sRjb3zLZ1588TNveeNjT0Te88ivPH423P2VR97zxPo3f3r4xo/PMrwEy//Sw+LFcbM9TO/t7233o7TLx3rxsCsaf1UHfqGkt7HRW18fHRKmshZ6G/08z+rtVI9Sv9t13LcMZ5jT3Ifuqj08+/hDkYf/+Ac/+OOHH8r97jM/+Mxb4lshBg/d+PFZhpdg+V96WLz9V8NgLh3NRYaD3cHe/nAQjfHCgG8wjDKot3k5H/gl8RciMmRkXpjULBT7hPBcT8JutJ3yUYrN+UFC9A6qzTZq+aT311ZWz1wqFVw6s7qSWOsf8slqPG5od7VrH1oL59GHcKBc6Yitz0NTx/I2ZtHlxrBrN5Owqz2olufkCMaGXfFclw5XLpzN21HYQQdRoiSRlIzE0tgrJhiT+EvqhnpxYXk82DAVGYKrv53sM7yymW5ubediuktv89X9g3R0OcWFvNFPenZGK5/NojNMelbpkDbnz5+fWJgeN8qZM9360Fw4rz6Ewuw0Gj349JjNz0Nzx6LSrmfiKXqbOvt4kmYvnj0bh9rZzyThdvbs2fLmrjq9BM3PSatpH9TUL0EH0z+xQLsQRLWLdtUIKy1hqYVUU9hVSvJgG9/OxTxuk8w9d+2go06/0pdPbZNONjdv3nzXu971zDPPlAvD3VAYNtWPG46z1p/5yG52fciOmTzkcc9DrWNTnJOn621q7mEXa3+2J0X5FA8qe6rGvQTF0znvJxZoEuKnPIqKh1X9ndqYa32jNGM5Oewq+ZZvHt9OCLt8mUyQjQE76Bx2U/xOXzvJjJ5e8uPGOTPVmbbrNOaM+hApHvG456Hh14PVzjO/3XubOfv4r7/3c6He5558MvrnmSff+97k3yefjP9513zDrsvIbtoHNeYlKPWjMo05hycWaDKMZjBLcRdPJ14txVB9xjIec40Pu7jRdD40HstFmye0U92luIY4WaezXOXX+OnGVo2nl+y48QTipbmE3Yz6kJ5ci6nL1udh9Bkrz3JOHot0621uoSO78nMy1lQPqrEPWbY1dCPeNKu3IjDecLB7oTSF2Nu8HI+qkoUrIQb3965sZosoe/1oaeVONeDympVGL6c7JbtcjMaMDe2U9h0O8m70Nq/EA7sjrcY80sgukZxkGk8vB/n8VdzS/BaozKIPpeN1H9nVY3GKaBjX28LZx6MvGDzxxHseeyz654nHHnkk+fex+GsI8ZcSmo9SrDIp9WnKl2CK16D7g+o0k9yh9Ch9ANrlV+zK84fxwpV4MWRyK94Y5EWD4vsKWc2SbKd8l8Z2Kvvm3cjXscxuNeY01+zKbsZaj5tMIM4z7I7Wh5GzevdrdpUonG40Oq63hUWN7KZLukTHBzXpml1z7Ha/ftftiQVOpm5nuelWY3Y8bpYz8w27w/ah8aw+5nloeMaKC32z+L5GPewefuqFV1555YWvfjX655WvPvVU8u9Xvxr/8555ffVgZs/+yHHrfeiv5c9a5dksj61n/8QCJ1P7mvPapZK8eFbfs/vtdAKxcx9aOjafPlQO1tiL4nmY9IzN/itpBwc//ebH3/Eb7R7+nS/+4F5rU5Mar/S+eAStz8nRHlTbaszmpSjlTsz2K5/ASbYM/9uK09yH7ubaw9P8Eiz/Sw8c3TKcYU5zH7oTdsfQB+CkWoYzzGnuQ3fC7hj6AJxUy3CGOc196E7YHUMfgJPqg4ujD9PyNph3HwAAAAAAAAAAAAAAAAAAAAAAAACAY7YM/0PCU96H7rwN5t0H4KRa1Cf9g0v2v7tf/jPeXHt4ml+C5X/pgaNbhjPMae5Dd8LuGPoAnFTLcIY5zX3orqmH91778Suv/Pi1e9n9n1955ZVXrvx8No0fh2V4CZb/pYclcm2rt17T27rWdc+NnUNtHb9rN8twhjnNfeiuoYfnP/XmN7373W9686fOx3d/9JV//KbH3vPIG/7p06/NoPFjsQwvwfK/9LBErp3rrfcv7JYN9vY773nxUFvH79rNMpxhTnMfuqv28LW/+OLHnnjsjW/5zIsvfuYtb3zsich7HvmVx8+Gu7/yyHueWP/mTw/f+PFZhpdg+V96WCJtuRMGX72trY10sFcahu2kZb2NfsOeTVtLg8e4nZ1qqzv1g3Qb9y3DGeY096G7ag/PPv5Q5OE//sEP/vjhh3K/+8wPPvOW+FaIwUM3fnyW4SVY/pcelkhr2IXy9d7m5Wiod6GfT22GZEoLt/shn2p7Nm0tynYvb8YpNhxEN8JwcjAsbU43Bvt7g3jTeC2f9P7ayuqZS6WCS2dWVxJr/a5PSpfjhnZXu/Uh3M1V+zaXPrQcrvV5GHnGym3Mor+NYdduJmF3rA+qNXSiI3Z5CWbQB2CCONQaLtnFIbidTGhejbIpG4VlhcMrm/WYbNw6HOTzovshAuOyImHjrHs12ry/F7ZOcSFv9JOenczK57Lo/JKeWZrOfzXnz5+fWJgeN8qZM536EGpm57aoN/PuQ/Phmp+HpmcsKe16Np6it6mzjydp9uLZs3Gonf1MEm5nz54tb+6q29tgvg+qOXTSaMu7UfSgloEz6QMwweg1uySayiO+/HZlGJhHV6Wpxq35TOV6vZ2L/WrQnuu0NibS6Vf6crqUzveNbt68+a53veuZZ54pF4a7oTBsqh83HGetP8WwIt9yTH2oHm7c81Dr7aSn6dC9Tc097GLH8qCyVpv6kHSg9otF1196DvXEAmONm8YcCbtKgo3s2bw1CrqN7XwaczTsylHbcW1MpHPYTTGsqp1kRk8v+XHjnJlmDq1rF2bVh+rhxj0PDb8erHaebuve28zZx3/9vZ8L9T735JPRP888+d73Jv8++WT8z7vmEHZzflAjfcif7kOG3SH6AEwwVdgdDLfzy3fxaK26Z9PWZDp0mLcTj93aGuz4pYdYp7NcZSTVYR6zdJJpPL1kx40nEC9NGXbxvFaX8cUs+lA93LjnYfQZazo/H7W3uUWM7Ob8oGp9KB2h1I3yy9Hll56pn1hgrNFrdsmyyOawSxeXxDOO/dHVmA1b9/eubGZHSApD4/uvxmXRcYaDC9lMZm/zSjKDepTVmEca2SWSk0zj6eUgn7+KW5om7LpcqJltH0qH6z6yq8fiFOk8rreFs49HXzB44on3PPZY9M8Tjz3ySPLvY/HXEOIvJTQfpVh5U+rToX7nmfGDqvahWIayUutveenQrN6KQEfR0se6aClkeUlkZXlktsMgGF002bC1OEJRmJQl24eD2hzmDFdjTnPNruxmrPW4yQTiFGE3XdIduQ8jh+t+za4ShZ3Gwp16W1jEyG7OD6o9dFqONUUXuj+xwMk09cqEac4w44+b5UzHPhwm6Y7Qh8bDjXkeGp6x4kLfLBbJ18Pu4adeeOWVV1746lejf1756lNPJf9+9avxP++Z1wKV+T2o6cJuVj0QdnA6tK85r80S5cWz+nLTb6cTiB37UCmazde8xvWh9XANz8OkZ2y23wpM/PSbH3/Hb7R7+He++IN7rU1NarzS+7k/qHGrMfODVr56MMMOHAg7OB2W4X9bcZr70N1ce3iaX4Llf+mBo1uGM8xp7kN3wu4Y+gCcVMtwhjnNfehO2B1DH4CTahnOMKe5D90Ju2PoA3BSfXBx9GFa3gbz7gMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzfzsZ6b+tadu/aVm99Y6d8o9XkGgCwFHY2+v1+kXbXzvXW+xfLN1pNrjG1S2dWV1bW+rWSSgEATCmMznqbV7aLtJscdmEkGOtt9PMa0SAvlYz1QqV00BcdYetax1FgHHaVuBN2ABxRnHWv7g+3+3k2TQi7aNJz8/JuEPZZT2oUZbuXN5NQCy32zsX5udOPjrC/N9gdDCf2J4m2/lqRb5WwCxsS4g+ArtKsi7MpTbsJYRdyrb+9tx/dHF7ZTGsMQ5AlZQf7oaGkLB0t7mwkR+gmi7Yi7kphFwpXz1yq3gKA8UqTj/kE5EjYZbOW8fZKAubBFimqpWVXN6Ppy+myrhRt/bUkzsollSGetAOgg3hcl8w+BheSsd1I2IVhW2owrOZbXjUKuo3tfBozqbD/6mavvzFd1pXHceFmlGd5SWU+M90IAOOFrMtmJCPpTOaEacyoVrqYJR7LRTXimtvJBbnodnqxLkq79emyriHR+kZ2ABxanHXlJSNJju1MWKAyHESDt3g1Zj9djbm/d2Uzmw9NCpO1LvHYbns/O1rX1Zi1pZjFchTX7ACY0v7eoLY8Ml5nMsyWTbaun4w2xLOaQVojK6oUVuJ0qtWYtQKrMQFYSvHal97mlcn5BgAPqHisN9ib5nodAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDhxX9BvGpjZ76Hm2f7ADDq2rneev/CbuHyZm+9t3Vtnoe72L3+pTOrKytr/VpJpQAAJhhJn/1XQ9r1s8HXzkZ9uBdKNrbS4WA5FEdrVoaNcWmpTschXhx2lbgTdgBMayTsohTqbV6Nb4dw6m1eTod7aTRd7EcpF5de6OfR1lQzL8tLh4PoRhhIDob7e4Pw34ndS6Ktv1bkWyXswoZEXBI2rZ65VNRL7lTrpFvW1lZXVoQmwCkRhV1VCKjB3n60LU6rV6Ob+3vb/TTDorDrb8cVhlc2e71z19pqDkOcJQ0d7IfCOFIPM40ZRVIRd6WwC4VJnmVlpbTLbo7UaZoaBeBkK1+zi0Zqvc0raUClg7hSCsa5FgqzgV+SYTttNSP5xOX60cIuSq16aOU5dpCHYZ52I1lX1DERCnDqlNMnmWUsLqWFCCuvXUmGaVHYZVkWdk6Cr7FmFHQb2/k05hHDLsuvStiVxaFWVKrNYVbrCDuAU6WaPvt7V0pxNwwDt3QNSjRPmdyKB3FJhWLysqlm3PL2MD9KHJFHCLs0yfrlsBvNrKxOOp5rqiPsAE6bevqkcZfk1XBwIZufzKc3o5Fdv9+rFjbVTFtKyqI9ognPeK3nlKsxa0sxi4UlxRxlabYyqVKeu6zXEXYAp83oqsioJF9ZMhxUZiYP0mt2VwbVwsaaSUtJWZAcJimbcjVmraBhNWaxCjOuUbo7WkfYATBB+ZodAJxIpS8UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHB6XDqzurKysnrmUnEvu9NWf60f3eivhf1KNyNra0XhdH0YaRMAZiYJuyzgJoVdYxrFhWMTciwJB8CcJfG2uprETSXs0hzMk6y4HxWkGVUqDPfKwVWtflAvSwob22w8eta5tbXVapsAMEEab2fW4pAphV0RPI2FpZulkV2tsFYzaijNqMaGGncvjl7MuCa3jAYB6CbLkvBv8t9SnIxeyescdmPmJvMrfO0B2nz05tAFgEnKUbJ6pt8Ydo0ZNjbsmode6cxk3lC3sGsqFXYATKGaINHFu7mN7Mptjp/GNLIDYJZGEqhygWwm1+xKM6WVrWPabDy6sAPgcBrWX7atxoxkF9zKCy+bpyQrKy9HisrfyGtqs301prADAAAAAAAAAAAAAAAAjuZlAFgCi85DAAAAAAAAAAAAAAAAAIBT5Pz589+B2Vn0OxqgQQi7Gzdu3Lx581bs53Ao4S10/fr18HZa9DsaoEE4O4XTVDhZ3b59+86dO3dhSuFtE948Sd4JO2A5hbNTGNCFk9W9e/d2d3cHMI3wnrl//3548yR5J+yA5ZSEXfjlPJy19vb2Fv1/hz0O+8zUcDgMeRfeQsIOWFrh7BTOUXfv3g2/pYez1qKD6Dgs+ik/aULehd+UwltI2AFLqxx24ay16CA6Dot+yk+a8LYJbx5hBw+8a1u99fWNnVpJpWCkfry1qBY3sb7e29gYt2OnpmZsXNh964O/tPJLH/xWfie/fRRfeCRppmgvOkzwyAe7H2G0kSnM4Vk81YQdnBDXzsVJVcqaqKR/cVz9eOv+3mB3MDxIoqp/IVn+kZRMcehqU7M2KexCCH0huzOLsBtt5hANH60vc3gWTzVhBydEnDgXLvSLuKuE3c7GeiLZXLqbDsfykt7WTnmAViq/ljSbjP/ytkabajxivGNva6tW2m0wOCHsfumDH2wbia2s1AMnbHjkkUeSbWlE1ipn98KdtL0vpPXDDvkR8n1KQVsqGG1kpEtNPRF2cyLs4IRIom04KOKuFHYheHqbl3eDsDlKreHg8mY8jhsM02pFyd7VfMdssFfsWLS0G9UPhxptqvGI6dizXthtMDgx7KJASSMmz5UkP0JOVeOusim+MVq5nGjNN4pm072LmC01W96l8Si1ngi7uRF2cEJkQRPFXREuSfSE5Olv7+1HN4fbaczkW8fdiLJuO4miYQil0ET6T2Q/NNWyY/sR08KrUT52v7o3OezSK2TFnTw96kFSGfy1VJ4Ydo1TlMXQrikxxxylacZzFu8JCknY3bt3T9jBg60ImuGVzV6ULg0ZdBDHTO9c17A71+ttXh05VD5BuT6xhcYj1itM1iXs4lnBDy4s7KKZzrHDQ2G3UMIOTohSfOzvxXG3k68byYZgkZ0wzpoi7OrjryjoNrbzacyWHccf8WA+YZcETsMM4cg0Zi1ijjaNmd7MsyzqRFMjY44i7OZP2MEJUYmPOO7ykVcxk5heS3t1v1vY7b+62auuJEmmIof5EVtyc/wR672drGPYlb+GkM8p1i+GNUXMSOUsNsenXmWBSraIJV5zEhfVG6kfRdgdI9fs4ISoxUcad2lJvG4lnXi8kFxzi4NsPcuvlknI/b1ix97m5cEwT9GooN9PBn6jTTUesTHsjr4a84Sa5XsDYQcnxsiyxqigKBkOdhN5Sbx9N8qvdMfRG9Udk6UlyW67u+Xv44001XjE8tbmY7USdhyRsAOWXx52ITuFHdNK/kfQwg5YcknY3blz5/79+6fkfwR9bH8O4DQI75m9vb3wm1J4C926dUvYAcspCbvk79mFvPMn7ZhWeM8kf89O2AFL6/T8pfJ7S2DRz8Fc+EvlwPILZ6fr168neQeHcCsW3kI3btwQdsByOg8zteh3NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCnXX1tZWVnrTywrXDqzurKyeubS/PsGADMxPtiaCDsAHjBjR3ZJrq2thf+u5AFXCru4otwDYMlNDrs4zZJbcb087OIbUw0KAWAROozsikFcOez64R+DOgAeBIcMu4yBHQDL77BhF0pdsQPgwXDoacxLLTsDwLKJ86okSrHOYedrCAAAAAAAAAAAAAAAAMAD52UAWAKLzkMAAAAAAAAAAAAAAAAAgFPk/Pnz3wGO0aI/9HAahbC7cePGzZs3b8V+DsxH+JRdv349fOIW/aGH0yh89MJnMHwSb9++fefOnbvArIVPVvh8JXkn7GAhwkcvDOjCJ/HevXv3798fALOzGwufrPD5SvJO2MFCJGEXfvMMH8m9vb3hcLgPzFT4WIW8C58yYQeLEj564QN49+7d8FtonnSL7hScKOEzFX6ZDJ8yYQeLUg47MQfzED5Z4fMl7DiVrm311ut6W9ei4o2d1l1CjS4Nt7XQQNjBvAk7TrH9veTa9eXN3nr/QnIZe7C3HxUPhs27XDvX652bHHbnQoMXO/dD2MG8CTuoZ1NlXLazUQz5DkphF48K00FeXifZq3S32xBP2MG8CTsYCbv8bpRV6ZDvQj+OtjTsQp71Ni9Hw8CD7HYyQIySbThIh4qD4bhBYkHYwbwJO2gNuzjrtpOsGg7iaIvCrteL0i0OuoM0616Nbu/vbfeTcZxpTFgySdjdu3dP2HF6tYZdSLbNqyNVe5ub/WKVysV+dYFLNMkp7GDJCDsYF3br/Z161TCO27uymS/KDGGXLW5JF7gIO1g6wg5aw27/1c18fUm61CS9ZrdfxN1wu19aqJIvYxF2sExcs4P2BSr7e4ML2SxldJluWKzGjOMuXY9SqnMlvpIXp6TVmLA8hB0c1NZMVu4OB+X5yWhbtjKlqFarc5B9g89qTFgWwg4WLg+7EJDD4cRsBKaQ/4+ghR0sVhJ2d+7cuX//vj95ADMXPlZ7e3vhl8nwKbt165awg4VIwi7/e3bRBCgwU+Fjlfw9O2EHi+Ivlc/PvQffop/CE8JfKoeFCx+969evJ3kHzMOtWPiU3bhxQ9jBQpwHjteiP/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcxl8CwEn3UwAAAAAAAAAAAADgdFv0ouajWvIHssBXFoBcOCEv+hurh/eX1bBbdHfqhB3Akkgy4mcPoIOmsFt0pwrCDmB5LFtGdCfsAOho2TKiO2EHQEfLlhHdCTsAOlq2jOhO2AHQ0eSMuPz//dX/02Dnb44rNloIOwA6mpAR2//b+37tv/jVXx/13/xP/2p7+5kPv/vDz2wfY4KULT7sXvzsW9/62Re7dQ+ABRqfEVuffuTNn/7BfoPhf/g3v/drv/xQ8N/+0VZ9t/4HHippD4QjmS7syl36QH82PfirP33HO/70r7p1D4AFmhB2/+Itb/kX/360PBrwxUn3n/1XH/i3P/55ZVsSKx/9bv7d6uHdm0eJlDbdwy6MwB566MN5h7774Q/NJu2EHcADokPYbf1s+5kn/utf++//l+9ejgvLSXf2p3u1KHvx828Pm97xhersZpw31bFeWpQOs5J7ySCwPArrPE/Y/kBe/JO3v+PLP9q9nd2/vRvdLvUo685bP/vZ7MjZ4K/oSlRS7BPvIuwAHhBdwu7PP/Zr8Rn+DSHvXhybdMHN5z7SMId58+4wHVf96MvvCMVv++yLN+++8NGoRjzMCoEUReSXLt6MAyWEUzwG+2hS9UhhFzX9kedG+5n36LsfeeiJfpRcoS/fOkiPGx016ko+INy9HYLvQy+kD+JLbw8VhB3AA6JL2N3+2x/8y3f+gzi7fvmX86T70fe//JXnGva5vZumVPUaWXVsF4fE7W9F1d7++RfTrPvoC3dvJrcqPvTnRwq7KJK+0LCKptyh0Ieo2pf/Ohn+bX8hSrF4RPjX+YAwGbKWuyXsAB4QnaYxr//t7p0877Ix3bk/+kfv+99b9osCrxjGvf3z/ThYkvFaHIRJSKRp9ycv/vmHoqz71u2fJQOsbGSXjamOFHbRUDMcYjTp3v6lH2WdDN0pJ1dyu5ZlcRpWuiXsAB4QncIuyPKumL0M237v37TtmIpD7KGPPPd/fSgfzqXX9JKQuP3XURq+/W1vi/ItHkRls6BPTFxD0vmaXXKQYglm/wMf6Ec59aWL8dxmNJZsDLubF7/0jlI/4p5VuiXsAB4Q48Pu//3T/+7X/2Aj/fp4lHevvXYruU53+cU//e03fHRjdJfq1w7iMdru7du7+cTm297+jiLsfhYHykPp5bokmnbT8WDtqt+kNBnzQG7eHf7oy6U5yA9/6/bNuy9klxbf9qGPNI/swn4vF7t9oH97t9zKW12zA3hgjA+7m7f+8ov/w2/85/WraJF/8PDH/s//cGd0l2wGs/a9g7x4OByWv46QrRMpfz+hWDsy7psLU33PrtJkPC9adGh3dxiOEWqUO5XcLu0W7VRupbaLsANYYhO+i339b+/v7R80Gg7uzOX7c11NFXbHT9gBLI9ly4juhB0AHS1bRnQn7ADoaNkyojthB0BHy5YR3Qk7ADpatozoTtgB0NGyZUR3wg6Ajp57kJXTZNF9aSDsAAAAAAAAADi6/x9iX2GWCmVuZHN0cmVhbQplbmRvYmoKNDI3IDAgb2JqCjE1MTQzCmVuZG9iago0MjggMCBvYmoKPDwgL0xlbmd0aCA0MjkgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1XzW7cIBC++yl4gTjDAMZIVaSku1u1tyor9RDl1KrtIWm1p75+Bxh+DOw26SnaOGDmf+YbwKdJCqDflR+sQ/H1eTrxmhQWhVq2S9IsQsG8mgVAEilKQhpowQ/+/xXMaMRTkKjnkMa4BGnyU3yZfk0gPkwPj7T6jdaN+DNFdUnwfvrcOANvzr/aQyXxDXp4mqyONnGZpTPOObGiQDtjdOn64zOK3e8QTGBHj4VnYTT4yRNPvL5AyhMavQ+nSRuIFvxklWLBpFgnxRucWYae1mqmpEHIG4kbhbOxylkjVmGUopfVWeeZSdcKURmIH9Pdcbo+SCMkiOP3AmuSMpaltBPHZ/HwDkBJALwFAEOPvCE7bl4EEcDS+8IPMdEfwJ6eA80NC/D7VvDAzH7EgWZkBk8MDBviSEJallDsD0b/cBeZPb13Xp1zbCVJcyOUCatmFIMPbBcDzR7pgRHP2Fv/VwbOS66FGBjkwLlhikJQt5VqXVKjDjeP4vhpA4XFdVAI2U1VXosNrUMNOCC9lNRGSjC543Alo8Nu8x0KwvUOVSvSnqpvBLVFqgbLFvc3/DvGgO05G5/23erGjvfT+4vynK0gbaK9hPeExZzkwi05d8XeYdtcQy/wYhyXMetqXkUzBXWtIvj64q+yK37flDXQXtqCdedxWJJ1csqQ9SWwpHlJ08sS1IU7TJDWDMkES8ne9aBL25nr0rWA6bdNb3KJ2acWxITkEJJPiWZDpmAq8Y06KdNUqXm9P2Z62o1V6VdMfKbxJ6e4kmdEe99zrzdyiKWMuX9b//esg8slbaA0nV93RJZmMDTFqv22Y59L4Vj7ctlSuwec1Y8sv469b+uHDNcMu9seMrI/aUfHnp11u6PzUgZC3w92w1iqsF0+VOfBoVNd72Cyt/6qw99tRd+nug68ClHtoJxW/2cydU3SOmioWityzHIr9YJWqpLZSg8bqQcC9udsfbBLqFScwR9UvCkTmy02YxzGW62N9Hxytfot5C3/8nkTrPIGuT+2N9dF47zQvXNzyQfh1nldu9VwUx9c8ZEu4n7XBhwtQfP6mnt/o6b9QInkV3orzQxuaV+hmr7uyySL31++y8tZrpY+VohbShLy9UGbL3J3tGnZYZlQ09FPn7Jvuij+9xeHcg1wCmVuZHN0cmVhbQplbmRvYmoKNDI5IDAgb2JqCjg2NQplbmRvYmoKNDMwIDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDQyOCAwIFIKPj4KZW5kb2JqCjQzMSAwIG9iago8PAogIC9OYW1lIC9JbTgxCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDQzMiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAzNDcKICAvSGVpZ2h0IDI4MgogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwTEBAAAAwqD+qWcJT6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgI8Bq1jWBwplbmRzdHJlYW0KZW5kb2JqCjQzMiAwIG9iagoxMTgKZW5kb2JqCjQzMyAwIG9iago8PAogIC9OYW1lIC9JbTgyCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDQzNCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAzNDcKICAvSGVpZ2h0IDI4MgogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDIgMCBSXQogIC9TTWFzayA0MzEgMCBSCj4+CnN0cmVhbQp4nO2d368dxWHH/bf0vS++5IHQKFIfgiLeKhC+zoNRipuUUio1rWTXNsQYGaT4oRQUG1+oLatSufEPUGLfC5cfxobyQwI3N7aDiWs5BCimJRduy41TyIXO/pqdmZ2ZPT9mz+ye/Xx0kuyZnZ2dXfz97MzsCf7qKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAznCtrUzNhQC0io7mCCEANEFHc4QQAJqgozlCCABN0NEcIQSAJuhojhACQBN0NEcIAaAJOpqjeEI4N7f15pLdC6O2MdqRAM3SeyH89Ed3/uXeE78Y8LwLu1UJpHLwJFsNPhKALtB7ITx532233bbpLwZzgvDB1rlzSoE/5ggBugZCSIQwqBP8Q4Jk+KBMJORX4RB1W5FDujFXTEJK18h5SbozP6Fsw5ASQDgQQi6EQZ1QxlI3QzkCSLayyLpGCJoQiniXs5FyKxNDuq0MTirjFIBQIIRSCKkTHnr67cG6UJihjK4URJHYgYRQZFsWanmXctBXLwCaASFoQtj8Nz9+8TdD9EMmWn/5YE4NrnmEYBaqktBrlIMTzAANgRDuG9wGlqe0GuNKTEcSgmOE4O8GQBgQwn1DjA3UOX/xPf+qZNs5I6jMDuzGsK0hqIcjBGgMhHDfkDMFZVXRWO/XXyUk5BOJcgHxZn044RtCZHOD3dpaIm8ZoGF6L4SXDmzfPjfUusFE4Y0CTJTeC6F9MDuAeHQ0R9MsBO2VBcMDmCgdzdF0CwEgFh3NEUIAaIKO5gghADRBR3OEEACaoKM5QggATeDP0VpbGVYIADA+sXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvJPaNAegjsXPvZNgLif3/MgfoBggBACQIAQAkCAEAJAgBACQIAQAkCAEAJAghJ/lrVYP+RYrqX+8O0BEQQkqa3t27J5fghnSBhWA8EEJClqNJpgkhQCtBCNeUGIl5gzJtEMVb5+Z2538xe54za6H6N7gXDchG0425Yn+6e2G3VlmvIQ46p2znLJinrG9WKeCvlYfBQAiaBjQjZLHMAiiXGKyFyUYeVLmpCaFotbr3mqWG4gnFGAvXKmX+Zl3XBeAEIehhUaJdDW3yxVZojaEmBPuwwWzbte1s39+sei0AA9F7IZRj/ZJydqCP2ZP82Qor4wotxda4Dy0EFV04zmavqXMGzACD0HchVFfhbAP1a+OOEMYXQiXQAwmhgMECDEbPhWANihpp6yy9Uli7hmBNrhxV1AlBLRy8WXUbIcBg9FsIjrW2PD7FjxOqLw/Mwvq3DJW45wd4aujblTcI9c3ylgGGpt9C8FM7UgeYNhCCG4QAvQMhuEEI0DsQAgBIEAIASBACAEgQAgBIEAIASHoihNj9BegG/hxdic1o3UYIAKPhz9FKVBACwIRBCAAgQQgAIEEIACBBCAAgmbgQLvzbM4tWll57GyEAxGXiQlj56J3Xl372U4OfLb3xq/82a05ACG8C9IZ2CqHqBKsNJiaEYZsC6CJtFoLqBJcNJimE5i4ToA20XwgrK5ffWEqEsPTGZVcNhAAQBISAEAAkCAEhAEi6IISV95bPLCAEgObphBBWEie8fOatd1174wrhvV///OeXbZ8rVz5s7IYANEFXhOAnnhA+fOn07J88+bWv2T83fuuZn1yJcD/Csbz/9pnb9y/LL3J7LE5tmwnQkLM7p7YFaD1II90DIYwnhJ/8/bxigGPf+dvn/uF7T31dccId+50TnS5w/vHNMzMz208VXzY/fn7sNpf3b9p5+NBs3ujorF5fX7++amn/4Oz43QzSSAdBCOMJ4dgP1CHBs0/94Ysv/v3l2xQh3PrwLyPckGAkDjh8eOem9GGpCEE84zO2pbFWHtbJnqzQ8Qg/tX1m1wvXLx2a3SGNkFTctu12o0G9JButpOSNZs2L/962bVvZGaGbopLSyO37T+2/XTm22n9XI83c19YSSggT/zckmbRDCMdE0WtnbtWEYP4fLzpF6oBLl7PneSEEEZ9NT1xNb9eZnWmAVi8d2jx7IAnPqR2zmzfPHkw2lw/Mbj50yXyEn9oxc+8La8kRs5uKuCXjkNknroj2rh6eTRusliQZ3XUmPeeumfTIrDtJzZ0vpOX3zgjHrF6/clhI7KoYPMhGrh7ePLPp8WxDdLPaf08jE77hsQklhPWoRBbC0bsefuv4cfG5eEEUvfurhWT7rUf/+tiUCOH86vXTySChEMLijhmFNP2FEYQPDl05vSvZtPpAxHr28OW1lWTAf3qXOhfJqqbtiAarJYuZSARrL4jQLipC2PxEeo/ffiIzkRzIyEa0jcfPV/vvaaRnIIQAQnj6n978fcra/4iiTz/7Xfrl86eenRYhiBAmg4QD+ZelnTP3nin/0V+XuT1w6uDsrudW114QRjhl84GYLuhU5iL5ZrVEnHTnUtZKvlkKIatZbGlCsG1U++9ppGcghABCePIbf3rs298Wn2ePi6LXXvrzZPvYt745Pz1CSB7oO0WA0y/iKZonOZnW51P81AibZnclT3FRYceOHRYf7FCTWIzg8wnCgXyaMSOUYilJTpqtOohW0sf5yEKo9h8hFCCEEEKQawhHV6ZxDSHLxdplMRNPv6xeXxfz+IxdZz5fy6omRsiSmi4QzMyaPkjeLsja2SH5tCE5y64dm5QGqyXJtH42O+fOM+moxCWE1ed2ZeuBLiFU++9ppOk73DIQQlAhJIuKr7z0Z9MjBPXVntj+qviy9nl+v5SAK/vVqup+TQd5O6IsncJfXlcarJZkjaoFWd/KHsqttHPqruqG0X9PI0FuY3dACOMJ4eyPTrh+lZR+5u/+V36tWEt1fN7XEXt0EMJ4Qvjsf//jn+9+6ptft9ngG8e+s+cX7/3+0wj/WDtG9SdGrh8dQcMghPGEsPLJZ//3hy+/tLf15foXv+MPNXQJhDCmEACmCYSAEAAkCAEhAEgQAkIAkCCEAYXwHEA/QAiDCAEAVBACAEgQAgBIEAIASBACAEgQAgBIEAIASNqcI4QAMGHanCOEADBh2pwjhAAwYdqcowkK4Z0j37/Z4PtH3qk56MW9otreF4e+rvRIpfn05Hk7yXbNmf/rl6+89WvHvvdfnX/MYP7V90foYYOIPip9urj42OJFuV3XWd+1y/YKZLvjI/ssmy8ar+9zt0AIGknG602gVB5FCNpJChUV7ah2sFMfCjN0bUL0rAxqFi8luHXxqrn2xIdFa8l2oHsg+1zaS/HYdCkBIWgYQkgjf7MW2HIwsXdvKYSyYnJ0WiVvpmoN5RzKwERv32eEYYUgRw15SbJvcXE+K7n46ny5y11z8aK6ba+Zny8JeZ4Vi5aU9GQxU0cIa4Yvhr52hwfN3lr7v7i46BhY2BKvdrumz90CIWioQrDG+kVTAnlhVq84vDy0Gm9jgiC2DGfUDTyGE0L50BR/htMy+ehUN8T/emquVbf1muqYen5+3igrMeJvKfGnq/baL1ZTbb8uT0l9Dw1tTJMREIKG+fSWucx3aIVqcs1nfbJPbFiWBKqzEsMAdUOE4YSgjW2Lp7sR2GzDU3NN367WlPvTp2n2SLX4YABF+Cc7g1x70WyR2mpvfVdaOb+jQ8YQYWpmDQhBYyQhlOMBY/yw94hliXBKhZBVuJg9KxMjXLSkZHJCUJpqRgiue9N1EIKGb8pgTgHklEEGOhsm5FnOlxUqS5TVvFumDL6FzQBTBqsQPDXXKtvmlCGvMZ+NnbMpuSUk9QPyao0hrl1Zvyh7OeCUwSUEu/6MtyMh32jEBSFojLaoqBcVx6cHW5JdCbwuhOYWFc2lvsqGs+aaGRSzpixUNGR9aFYW6IIuKurvXZ13wHel/oXQ8rWjfjOmxgcIoTmcT3rvbw3CvHZsL/70jPnasSHG63O3aF+OSrorBPPHBSb6D5PMI8f4YVIXcM+4Q/wwqRnG6XO3aFWODLorBICO0uYcIQSACdPmHCEEgAnT5hwhBIAJ0+YcIQSACdPmHCEEgAnT5hwhBIAJ48/RldiM1m2EADAaHc0RQgBogo7mCCEANEFHc4QQAJqgozlCCABN0NEcIQSAJuhojkIJIfZbFIA4jJasZtIcgIBCWGkfb775Zuwu1ND+HoIHhOBqByGMRvt7CB4QgqsdhDAa7e8heEAIrnYQwmi0v4fgYWQhTA0IISzt7yF4QAhTKISlvbcU7F1aWblw+K5bDO46fCGvmG9lGDXFwe5jR+yhtcGlamFRbpxNubTansAIIIRpE0KSuEQDxXaZmgtGvMT3vYfFf5bUkrKGZgvz2HF6WG1Q+eIqLzul9BeCgxCmUAiO6Bp7smxdUI2g11DDhxB6AkKYNiGUw2ozOfa4q6WdGCEwY2gShDB9QijIwmN//qvb5VNXn+CrgWuREBghNAlCmF4hJDgkoK3NleEva1iWGxFCH0AI0yaEJOvq1N+2DmDGqthj6MMxuhi3h9UGEUJrQAjTJgR94G8b9mvriDlyhVFfZbjFmtOxe2g26BGC8RpUH9rghuAghOkTQlza30PwgBAQQlja30PwgBAQQlja30PwgBAQQlja30PwgBAQQlja30PwgBA8Qmgh58+fj92FGtrfQ/AzmhCutZWAQlhvH+L5G7sLNbS/h+ABIXRLCACNghC6JYT2P3/b30PwgBC6JQSARkEI3RJC+5+/7e8heEAI3RLCEFzad8OG757Uv6fcsO9StfbJ71p2WgvH5MMjD91/0z3656HTVwc8+oPTd9xz9Ez5/cKee/Yf+SBQ18zGh9nbxBljgBACCuGPHnlw2M+wpxj0+ZtHuRSCKMi/iC0z4KU7FItYC8P1cLQsGEedO7rn0NE7Fj4ctplRQAgIYUhEwP/4lZODf0YQwiCkMrhh30k1xqUPSsqcK3trCsNhedZnAwYt7zdphUYdMdgQw4MLe8oBhqhw9MjC/rSOHDlYC21nlF0SGw+dPnIoH8DsOWdUTs+7kPct0dE5ZdvTuK/NtoAQuiWEIWboaorF9g379rkmAOneoqwYQFgLA/ZQF8KZQ3marorkHrqQliVBziqUhepRacSupsem+VrPI5b5IQmpohGzsDxjUpjtVYVwj3tvNusp+3N/tW+Wy6lpsy0ghG4JYQgMIWxQpgJGuLW4F1+shQHRsqAuBUgP2NYHlKNE1sp8lQ6RcsjGD57Cytk1IdiGDdrIxGhQ7bDtcmrabAsIoVtCGGeE4Ex3/BGCHDzfrw3ss+evWaI8pstDLA4pRg62Qu3sRahDCqFyOQghEtMthCG4pK8h+NIdfQ1BfV7bsI7qlXcTtuyrgwFrYaMjhMrlIIRITLcQRhwhqPGuThnSqlmZ8ZahUhiuh441hDL7cmPdIgQxXyhmAUWFZNaQPpqz6UN5uLWwdg1hHCF4G3edqB0ghLBCaPq14xCYMS5+VGB/7k/sdwgFzrcM2vD+JnMdPpsp7L/jISNHWRiT/95zqPqWoVq4blnk9wshP3XxlsErBMvl1LTZFhBCQCFMgPb/DjBqD62/Uwr646VpByF0SwjgBSGMC0LolhAYIUCjIIRuCQGgURBCt4TQ/udv+3sIHhBCt4QA0CgIwSMEgB6CEACgFoQAABKEAAAShAAAko7mCCEANEFHc4QQAJqgozlCCABN0NEcIQSAJuhojhACQBN0NEcIAaAJOpqjYYUAAOMTO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOYt8YgD4SO/dOhr2Q2P+WaIBugBAAQIIQAECCEABAghAAQIIQAECCEABA0nchLOy+WWfr3Dmtwrm5rf4Ko6A3unth7AYBwtB3IagkcqiEM8muWphUGtMJ+nlSOWRfzXNVqK0AMB4IocCqA1sGHRUHRhyvG0WeAiFAbBBCRhI164PfkkEl0eqMI61l2MKWYGVIYDarT0rMxj0VQsxjABBCjvvRa9kji5T0y5mEVt/VrBJ1dbdWvbZx3UsoAUKAEBI8Q3GfEFRkJpW99SP8wgw1awhF4y5jAAQCIVzzB9c/ZdBeF+SF6pLAQM9tOV0xzlVt3LbCyZsKCAhCuOYfcXsWFbV1B7UNsS0qOHxgebAX51DPZW3cNwVBCRAAhFAzsve8djRm+YpUEiPMucYH6YNf2VVGX5WAtXG1gqMywDgghJolucoPk6xj+q1zC5o40gx7Iqr9Hqo8ed6gHH9UGlcr8JYBwoMQGoEfDEA3QQhNgA+goyCEwOiDeoBu4c/Rldh0TwgAXcafo5WoIASACYMQAECCEABAghAAQNITIbjaAQAVhAAAEoQAABKEAAAShAAAEoQAABKEAAAShAAAEoQAABKEAAAShAAAEoQAABJ/jib/b0QxGK3bCAFgNPw5Wo8KQgCYMAgBACQIAQAkCAEAJAgBgrP6+vOfnDj424M/FB+xIb7G7tEoPHPxxKNnH9h+8k7xefTlB8TX2D2aBAgBAvLZR//5yfHHPv7HHxgfUSh2xe7doHzw8W8eObvnr47fanxEodgVu3fNghAgILkNHv47qxP0ussPbtyQsWXEZ++JLRsfXK6pk5xl2PYzG9x9/DarE6rta1chCup7Vcso3Q4CQoBQrL7xvMsG2UdUKOomf+CL3JzYsmGkCA0UvaGTJaYGLhtkH2XuYLsKhIAQIOWTEwddKsgHCScO5lX11Cwvn1jOo7Rly8biYSsSpg8g9Idx8S1rx1U5bXCoZD368gMuFWSfR88+UHcVuRg2KB1Uu18eFK7boUAIEIrfHvyhXwifnj2ZVxVBqP5xV5+3StbyumVJcbAssVaWdYackmw/eadfCE8v/0vNVYjOlE/4YuRQVq70P0S3Q4EQIBS1QhAV8qqeKMkKCnmx8YyV9SuVjZbCCkFUqL8KZZcSdn3FJGi3Q4EQIBQjTxkshdU8JPHRn7mqEPTK4yRLzAhGmzJohVUhyL3SCkG7HQqEAKFYff15vxCUHyQYy3HptpqHcn8xjJYJKaprUwajsjZiH2VR0fNxLyoqV1GZMqirhEpRsG6HAiFAQKw/QiheOx7Q65Yj5nJGoD5wzQW34vuWLVvUZUf/ouKGjRtHfe1o/Txy9v4Br8I3RajOjEJ0OwgIAQLy2UcfOH6YdEDsit27QXnf+cOk+9//+N3YvWsWhADBWX39uU9OPDZVP10+y0+XEQJA70AIACBBCAAgQQgAIPHnqLl/e+qAjNZthAAwGh3NUcuEEOtnZQCBQQhjk/24BCHANIAQxmP5wY1CBYwQYEpACCGwCOEDgKiM9kcZIYTAFMKNN97Y8BlLRv5H3+ZzTeVFTfJcCAEhTNO5pvKiJnkuhIAQpulcU3lRkzxXQ0L4f95rmsEKZW5kc3RyZWFtCmVuZG9iago0MzQgMCBvYmoKNTY3MwplbmRvYmoKNDM1IDAgb2JqCjw8IC9MZW5ndGggNDM2IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzNWkuPI7kNvvtX1B+YGol6lAQMGphp28HmFqSBHBZ7SpDksJ2gT/n70YsU9ahyubGHwaDHtkRRJPXxpaqPi1xE+Pclfmwelr+/Xz7KmFw2WJRth6SxixKrM1YIGabySoEfYSB+xP+/iBXM8ntawb8L/MxDAr/8e/nb5T8Xsfzp8utvYfQfYdws/7tkdrjwr5e/dMKIn04+LqGS8BNK+HHZdN4T7Cq98d4vDhbYVsgiff3lHZbrf5MyiRwiFt4Xo0X88nv5EvmlKfoSPqMMHxdtRN4hfnFysYCMNTJucLYl6InlX5cfb5evd2kWKZa3f1Z4usWtxhshBGzL2/vy67fw7TWYUIa/OBz/5EvY0Aetv+UJYbtBcQ+rvpdVarZKZSKxhT9dvvccIufpniDzSgnh85oJEseGQ2L9sgSLfDvgEXePX+N3gMKzJ06EtzC27SiaVrSb2WKbfRGi6NIWrls1yK4YcQKuRyI0E83OiSFuYmaqRIPqwucWCV9+W97+zKEBAeleBxgridhoLZOPocXK/CTKKlkE8sNeGlZjIey1Kdrr9WVRFXQ6K6DsqtKYKDw5tKIertoGaXubEQ9b9Y8aEU89ru/RyeVAMBL91v6eAXgqHx4Yn3NMN84TJnwc43Or5ys7eRIS1bG+f4S9kjwGTzGt7LXbioZo4YSUAR1GD+jAvYXs5X28fwCTKbhF7Eoe2iYcTzjXw319pgJf3PpWUGHqKlFkSL/LTsh9Pwz2KOHoeISKQrdVRMgSdtSdaZXs87LILWk0+u9mV6OE9w7ohJSqqP0i/WrJfKoKzE1ZAdAt2vMfIkhmEoPRm43RqprFjIagPWJVgjWGLjXjOctaJBMLWs2KJnrTxCw5PLXfTgIkcRTzXycoCSabPjI2ZVsiwoyPaP8+IUAwSRjg4twAlx6y6JpJ6OvE2aZBrNhB5jIm5+msE7lY2QNUpYMtiA6wIGrRK25lW42JmHkKeosudH0ckPX7Hx9JBoOG7daQqiONIQeEDHtVoK7NqskVGDpx/FFKHfiwtNSMXasJpGn9m/u9ZPUNrXcDiidVDN8teU3RiJLCnTkJHiLXlFWxxOuepSEn4fQPEh/n0Tsoty76Edf2KGET3YD1EQAAAwCGaGNNW1RQ2YklHdbnnFhi7umdyWQ3R1hU7rvbnitRkXw37BNBE2T6SZhJsBNmh71reXFKsYcFTyXdWDjlilC6h4lJd+Mtl3dgW+Ud4aJ0gIvzHjxQSaUEFSSoonStNRGtCAIeR5CWq0hjdk77KC01PE96er8393biN/F2ot+OCrROJ8FOLoLItzRKPt8xkhwiy6ntxJ6mzlf+3Xq0FUtXYszFUtsBCkNPGgp2IKTLfvCoeOErG+ehiXNRoZHg2NcauSZ9zgmZzm/StxKqJ2gKQRxsenscVK7KPFemM/InFDvtRyNOjBtwMnauJZjhNQueIhZbeLrJrnmMlwN4UyAMO31eF+0lTKzajiqvp2sqF2oqa703oHlT82wcUnJ1GC8q2GvrySgmUYnmnuicOL++HqE53jLyyxlG01wy4LoHKbShm10ycF2/T/ifCgdE/WReUBNcexiOucnSElTrVcM9J1EcN0/EZ6dVo/nuONjMDv6n94i0ikrWdk+8d+GhqGoyHR37V65Te58oKBkyrq/FLk3P2PB40rnOW5U6ttJUZr0nt556hMPQkSQcQmTvKMbfuC25Q/Z2OwfyfTTRzQyhdCwh+/kjaSSW/XiG2Ebzm97Guul08K4MgxVqcB30U7ndbpDL2o8k4xh/AUJhokJTsxlL8RchEY/Wrx63aBqUazd/VJ4UmubeCdf1YMfxM90T8i0JjGrFm6DE2EftRhZ9UpZzxRPjsp8CK7RO7PvJPr+x4UGfP4JBuQEMn4oXTpenK7PmkSZ5HMXBh80jEW47+zUO6jsCbBWaVq6RtuACesGeVyV5H6+1+hV0XqRTDwQSW2TR5bWEd8hX3AJLN9OhnGQQk8GDljWoPSCgrydT9GqilLgyB0WTG5NvKZ/tzsg7kMGsRaNJMm65P8M+DOME2ZgW8OYKB3nHTcbnK5pTIcEQo7MToNW62ocCE28niLDr3of9G8zyVceJ4YT2De5HTFgYMCHHMhsF0TUYGZmZfb1Lu0honoqLBRysUoUlfqPn4jLqGjl8LzaP+v4Iv1+zuQHD/48SJuKOoUTQ6QovMhOv5TB8AUWqgAKRK7KxjErJpeTluDbiV5anSGkX9Hdd5wXmWFd/y1fSdfIGgAoFz+aU99Y4SrPxGsHWbBR+Aj54nOARugefRHvLp15zTjv/6Gqx551KXHTqfh77Jv7soAM05/Vc19DJPXF7sPu3Ln1pDvxBaWdf2ntS0u/ZGb1dliKL7FSKtvzYbpJVlbTD2VM24RU9VpxdWufVqt6eb491ispZrNvb5eMCVqzgbFhcXqWRcjXxya9Pj4FhtR7CjvG1lq+/vLvyPs3u2y3G6tWa+NxY1hZ+lmc33V0pD8ozIuyn6CFhyUJwnXA8g8tK/JmKhsTCYrzhuFcc8y3TsXZZaobbuuhMCUw2hdm2feZqTNA3ko2aySbjOwKbHY4anwXOWr/Eht/gIi1mrJIUsTbwOWuNbYrxbrWweS82aB69FcH7W2iejFRD0tvk4B4Xigakyb3a2I3BxbFj2626OWFRHFodPgNP1zoW6dhy7YQktVjS4Ha8nbEbYNt8Z8ZoV8b4I+9TXY9C2eQW3UoxoKA3SYqQZRcJ5UZk58kOzvPSK0nYhfRqaFrRWYPGdxyLr0O8POR1wv+R9kySJ1q84GxBihJ32vB39PhuzePa3jodfY/0xlpPHD/Aw+PHa5TECpOoLIcyxhWrQ0/kw/ZO9akLL24epWpC/H2UhM9TfFTcd3lGYVAYjwZLVlEAgbvhVRLfGR8M4FWWoeTfvbtqY7IPOb15zVcsIdg6N4ymd3UnL/mmK6QoBsyGRPfzmTd/Ozb9K8p5+klppVmFt/1Pwb4+924yLY/SHbwFLFfptlhjhU5IhkWpcal9T+g0xI/pMYEO1ZmyP/ehxH//B7CFTD4KZW5kc3RyZWFtCmVuZG9iago0MzYgMCBvYmoKMjI4OAplbmRvYmoKNDM3IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDQzNSAwIFIKPj4KZW5kb2JqCjQzOCAwIG9iago8PAogIC9OYW1lIC9JbTgzCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDQzOSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAyODQKICAvSGVpZ2h0IDIwNgogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDMwMCAwIFJdCj4+CnN0cmVhbQp4nO2dwW8dxR3H/beUc5WDw6FQhNQDEeJWUSXPXCIqVEA0h1atTG0TJZbSoOZCW8kpSWrLOQTj0PQQ2yVRCG4iuASXNDaEplaoaJSohxS3mFDApLMzuzOzM7+d3X1vdne8+/3IDbuzs7O/3ff7+De7L83evw8AAAAAAAAAAAAAAAAAgHLcAQAUAE4B4Bc4BYBf4BQAfoFTAPgFTgHgFzgFgF98OrV4YNeuZ46t+Atu5dgzuw4s+hsPgBrw5xQX4MCB+iSoyDiIDAbDm1MiFetMSDgFgsSXUzIT2QRQm/+x5meOHWNzQk6cqmSjGEKQDCAH5QvHku188+KBVOd0D7bTirYcs2geMn9YrcHvtBa0F09OaSalpBKZLXJY3m6RjdFCnOtyMeVUMqq99Q7RQ1NNk27xjtXmHjbrvADIxI9TqXzT7LDzPlqhGslMTjlFFy9z7KzlzPHdw+rnAkAhfDilJm0KNc1LT76iFKYareqWEoE0prRTOmlnM4e9o0/+IBcoggen7Jt6asZ1Z9A6NbhTlhOFnEpAyQLFGNwpMtd0K8g7Fqsx936KTH5Z2/Kc0huLD6svwylQjIGdyrh1jzMw+dLKfpxnNuY/97OMiXdw9EgvW8/08ofFcz9QGg9zPxe5Uy4A2gacAsAvcAoAv1TsFACdA04B4Bc4BYBf4BQAfoFTAPiluFObAIACwCkA/AKnAPALnALAL3AKAL/AKQD8AqcA8AucAsAvgzt1BYDOUJtTxQcBYPtSs1N3AWg1cAoAv8ApAPwCpwDwC5wCwC+BOPXJx++/f4P6WV+/XfMVAWAwAnDq9tsXe9997cEH6Z/vPPan19cbuDD+uDq1e3j31FW5IpcHYmF02MNAmeEsjHoY3csg248AnHr9Z3OaRKef+sn5X/zozEOaVnunbjRwZbxx7fjI8PDwiwvJysjxawOPeXVqz/jMdC8etH827m1t3dsgxn+1N3iYXgbZhgTg1Omf6oXpzTNff/XVXy79QHPqyVc+aODKeCPSaGZmfA//la05xSqNYJSboZWMaItozCgkCy8OT1y4d326NyalijqOju42Bky3iJrJiQcVw7M/R0dHVTDM2KSTNsjuqYWp3dq+dvxZg1RzXYMlPKdOs6Z3l59MOfVh/RfGH1yj6zdEVUmcYhm458RNfrmWx3kOblyfHukdjfJvYaw3MtJ7NVq8erQ3Mn3dLCQLY8MvXdiM9ujtSTI2qoa9E+tsvJszPT6g3RKl+cQyP+bEMN9ThBP1HL/A218aZppu3FufYb8HbrISJge5OTMyvOe4WGBh2vE7Bqn5gjdNKE7NP//Ke2+8wX7WVlnTP/62GC2/99sfn26JU9c27l2MSlXi1NLYsAYXKJGKKTW9fnEiWiSVYmb0Zm5s3o1mbhcn9Eml6MrHYQPaLUvCRcbmBZb3S5pTIyf4Nf7whJBZllM5SGrh+DU7fscgHSMUp/746ytfcDb/w5o+/exzvvLlmTfb4hTL46hUHY1Xzo0Pv7Qsr5j4XS6kWni1N3F+Y/MCk2qBUorN+9JYk8p40W5hBx0/J0aJF5VTomeylHKKWrDjdwzSMUJx6rVHvnf68cfZz5tvsKZ33/5htHz6sUfn2uNUVFbGmQN8hf0uj2WIbnHi2x0u1Z7eRFRLWIexsTFCqTE9mZOpWDzTOxrPF4eZlURLdFBxB8ZG4UWlb6fs+OFUQjBOyfup+bttvJ8SqbV5g92V8JWNe1vsnkYwsfzlpugaSSWSnd8sDfdMpaLnfbK32CWe/0VHmRjbow1ot0S3OD1xzPFlXhuznNo4PyEeL2Q5ZcfvGKTqKxwY4TkVPaO4/Pb32+OU/ryaLd9PVja/jK+X5oi2Xe+qb08ZFY/D2vjtzI0tbUC7RQyqN4jYVIRyiQenb7IXjPgdg3i5jNuHAJz686/+kPWFL/+Ze+EU/i5FLvZEq6tTr8YJwKnP/vv3379w5tGHKKEeOf3U5F8/+eLTBq7MNsP+9jbr+1xQMQE4dfffn/3v62++ocf6Zuurz5EXYDsRglMAtAk4BYBf4BQAfoFTAPilTqfOA9ANanMKAKADpwDwC5wCwC9wCgC/wCkA/AKnAPALnALAL3AKAL/AKQD8AqcA8Is3p/75ztzvDObe+aer99JaPwGzPbVx15bUMGtLjgNy/vXB5fc+dkRUPP5mqOrcE946tEvw7OxHg0VKjh2Pah7lo9lnqzhgc3ivU+nP3dGrL6fYfmo3llQMbZi8zCqSV8Xib4Kqzz3K9Si3oxz3neTJ2LFRh97Sj8IXWVNbqNQp+bvfbJlbWkqcUvWBr7NcUbmh/yaOG/SR2DajRyrtbMo6ZcYfbYsi5y1r8anwTdk9l9b0ZbpnfLzIkzh8wuzKz13lvdEYo7LebhSGHDr0rNk1c2hdpJZJVaFTqhYlosgWnlhxhsW9kwxRe9m1zHLManEnVjmn6PitBfZfR89NezndUx2QSTM3Z7TVeu6JKjK79YqV1BdHo9iRKHO2M9GOWoMcpxVU6JT2mYtFPVPURlWo1K/8tG720BIirxxToHJOWfGrbcaCo6cRk91Tbud1SBQj4ixqOfdN5ZWcBMpMj2sN2WiJlnaKrIDtLVQNO6WmO9qkj29rKq/qd0p0WBNVJpJqjTiJupziuPTx5pTeCqecFJr7SZdkXkQNeuaxWZA9kcmf/9g9dDzM/UinHD03rWX7dwjvEZ9vNIFboh43VH7uav4lBSFNKd4o0ZRRHfX5Hi3ddqVCp7RpnfyskxaWQvKZhOixtGR0o/LDerhV0zMK88mBtZDZc9OsH/Y12Uzdcul3XzWfu/boQSZ4qWcUWU6lmsStV+og7SpTYX7nmz2LcSeOj2fp4bKdz935HVTLlArPKeuLF4Ns3/x87xky2/nc1Xe+JvjOFwDgBE4B4Bc4BYBf4BQAfoFTAPgFTgHgFzgFgF/gFAB+gVMA+AVOAeAXOAWAX+AUAH6BUwD4ZXCn1gHoJJU61fSrVgmuXLnSdAg5hB8hcACnAiT8CIEDOBUg4UcIHMCpAAk/QuAATgVI+BECB3CK5tyhJxIOnbt7d3Xm+ScMnp9ZjTvGSwKjJ9s5e98+IyQHPGc3Ju3G0bRTy40E9AGcIoiSNjIpWVaJt2pkKFs/NMP+d05vUT1Swpn7DhKhPaC2ktWugtLiBd6BUwTZ2W9sEem5qkuV7qHnL5zqCHCKJJkfmclHG6O3bos6halflcApJyL/6CqkL6vf/embHT1nA3IKdapK4FQuGR6lbvWVP6oH8fQCTnUBOEUQ6aLfBlH3RGZmJlsMAzNq3KAR2gPCqWCAUyT6DI6av6UeS8TIBxbpO64nyFQfOEJzQIdTxrP9dIGFXt6BUwESfoTAAZwKkPAjBA7gVICEHyFwAKcCJPwIgQM4FSDhRwgcVO1UgFy7dq3pEHIIP0LgplKntsKDVYGmQ8gh/AiBgw46BUCldNCp8KtA+BECBx10CoBK6aBT4VeB8CMEDjroVAmuH9k59PTZ9Dpn55Hrdu+zTxMbycYBuT17+ODD+9I/hy/eLLj3rYt7980vq/XVyX1Ts7c8hWYOXmZrFUdsgtCc+tZvfln2p+whilaB2AblFGuIV9iS6YjSTxORbPQXYX/pZOy1Mj85Pb938XbZYfoBTjXk1Lcvny3+04dTReA+7TxyVjdBKaVQqmhbcxr9QVQcUbZSyjycajT6sJLHitTqpCpzrMP87OIU7yPrF9lIHVGGxBYOX5ydjsvo5IrRmR93MY4tMnpFW3YM7hozFDroVIm7FV0EtrzzyJGsmRzfmrQlZYxs9Bhh2qnl6Tghb7Lkn17lbZELooNq1PfiWXqT78tTdCvOUqFYlOeaiWajOmLUKLbqTu3L3iqmryqeg3ZsxOnkjBkKHXSqBIZTQ9qczvAjZUyyQjZ6JJVO+m2RVIm6V9L2YumqUlRpKP0SVczRaB095RRVvFL10RhQD5g6nZwxQ6GDTg1SpzIFab5OyVnQwdQMTVQBs0UrFmoXQsOkflGNqaMnXvh0yjodOBWqUyW4nr6fcgnS+P2UXjUoyOmZ9rSQ0kcvSWRjpXXKOh04FapTfdYp3RB77se7ijbjuZ/V6C/CjPsppY9c2CKcYhO/ZDqXdIimf7xAiHmg2p1szL2fGsQp5+BZBwqDAJ2q+ll6CUwTki+b6OpT2/dTCZnP/VLztIfNJ2Niyje197CRiiKfoz8np+3nfnbjFvHYze1UfOjkuZ/TKeJ0csYMhdCcqoHw/5ZCoxGSXwF7/V647XTQKeAETg1KB51CnQKV0kGnAKiUDjoVfhUIP0LgoINOAVApVTt1KzxYwE2HkEP4EQIHHXQKgErpoFPhV4HwIwQOOugUAJXSQafCrwLhRwgcdNCpElzev2OodzK9ztmx/7Ld+2SP2Eg2egjLpPj45kmxCP0FZw5eZmsVR2yC0Jzq4+/Qlj1E0SoQ26A+L9YQrxBpqD5a7UMmG/1F2F86GXud7DF8Gl/80MGOORgBOlX2/+tRxWXhPu3Yf1L/vJRSCvWBaltzGv1BVJwh4/eAalMh6atsCObTSU2qKOb9cSGUrWQjdUQZEh94f2qz3jm1ORqRqOfU4K4xQ6GDThWtArfSSWtlgdkzlZZ8hWz0GGHaKXkArVlJTZfMJEJN/vjXyeV4UTPRbNROyT42n59mbhWbtUU7tqydsscMhQ46VQIj/Ya0BDX8SBmTrJCNFYWXGl8qQh00PTdVKapy2VIus9E6esopqnil6qMxoB4wdTo5Y4ZCB50apE5lCtJ8nVKTvFQlVc8z9Ba9QkgIDZNsphpTR09O1adT1unAqVCdKoGRtC5BGr+fom73jADt6Vn67sXSRy9JZGOldcpx9wqnShBunTJuTqjnftYEn2z0F2HG/VTmBCodCvtvKqL49HiBMEsW2Zh7PzWIU87Bsw4UBgE6VfWz9BLkPlgjZ1+Vfz+VG16qoA4ZMcdTvh07dhipKHI3+rPXs5/72Y23XBeEzH/1PCLfKeJ0csYMhdCcqoESdaohGo2QvO+r4AFLe+mgU8AJnBqUDjqFOgUqpYNOAVApHXQq/CoQfoTAQQedAqBSOvhvvIT/rxKFHyFw0EGnAKiUDjoVfhUIP0LgoINOAVApHXQq/CoQfoTAQQedKoH5/in+Tt8I8m1Stb1/ynhnKP/R3niYA/HWKn/v7HC/Ya2K96/hnW551PBOt6JVILaBek8i8W5epZ/xnkSr0V+E/aWTsdfK/OT0fPxGwqqBUw05FcL7fLlPO4+cNV6DaFmR8+reOt/nu0W8tXCLv7jTfAW2vireUbg6qcpc9CLd2UX7PYl2I3XE9MuCZ5O3NCZvCpad+XEX49gio1e0ZcfgrjFDoYNODfLe+SNZM7nm3zuvXoB7kyW/ePeu9qZp1Wi8wZPblLwgeyvOUvk6YN1EszH3fb6OF/Ly6auK56AdG3E6OWOGQgedKoHh1FD2O7JTxiQrZKNHzPfOp8rKstlI7MXSVaWo0lD6pb9inmys9L3z1ungHdmhOjVIncoS5OegCeBUEcKtU8wjp1PFLxfwApwqSLh1Sn/iYM394FT9wKmC1PAsvQTmw7rkyybraR6cqp/YqfjbuoC0Cs2pGqjibynAqfph19z75+iFDjpVBXCqfuBUOKBOtQM41W4cTp06dYrdgOktzz33nLgru3Tpkt2T8fLLL2e19NfZgRFe1iCsnYVN7rJr1y6xC2snd5Ed3KEWv1ACOBUOddapBx54QCSGnidZOc+6sSsmFkQW2S39dc7CDi9rEOaFaLd3ESqxzoYRYheGdE0f3DhKqQslgFPtxj3301OFJQ/ZRy8EL3Pslv465yLDyxqEfY5MkKwzIhvtXe5zy5hBjlCLXChJZ53qCAWdYhnF0ollC2sRKccSTCzo2SWyzm4p1bn4xyfDyxpEHJrcRSJjy9rlflKeHKE6LpQNu+ZNf+yZVOdUdyjolLhlWOfTHpYqor6InNGTUGSa3VKqc/GPT4aXNYhdMnSn2FnYmW/vIudyjlAdF8oOm13zpj/20hT/UJqOtHmKO6Xf6et5WKr0lOrMMnMoQWRpVnjkIGzBTmm7Ton7KTG+vYvuRZE65bhQEjjVborP/WR6GOlk3GWc4hgt/XXOJet+Sgwin06Qu+iI2yV7F9nuOIoxrONCSeBUuyn+jEI+6WI5I1wQySOqiewjpuVGS6nOxT8+uSM5LFkj9OTX97V3sY1whOq4UHYMcKrdFHdKzJEYcmal/0I2vugxWkp1Lg75/ZQYhAVJPpbXnZITS9HT2EXcbUnkWZOhOi6UDZxqN638exSsguQ+0B58l76BU+2mlU4FDpxqN3CqfuBUu4FT9QOn2g2cqp92OwXgVP3gmrebqv5hIOCk6Y8dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtJD/AwmS6h4KZW5kc3RyZWFtCmVuZG9iago0MzkgMCBvYmoKNDgxMgplbmRvYmoKNDQwIDAgb2JqCjw8IC9MZW5ndGggNDQxIDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzVWUtvIzcMvs+v0B/ILEU9B1gEyNZ20d6KBuhhsacWbQ+bFjn171cvSpQ0dsZ7yiJwZkxSEh8fSUl+XaSA8PcQH25D8fvL8lpoUjgUyvYkaaxQsHpjAWRg5ZFAj0CIj/j/AVY04msawd+BnpkE9PK3+G35ZwHx4/L5S6D+EehG/Lfk6Wjgr8svgzLw7vTjGiqJ71DD18XpvCbaVW5m2zbhUaBbMav04acXFKd/kzFJHCMWXoTREF++lpc4X2LVl/CMOrwu2kBeIb54KSzSxJom7nDmEvRA/LV8el4+XKQREsTznw2eXvjVbAYA0InnF/H5I4D2j1/E889NSO5JKfkopN1EeJUyfFzghg+eHuOqUSDKBw5u6QFShU+MDpJkpiXmKfPAl9lMJsM5PHWRcWW8LTKFD5csD4Z9p3mLLNAcgYdPRVbm9eLaoIMxLmod34JTP/bzAbMwfY+8bXCTjwA0mw5xV/KWM3fERm8a0nvWK9Lx8hjA8t14OcobskQ+zT6NqJE6wWbHrQYz+iTiLbfuiOEPxYqiRfXWQAfJrHPFI+pea5IfYpLIJt0szDMqkmUz1Bj7ErdTHjfF5jLmWotZknOD3AEUbfKK052evVl0wqC7MjVHAnRhTWCsYGmk3ntNcnSs7tnFwuixKIJYhjhuTba3DsJLSQFXXGYaTLPb39IK+Mia+o3tm6+5sqqtnUb4MjlTDZs6SPXDTDNdU6vgKmGDRmtCaLdIhkSncRyVVItqTRnfR+Q8wcDbCQZTQlxRryaLa8mlTF7h/BwaFUq1hsIV+2RezwTMRStUWBiNCV/CUB9bWOhwXuUWd7WToXNlBNiuABAqffNsWAtWt+dzxrmjFPYjq2QtjBWyVGAIq7UAjeMpuIyqCse0Ep9WKv6P+lBK9Fa04tBxzg2I0u2tSIWkp1Yw97K8qdiyrr/pnZ7a+8n1deGYThN60W8TJKiy7nVK7kKV66SFoWomCmUgS7kiz4zLlBFgRU41MKRAIudeK2VUxthagaJtC17TOumqGmyQVjGjduTOplnUN3eIjsP6CdsjNb5rmgJ5GXe9+k0JUjR2rB9E31929mFyCntUojZm3cL2gGa1yee0+ykduEKcBDrcEnEqH5XROYlARvWxZiOfh3YkVEiT/XZUsyzIndsLUOyYsWPNbzYNggdt80zRUwnaucGzCfKywh1dE3AHmN/o8D5TKdwVQ2n/NSMltKCpQKhSuXqYFxt5eqRo7hwDlJkmVU/NG9SNee5XOG4y92PlSWloNZSYkxMqg0WmbcmZgCwN++B0x0DMV68pRP6iY5Nm+Hhz4Wp1GbnrAWqG8+j7jLy3z/OBXWudl5qxoedNyt0K6I27ID15/mR27SGsuxBrlj7aFfnaciJ1/i3kvT311okonudFwyNFTNfz8lTCbqt0DNVF+K1aV8QslJuE8ME57GbeiOydf/RwkLqrP+rhHMQCr4dzCFvqYOC5ZrYjjfvI+tw6MYXzyCE++vYxTN841Khey9krSeIE3elM93k8qnAwJdXlilEzCty8L0khGY7lRdtu/xvaHO6Al64J+l5V9t1tR19Hd7tnTu3PQJXzRkXvpcdUpAacmvFlkr7ZZwc9plMMX7Nuyc/XbL5i3bFC0Glx34mw9/sMCL+//ej336MJUKtNS3EGGbpbq03wm+rJVg/qw52y1bjacP7urt9BbH71fqKmO/Sdy3dEu+pUKvdIMHy950Z+mGb86SCz79RWmhU2O34F9nrfbwZ1eNTuxu28XKV38X7ECinDoBirdgMvP4WP3w0T6lBolH3fQYl//wN3JE/lCmVuZHN0cmVhbQplbmRvYmoKNDQxIDAgb2JqCjEzNTkKZW5kb2JqCjQ0MiAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyA0NDAgMCBSCj4+CmVuZG9iago0NDMgMCBvYmoKPDwgL0xlbmd0aCA0NDQgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1WzW7bMAy++yn0AnVJSrJkoAjQxPGw3YYF2KHoacO2Q7Mhp73+KImyZdldF+wSpCpliqQ+/kjipUEF/LsLxPWkvpybi/BQOVK6W7LQdkpD620HgLyUNCETZgQS/t9BS1a9RI1yDpkmFuTJD/W5+dmAetc8PTP3K/Ot+t0kc1nxU/OxAgM3h69EqJFuEOGlcSbtSV2Lve37XnlS5FpKkO7fn0kNv6IzUZxCLZyVNRAmLzIJ9uLSNGEaMFwaYyHtECYeVUfZsMmGF3XmYumB+t7sT839iJ3iv9O3sjxRt84iY/W8clZPDxw/zcMBwJ4pMX3k4XnOsSWe08jzxzSH445NkHpIImBFtedxSN/RjGGKADrwXTIbeT59R9rLVnuhQd8In3VBi1yWOSQbeNg9q9OH4J9VCAv/vNKudb1h99Bl/zQm7MFm8BVwp7TmrAbfgwMoTgziv13KRAfyqPRhlLjUOp3YJRkocYQQwxygAoeTwIyJEsm+esN2IZPxBjldy/k5+NHGsdiH99fjdfJmkPVOBs7+BEwhllkPatuusPfGnkApwUVWTb/K6v8gi/I5G4yALCNKeKxg71cYHL5aWTlDd8a0fiqZK8I0K76Rg4Xw34p3YTEK2blSlgJDwrlgTrWa63uxrxYNK+ahAF0K6oBY71Sn41dQqx2OhwOk4M3saLS5CXdM/qwQZT9yzKO1VXzHVzIWDzekg7tRgF6vkg85Aman+F7OxTNltZDIB3uopZN3Es1pBbGIr0kxooEvXpMu3nVtItg1vkMu6ikaOF8ohLP9OXfXYJ4TIeUiu5D9d5/yJST7ZZyDxPFYX5jpUQjHDlmGDrK7vDIRnZyJqI/lpS88qdnsSVyTmtuI8fFUv7Gdobbjl2fRjoDqfev9iht7io1mhLhlMMEj2mJB9XlNh1KZqVuptHwlWrQt9F39CcX0uh5qUg/o5m5l9Zpji95xq8LSiKwUUkfzAxD6jP1mmshga7npvumkhN8fqRhoEQplbmRzdHJlYW0KZW5kb2JqCjQ0NCAwIG9iago3NTUKZW5kb2JqCjQ0NSAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyA0NDMgMCBSCj4+CmVuZG9iago0NDYgMCBvYmoKPDwgL0xlbmd0aCA0NDcgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nN1azW4kJxC+91PwAmapoviTLEvrGU+U3KJYymG1p0S7OawT+ZTXTxXQv4PxOJG809G4DQ0fRdVHAUV3Pw+gDP9uJAkJ1W9Pw3MtAxVQWb8uAueVNTo6bwxwVWlpxoQLJJH/N0ajU99yi2XejGkpMmPmD/Xr8Odg1A/Dp89c+juXO/X3UMSNDX8Zft4oY65Ov6WGFvAKNXweApU+0WtILqWkIioMGotKH358QnX8KxuT4Si+8KQcGcl8qxmRl6umDKeiw/NAzpQeJBNBeRwF0yh45Wchu55RX4f7x+HDCbziv8cvS/cEq4MD1jVyzZP6dMv8Wb6CMeaeU+T0I1+R88wtct5yGXwseWSMOfA9FYwBrqdadpC2d5/V40/SuVNgVp1HZYOmIK08jZ1bKILBFEUkI0pM96daZitO8KcZa0LFY8VxYh6qAVJ2rMa5mgrAV/lYyxeypO2EO5U+BZPv6U7xCNzWEl9TLoWQS2nuPxMEhcQ1CtxsXb5MsSq3Ek1SoXDBm0ua5fCg2ZE2ihsQNFFsYOaljg5VQ+lwpyhNhswGPFRCpJ0tIzuqNpFGpc6wDPa323Mqc0tThhaYfmTkDesno20LI/lajtap8JLVqffZrcIsehqZUFROZSRScc7MKp4xF3mNILEihB51Ldh/5G6cQaNTGZwdG5f8YjXTzuzBkfugqY9TceN1X/ae+S93I0nHik+VYHdGBxjUDjOBXVdq4r4jIdZOUmO93GIGwZlHvGA+Ei/OPEOSiV3zW7grN3+WkJessJhc49LXIYacjonbO9udJ03cLoiR5ar6R1jsLB1KfNAueBHQnyot3C4o6fnKv6MsJo6huB596lLWwr0DZZhq/amkmQTc7DQvm4dgdBI9wVLPvCbuSszLsmYPmQIaWIUqRQbyLgSEr6ypaFF7jpx7hGwgV8QFJDMFHHleXGazI21NkCDadw1v4a7a+m1stwl5+bKyYhzrenMZW8Fp3klTCha6bLVwO2DLwh2fRadIuPJEy9i5H5VhCtoHYjh2t5ombgcESTmCWUX3HTosJG2dT4l8l44mbgd00Kl6xllMf8EmZAl0XqCj625CTdwOyJHJBD5Ne5I0gUmhDi8edUBMCVKflxZuD7zYOdxbP0vokRJJkxzcXezuU03cHki5aOXNPR3mXrYPEiqV/RMS06NNjCkm7FLZxP2/qKw9ScvpSd14lOiv7IRBhyBaQfeY2cTtgcQXJ2kv7p7OaGHeExYxV4dOSpoccXTp+nS2cLunE8Zt9PUAiwJosEIzdQ+mTdzuiRLp0wNnPyMvi94poY4cvQF199UWbPfMWaHlWCR2KHJA2rFUjBa7D+hbuN2TJK3yflEfI70SwDrrNcTAUzf0yWrhdk+W1I6vpMqLnwtiW+eCjnzOSQ76lLVw702Za1PWMy8k7RwfbqPrm9fCfSfzMEwSR9f3xQfG+4teSHgDGq3nrlL3CVoTdyUjO+GOZSKM+OV7zR4FiDrJZPK2T0EL914UiOmwbrs6UbAcdPXwSn58FzxWvRKdeCLNA8xHhtBnoIXbDwPbB4vVg1ybn4fH7ccNnlB7cOvvQIxKUcd4Vpo/5mh8BYLotRxqDLaKzOb2LZ+GbMRsv2Ep1W/UFpw2yW9vzSL7to9Xpuai3fyZyNmXGiA7r7z+9AqAG8n44HR0APlO5NAcJiTQvHFf96DI7x+VeXOaCmVuZHN0cmVhbQplbmRvYmoKNDQ3IDAgb2JqCjEyNzYKZW5kb2JqCjQ0OCAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyA0NDYgMCBSCj4+CmVuZG9iago0NDkgMCBvYmoKPDwgL0xlbmd0aCA0NTAgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nNVazW4kJxC+91PwAmapovhpaWXJa09HyS3KSDms9rRRksM6kU95/VTxM91uEzaj0bZYWWNo+qMKPoqioHmZQBn+u5MkzKg+P08vpQxUQGX96yJwXlmjo/PGAL/KNU1NuEAS+X9nNDr1JdXY5k1Nc5GpmT/Vr9Nfk1E/TB8/celvXO7UP1MWVyv+Mv28a4wZrn3bFlrAAVv4MgXKOtFrmN08zyqiwqAxN+ndj8+onv5OnUlwFFt4Vo6MZL6UjMhLry4ZTqUNLxM5kzVIJoLyWAVTFfzKzkIyPaP+mD6cp3cLOAVGnX9fzTOqqN3sjDEY1PlZfXxvDMX7T+r80wqCJgr5iUvgMf/IygOnj/eKZsUIIxXoXkFIT6dcAlJPsJHzPFgmlHeY34FkC8YC1/ZFWBUED/y0ZAAKmhVyP9/nqiJC1CQVLBoENRc1S0nnrBrcrqMxmVDggZvB9+howW7kA8PKBRCnT6UDtHYIQs4TvxPxluUD55F13HGzWKy1pW/yg8xJUrVIf0sjyrOlogLXcqjN4IbOkBr632w5q8FLRXZxHbZasAPYSnhb2KLM2CjMBaeJ2H787HrMtWAHM2d4utFpHObmoIOVih56zLVgR9vcAGxxRW1ALMhTj64m7gC+8CGXD8MXobaGpxz62OWrhTuALxtz2TB8edIuit3Yvn21cEfMx1OOJoQvWMZaAyB6jiK6/n8POSLG8Bk/CktoZp3iROu7IVkTdxBf0tHE10PmahjuLHD8wDWD7QZoTdwRs5PG8v7IkWpA9lIu2C5fLdwRtlY4qxEtPuXnoeZr8FqkAvmua2viDubwgl9ynWE4nKMW84ohzF0OW7iDOJSt9yh8WY5eXeRojI2pu21v4Y7wc8LNQPt2y9Fr9OK/oLsuNHEH8CVLkewMqp+DZSDuvNPgSCZdd4fQxN16ZvZQOhgyb7UTaT7aQgTtOnwNObv6lRhRnY7aXPadWOXIOC3/h7QYOMAQKdTdJjRx35y0y8liyJRUiq6hTkxUMCkvOF/SsmGr5Qkj1M4bSouMDoHE0W0QF9I/9WjBRre57oTM+i9nxBs/0SPLok4659A91G7ivnO6bp6q5IhjCo7LLHVj4CZucPJk0qVJbr4+4Tg8dYG9t3d9G2rhBqfBYvFzBZum2Vfo4Egzel7NuAFdOlq4wenAYhFpZ9CnwSFoqc7LU9cPN3GD0yCuI8l8ynIqFh8LrkRImD1ILIe3HbLIarJsC8F1o/Im7huTZS6LforNN98epWO3fxjj4C8A98h0nUcLdmPHBZ5C6iU3rubTu8ccPgs5YvQ1HL+MtCvrB5aDZpfpuNS/xpo65MSoE5ZiN4Ju4g6mZ2Mnq+mLBr9q2pSeCmH7aTlGEOnBaIxsbtF0nXgTdzDxrz79b5YrXJnYspycVP28v5uta3Bfw/07DHnfuMlez74wnXQub5nmyNIFDo4Qu+tEE9dkmltK6ZLDd0n4GPur1EXyeTZvmp58XmNwiN4Mzj5kShFlWRyTetwsmMumueW0I+na2c3pvL+24wm1B/f6hpNRElvFN6XpmlLjfhOiL3vpVpHZPV5z6WknZn87K7++srXgtJn9/tFsstddy7pUl9Z1LkBxnJZv8ngFwJVk3NZLTvCBf6fmMCGBdtaPPSjy9y/3xwuTCmVuZHN0cmVhbQplbmRvYmoKNDUwIDAgb2JqCjEyNDMKZW5kb2JqCjQ1MSAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyA0NDkgMCBSCj4+CmVuZG9iago0NTIgMCBvYmoKPDwgL0xlbmd0aCA0NTMgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nO1azW7jNhC+6yn4AsvlDP+BwkASx0V7K2qgh8Wetmh72LTIqa/fGf5IskLTVpPU3jQIvKJGH4ejb0bDIZePAwhFfx/44iOKLw/DY5GB8Ci0OxSBdUIrGaxTCuhR7qnqhQR84X8/KIlWfE095m1Vr1mkauMP8cvw56DE98OnzyT9leRW/D1kdbXjz8NPC2PU1dk3t1ADXqGFj4M3eUx0EqKNMYqAAr3EbNLHHx5QbP9KL5PgyLHwIKxR3PhaGqwvPRobdGUbHgdjVR6BGwGEw6rYVMUHceZT6Cnx+3C7Hz7uwApQYv/bFJ5BBGmjVUqhF/sH8ek7pUzYfBb7HycQNFFIdySBu/wzmm/oercRJgpCKO5gNgJ8urvPEuB+hGW42tJvRzI3tdMz0qdJl7rhEYsMSJMbFYPN3Vid8rlrkusMx7si83lo8KU9GgRVsZ5Lkl6V+2hdxuAfTPJksi0vWO93GZPajHPlGib7+D5h2J5Io8OhDhXLdbdwQEih7SmgIriem1qwt+MnaptDxtZ4aNm/jsQvOHrC5HbSQ/e424gI6V2O+8ZqCY47U6Lv+KYFe/dNweLMGsh+OPFFeCuNoUh30fZYb8HeWS9YkzUnS+xytPwS1YqEq2Md90r00muGOOh5pQV798p5Xnl2viLFkuYf+iac6TmpiXv3UrmPpV5QJzMVGJRaURJCF7p8t3BvhW81VllsAmLWWSukfsyfE9POSBs4VnU/plu4/5hjjOVluX1TyIBuoL5I6pjTmLTZpzQGRwVkd0JdQt5KgLYSwvmeeh0vHQl2VFEmrrTrrgaauGf6iwnFbaZkJNsWCp8bfqiBqjXq6XW3lG7iLvZiZwelvp8FQpm9x7UhnMsRrSM8UgazXnc5auEuyBFjWove8aM2Lg1ZObnPwyxXBFVN+qjK/JuG7DDmnWQ8jdDNbE3c22BM30yJrFbwx9iKQXLYBO9jl60W7sJsrcnCHQpoNUpFAhVizHBvt6WFuzQFd5O+lPvtmXlFU/UZHOcL6ObeJu7CL81VRHq+zXP46PfO6zorwRqO325R3sRd6evWxKBVKktYSrU1WpLY0aoToR88zawEQdOto5u4K82Va7dmO/QYqqg82lPbGy3YlZJzTrysWhfrPoEaZeoffff/G5q4K6AQbo5MsLjQ0aHAGpo4qczQplvANXGXnl2O7NOupYAqLesppzrbj4IW7tIUnPHB1FU+jzNuntpZ1iFbPY466nTt+6RRwRUczUSkvktaC/eNkJY+MT2l5vkKap6iD/WNOeg4eRZBJoON6WbuJu4bIY+32GbSoqkmazD/hjajpdEUS952K+EmrknbhnoYr2Ti7SUYrHs048K7hEjvGW8opYmMn20n9g92jULe80nyBW5a82e66xYRm3S7ETYkikt+XDjLnOf43pyrsOEBa594YMWSx3ovPVBv1U3ILdgrfh04i18mlyG8B6dD0Rqm6H+htR9JZcKa0F0XNHGvmShWZNArqPMcosRAgRJUd7Jq4v5HNKYMZWdpYHcyJztjqCiiuhCxO5U1cUeoHefcsppMOwe7KSHOt9VHKi6/4Vf3xu/3y4NPzqB0YA/PiCnBpVF4Ik0HvRonxBBdWeS2RGpxu+bY2ELN8nxbfrzSWrBSRbe8VbPmuoNtY3e2rnOEjAqmfObICQDqxH6ajonBLUdc001oQFrtrtsp/PcPmE5JjQplbmRzdHJlYW0KZW5kb2JqCjQ1MyAwIG9iagoxMjgwCmVuZG9iago0NTQgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDE0IDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxNSAwIFIKICAvQ29udGVudHMgNDUyIDAgUgo+PgplbmRvYmoKNDU1IDAgb2JqCjw8IC9MZW5ndGggNDU2IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJztWs1uIzcMvs9T6AWiJal/oDCQbOKivRUN0MNiTy3aHjYtcurrl5Q0nvFYo9hN1si6TuKMTH2ixB9JpEbPAyrg3xt5hETq16fhudJQBVLG75PQeWVAR+cBkKtKSxgfTJCH/L8BTU59yS3mZRifhQRj4U/1y/DXAOr74dNnpv7GdKf+GQq7seHPw0+LwcC7G998hAbpHY7weQi29EleY3IpJRVJUdBUhvThhydS939nYTKcxBeelLMghS+1IPxy1a7ATxnD82AdlB6kEFF5GhnbkfGen4XseqD+GO4ehw9bdApBPf4+uWdUUbvkAICCenxSn74DsHHzWT3+OIGwiSL+xhT8WD7WyBf+k2fkj81fAdkgsC10MqUMruK2hWYYC4FpVOrggcuh0MBuVELFPUKSFouxRbG6CcTKxtSToAU7mwgVYwqv/MHCW3CZt5vaZf5tYR1pdNIuxZ6wLdi5hf1Y21Hl6Y6wZTA6kVRF1xOvBTuzeGBq/T0/7cyWbcGS0yE3D6YnWAt2brvhhueK2CiLxD2QY4rLVnOF1ymOnPtvKwUxaBsF67GnlSbuzGpBFgFvJ5GFvmtPCx4r4pqkyUu/trtSNXHn9gIqlnyNuB41WGlrultLE/eG4tJsIdqJC3XmutnKbPcdt9A3CkOeDKEqpLp6v/akCbKtKt5WnJ+mXjZJpWfMQ/FEQjhmt8BIOgoeyHZN0MK9GxMc0k9R77L96OkyvJ0abSlnPjKe7Qv7FIHlgEg4cSTaUWwTdymKfWEZgdtafqi4sa8VlXLQbEJ3219C/ieKfJ2n2sihoMS9sRsxNnGXpGAOPQl3QUyYRrmmOJ90MsAKCb6ruBbuQhSXY+xQx8fTmahuQzUvmzY/uhvVm+WaT/f17YkScribGBq7AVETdykqDlM9jeNaSXTRcBjs2dNcN1xu4i5EXacGS2uqNI5DbMdD8d0dp4m7EFXuJ3pjrbUz5a2vjsYFDtplu+ifGzVx70WBL+VBYVJN5rl95V5sQtSRW6DtRuMt2BuqLJfHfMVP4h+bGmaVN9off4g3Tlg0BypiHhwwR/YX6AbWTVxTSRt1Y6z0TLiQ47bqZ1vlCPv0vInhONJJdzTL80b6motl+V1ZpnLf91U/tX7kPbeX9J/5722w6KfRZ9R9beEnrplz7FvBm2wFQd8Va5hQHfbuv3GcubwgqWEspANjFakP7W8sh/iBlYndqKuJW7M/We+vHvC2HtC0s/UHRllZAWYaHD1nzSO8JCaW85LQTWCauDWP8J5bXD3i0CNq/1leV1EtS0c4UPZODrfkCtXPxASjv+12omVvCy77q8uKj3CAxjmY4arU3TWauKuPfB0fcZyGJEMpGnsuFzlhWXEc2QfktD26bjDWxK1EY5fpKVhzitxLrBJZ2IXYc/ORPzRft+0LRnLy4ocTf+O7WUYT9w0byYxJ2P6hVXrLc8Vjl9YgL6MCUIzdQ4cm7mqCo02w9priBfN4kJdnNkVKXfM0cVfzHD9Dei8zOuYh4lSeePeA7jlTE/cVzWNm5W8l41iZN+1zBG+tZp/nKuxmDU3cVfHHHOIsYq25IR4elxfRvCXt0e3f2QOVoo7xgJov3jVu7Mn7PzmfBGqRYPH1lGt8CzbL+4al+sTRotOQ/PIrzIqnXTTcNZfRda70ocYYEv94hbzoL67tiSOQbZqJLGpn/Ps2ivz+C6xMl+4KZW5kc3RyZWFtCmVuZG9iago0NTYgMCBvYmoKMTI4MAplbmRvYmoKNDU3IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDQ1NSAwIFIKPj4KZW5kb2JqCjQ1OCAwIG9iago8PCAvTGVuZ3RoIDQ1OSAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnic7VfNbtswDL77KfgCdUnqxxJQBGibdNhuwwLsUPS0Yduh2ZDTXn+kJDe2o3rOsA4BVgSKKOojRX2UZXPfEKD8LrTrIsOnXbMvOoKOwfixipwHg21wHpFkKlti34lCO/2/wJYdPCaLoYx9n1XYC9/gY/O9QXjT3D+I9rPoHfxssrve8EPzfhIMnl18wwgN8RlGuG86m9dk31J0MUYIDNy1nEO6fLtjWP9Im0lw1rOwA2dRhcciqL809SRIrzHsG+swr6BCIPDcO7a949E569LRQ/ja3GybyztyQAjbL4fjGSC0LjpE5A62O7i/QrRh9QDbdwcQVVEsI9HQbW7W6EB00rCTZkUWHV+LfJcbaXK6sV7HpDZBepPnzEBWjGIVgnYF1MFVsfKHlRJqXSxULzJxbupZcUnWTWyyfbZdgTfqUTejayo6xeYKaj2wHKHxRlrMu9felJ0t8RIpeYn9XieMBz3LLlo5Qobm8lKDvSbmrySGXNnbZjZRjvOjQcxziarBzjZRaeuU+z4xOt97TSkJmRYlm24mRD9jfwKtnV1Eaw12trQmT5wtFMNcVuimHg7ETE70ZkB6+HOvR3RHv4juGuyV7hmvC087UVjEfxV3tglQyzTnste0ui13rhtTzf74rp61nSHT4jIya7h/RKaxZV6I5PzK6TelG7fH96YphKRGg1N1V7mnLc6+WH/79UF+2VutivvPKMTrot0UCzuI5Bl6w7K3WxW3kN6nh1LvLdc/rsMA023nCj3rcpspsTI0So8+xrcriSWo6cuwl7y5vPXNdlq/eMutl6plVOohxNCGcKRN9Vql0GMpx6wGxDUVToanVH8TN9MyNU+fGC25FqOfDnEgnlafPplrdDOVILUUOikkBE0kRuNqT7/w2FfTxJZaZ/x5J0V/vwBW/HouCmVuZHN0cmVhbQplbmRvYmoKNDU5IDAgb2JqCjY4OQplbmRvYmoKNDYwIDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDQ1OCAwIFIKPj4KZW5kb2JqCjQ2MSAwIG9iago8PCAvTGVuZ3RoIDQ2MiAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnic3RlJbhw38N6v4AfcJotssgkIBiRrJkhuQQTkEPiUxM7BSqBc8v0UlyKLS89IDrwgkMfNJou1b2Q/LUpI/HsVHs6D+PVxecpzSjgQ2rZTarNCy3XfrJQKl9JOSQ+cCI/w/yu5wiY+xh18LOmZpiQN/hA/L38uUny3/PIOZ3/D+U38syR0tPGn5ceOGfnN8cc51Aq+QQ6fFmcSTbCr8pv3XuwgwK2QWHr9/SOI+7+iMBEcgi88is3IMPiYBwFfXCoDfAYenhazyUQhDHYlLBBiQ4gbP3PR9aT4sNw9LK/Pygr89/Ceu6fSq9sU8rrjyqP45Qb1p/HnpJR3+AR83uJvxzHqFnCsw/ptGsvTG0QB4iaDvE3g6u2bd+Lhh0BzE0o2NHeh3eq8QZLKEU2tEj58RPphoDb8qczLfeZlS2uRtquwQGvhd0pz8pzeIwyNXcatWriIL+MOggR60qBsLoqGI1T1DcN/zngIt6s0Cn57gD/AGoZDVl7glGm7JG9cC/vvkReT9OyLbtGe0Nlzc+umNNrTm2LP81V7FVHu8tx+zYa7RB9HG3rrqw0RN77eZPHx1WyRUmeIZDS+2pqeVoLDRWUhN7AVYwTVGFInhy0OQo7RQARzRHeC/AvqPs846fYVyoqcbmvpdVw7NrsnUwfZyEWTCxboYvzLXGifMc6lJ2n3rGFZXVy3MrqqgauSD3ZLHsHcwMPgBpEHZoESzjrbWdVwpnDsAuw8BOBRqDa2if7CtMADvqUQeaKUcmY8ZttFXyHLcCwU5hNein0N23uq42i1PjVszMNvZzLN/O1yBlBKrT4yYUpKB1NTgA7xjd4kWex/UhpX2qybD7wBXMgBr7zjmZNU35mcAXa+mKePM2MDVrV7DeFReaF4IbDsxkDmMpWHDkyFV7VHmsACASpyCn5i7Z75yHngepY0SR1UbA7VuA+LrEYFPvRIsLdZX0FnSh1yAvrd4BfRJFnYWZLqrRqfPHlM6umzegWf1qm/KDgpgQwGONJ8tWep1awfiV5xz9aorru6VxGfW8VT+hGS/dSGOFer3cdw02+Ei/aIgZdHCBKqxTmNNaKOEoT37CMYuclNtTysmgXmNAkAvt6IzuYnvl3WDpyb1mt7xva4DsZyB+fG5w5WuOY7dUobTWPIIp/DFaPsE810iYVzqvKPB/2R9A1NxwJ1sg9zzOAY2IsN8dYVpyORZW6CYiyVtiAbTjHfpDlqPcwsBpoSmyOSDBAFo2jMbgdZyMIZtQY8QimCBqVdkGqMHpAwKElhU20M99VZXX9OF5p9hfUf0W+oi9iraNeTzcg6PKvOOrvqWTzSfDEh1KJZ9nSeXOYnMcz39F5Ma8BSdO1t2vXW5dgajHyUSIIuqluXc3MqRbqJxPzUUahdtbjuddE47TP0enAWaXtFBn9YPkZv0WP1vXbafUll0rngnx6WpwXJGaxK4lEYS+OPabzta4oBnBhfM2S8Wlm99Lv4UJAZK4Vfrfj7d/G+vdHARQSptznGqnj9gjtwSUaUdZRvblZtsEcer2/C9U5GkW562mswE8ptJafoKoldJim55nsjPAx/GvmE4gJ91JtNeju+1PqcanADE5H+l9BFurPy6C7tuQO2bdXOBk/duYfHRBIqjE6/UlHuZD3w0BzVsHMONirxb1k0WFnuekoE6YQrRspdxQc2zUNIEnv6AR1DTY6yc95LUUdwIaF5VhJA1vMDg2+KUeYj7qG5i6c1cC7cSiKkrl3CbY33VBJq3e4PFrNiMBaBonM3xeBqZxyt5VK6b49e8sJljmyO5uVYznMY38tv5IAle+L+nuFhXY1J2gz3pzeMW+qXXIvJUKa8cAkz60i8Hwxy0JE0dzZVjdLJQ1X+h35DgxoYG/oNORx5Pi+X1TmGBrEvaM+qrfJ64ft8RVNrTdUwVU42kcqnNrBGXBDrZf/KwbsaytYuFlKtoUnqX6ae9lS/UlnVRq+Q9Pn1ymrLxFcvq1r71WNZVVr9z8pqib3u85jFqLJYK5sviRgy+7rvw2zU4OQ7IoBdTWAFZlOye33Jx8UOTf8VNC2/kFu1rdLb/lWy4cs+f5btgbv6oXHoP7Ci7C58lbJCKdwU7Azl65+6C2admgmMWjdtv22jhL9/AWO2SroKZW5kc3RyZWFtCmVuZG9iago0NjIgMCBvYmoKMTYwMwplbmRvYmoKNDYzIDAgb2JqCjw8CiAgL1Jlc291cmNlcyAxNCAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMTUgMCBSCiAgL0NvbnRlbnRzIDQ2MSAwIFIKPj4KZW5kb2JqCjQ2NCAwIG9iago8PCAvTGVuZ3RoIDQ2NSAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVpLjxw1EL7Pr+g/sE75bUvRSsnONIIbYiUOUU4g4JAF7Ym/j1/l93h6EgLRZtJud9mu/r5yuVzu1xPdwP09+Iu2bPvl5fSa6uim2cZVW0Wl2jgQIxUAdY9iS8CLq/AX//8DECa3T6FFXQa8xirAwh/bz6c/T7B9d/rw0dX+6url9vcpdocNfzr92CkD35x+tYacsm9Qw9eTFnFMpgi10lq7GbYxTVhU6c33L2w7/xVeJogzbwsvmxTgC59SwfcXHuWCu3odXk9CQhzBFwzdFMOOBXbc2JkOpgfb76f3z6c3O1Wb+/f8W22elBMtqdPVuCcv24e3Dj/ufhoA3rsrc9d37mdc2WHLXJlJV34Xy7UsWFe2URYoABfuKnzd48ft+YekAGsUMJsAYoE7BTjPCpzjAPSSrrsbDFKnNF6ZSM/3qJAX8PdMVWUZZbHMeJQP9zzKMpGVkxuFTjnFCejQI0XlhIkNshSdigWF6ePGGKGbv3969HS8DQq5t3p05hrqZQKwkmVeRCfwIJYZS2TIVpZ6AYcX7JEgLDcyvo9LWyc8bk+djnvSR8a+wni6queR5KbNne/JO/2Dcfk68bhRHdqJOSrBrGTUKvx491zHXhjF8Zqnl4RVhw2ohE9fvyf5bgTULvSn06gdH4E/Gfnz5dC/t799NB0tnek4X6FEtpx9xrjrjMU6z7DXgqs0RZ/S730kQ2SWkB0nyzO6OumdEU580xG9hDON41G0xktCgZb7gCJtWJTFdgKMFG3Q4xCdB+KYnYWu3rjGV6AzafSrLNNjE96bRl1CT1DZydIFOUlCjbBWS7X0QeKgDxKx7K9sr3yQSH4Hij/yZc5WPog60+IyGIRaOaGZXObfJkSzpXezesf5VO6zDSKOnoBrrK7xFZoIpTyJbIUv3Y/hG+RYvHLUek92xQtXAV/fx3mJr7JEce9chF3iO5Gr8Q0eU0PrMXVlk2jhEr0BzpmyUqE3wlmAnBRv5MaCiJBHMHrwiIqf81zHK01+4QYvVhAtlLUC1rxc7uclrMOJF84qu4eKI7nihVFFrI8nFJcrXmZyh3kxyb/5SOAMecX1/i14qP0WhkwwAkz7AMpcwxDZneEX7BcxE6WMcyGUz3W8kvDz7S9L/JQgAQa2Dl5mcriqUx/svr2FY5ELKwmuEZBs/Zyuldyx+VDk6xU1hJzNilL1W63aWafZ3EjhatO2f2eKsUvoMK0o+a1vtf7PEZswq9XA7BrJ1tPMkIuB/mpGcKCEg7HWWdu1GYFe+9aMyB7lEvvIHoUX796uqqsZwRknwoA1Wi49ykwO+X2gfsarYJRPCcod8oJYgqNG1OsbrCHFSTlu2gubeL+OhDC+8nF0+N2ImxhGQmhne1xBrseog/J96FxD0M3ZBQToassrdOGcSXD4xeI8IYXLkbxFSOyNNpjNUx0Se5XclldtDaVYg4w2YEI7IYv0ZwVKrQZP6dfWvoNm+5fbVrYGgzbj2wSjq7YrsN9niBTJRdvGrZK58m426TZBesKnDwo7Po/gD4R/CfipeY08Vt0BOzZhze2XAr7e4/TwznX4qhBOWJR2dJWNVUsXY95v1bkV62v+FZBXG01YbuA3G8kZbP26xse8Ckp/vlfJGhzCfzonNR3YXPEk2tgn3X5thvKbXKBNyXSczLU7wkYS/VwqcOCKB6y6YxJcA7fO5ExJNGP0UkeZX3MJ8NuwPHkuFR0391ECDJEuaLSKi6tRI+7qVlEj5n0n+9CcHzin+xRBrvMvLnggWlFruVjuo2ZyR/ehaFWY4wxYcrSFiqPjebY12lISoz2EVzf+mLi6BTZPu/om2VUnYKAkAPwYzoBXYGtDXFjn7IDpJdgTuaOp5wfGbUrW3hvhtK0xOUoLWZiULlKR6kwXJhVamUxr/0SoWfIWA/lGN/SYbc9DjB3a4HvW07RtJ4tpodvrJHTRpx0lbCsrPITq244J4AZXXrlYTPhD0mfi8ISFwRYQobgGakzOm7gv4Lp/4pFhlXMOV1M5ZFFxW/qDWW3Ndt7r4MTGSV+lAkrLq/sZn9o3MEnxN+Metf/cIril7GaaN6PRKrtaWRCab/eyJC6d3aHBBC09rd0rHpIzbI6jJnYggY0+oT9ISahxirHSMcxQnr13K7FoZ1Ze/EQr26Arkhfsx2829aEHjEO6uYkt8lJQj9R6iP9zsa+0WlqzKrNRVAc0DZ9UEP+QWW3v9vGU87Ktw3marQg9m4aJDWNLtDeGyXg29L1XXmMfnpr07njAQivMh9Eyypf+CY7fyd/n2ctbNTM791bleA5xz4ce9KyWNltaPKym4/jrt5nNdqZG6+jfWsMBxyqSc+0TRdj4sM1hgyNOogg/xaOHgJ0pgvkoqG+Ql4/UIO8l1IKm/C59pJF7Td8OoLPM5DdClffIVpyOW/MKdw/uuLBddQHcfIELYJLYALGtJrAcUWql2wmCtXlimJBl3rjMxrrXhp/lx6Qp9o+uGB0SwPB1RyUNU200lK8+0K3oVksMCGNCdejBDJNuckrRjnh4IRnRaALgHDYN2Azm2eIw+X5CShgsZGl1EGc6NdB+KXHIqo6kDxIzN07b1/szqSWhklqt5dXdMJ6H3NwNi6qMG7T6i6hLdULrfSGsNmjSasJdqK6FWu6GZ3K3v4GCEvDhzvhWDkZ2sre46Xi4/XWIYowIzqy5npjAJMOUirQ/bo6z6sRETcUZ2sPefflxmhBEgbAGxHKvPJM7au7+EJSKmMRfhOOtN61mOK5D2RN2ngRXmppFKP18aSoxn37xMv7KO+ChUb8mXZ77TyuVP9dyrDRfocJmDTFmqA2fkk6+QWUuhhFhes6qoLu958PUrpv+C9r4+E5tqSRgVX8LVfG+T2dzc69d+Uh1sHRKqPEfWDhpSl2jkAYoO/1w1jeliQlKJFffNin+7x81xxW1CmVuZHN0cmVhbQplbmRvYmoKNDY1IDAgb2JqCjIxOTgKZW5kb2JqCjQ2NiAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyA0NjQgMCBSCj4+CmVuZG9iago0NjcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAyNDkuMDA2IG51bGxdCj4+CmVuZG9iago0NjggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNzA5LjAwNSA0MDcuMDIzIDcxOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDY3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ2OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDcwOS4wMDUgNTM5Ljk5NyA3MTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ2NyAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAxNzIuNTA3IG51bGxdCj4+CmVuZG9iago0NzEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjk3LjAwNSAzODQuNzIxIDcwNi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDcwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDY5Ny4wMDUgNTM5Ljk5NyA3MDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3MCAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjEyIDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjQ3NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2ODUuMDA1IDQwNy4wODIgNjk0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzMgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDc1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNjg1LjAwNSA1MzkuOTk4IDY5NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDczIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3NiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMTIgMCBSIC9YWVogNzIuMCA2NDkuNiBudWxsXQo+PgplbmRvYmoKNDc3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDY3My4wMDUgNDIxLjI4NiA2ODIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3NiAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA2NzMuMDA1IDUzOS45OTcgNjgyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDc5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxMiAwIFIgL1hZWiA3Mi4wIDU3My4yIG51bGxdCj4+CmVuZG9iago0ODAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjYxLjAwNSA0MDIuOTc5IDY3MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDc5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuODA4IDY2MS4wMDUgNTQwLjE2OCA2NzAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3OSAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjEyIDAgUiAvWFlaIDcyLjAgNDk2LjggbnVsbF0KPj4KZW5kb2JqCjQ4MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2NDkuMDA1IDQxMS4yNzYgNjU4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODIgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDg0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNjQ5LjAwNSA1MzkuOTk3IDY1OC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDgyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMTIgMCBSIC9YWVogNzIuMCAzODQuNCBudWxsXQo+PgplbmRvYmoKNDg2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDYzNy4wMDUgNDEzLjgwNiA2NDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4NSAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA2MzcuMDA1IDUzOS45OTcgNjQ2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDg4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxMiAwIFIgL1hZWiA3Mi4wIDMwOC4wIG51bGxdCj4+CmVuZG9iago0ODkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjI1LjAwNSAzOTYuMDA5IDYzNC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDg4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ5MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuMzM3IDYyNS4wMDUgNTQwLjY5NyA2MzQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4OCAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTEgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjI3IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjQ5MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDYxMy4wMDUgMTI1LjI3NiA2MjIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5MSAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA2MTMuMDA1IDUzOS45OTggNjIyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDk0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIyNyAwIFIgL1hZWiA3Mi4wIDcwMC44IG51bGxdCj4+CmVuZG9iago0OTUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjAxLjAwNSAyOTQuNTc4IDYxMC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDk0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ5NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDYwMS4wMDUgNTM5Ljk5OCA2MTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5NCAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjMwIDAgUiAvWFlaIDcyLjAgNDM1LjU0NiBudWxsXQo+PgplbmRvYmoKNDk4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU4OS4wMDUgMzI3LjU5MyA1OTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5NyAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3NyA1ODkuMDA1IDUzOS45OTcgNTk4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTAwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIzMCAwIFIgL1hZWiA3Mi4wIDIwMC4wNzQgbnVsbF0KPj4KZW5kb2JqCjUwMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NzcuMDA1IDMyOC4wNDYgNTg2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTAyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzcgNTc3LjAwNSA1MzkuOTk3IDU4Ni45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTAwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwMyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyNDEgMCBSIC9YWVogNzIuMCA0NDkuMzYzIG51bGxdCj4+CmVuZG9iago1MDQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTY1LjAwNSAyMDkuODY5IDU3NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTAzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDU2NS4wMDUgNTM5Ljk5OCA1NzQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwMyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MDYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjg1IDAgUiAvWFlaIDcyLjAgNTUwLjU3MiBudWxsXQo+PgplbmRvYmoKNTA3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU1My4wMDUgMjAzLjA5NiA1NjIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwNiAwIFIKL0ggL0kKCj4+CmVuZG9iago1MDggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA1NTMuMDA1IDUzOS45OTggNTYyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTA5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4NSAwIFIgL1hZWiA3Mi4wIDM1OS41MjggbnVsbF0KPj4KZW5kb2JqCjUxMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NDEuMDA1IDMxNy40OTMgNTUwLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDkgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTExIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzcgNTQxLjAwNSA1MzkuOTk3IDU1MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTA5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxMiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszMTEgMCBSIC9YWVogNzIuMCAzOTkuMDQ2IG51bGxdCj4+CmVuZG9iago1MTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTI5LjAwNSAyNDEuOTI2IDUzOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTEyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxNCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDUyOS4wMDUgNTM5Ljk5OCA1MzguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxMiAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzI2IDAgUiAvWFlaIDcyLjAgMjczLjAwNCBudWxsXQo+PgplbmRvYmoKNTE2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDUxNy4wMDUgMTgwLjUzNSA1MjYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxNSAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA1MTcuMDA1IDUzOS45OTggNTI2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTE4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMzNyAwIFIgL1hZWiA3Mi4wIDI3Ni4yMTEgbnVsbF0KPj4KZW5kb2JqCjUxOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1MDUuMDA1IDM1OS40ODEgNTE0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MTggMCBSCi9IIC9JCgo+PgplbmRvYmoKNTIwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNTA1LjAwNSA1MzkuOTk4IDUxNC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTE4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyMSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszODUgMCBSIC9YWVogNzIuMCAyMjUuMjcyIG51bGxdCj4+CmVuZG9iago1MjIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDkzLjAwNSAyNjkuNDcgNTAyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MjEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTIzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy42MjcgNDkzLjAwNSA1NDAuMzQ3IDUwMi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTIxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyNCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MDkgMCBSIC9YWVogNzIuMCA1MTYuMDY5IG51bGxdCj4+CmVuZG9iago1MjUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDgxLjAwNSAyNzUuNTgzIDQ5MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTI0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyNiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuNjI4IDQ4MS4wMDUgNTQwLjM0OCA0OTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyNCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MjcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDM3IDAgUiAvWFlaIDcyLjAgNDU0LjE2IG51bGxdCj4+CmVuZG9iago1MjggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDY5LjAwNSAzNjAuMDc4IDQ3OC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTI3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc3IDQ2OS4wMDUgNTM5Ljk5NyA0NzguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyNyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MzAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDQ1IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjUzMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDQ1Ny4wMDUgMjYxLjcwMyA0NjYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUzMCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MzIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA0NTcuMDA1IDUzOS45OTggNDY2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTMzIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ0OCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago1MzQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA0NDUuMDA1IDEzMi45MDggNDU0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzMgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTM1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNDQ1LjAwNSA1MzkuOTk4IDQ1NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTMzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzNiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NjMgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKNTM3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNDMzLjAwNSAxMTkuMDYgNDQyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTM4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNDMzLjAwNSA1MzkuOTk4IDQ0Mi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTM2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzOSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NjMgMCBSIC9YWVogNzIuMCA2NzguOCBudWxsXQo+PgplbmRvYmoKNTQwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQyMS4wMDUgMTcxLjkyIDQzMC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTM5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU0MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDQyMS4wMDUgNTM5Ljk5OCA0MzAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUzOSAwIFIKL0ggL0kKCj4+CmVuZG9iago1NDIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYzIDAgUiAvWFlaIDcyLjAgNjI0LjQgbnVsbF0KPj4KZW5kb2JqCjU0MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0MDkuMDA1IDE2Ny44MzMgNDE4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1NDIgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTQ0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNDA5LjAwNSA1MzkuOTk4IDQxOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTQyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjU0NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NjYgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKNTQ2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgMzk3LjAwNSAxNTQuNjY1IDQwNi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTQ1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU0NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDM5Ny4wMDUgNTM5Ljk5OCA0MDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDU0NSAwIFIKL0ggL0kKCj4+CmVuZG9iago1NDggMCBvYmoKPDwgL0xlbmd0aCA1NDkgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVh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dCA8PAogIC9GMTYgNTYwIDAgUgogIC9GMTUgNTY5IDAgUgogIC9GMTcgNTc4IDAgUgogIC9GMTkgNTg3IDAgUgo+PgogIC9Qcm9jU2V0IFsvUERGIC9JbWFnZUIgL0ltYWdlQyAvVGV4dF0KICAvWE9iamVjdCA8PAogIC9JbTEgNyAwIFIKICAvSW0yIDkgMCBSCiAgL0ltMyAxNiAwIFIKICAvSW00IDE4IDAgUgogIC9JbTUgMjEzIDAgUgogIC9JbTYgMjE1IDAgUgogIC9JbTcgMjE3IDAgUgogIC9JbTggMjE5IDAgUgogIC9JbTkgMjIxIDAgUgogIC9JbTEwIDIyMyAwIFIKICAvSW0xMSAyMzEgMCBSCiAgL0ltMTIgMjMzIDAgUgogIC9JbTEzIDIzNSAwIFIKICAvSW0xNCAyMzcgMCBSCiAgL0ltMTUgMjQyIDAgUgogIC9JbTE2IDI0NCAwIFIKICAvSW0xNyAyNDkgMCBSCiAgL0ltMTggMjUxIDAgUgogIC9JbTE5IDI1MyAwIFIKICAvSW0yMCAyNTUgMCBSCiAgL0ltMjEgMjYwIDAgUgogIC9JbTIyIDI2MiAwIFIKICAvSW0yMyAyNjQgMCBSCiAgL0ltMjQgMjY2IDAgUgogIC9JbTI1IDI2OCAwIFIKICAvSW0yNiAyNzAgMCBSCiAgL0ltMjcgMjc1IDAgUgogIC9JbTI4IDI3NyAwIFIKICAvSW0yOSAyNzkgMCBSCiAgL0ltMzAgMjgxIDAgUgogIC9JbTMxIDI4NiAwIFIKICAvSW0zMiAyODggMCBSCiAgL0ltMzMgMjkzIDAgUgogIC9JbTM0IDI5NSAwIFIKICAvSW0zNSAzMDMgMCBSCiAgL0ltMzYgMzA1IDAgUgogIC9JbTM3IDMwNyAwIFIKICAvSW0zOCAzMTIgMCBSCiAgL0ltMzkgMzE0IDAgUgogIC9JbTQwIDMxNiAwIFIKICAvSW00MSAzMTggMCBSCiAgL0ltNDIgMzIwIDAgUgogIC9JbTQzIDMyMiAwIFIKICAvSW00NCAzMjcgMCBSCiAgL0ltNDUgMzI5IDAgUgogIC9JbTQ2IDMzMSAwIFIKICAvSW00NyAzMzMgMCBSCiAgL0ltNDggMzM4IDAgUgogIC9JbTQ5IDM0MCAwIFIKICAvSW01MCAzNDIgMCBSCiAgL0ltNTEgMzQ0IDAgUgogIC9JbTUyIDM0OSAwIFIKICAvSW01MyAzNTEgMCBSCiAgL0ltNTQgMzUzIDAgUgogIC9JbTU1IDM1NSAwIFIKICAvSW01NiAzNTcgMCBSCiAgL0ltNTcgMzU5IDAgUgogIC9JbTU4IDM2NCAwIFIKICAvSW01OSAzNjYgMCBSCiAgL0ltNjAgMzY4IDAgUgogIC9JbTYxIDM3MCAwIFIKICAvSW02MiAzNzUgMCBSCiAgL0ltNjMgMzc3IDAgUgogIC9JbTY0IDM3OSAwIFIKICAvSW02NSAzODEgMCBSCiAgL0ltNjYgMzg2IDAgUgogIC9JbTY3IDM4OCAwIFIKICAvSW02OCAzOTAgMCBSCiAgL0ltNjkgMzkyIDAgUgogIC9JbTcwIDM5NCAwIFIKICAvSW03MSAzOTYgMCBSCiAgL0ltNzIgNDAxIDAgUgogIC9JbTczIDQwMyAwIFIKICAvSW03NCA0MDUgMCBSCiAgL0ltNzUgNDEwIDAgUgogIC9JbTc2IDQxMiAwIFIKICAvSW03NyA0MTQgMCBSCiAgL0ltNzggNDE2IDAgUgogIC9JbTc5IDQyNCAwIFIKICAvSW04MCA0MjYgMCBSCiAgL0ltODEgNDMxIDAgUgogIC9JbTgyIDQzMyAwIFIKICAvSW04MyA0MzggMCBSCj4+CiAgL0NvbG9yU3BhY2UgPDwgL0RlZmF1bHRSR0IgNCAwIFIgL0lDQzMwMCAzMDIgMCBSID4+Cj4+CmVuZG9iago1OTIgMCBvYmoKPDwgL051bXMgWzAgPDwgL1MgL0QgPj4gMSA8PCAvUyAvciAvU3QgMiA+PiAyIDw8IC9TIC9yIC9TdCAzID4+IDMgPDwgL1MgL3IgL1N0IDQgPj4gNCA8PCAvUyAvRCA+PiAxMiA8PCAvUyAvRCAvU3QgOSA+PiA0NCA8PCAvUyAvRCAvU3QgNDEgPj5dID4+CmVuZG9iagp4cmVmCjAgNTkzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAwMTM5IDAwMDAwIG4gCjAwMDAwMDI2NzcgMDAwMDAgbiAKMDAwMDAwMjY5NyAwMDAwMCBuIAowMDAwMDAyNzMwIDAwMDAwIG4gCjAwMDAwMDM2NjIgMDAwMDAgbiAKMDAwMDAwMzY4MSAwMDAwMCBuIAowMDAwMDUyMjA2IDAwMDAwIG4gCjAwMDAwNTIyMjcgMDAwMDAgbiAKMDAwMDEwNTQ4NyAwMDAwMCBuIAowMDAwMTA1NTA5IDAwMDAwIG4gCjAwMDAxMDYwMjggMDAwMDAgbiAKMDAwMDEwNjA0OCAwMDAwMCBuIAowMDAwODE0NDgyIDAwMDAwIG4gCjAwMDA4MTM5NjkgMDAwMDAgbiAKMDAwMDEwNjI0MiAwMDAwMCBuIAowMDAwMTEyNDEzIDAwMDAwIG4gCjAwMDAxMTI0MzQgMDAwMDAgbiAKMDAwMDExOTYxNCAwMDAwMCBuIAowMDAwMTE5NjM1IDAwMDAwIG4gCjAwMDAxMTk3MjAgMDAwMDAgbiAKMDAwMDExOTg1OCAwMDAwMCBuIAowMDAwMTIwNzY3IDAwMDAwIG4gCjAwMDAxMjA3ODcgMDAwMDAgbiAKMDAwMDEyMDgxNCAwMDAwMCBuIAowMDAwMTIxMDI1IDAwMDAwIG4gCjAwMDAxMjM5MzkgMDAwMDAgbiAKMDAwMDEyMzk2MCAwMDAwMCBuIAowMDAwMTI0MTU0IDAwMDAwIG4gCjAwMDAxMjY1NTQgMDAwMDAgbiAKMDAwMDEyNjU3NSAwMDAwMCBuIAowMDAwMTI2NzY5IDAwMDAwIG4gCjAwMDAxMjc4MTYgMDAwMDAgbiAKMDAwMDEyNzgzNiAwMDAwMCBuIAowMDAwMTI4MDMwIDAwMDAwIG4gCjAwMDAxMjgxMjUgMDAwMDAgbiAKMDAwMDEyODI2MSAwMDAwMCBuIAowMDAwMTI5NTE3IDAwMDAwIG4gCjAwMDAxMjk1MzggMDAwMDAgbiAKMDAwMDEyOTU2NSAwMDAwMCBuIAowMDAwMTI5Nzc2IDAwMDAwIG4gCjAwMDAxMzE0ODAgMDAwMDAgbiAKMDAwMDEzMTUwMSAwMDAwMCBuIAowMDAwMTMxNjk1IDAwMDAwIG4gCjAwMDAxMzMzNTMgMDAwMDAgbiAKMDAwMDEzMzM3NCAwMDAwMCBuIAowMDAwMTMzNTY4IDAwMDAwIG4gCjAwMDAxMzYwMjQgMDAwMDAgbiAKMDAwMDEzNjA0NSAwMDAwMCBuIAowMDAwMTM2MjM5IDAwMDAwIG4gCjAwMDAxMzgwMDUgMDAwMDAgbiAKMDAwMDEzODAyNiAwMDAwMCBuIAowMDAwMTM4MjIwIDAwMDAwIG4gCjAwMDAxMzgyOTggMDAwMDAgbiAKMDAwMDEzODQzNCAwMDAwMCBuIAowMDAwMTM4NTcxIDAwMDAwIG4gCjAwMDAxMzg2NDkgMDAwMDAgbiAKMDAwMDEzODc4NiAwMDAwMCBuIAowMDAwMTM4OTI2IDAwMDAwIG4gCjAwMDAxMzkwMDQgMDAwMDAgbiAKMDAwMDEzOTE0MiAwMDAwMCBuIAowMDAwMTM5MjgyIDAwMDAwIG4gCjAwMDAxMzkzNjEgMDAwMDAgbiAKMDAwMDEzOTQ5OSAwMDAwMCBuIAowMDAwMTM5NjM5IDAwMDAwIG4gCjAwMDAxMzk3MTggMDAwMDAgbiAKMDAwMDEzOTg1NiAwMDAwMCBuIAowMDAwMTM5OTk2IDAwMDAwIG4gCjAwMDAxNDAwNzUgMDAwMDAgbiAKMDAwMDE0MDIxMyAwMDAwMCBuIAowMDAwMTQwMzUzIDAwMDAwIG4gCjAwMDAxNDA0MzIgMDAwMDAgbiAKMDAwMDE0MDU2OSAwMDAwMCBuIAowMDAwMTQwNzA5IDAwMDAwIG4gCjAwMDAxNDA3ODcgMDAwMDAgbiAKMDAwMDE0MDkyNSAwMDAwMCBuIAowMDAwMTQxMDY1IDAwMDAwIG4gCjAwMDAxNDExNDMgMDAwMDAgbiAKMDAwMDE0MTI4MSAwMDAwMCBuIAowMDAwMTQxNDIxIDAwMDAwIG4gCjAwMDAxNDE0OTkgMDAwMDAgbiAKMDAwMDE0MTYzNyAwMDAwMCBuIAowMDAwMTQxNzc3IDAwMDAwIG4gCjAwMDAxNDE4NTUgMDAwMDAgbiAKMDAwMDE0MTk5MyAwMDAwMCBuIAowMDAwMTQyMTMzIDAwMDAwIG4gCjAwMDAxNDIyMTEgMDAwMDAgbiAKMDAwMDE0MjM0OCAwMDAwMCBuIAowMDAwMTQyNDg4IDAwMDAwIG4gCjAwMDAxNDI1NjYgMDAwMDAgbiAKMDAwMDE0MjcwNCAwMDAwMCBuIAowMDAwMTQyODQ0IDAwMDAwIG4gCjAwMDAxNDI5MjIgMDAwMDAgbiAKMDAwMDE0MzA2MCAwMDAwMCBuIAowMDAwMTQzMjAwIDAwMDAwIG4gCjAwMDAxNDMyNzggMDAwMDAgbiAKMDAwMDE0MzQxNiAwMDAwMCBuIAowMDAwMTQzNTU2IDAwMDAwIG4gCjAwMDAxNDM2MzQgMDAwMDAgbiAKMDAwMDE0Mzc3MiAwMDAwMCBuIAowMDAwMTQzOTEzIDAwMDAwIG4gCjAwMDAxNDM5OTIgMDAwMDAgbiAKMDAwMDE0NDEzMCAwMDAwMCBuIAowMDAwMTQ0MjcyIDAwMDAwIG4gCjAwMDAxNDQzNTEgMDAwMDAgbiAKMDAwMDE0NDQ5MSAwMDAwMCBuIAowMDAwMTQ0NjMzIDAwMDAwIG4gCjAwMDAxNDQ3MTIgMDAwMDAgbiAKMDAwMDE0NDg1MiAwMDAwMCBuIAowMDAwMTQ0OTk0IDAwMDAwIG4gCjAwMDAxNDUwNzMgMDAwMDAgbiAKMDAwMDE0NTIxMiAwMDAwMCBuIAowMDAwMTQ1MzU0IDAwMDAwIG4gCjAwMDAxNDU0MzUgMDAwMDAgbiAKMDAwMDE0NTU3NSAwMDAwMCBuIAowMDAwMTQ1NzE3IDAwMDAwIG4gCjAwMDAxNDU3OTggMDAwMDAgbiAKMDAwMDE0NTkzOCAwMDAwMCBuIAowMDAwMTQ2MDgwIDAwMDAwIG4gCjAwMDAxNDYxNjEgMDAwMDAgbiAKMDAwMDE0NjMwMSAwMDAwMCBuIAowMDAwMTQ2NDQzIDAwMDAwIG4gCjAwMDAxNDY1MjQgMDAwMDAgbiAKMDAwMDE0NjY2MyAwMDAwMCBuIAowMDAwMTQ2ODA1IDAwMDAwIG4gCjAwMDAxNDY4ODYgMDAwMDAgbiAKMDAwMDE0NzAyNiAwMDAwMCBuIAowMDAwMTQ3MTY4IDAwMDAwIG4gCjAwMDAxNDcyNDkgMDAwMDAgbiAKMDAwMDE0NzM4OSAwMDAwMCBuIAowMDAwMTQ3NTMxIDAwMDAwIG4gCjAwMDAxNDc2MTIgMDAwMDAgbiAKMDAwMDE0Nzc1MiAwMDAwMCBuIAowMDAwMTQ3ODk0IDAwMDAwIG4gCjAwMDAxNDc5NzUgMDAwMDAgbiAKMDAwMDE0ODExNSAwMDAwMCBuIAowMDAwMTQ4MjU3IDAwMDAwIG4gCjAwMDAxNDgzMzggMDAwMDAgbiAKMDAwMDE0ODQ3OCAwMDAwMCBuIAowMDAwMTQ4NjIwIDAwMDAwIG4gCjAwMDAxNDg2OTkgMDAwMDAgbiAKMDAwMDE0ODgzOSAwMDAwMCBuIAowMDAwMTQ4OTgxIDAwMDAwIG4gCjAwMDAxNDkwNjEgMDAwMDAgbiAKMDAwMDE0OTIwMSAwMDAwMCBuIAowMDAwMTQ5MzQzIDAwMDAwIG4gCjAwMDAxNDk0MjQgMDAwMDAgbiAKMDAwMDE0OTU2NCAwMDAwMCBuIAowMDAwMTQ5NzA2IDAwMDAwIG4gCjAwMDAxNDk3ODUgMDAwMDAgbiAKMDAwMDE0OTkyNSAwMDAwMCBuIAowMDAwMTUwMDY3IDAwMDAwIG4gCjAwMDAxNTAxNDggMDAwMDAgbiAKMDAwMDE1MDI4OCAwMDAwMCBuIAowMDAwMTUwNDMwIDAwMDAwIG4gCjAwMDAxNTA1MTAgMDAwMDAgbiAKMDAwMDE1MDY1MCAwMDAwMCBuIAowMDAwMTUwNzkyIDAwMDAwIG4gCjAwMDAxNTA4NzMgMDAwMDAgbiAKMDAwMDE1MTAxMyAwMDAwMCBuIAowMDAwMTUxMTU1IDAwMDAwIG4gCjAwMDAxNTEyMzQgMDAwMDAgbiAKMDAwMDE1MTM3NCAwMDAwMCBuIAowMDAwMTUxNTE2IDAwMDAwIG4gCjAwMDAxNTE1OTUgMDAwMDAgbiAKMDAwMDE1MTczNSAwMDAwMCBuIAowMDAwMTUxODc3IDAwMDAwIG4gCjAwMDAxNTE5NTggMDAwMDAgbiAKMDAwMDE1MjA5NyAwMDAwMCBuIAowMDAwMTUyMjM5IDAwMDAwIG4gCjAwMDAxNTIzMjAgMDAwMDAgbiAKMDAwMDE1MjQ2MCAwMDAwMCBuIAowMDAwMTUyNjAyIDAwMDAwIG4gCjAwMDAxNTI2ODMgMDAwMDAgbiAKMDAwMDE1MjgyMyAwMDAwMCBuIAowMDAwMTUyOTY1IDAwMDAwIG4gCjAwMDAxNTMwNDYgMDAwMDAgbiAKMDAwMDE1MzE4NiAwMDAwMCBuIAowMDAwMTUzMzI4IDAwMDAwIG4gCjAwMDAxNTM0MDggMDAwMDAgbiAKMDAwMDE1MzU0OCAwMDAwMCBuIAowMDAwMTUzNjkwIDAwMDAwIG4gCjAwMDAxNTM3NzEgMDAwMDAgbiAKMDAwMDE1MzkxMCAwMDAwMCBuIAowMDAwMTU0MDUyIDAwMDAwIG4gCjAwMDAxNTQxMzMgMDAwMDAgbiAKMDAwMDE1NDI3MyAwMDAwMCBuIAowMDAwMTU0NDE1IDAwMDAwIG4gCjAwMDAxNTQ0OTQgMDAwMDAgbiAKMDAwMDE1NDYzNCAwMDAwMCBuIAowMDAwMTU0Nzc2IDAwMDAwIG4gCjAwMDAxNTQ4NTcgMDAwMDAgbiAKMDAwMDE1NDk5NyAwMDAwMCBuIAowMDAwMTU1MTM5IDAwMDAwIG4gCjAwMDAxNTUyMjAgMDAwMDAgbiAKMDAwMDE1NTM2MCAwMDAwMCBuIAowMDAwMTU1NTAyIDAwMDAwIG4gCjAwMDAxNTU1ODMgMDAwMDAgbiAKMDAwMDE1NTcyMyAwMDAwMCBuIAowMDAwMTU1ODY1IDAwMDAwIG4gCjAwMDAxNTU5NDYgMDAwMDAgbiAKMDAwMDE1NjA4NSAwMDAwMCBuIAowMDAwMTU2MjI2IDAwMDAwIG4gCjAwMDAxNTYzMDcgMDAwMDAgbiAKMDAwMDE1NjQ0NSAwMDAwMCBuIAowMDAwMTU2NTg1IDAwMDAwIG4gCjAwMDAxNzkyMzYgMDAwMDAgbiAKMDAwMDE3OTI1OSAwMDAwMCBuIAowMDAwMTgwMDY1IDAwMDAwIG4gCjAwMDAxODAyNzkgMDAwMDAgbiAKMDAwMDE4MTk0MiAwMDAwMCBuIAowMDAwMTgxOTY0IDAwMDAwIG4gCjAwMDAxODIxNjAgMDAwMDAgbiAKMDAwMDE4MzI5MSAwMDAwMCBuIAowMDAwMTgzMzEyIDAwMDAwIG4gCjAwMDAyMDkzMTEgMDAwMDAgbiAKMDAwMDIwOTMzNCAwMDAwMCBuIAowMDAwMjEwMzkwIDAwMDAwIG4gCjAwMDAyMTA0MTEgMDAwMDAgbiAKMDAwMDIzMTMyMSAwMDAwMCBuIAowMDAwMjMxMzQ0IDAwMDAwIG4gCjAwMDAyMzIwMDEgMDAwMDAgbiAKMDAwMDIzMjAyMiAwMDAwMCBuIAowMDAwMjgxNDg3IDAwMDAwIG4gCjAwMDAyODE1MTAgMDAwMDAgbiAKMDAwMDI4MjgwMyAwMDAwMCBuIAowMDAwMjgyODI1IDAwMDAwIG4gCjAwMDAyODMwMjEgMDAwMDAgbiAKMDAwMDI4NjYxMCAwMDAwMCBuIAowMDAwMjg2NjMyIDAwMDAwIG4gCjAwMDAyODY4MjggMDAwMDAgbiAKMDAwMDI4NzM3NyAwMDAwMCBuIAowMDAwMjg3Mzk4IDAwMDAwIG4gCjAwMDAzMDAxNDIgMDAwMDAgbiAKMDAwMDMwMDE2NSAwMDAwMCBuIAowMDAwMzAxNjY1IDAwMDAwIG4gCjAwMDAzMDE2ODcgMDAwMDAgbiAKMDAwMDM1MDM1MCAwMDAwMCBuIAowMDAwMzUwMzczIDAwMDAwIG4gCjAwMDAzNTIzODcgMDAwMDAgbiAKMDAwMDM1MjQwOSAwMDAwMCBuIAowMDAwMzUyNjA1IDAwMDAwIG4gCjAwMDAzNTI5NTcgMDAwMDAgbiAKMDAwMDM1Mjk3OCAwMDAwMCBuIAowMDAwMzYyMDIyIDAwMDAwIG4gCjAwMDAzNjIwNDQgMDAwMDAgbiAKMDAwMDM2MzU2MCAwMDAwMCBuIAowMDAwMzYzNTgyIDAwMDAwIG4gCjAwMDAzNjM3NzggMDAwMDAgbiAKMDAwMDM2NDA5MCAwMDAwMCBuIAowMDAwMzY0MTExIDAwMDAwIG4gCjAwMDAzNjk2ODcgMDAwMDAgbiAKMDAwMDM2OTcwOSAwMDAwMCBuIAowMDAwMzcwODQ2IDAwMDAwIG4gCjAwMDAzNzA4NjcgMDAwMDAgbiAKMDAwMDM5NDc0NyAwMDAwMCBuIAowMDAwMzk0NzcwIDAwMDAwIG4gCjAwMDAzOTU4ODIgMDAwMDAgbiAKMDAwMDM5NTkwNCAwMDAwMCBuIAowMDAwMzk2MTAwIDAwMDAwIG4gCjAwMDAzOTY5MzEgMDAwMDAgbiAKMDAwMDM5Njk1MiAwMDAwMCBuIAowMDAwNDExOTU4IDAwMDAwIG4gCjAwMDA0MTE5ODEgMDAwMDAgbiAKMDAwMDQxMjIzNiAwMDAwMCBuIAowMDAwNDEyMjU2IDAwMDAwIG4gCjAwMDA0MTQ3MTEgMDAwMDAgbiAKMDAwMDQxNDczMyAwMDAwMCBuIAowMDAwNDE1MDEzIDAwMDAwIG4gCjAwMDA0MTUwMzMgMDAwMDAgbiAKMDAwMDQyMDAzNyAwMDAwMCBuIAowMDAwNDIwMDU5IDAwMDAwIG4gCjAwMDA0MjEzNzQgMDAwMDAgbiAKMDAwMDQyMTM5NiAwMDAwMCBuIAowMDAwNDIxNTkyIDAwMDAwIG4gCjAwMDA0MjE4OTIgMDAwMDAgbiAKMDAwMDQyMTkxMiAwMDAwMCBuIAowMDAwNDI1NjAzIDAwMDAwIG4gCjAwMDA0MjU2MjUgMDAwMDAgbiAKMDAwMDQyNjQ3OSAwMDAwMCBuIAowMDAwNDI2NTAwIDAwMDAwIG4gCjAwMDA0NDIzODcgMDAwMDAgbiAKMDAwMDQ0MjQxMCAwMDAwMCBuIAowMDAwNDQzODUxIDAwMDAwIG4gCjAwMDA0NDM4NzMgMDAwMDAgbiAKMDAwMDQ0NDA2OSAwMDAwMCBuIAowMDAwNDQ0NzA4IDAwMDAwIG4gCjAwMDA0NDQ3MjkgMDAwMDAgbiAKMDAwMDQ2MzE1NCAwMDAwMCBuIAowMDAwNDYzMTc3IDAwMDAwIG4gCjAwMDA0NjQxODYgMDAwMDAgbiAKMDAwMDQ2NDIwNyAwMDAwMCBuIAowMDAwNDY0NDAzIDAwMDAwIG4gCjAwMDA0NjQ3MjUgMDAwMDAgbiAKMDAwMDQ2NDc0NiAwMDAwMCBuIAowMDAwNDY5MzcxIDAwMDAwIG4gCjAwMDA0NjkzOTMgMDAwMDAgbiAKMDAwMDQ3MTM4NyAwMDAwMCBuIAowMDAwNDcxNDA5IDAwMDAwIG4gCjAwMDA0NzE2MDUgMDAwMDAgbiAKMDAwMDQ3NDMxMCAwMDAwMCBuIAowMDAwNDc0MzMyIDAwMDAwIG4gCjAwMDA0NzQzNjkgMDAwMDAgbiAKMDAwMDQ4Mzk4NyAwMDAwMCBuIAowMDAwNDg0MDA5IDAwMDAwIG4gCjAwMDA0ODQzNjEgMDAwMDAgbiAKMDAwMDQ4NDM4MiAwMDAwMCBuIAowMDAwNDkxMzcwIDAwMDAwIG4gCjAwMDA0OTEzOTIgMDAwMDAgbiAKMDAwMDQ5MjIxOCAwMDAwMCBuIAowMDAwNDkyMjM5IDAwMDAwIG4gCjAwMDA0OTI0MzUgMDAwMDAgbiAKMDAwMDQ5Mjc3OCAwMDAwMCBuIAowMDAwNDkyNzk5IDAwMDAwIG4gCjAwMDA0OTc4MTkgMDAwMDAgbiAKMDAwMDQ5Nzg0MSAwMDAwMCBuIAowMDAwNDk4MTEwIDAwMDAwIG4gCjAwMDA0OTgxMzAgMDAwMDAgbiAKMDAwMDUwMjA0MiAwMDAwMCBuIAowMDAwNTAyMDY0IDAwMDAwIG4gCjAwMDA1MDIzMTcgMDAwMDAgbiAKMDAwMDUwMjMzNyAwMDAwMCBuIAowMDAwNTA0NDAwIDAwMDAwIG4gCjAwMDA1MDQ0MjIgMDAwMDAgbiAKMDAwMDUwNjI5NiAwMDAwMCBuIAowMDAwNTA2MzE4IDAwMDAwIG4gCjAwMDA1MDY1MTQgMDAwMDAgbiAKMDAwMDUwNjkzMiAwMDAwMCBuIAowMDAwNTA2OTUzIDAwMDAwIG4gCjAwMDA1MTcyOTYgMDAwMDAgbiAKMDAwMDUxNzMxOSAwMDAwMCBuIAowMDAwNTE3NTYyIDAwMDAwIG4gCjAwMDA1MTc1ODIgMDAwMDAgbiAKMDAwMDUxOTExMSAwMDAwMCBuIAowMDAwNTE5MTMzIDAwMDAwIG4gCjAwMDA1MjA4ODAgMDAwMDAgbiAKMDAwMDUyMDkwMiAwMDAwMCBuIAowMDAwNTIxMDk4IDAwMDAwIG4gCjAwMDA1MjE3MDAgMDAwMDAgbiAKMDAwMDUyMTcyMSAwMDAwMCBuIAowMDAwNTM2MzA2IDAwMDAwIG4gCjAwMDA1MzYzMjkgMDAwMDAgbiAKMDAwMDUzNjY2MiAwMDAwMCBuIAowMDAwNTM2NjgzIDAwMDAwIG4gCjAwMDA1NDUyMDEgMDAwMDAgbiAKMDAwMDU0NTIyMyAwMDAwMCBuIAowMDAwNTQ2NDMxIDAwMDAwIG4gCjAwMDA1NDY0NTMgMDAwMDAgbiAKMDAwMDU0NjY0OSAwMDAwMCBuIAowMDAwNTQ3MDMzIDAwMDAwIG4gCjAwMDA1NDcwNTQgMDAwMDAgbiAKMDAwMDU1MTc0NiAwMDAwMCBuIAowMDAwNTUxNzY4IDAwMDAwIG4gCjAwMDA1NTIxNTQgMDAwMDAgbiAKMDAwMDU1MjE3NSAwMDAwMCBuIAowMDAwNTU2OTE1IDAwMDAwIG4gCjAwMDA1NTY5MzcgMDAwMDAgbiAKMDAwMDU1NzM5MyAwMDAwMCBuIAowMDAwNTU3NDE0IDAwMDAwIG4gCjAwMDA1NjE3OTQgMDAwMDAgbiAKMDAwMDU2MTgxNiAwMDAwMCBuIAowMDAwNTY0MzgwIDAwMDAwIG4gCjAwMDA1NjQ0MDIgMDAwMDAgbiAKMDAwMDU2NDU5OCAwMDAwMCBuIAowMDAwNTY1MDcxIDAwMDAwIG4gCjAwMDA1NjUwOTIgMDAwMDAgbiAKMDAwMDU3NTMxMyAwMDAwMCBuIAowMDAwNTc1MzM1IDAwMDAwIG4gCjAwMDA1NzYwNjUgMDAwMDAgbiAKMDAwMDU3NjA4NiAwMDAwMCBuIAowMDAwNTk0MjIwIDAwMDAwIG4gCjAwMDA1OTQyNDMgMDAwMDAgbiAKMDAwMDU5NTM4NyAwMDAwMCBuIAowMDAwNTk1NDA5IDAwMDAwIG4gCjAwMDA1OTU2MDUgMDAwMDAgbiAKMDAwMDU5NjQ3MCAwMDAwMCBuIAowMDAwNTk2NDkxIDAwMDAwIG4gCjAwMDA2MjQxOTAgMDAwMDAgbiAKMDAwMDYyNDIxMyAwMDAwMCBuIAowMDAwNjI0NTYwIDAwMDAwIG4gCjAwMDA2MjQ1ODEgMDAwMDAgbiAKMDAwMDYzMDMzOSAwMDAwMCBuIAowMDAwNjMwMzYxIDAwMDAwIG4gCjAwMDA2MzE5ODkgMDAwMDAgbiAKMDAwMDYzMjAxMSAwMDAwMCBuIAowMDAwNjMyMjA3IDAwMDAwIG4gCjAwMDA2MzI0ODkgMDAwMDAgbiAKMDAwMDYzMjUwOSAwMDAwMCBuIAowMDAwNjM0ODMxIDAwMDAwIG4gCjAwMDA2MzQ4NTMgMDAwMDAgbiAKMDAwMDYzNTI1NCAwMDAwMCBuIAowMDAwNjM1Mjc1IDAwMDAwIG4gCjAwMDA2Mzk3ODggMDAwMDAgbiAKMDAwMDYzOTgxMCAwMDAwMCBuIAowMDAwNjQwMjYwIDAwMDAwIG4gCjAwMDA2NDAyODEgMDAwMDAgbiAKMDAwMDY0OTQ2NiAwMDAwMCBuIAowMDAwNjQ5NDg4IDAwMDAwIG4gCjAwMDA2NTA2MTEgMDAwMDAgbiAKMDAwMDY1MDYzMyAwMDAwMCBuIAowMDAwNjUwODI5IDAwMDAwIG4gCjAwMDA2NTQyMDYgMDAwMDAgbiAKMDAwMDY1NDIyOCAwMDAwMCBuIAowMDAwNjU0NzM3IDAwMDAwIG4gCjAwMDA2NTQ3NTggMDAwMDAgbiAKMDAwMDY2MTEyNyAwMDAwMCBuIAowMDAwNjYxMTQ5IDAwMDAwIG4gCjAwMDA2NjMxMTkgMDAwMDAgbiAKMDAwMDY2MzE0MSAwMDAwMCBuIAowMDAwNjYzMzM3IDAwMDAwIG4gCjAwMDA2NjQwMDEgMDAwMDAgbiAKMDAwMDY2NDAyMiAwMDAwMCBuIAowMDAwNjc2NTE2IDAwMDAwIG4gCjAwMDA2NzY1MzkgMDAwMDAgbiAKMDAwMDY3Njg2MiAwMDAwMCBuIAowMDAwNjc2ODgzIDAwMDAwIG4gCjAwMDA2ODIxODcgMDAwMDAgbiAKMDAwMDY4MjIwOSAwMDAwMCBuIAowMDAwNjg0MTY4IDAwMDAwIG4gCjAwMDA2ODQxOTAgMDAwMDAgbiAKMDAwMDY4NDM4NiAwMDAwMCBuIAowMDAwNjg1MTc5IDAwMDAwIG4gCjAwMDA2ODUyMDAgMDAwMDAgbiAKMDAwMDY4NTM5NiAwMDAwMCBuIAowMDAwNjg2MDMxIDAwMDAwIG4gCjAwMDA2ODYwNTIgMDAwMDAgbiAKMDAwMDcwMTQyNCAwMDAwMCBuIAowMDAwNzAxNDQ3IDAwMDAwIG4gCjAwMDA3MDIzOTAgMDAwMDAgbiAKMDAwMDcwMjQxMSAwMDAwMCBuIAowMDAwNzAyNjA3IDAwMDAwIG4gCjAwMDA3MDI5MzEgMDAwMDAgbiAKMDAwMDcwMjk1MiAwMDAwMCBuIAowMDAwNzA4ODU0IDAwMDAwIG4gCjAwMDA3MDg4NzYgMDAwMDAgbiAKMDAwMDcxMTI0MiAwMDAwMCBuIAowMDAwNzExMjY0IDAwMDAwIG4gCjAwMDA3MTE0NjAgMDAwMDAgbiAKMDAwMDcxNjQ4NiAwMDAwMCBuIAowMDAwNzE2NTA4IDAwMDAwIG4gCjAwMDA3MTc5NDUgMDAwMDAgbiAKMDAwMDcxNzk2NyAwMDAwMCBuIAowMDAwNzE4MTYzIDAwMDAwIG4gCjAwMDA3MTg5OTYgMDAwMDAgbiAKMDAwMDcxOTAxNyAwMDAwMCBuIAowMDAwNzE5MjEzIDAwMDAwIG4gCjAwMDA3MjA1NjcgMDAwMDAgbiAKMDAwMDcyMDU4OSAwMDAwMCBuIAowMDAwNzIwNzg1IDAwMDAwIG4gCjAwMDA3MjIxMDYgMDAwMDAgbiAKMDAwMDcyMjEyOCAwMDAwMCBuIAowMDAwNzIyMzI0IDAwMDAwIG4gCjAwMDA3MjM2ODIgMDAwMDAgbiAKMDAwMDcyMzcwNCAwMDAwMCBuIAowMDAwNzIzOTAwIDAwMDAwIG4gCjAwMDA3MjUyNTggMDAwMDAgbiAKMDAwMDcyNTI4MCAwMDAwMCBuIAowMDAwNzI1NDc2IDAwMDAwIG4gCjAwMDA3MjYyNDMgMDAwMDAgbiAKMDAwMDcyNjI2NCAwMDAwMCBuIAowMDAwNzI2NDYwIDAwMDAwIG4gCjAwMDA3MjgxNDEgMDAwMDAgbiAKMDAwMDcyODE2MyAwMDAwMCBuIAowMDAwNzI4MzU5IDAwMDAwIG4gCjAwMDA3MzA2MzUgMDAwMDAgbiAKMDAwMDczMDY1NyAwMDAwMCBuIAowMDAwNzMwODUzIDAwMDAwIG4gCjAwMDA3MzA5MzQgMDAwMDAgbiAKMDAwMDczMTA3NCAwMDAwMCBuIAowMDAwNzMxMjE2IDAwMDAwIG4gCjAwMDA3MzEyOTcgMDAwMDAgbiAKMDAwMDczMTQzNyAwMDAwMCBuIAowMDAwNzMxNTc5IDAwMDAwIG4gCjAwMDA3MzE2NTkgMDAwMDAgbiAKMDAwMDczMTc5OSAwMDAwMCBuIAowMDAwNzMxOTQxIDAwMDAwIG4gCjAwMDA3MzIwMjEgMDAwMDAgbiAKMDAwMDczMjE2MSAwMDAwMCBuIAowMDAwNzMyMzAzIDAwMDAwIG4gCjAwMDA3MzIzODMgMDAwMDAgbiAKMDAwMDczMjUyMyAwMDAwMCBuIAowMDAwNzMyNjY1IDAwMDAwIG4gCjAwMDA3MzI3NDUgMDAwMDAgbiAKMDAwMDczMjg4NSAwMDAwMCBuIAowMDAwNzMzMDI3IDAwMDAwIG4gCjAwMDA3MzMxMDcgMDAwMDAgbiAKMDAwMDczMzI0NyAwMDAwMCBuIAowMDAwNzMzMzg5IDAwMDAwIG4gCjAwMDA3MzM0NjkgMDAwMDAgbiAKMDAwMDczMzYwOSAwMDAwMCBuIAowMDAwNzMzNzUxIDAwMDAwIG4gCjAwMDA3MzM4MzEgMDAwMDAgbiAKMDAwMDczMzk3MCAwMDAwMCBuIAowMDAwNzM0MTEyIDAwMDAwIG4gCjAwMDA3MzQxOTIgMDAwMDAgbiAKMDAwMDczNDMzMiAwMDAwMCBuIAowMDAwNzM0NDc0IDAwMDAwIG4gCjAwMDA3MzQ1NTYgMDAwMDAgbiAKMDAwMDczNDY5NiAwMDAwMCBuIAowMDAwNzM0ODM4IDAwMDAwIG4gCjAwMDA3MzQ5MjAgMDAwMDAgbiAKMDAwMDczNTA2MCAwMDAwMCBuIAowMDAwNzM1MjAyIDAwMDAwIG4gCjAwMDA3MzUyODQgMDAwMDAgbiAKMDAwMDczNTQyNCAwMDAwMCBuIAowMDAwNzM1NTY2IDAwMDAwIG4gCjAwMDA3MzU2NDggMDAwMDAgbiAKMDAwMDczNTc4OCAwMDAwMCBuIAowMDAwNzM1OTMwIDAwMDAwIG4gCjAwMDA3MzYwMTIgMDAwMDAgbiAKMDAwMDczNjE1MiAwMDAwMCBuIAowMDAwNzM2Mjk0IDAwMDAwIG4gCjAwMDA3MzYzNzYgMDAwMDAgbiAKMDAwMDczNjUxNiAwMDAwMCBuIAowMDAwNzM2NjU4IDAwMDAwIG4gCjAwMDA3MzY3NDAgMDAwMDAgbiAKMDAwMDczNjg4MCAwMDAwMCBuIAowMDAwNzM3MDIyIDAwMDAwIG4gCjAwMDA3MzcxMDQgMDAwMDAgbiAKMDAwMDczNzI0NCAwMDAwMCBuIAowMDAwNzM3Mzg2IDAwMDAwIG4gCjAwMDA3Mzc0NjggMDAwMDAgbiAKMDAwMDczNzYwNyAwMDAwMCBuIAowMDAwNzM3NzQ5IDAwMDAwIG4gCjAwMDA3Mzc4MzEgMDAwMDAgbiAKMDAwMDczNzk3MSAwMDAwMCBuIAowMDAwNzM4MTEzIDAwMDAwIG4gCjAwMDA3MzgxOTQgMDAwMDAgbiAKMDAwMDczODMzNCAwMDAwMCBuIAowMDAwNzM4NDc2IDAwMDAwIG4gCjAwMDA3Mzg1NTYgMDAwMDAgbiAKMDAwMDczODY5NSAwMDAwMCBuIAowMDAwNzM4ODM3IDAwMDAwIG4gCjAwMDA3Mzg5MTcgMDAwMDAgbiAKMDAwMDczOTA1NiAwMDAwMCBuIAowMDAwNzM5MTk4IDAwMDAwIG4gCjAwMDA3MzkyNzggMDAwMDAgbiAKMDAwMDczOTQxNiAwMDAwMCBuIAowMDAwNzM5NTU4IDAwMDAwIG4gCjAwMDA3Mzk2MzggMDAwMDAgbiAKMDAwMDczOTc3NyAwMDAwMCBuIAowMDAwNzM5OTE5IDAwMDAwIG4gCjAwMDA3Mzk5OTkgMDAwMDAgbiAKMDAwMDc0MDEzOSAwMDAwMCBuIAowMDAwNzQwMjgxIDAwMDAwIG4gCjAwMDA3NDAzNjEgMDAwMDAgbiAKMDAwMDc0MDUwMCAwMDAwMCBuIAowMDAwNzQwNjQyIDAwMDAwIG4gCjAwMDA3NTQ3NjMgMDAwMDAgbiAKMDAwMDc1NDc4NiAwMDAwMCBuIAowMDAwNzU1MjM5IDAwMDAwIG4gCjAwMDA3NTU0NTMgMDAwMDAgbiAKMDAwMDc1Njk5MiAwMDAwMCBuIAowMDAwNzU3MDE0IDAwMDAwIG4gCjAwMDA3NTcyMTAgMDAwMDAgbiAKMDAwMDc1NzQ3NSAwMDAwMCBuIAowMDAwNzcyMTkxIDAwMDAwIG4gCjAwMDA3NzIxNjggMDAwMDAgbiAKMDAwMDc3MjI5MSAwMDAwMCBuIAowMDAwNzcyMzExIDAwMDAwIG4gCjAwMDA3NzI5NjIgMDAwMDAgbiAKMDAwMDc3MjQ3NiAwMDAwMCBuIAowMDAwNzczNTQyIDAwMDAwIG4gCjAwMDA3NzM1NjMgMDAwMDAgbiAKMDAwMDc3MzgyMyAwMDAwMCBuIAowMDAwNzkwMzI2IDAwMDAwIG4gCjAwMDA3OTAzMDMgMDAwMDAgbiAKMDAwMDc5MDQzMiAwMDAwMCBuIAowMDAwNzkwNDUyIDAwMDAwIG4gCjAwMDA3OTExNjQgMDAwMDAgbiAKMDAwMDc5MDYxMiAwMDAwMCBuIAowMDAwNzkxODIxIDAwMDAwIG4gCjAwMDA3OTE4NDIgMDAwMDAgbiAKMDAwMDc5MjExMCAwMDAwMCBuIAowMDAwODAxMzMyIDAwMDAwIG4gCjAwMDA4MDEzMTAgMDAwMDAgbiAKMDAwMDgwMTQzMCAwMDAwMCBuIAowMDAwODAxNDUwIDAwMDAwIG4gCjAwMDA4MDE5MzMgMDAwMDAgbiAKMDAwMDgwMTYxOCAwMDAwMCBuIAowMDAwODAyMzM0IDAwMDAwIG4gCjAwMDA4MDIzNTUgMDAwMDAgbiAKMDAwMDgwMjYxNyAwMDAwMCBuIAowMDAwODEyNzc2IDAwMDAwIG4gCjAwMDA4MTI3NTMgMDAwMDAgbiAKMDAwMDgxMjg3NCAwMDAwMCBuIAowMDAwODEyODk0IDAwMDAwIG4gCjAwMDA4MTM0NTMgMDAwMDAgbiAKMDAwMDgxMzA1OCAwMDAwMCBuIAowMDAwODEzOTQ4IDAwMDAwIG4gCjAwMDA4MTQzNzMgMDAwMDAgbiAKMDAwMDgxNjAwMiAwMDAwMCBuIAp0cmFpbGVyCjw8CiAgL1Jvb3QgNTkxIDAgUgogIC9JbmZvIDEgMCBSCiAgL0lEIFs8NUQ2RTc3MjVBODI3NEJFMkQyODdENDBGRUM1NUY3NzE+IDw1RDZFNzcyNUE4Mjc0QkUyRDI4N0Q0MEZFQzU1Rjc3MT5dCiAgL1NpemUgNTkzCj4+CnN0YXJ0eHJlZgo4MTYxNjQKJSVFT0YK