FAQ
1.2.9
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Improved multi database support (mysql,mssql,postgrsql,oracle,db2), added unit tests, added install intro, fixed html design problems and added insert on courser feature.
Fixed Bug 2682, SQL Error on MS SQL Server.
Fixed SQL bug, reserved word 'result'.
Fixed bug in SQL query.
Fixed bug in permissioncheck by attachment download.
Fixed utf8 bug in cattachment get function.
Fixed quicksearch bug #2010 / #2012.
Fixed sql insert bug.
First version for otrs framework 2.2.x.
A FAQ/knowledge base.
Eine FAQ-/Wissensdatenbank.
2.2.x
The FAQ/knowledge base will be found at the navigation bar and required "faq" group permissions to use it. To create new FAQ article you need to create categories and define the permission who can use categories.
Die FAQ/Knowledge Base ist in der Navigationsleiste zu finden. Es werden "faq" Gruppen-Rechte benötig um die FAQ benutzen zu können. Um FAQ Artikel erstellen zu können müssen zuerst Kategorien erstellt und die Berechtigungs-Gruppen dieser Kategorien definiert werden.
# add faq group
require Kernel::System::Group;
$Self->{GroupObject} = Kernel::System::Group->new(%{$Self});
$Self->{GroupObject}->GroupAdd(
Name => 'faq',
Comment => 'faq database users',
ValidID => 1,
UserID => 1,
);
$Self->{GroupObject}->GroupAdd(
Name => 'faq_admin',
Comment => 'faq admin users',
ValidID => 1,
UserID => 1,
);
2008-03-19 13:01:40
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogRkFRLnhtbCx2IDEuOCAyMDA4LzAzLzE4IDIzOjUzOjQxIG1hcnRpbiBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Tm90ZVR5cGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U3BlY2lmeSB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMsIHRoYXQgeW91IHdhbnQgdG8gdXNlIGluIHlvdXIgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGv2bm5lbiBkaWUgdmVyc2NoaWVkZW5lbiBOb3Rpei1UeXBlbiBmZXN0Z2VsZWd0IHdlcmRlbiwgZGllIGlubmVyaGFsYiBkZXMgU3lzdGVtcyB2ZXJ3ZW5kZXQgd2VyZGVuIHNvbGxlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld05vdGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1pbnRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1leHRlcm5hbCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1yZXBvcnQiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeU5hbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IGNhdGVnb3J5IG5hbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlJvb3QgS2F0ZWdvcmllIE5hbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RGVmYXVsdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+RkFRPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlDb21tZW50IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBjYXRlZ29yeSBuYW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Sb290IEthdGVnb3JpZSBOYW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkRlZmF1bHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPmRlZmF1bHQgY29tbWVudDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJhdGVzIGZvciB2b3RpbmcuIEtleSBtdXN0IGJlIGluIHByb2NlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkdld2ljaHR1bmcgZvxyIGRpZSBCZXdlcnR1bmcuIERlciBLZXkgbXVzcyBpbiBQcm96ZW50IGFuZ2VnZWJlbiB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SXRlbTo6Vm90aW5nPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwMCI+MTAwICU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ijc1Ij43NSAlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1MCI+NTAgJTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjUiPjI1ICU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPjAgJTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6Vm90aW5nOjpTaG93IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB2b3RpbmcgaW4gZGVmaW5lZCBpbnRlcmZhY2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JbnRlcmZhY2VzIGluIGRlbmVuIGRhcyBWb3RpbmcgRmVhdHVyZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SXRlbTo6Vm90aW5nPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImludGVybmFsIj5pbnRlcm5hbCAoYWdlbnQpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJleHRlcm5hbCI+ZXh0ZXJuYWwgKGN1c3RvbWVyKTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6Vm90aW5nOjpRdWVzdGlvbkxhbmdLZXkiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5MYW5ndWFnZWtleSB3aGljaCBpcyBkZWZpbmVkIGluIHRoZSBsYW5ndWFnZSBmaWxlICpfRkFRLnBtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MYW5ndWFnZUtleSBm/HIgZGllIEZyYWdlIGJlaSBkZXIgQXJ0aWtlbGJld2VydHVuZy4gV2lyZCBpbiBkZW4gU3ByYWNoZmlsZXMgZGVmaW5pZXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW06OlZvdGluZzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+QXJ0aWNsZVZvdGluZ1F1ZXN0aW9uPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6UGF0aDo6U2hvdyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgRkFRIHBhdGggeWVzL25vLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5GQVEgUGZhZCBhbnplaWdlbiBqYS9uZWluLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6SXRlbUxpc3Q6OlZvdGluZ1Jlc3VsdERlY2ltYWxQbGFjZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWNpbWFsIHBsYWNlcyBvZiB0aGUgdm90aW5nIHJlc3VsdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGV6aW1hbHN0ZWxsZW4gZGVzIEVyZ2VibmlzZXMgYmVpIGRlciBBcnRpa2VsYmV3ZXJ0dW5nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz4yPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6SXRlbUxpc3Q6OlZvdGluZ1Jlc3VsdENvbG9ycyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNTUyBjb2xvciBmb3IgdGhlIHZvdGluZyByZXN1bHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZhcmJlbiBm/HIgZGllIEFuemVpZ2UgZGVzIEVyZ2VibmlzZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzAiPnJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNzAiPm9yYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAwIj5ncmVlbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZBUSBwYXRoIHNlcGVyYXRvci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+VHJlbm56ZWljaGVuIGltIEZBUSBQZmFkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz67PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpDYXRlZ29yeTo6SWNvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNhdGVnb3J5IGljb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkthdGVnb3JpZSBJY29uIGluIGRlciBGQVEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6Q2F0ZWdvcnk8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPmZhcS1jYXRlZ29yeS1zbWFsbC5wbmc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06Okljb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JdGVtIGljb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFydGlrZWwgSWNvbiBpbiBkZXIgRkFRLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPmZhcS1pdGVtLXNtYWxsLnBuZzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6OlF1aWNrU2VhcmNoOjpTaG93IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SW50ZXJmYWNlcyB3aGVyZSB0aGUgcXVpY2tzZWFyY2ggc2hvdWxkIGJlIHNob3duLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JbnRlcmZhY2VzIGluIGRlbmVuIGRhcyBRdWlja1NlYXJjaCBGZWF0dXJlIGFuZ2V6ZWlndCB3aXJkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImludGVybmFsIj5pbnRlcm5hbCAoYWdlbnQpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJleHRlcm5hbCI+ZXh0ZXJuYWwgKGN1c3RvbWVyKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icHVibGljIj5wdWJsaWMgKHB1YmxpYyk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpRdWlja1NlYXJjaDo6U2hvd1N1YkNhdGVnb3J5SXRlbXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IGl0ZW1zIG9mIHN1YmNhdGVnb3JpZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFydGlrZWwgYXVzIFN1YmthdGVnb3JpZW4gYW56ZWlnZW4gamEvbmVpbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OlNob3ciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IGxhc3QgY2hhbmdlIGl0ZW1zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JbnRlcmZhY2VzIGluIGRlbmVuIGRhcyBMYXN0Q2hhbmdlIEZlYXR1cmUgYW5nZXplaWd0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImludGVybmFsIj5pbnRlcm5hbCAoYWdlbnQpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJleHRlcm5hbCI+ZXh0ZXJuYWwgKGN1c3RvbWVyKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icHVibGljIj5wdWJsaWMgKHB1YmxpYyk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpTaG93U3ViQ2F0ZWdvcnlJdGVtcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgaXRlbXMgb2Ygc3ViY2F0ZWdvcmllcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXJ0aWtlbCBhdXMgU3Via2F0ZWdvcmllbiBhbnplaWdlbiBqYS9uZWluLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6TGltaXQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5OdW1iZXIgb2Ygc2hvd24gaXRlbXMgaW4gbGFzdCBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbnphaGwgZGVyIHp1IGFuemVpZ2VuZGVuIEFydGlrZWwgaW4gbGV0enRlbiDEbmRlcnVuZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz4zPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6U2hvdyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk51bWJlciBvZiBzaG93biBpdGVtcyBpbiBsYXN0IGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkludGVyZmFjZXMgaW4gZGVuZW4gZGFzIExhc3RDcmVhdGUgRmVhdHVyZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaW50ZXJuYWwiPmludGVybmFsIChhZ2VudCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImV4dGVybmFsIj5leHRlcm5hbCAoY3VzdG9tZXIpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJwdWJsaWMiPnB1YmxpYyAocHVibGljKTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6Okxhc3RDcmVhdGU6OlNob3dTdWJDYXRlZ29yeUl0ZW1zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBpdGVtcyBvZiBzdWJjYXRlZ29yaWVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BcnRpa2VsIGF1cyBTdWJrYXRlZ29yaWVuIGFuemVpZ2VuIGphL25laW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpMaW1pdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIGl0ZW1zIGluIGxhc3QgY3JlYXRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QW56YWhsIGRlciB6dSBhbnplaWdlbmRlbiBBcnRpa2VsIGluIHp1bGV0enQgZXJzdGVsbHRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz4zPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpGQVFIb29rIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBob29rIGZvciBGQVEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkIEJlemVpY2huZXIgZvxyIGVpbmUgRkFRLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPkZBUSM8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkRlZmF1bHQ6OlN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzdGF0ZSBmb3IgRkFRIGVudHJ5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBTdGF0dXMgZWluZXMgIEZBUS1FaW50cmFncy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5pbnRlcm5hbCAoYWdlbnQpPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpJdGVtOjpGaWVsZDEiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIEZBUSBpdGVtIGZyZWUgdGV4dCBmaWVsZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgZnJlaWVuIFRleHRmZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTaG93Ij5wdWJsaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhcHRpb24iPlN5bXB0b208L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjEwMDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+cHVibGljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXB0aW9uIj5Qcm9ibGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj4yMDA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OkZpZWxkMyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgRkFRIGl0ZW0gZnJlZSB0ZXh0IGZpZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBmcmVpZW4gVGV4dGZlbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNob3ciPnB1YmxpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FwdGlvbiI+U29sdXRpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjMwMDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQ0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXB0aW9uIj5GaWVsZDQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjQwMDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQ1IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXB0aW9uIj5GaWVsZDU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjUwMDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQ2IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+aW50ZXJuYWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhcHRpb24iPkNvbW1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjYwMDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3QjIyNGQVEiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5MaW5rIG9iamVjdCBzZXR0aW5ncyBmb3IgRkFRLiBPYmplY3RzIHRoYXQgYXJlIGtub3duIGJ5IHRoZSBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxpbmsgT2JqZWt0IEVpbnN0ZWxsdW5nZW4gZvxyIGRpZSBGQVEuIE9iamVrdGUsIGRpZSBkZW0gU3lzdGVtIGJla2FubnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkZBUSBPYmplY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk9iamVjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09iamVjdHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudEZBUSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBGQVEgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGb8ciBkYXMgRkFRLU9iamVrdCBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+ZmFxPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxHcm91cFJvPmZhcTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5GQVEtQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5GQVE8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+RkFRPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwUm8+ZmFxPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5GQVEtQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkZBUTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+aGVscC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZBUSZhbXA7TmF2PU5vcm1hbDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+cTwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjgzMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwUm8+ZmFxPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5FeHBsb3JlcjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RXhwbG9yZXI8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmxpc3QucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRGQVEmYW1wO1N1YmFjdGlvbj1FeHBsb3JlcjwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5GQVE8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PmU8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwPmZhcTwvR3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk5ldyBBcnRpY2xlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5OZXcgQXJ0aWNsZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bmV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50RkFRJmFtcDtTdWJhY3Rpb249QWRkPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXBSbz5mYXE8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkZBUS1TZWFyY2g8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNlYXJjaDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+c2VhcmNoLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50RkFRJmFtcDtTdWJhY3Rpb249U2VhcmNoPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+czwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXBSbz5mYXE8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkhpc3Rvcnk8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkhpc3Rvcnk8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmhpc3RvcnkucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRGQVEmYW1wO1N1YmFjdGlvbj1TeXN0ZW1IaXN0b3J5PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+ZmFxX2FkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TGFuZ3VhZ2U8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkxhbmd1YWdlPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5sYW5ndWFnZS5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZBUSZhbXA7U3ViYWN0aW9uPUxhbmd1YWdlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+dTwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+ZmFxX2FkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q2F0ZWdvcnk8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNhdGVnb3J5PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5jYXRlZ29yeS5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZBUSZhbXA7U3ViYWN0aW9uPUNhdGVnb3J5PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+YzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkyMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI0N1c3RvbWVyRkFRIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEN1c3RvbWVyRkFRIG9iamVjdCBpbiB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBm/HIgZGFzIEN1c3RvbWVyRkFRLU9iamVrdCBpbSBDdXN0b21lci1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q3VzdG9tZXIgZmFxPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkZBUTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT48L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RkFRLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkZBUS1BcmVhPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5oZWxwLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUN1c3RvbWVyRkFRPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+ZjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlB1YmxpY0Zyb250ZW5kOjpDb21tb25QYXJhbSMjI0FjdGlvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgdmFsdWUgZm9yIHRoZSBBY3Rpb24gcGFyYW1ldGVyIGZvciB0aGUgcHVibGljIGZyb250ZW5kLiBUaGUgQWN0aW9uIHBhcmFtZXRlciBpcyB1c2VkIGluIHRoZSBzY3JpcHRzIG9mIHRoZSBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkd2VydCBkZXMgQWN0aW9uLVBhcmFtZXRlcnMgZvxyIGRlbiD2ZmZlbnRsaWNoZW4gRkFRLUJlcmVpY2guIERlciBBY3Rpb24tUGFyYW1ldGVyIHdpcmQgdm9uIGRlbiBTa3JpcHRlbiBkZXMgU3lzdGVtcyBiZW51dHp0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPlB1YmxpY0ZBUTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlB1YmxpY0Zyb250ZW5kOjpNb2R1bGUjIyNQdWJsaWNGQVEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgUHVibGljRkFRIG9iamVjdCBpbiB0aGUgcHVibGljIEZBUSBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBm/HIgZGFzIFB1YmxpY0ZBUS1PYmpla3QgaW0g9mZmZW50bGljaGVuIEZBUS1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5DdXN0b21lciBmYXE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+RkFRPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5GQVEtQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RkFRLUFyZWE8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmhlbHAucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249Q3VzdG9tZXJGQVE8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+PC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5mPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpJdGVtOjpIVE1MIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBGQVEgQXJ0aWNsZSB3aXRoIEhUTUwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhUTUwgRGFyc3RlbGx1bmcgZGVyIEZBUSBBcnRpa2VsIGVpbnNjaGFsdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9GQVEucG0gLSBwcm92aWRlcyBkZSBsYW5ndWFnZSB0cmFuc2xhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfRkFRLnBtLHYgMS4zIDIwMDgvMDMvMTkgMTA6NTU6NDMgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9GQVE7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkVHJhbnNsYXRpb24gPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRUcmFuc2xhdGlvbiBuZSAnSEFTSCc7CgogICAgIyAkJFNUQVJUJCQKCiAgICAjIG93biB0cmFuc2xhdGlvbnMKICAgICRUcmFuc2xhdGlvbi0+eydZb3UgaGF2ZSBhbHJlYWR5IHZvdGVkISd9ID0gJ1NpZSBoYWJlbiBiZXJlaXRzIGJld2VydGV0ISc7CiAgICAkVHJhbnNsYXRpb24tPnsnTm8gcmF0ZSBzZWxlY3RlZCEnfSA9ICdLZWluZSBCZXdlcnR1bmcgYXVzd+RobHQhJzsKICAgICRUcmFuc2xhdGlvbi0+eydUaGFua3MgZm9yIHZvdGUhJ30gPSAnRGFua2UgZvxyIElocmUgQmV3ZXJ0dW5nZW4hJzsKICAgICRUcmFuc2xhdGlvbi0+e1ZvdGVzfSA9ICdCZXdlcnR1bmdlbic7CiAgICAkVHJhbnNsYXRpb24tPntMYXRlc3RDaGFuZ2VkSXRlbXN9ID0gJ3p1bGV0enQgZ2XkbmRlcnRlIEFydGlrZWwnOwogICAgJFRyYW5zbGF0aW9uLT57TGF0ZXN0Q3JlYXRlZEl0ZW1zfSA9ICd6dWxldHp0IGVyc3RlbGx0ZSBBcnRpa2VsJzsKICAgICRUcmFuc2xhdGlvbi0+e0FydGljbGVWb3RpbmdRdWVzdGlvbn0gPSAnV2llIGd1dCB3dXJkZSBtaXQgZGllc2VtIEFydGlrZWwgSWhyZSBGcmFnZSBiZWFudHdvcnRldD8nOwogICAgJFRyYW5zbGF0aW9uLT57U3ViQ2F0ZWdvcnlPZn0gPSAnVW50ZXJrYXRlZ29yaWUgdm9uJzsKICAgICRUcmFuc2xhdGlvbi0+e1F1aWNrU2VhcmNofSA9ICdTY2huZWxsc3VjaGUnOwogICAgJFRyYW5zbGF0aW9uLT57RGV0YWlsU2VhcmNofSA9ICdEZXRhaWxzdWNoZSc7CiAgICAkVHJhbnNsYXRpb24tPntDYXRlZ29yaWVzfSA9ICdLYXRlZ29yaWVuJzsKICAgICRUcmFuc2xhdGlvbi0+e1N1YkNhdGVnb3JpZXN9ID0gJ1N1YmthdGVnb3JpZW4nOwogICAgJFRyYW5zbGF0aW9uLT57J0EgY2F0ZWdvcnkgc2hvdWxkIGhhdmUgYSBuYW1lISd9ID0gJ0VpbmUgS2F0ZWdvcmllbiBzb2xsdGUgZWluZW4gTmFtZW4gaGFiZW4hJzsKICAgICRUcmFuc2xhdGlvbi0+eydBIGNhdGVnb3J5IHNob3VsZCBoYXZlIGEgY29tbWVudCEnfSA9ICdFaW5lIEthdGVnb3JpZW4gc29sbHRlIGVpbmVuIEtvbW1lbnRhciBoYWJlbiEnOwoKICAgICMgJCRTVE9QJCQKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lbl9GQVEucG0gLSBwcm92aWRlcyBlbiBsYW5ndWFnZSB0cmFuc2xhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZW5fRkFRLnBtLHYgMS4zIDIwMDgvMDMvMTkgMTA6NTU6NDMgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjplbl9GQVE7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkVHJhbnNsYXRpb24gPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRUcmFuc2xhdGlvbiBuZSAnSEFTSCc7CgogICAgIyAkJFNUQVJUJCQKCiAgICAjIG93biB0cmFuc2xhdGlvbnMKICAgICRUcmFuc2xhdGlvbi0+e1ZvdGVzfSA9ICdWb3Rlcyc7CiAgICAkVHJhbnNsYXRpb24tPntMYXRlc3RDaGFuZ2VkSXRlbXN9ID0gJ2xhdGVzdCBjaGFuZ2VkIGFydGljbGUnOwogICAgJFRyYW5zbGF0aW9uLT57TGF0ZXN0Q3JlYXRlZEl0ZW1zfSA9ICdsYXRlc3QgY3JlYXRlZCBhcnRpY2xlJzsKICAgICRUcmFuc2xhdGlvbi0+e0FydGljbGVWb3RpbmdRdWVzdGlvbn0gPSAnRGlkIHRoaXMgYXJ0aWNsZSBoZWxwPyc7CiAgICAkVHJhbnNsYXRpb24tPntRdWlja1NlYXJjaH0gPSAnUXVpY2sgU2VhcmNoJzsKICAgICRUcmFuc2xhdGlvbi0+e0RldGFpbFNlYXJjaH0gPSAnRGV0YWlsIFNlYXJjaCc7CiAgICAkVHJhbnNsYXRpb24tPnsnWW91IGhhdmUgYWxyZWFkeSB2b3RlZCEnfSA9ICdZb3UgaGF2ZSBhbHJlYWR5IHZvdGUhJzsKICAgICRUcmFuc2xhdGlvbi0+eydObyByYXRlIHNlbGVjdGVkISd9ID0gJ05vIHJhdGUgc2VsZWN0ZWQhJzsKICAgICRUcmFuc2xhdGlvbi0+eydUaGFua3MgZm9yIHZvdGUhJ30gPSAnVGhhbmtzIGZvciB2b3RlISc7CiAgICAkVHJhbnNsYXRpb24tPntDYXRlZ29yaWVzfSA9ICdDYXRlZ29yaWVzJzsKICAgICRUcmFuc2xhdGlvbi0+e1N1YkNhdGVnb3JpZXN9ID0gJ1N1YmNhdGVnb3JpZXMnOwoKICAgICMgJCRTVE9QJCQKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0ZBUS5wbSAtIGZhcSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZBUS5wbSx2IDEuMTIgMjAwOC8wMy8xOSAxMDo1Mjo1MCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkZBUTsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEyICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBPcGplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCBVc2VyT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIikgaWYgKCEkU2VsZi0+eyRffSk7CiAgICB9CgogICAgIyBmYXEgb2JqZWN0CiAgICAkU2VsZi0+e0ZBUU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RkFRLT5uZXcoJVBhcmFtKTsKICAgICMgbGluayBvYmplY3QKICAgICRTZWxmLT57TGlua09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiAgICAjIGFnZW50IHVzZXIKICAgICRTZWxmLT57QWdlbnRVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoJVBhcmFtKTsKCiAgICAjIGludGVyZmFjZSBzZXR0aW5ncwoKICAgICRTZWxmLT57SW50ZXJmYWNlfSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlR2V0KAogICAgICAgIE5hbWUgPT4gJ3B1YmxpYycKICAgICk7CiAgICAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgPT4gWydwdWJsaWMnXQogICAgKTsKCiAgICAjIGdsb2JhbCBvdXRwdXQgdmFycwogICAgJFNlbGYtPntOb3RpZnl9ID0gW107CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgaWYoJFNlbGYtPntTZXNzaW9uT2JqZWN0fSkgewogICAgICAgIGlmKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRXhwbG9yZXInKSB7CiAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgICAgICBLZXkgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0RXhwbG9yZXIgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgPSBxdyhPcmRlciBTb3J0KTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0NhdGVnb3J5SUQnKSB8fCAwOwogICAgJEdldFBhcmFte09yZGVyfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnT3JkZXInKSB8fCAnVGl0bGUnOwogICAgJEdldFBhcmFte1NvcnR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdTb3J0JykgfHwgJ3VwJzsKICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICBpZighJEdldFBhcmFteyRffSAmJiAhKCRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfIik7CiAgICAgICAgfQogICAgfQogICAgIyBzdG9yZSBiYWNrIGxpbmsKICAgIGlmKCRTZWxmLT57U2Vzc2lvbk9iamVjdH0pIHsKICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgZGIgYWN0aW9uCiAgICBteSAlQ2F0ZWdvcnlEYXRhID0gKCk7CiAgICBpZigkR2V0UGFyYW17Q2F0ZWdvcnlJRH0pIHsKICAgICAgICAlQ2F0ZWdvcnlEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUdldChDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICAgICAgaWYgKCElQ2F0ZWdvcnlEYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQogICAgIyBkdGwgYmxvY2sKICAgICRGcm9udGVuZHtMYXN0U2NyZWVuT3ZlcnZpZXd9ID0gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9OwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdFeHBsb3JlcicsCiAgICAgICAgRGF0YSA9PiB7ICVDYXRlZ29yeURhdGEsICVGcm9udGVuZCB9LAogICAgKTsKICAgICMgRkFRIHBhdGgKICAgICRTZWxmLT5fR2V0RkFRUGF0aCgKICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICk7CiAgICAjIGV4cGxvcmVyIHRpdGxlCiAgICBpZigkR2V0UGFyYW17Q2F0ZWdvcnlJRH0pIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlclRpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdOYW1lJyA9PiAkQ2F0ZWdvcnlEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudCcgPT4gJENhdGVnb3J5RGF0YXtDb21tZW50fQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ05hbWUnID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeU5hbWUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQnID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeUNvbW1lbnQnKQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgZXhwbG9yZXIgY2F0ZWdvcnkgbGlzdAogICAgaWYgKCEkUGFyYW17TW9kZX0pIHsKICAgICAgICAkUGFyYW17TW9kZX0gPSAnUHVibGljJzsKICAgIH0KICAgIGlmICghZGVmaW5lZCgkUGFyYW17Q3VzdG9tZXJVc2VyfSkpIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyfSA9ICcnOwogICAgfQogICAgaWYgKCRQYXJhbXtNb2RlfSAmJiAkUGFyYW17TW9kZX0gZXEgJ0N1c3RvbWVyJykgewogICAgICAgICRTZWxmLT5fR2V0RXhwbG9yZXJDYXRlZ29yeUxpc3QoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBPcmRlciA9PiAnTmFtZScsCiAgICAgICAgICAgIFNvcnQgPT4gJ3VwJywKICAgICAgICAgICAgTW9kZSA9PiAkUGFyYW17TW9kZX0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3JlckNhdGVnb3J5TGlzdCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIE9yZGVyID0+ICdOYW1lJywKICAgICAgICAgICAgU29ydCA9PiAndXAnLAogICAgICAgICAgICBNb2RlID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICApOwogICAgfQogICAgIyBleHBsb3JlciBpdGVtIGxpc3QKICAgICRTZWxmLT5fR2V0RXhwbG9yZXJJdGVtTGlzdCgKICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICBPcmRlciA9PiAkR2V0UGFyYW17T3JkZXJ9IHx8ICdUaXRsZScsCiAgICAgICAgU29ydCA9PiAkR2V0UGFyYW17U29ydH0gfHwgJ3VwJwogICAgKTsKICAgICMgcXVpY2tzZWFyY2gKICAgIG15ICVTaG93UXVpY2tTZWFyY2ggPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpRdWlja1NlYXJjaDo6U2hvdycpfTsKICAgIGlmIChleGlzdHMoJFNob3dRdWlja1NlYXJjaHskU2VsZi0+e0ludGVyZmFjZX17TmFtZX19KSkgewogICAgICAgICRTZWxmLT5fR2V0RXhwbG9yZXJRdWlja1NlYXJjaCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgbGF0ZXN0IGNoYW5nZSBmYXEgaXRlbXMKICAgIG15ICVTaG93TGFzdENoYW5nZSA9ICV7JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OlNob3cnKX07CiAgICBpZiAoZXhpc3RzKCRTaG93TGFzdENoYW5nZXskU2VsZi0+e0ludGVyZmFjZX17TmFtZX19KSkgewogICAgICAgICRTZWxmLT5fR2V0RXhwbG9yZXJMYXN0Q2hhbmdlSXRlbXMoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBNb2RlID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICk7CiAgICB9CiAgICAjIGxhdGVzdCBjcmVhdGUgZmFxIGl0ZW1zCiAgICBteSAlU2hvd0xhc3RDcmVhdGUgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpTaG93Jyl9OwogICAgaWYgKGV4aXN0cygkU2hvd0xhc3RDcmVhdGV7JFNlbGYtPntJbnRlcmZhY2V9e05hbWV9fSkpIHsKICAgICAgICAkU2VsZi0+X0dldEV4cGxvcmVyTGFzdENyZWF0ZUl0ZW1zKAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgTW9kZSA9PiAkUGFyYW17TW9kZX0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICApOwogICAgfQp9CgpzdWIgX0dldEZBUVBhdGggewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRkFRUGF0aENhdGVnb3J5RWxlbWVudCcsCiAgICAgICAgRGF0YSA9PiB7ICdOYW1lJyA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlOYW1lJyksCiAgICAgICAgICAgICdDYXRlZ29yeUlEJyA9PiAnMCcKICAgICAgICB9LAogICAgKTsKCiAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6UGF0aDo6U2hvdycpKSB7CiAgICAgICAgbXkgQENhdGVnb3J5TGlzdCA9IEB7JFNlbGYtPntGQVFPYmplY3R9LT5GQVFQYXRoTGlzdEdldChDYXRlZ29yeUlEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSl9OwogICAgICAgIGZvcmVhY2ggbXkgJERhdGEgKEBDYXRlZ29yeUxpc3QpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVBhdGhDYXRlZ29yeUVsZW1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICV7JERhdGF9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN1YiBfR2V0RXhwbG9yZXJDYXRlZ29yeUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvcmVhY2ggKHF3KE9yZGVyIFNvcnQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgIH0KICAgIH0KICAgIG15IEBDYXRlZ29yeUlEcyA9ICgpOwogICAgaWYgKCRQYXJhbXtNb2RlfSAmJiAkUGFyYW17TW9kZX0gZXEgJ0FnZW50JykgewogICAgICAgIEBDYXRlZ29yeUlEcyA9IEB7JFNlbGYtPntGQVFPYmplY3R9LT5BZ2VudENhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKX07CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInKSB7CiAgICAgICAgQENhdGVnb3J5SURzID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkN1c3RvbWVyQ2F0ZWdvcnlTZWFyY2goCiAgICAgICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICl9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQENhdGVnb3J5SURzID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPlB1YmxpY0NhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgKX07CiAgICB9CgogICAgaWYoQENhdGVnb3J5SURzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJDYXRlZ29yeUxpc3QnLAogICAgICAgICk7CiAgICAgICAgZm9yZWFjaCAoQENhdGVnb3J5SURzKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUdldChDYXRlZ29yeUlEID0+ICRfKTsKICAgICAgICAgICAgJERhdGF7Q2F0ZWdvcnlOdW1iZXJ9ID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUNvdW50KAogICAgICAgICAgICAgICAgUGFyZW50SURzID0+IFskX10KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJERhdGF7QXJ0aWNsZU51bWJlcn0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUNvdW50KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gWyRfXSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNzcyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGlmKCRGcm9udGVuZHtDc3NSb3d9IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnc2VhcmNoYWN0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckNhdGVnb3J5Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgX0dldEV4cGxvcmVySXRlbUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvcmVhY2ggKHF3KE9yZGVyIFNvcnQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ3NzUm93ID0gJyc7CiAgICBteSBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgIENhdGVnb3J5SURzID0+IFskUGFyYW17Q2F0ZWdvcnlJRH1dLAogICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgT3JkZXIgPT4gJFBhcmFte09yZGVyfSwKICAgICAgICBTb3J0ID0+ICRQYXJhbXtTb3J0fSwKICAgICAgICBMaW1pdCA9PiAzMDAsCiAgICApOwoKICAgIGlmIChASXRlbUlEcykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyRkFRSXRlbUxpc3QnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19CiAgICAgICAgKTsKICAgICAgICBmb3JlYWNoIChASXRlbUlEcykgewogICAgICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJF8pOwoKICAgICAgICAgICAgIyBjc3MgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZigkQ3NzUm93IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICRDc3NSb3c7CiAgICAgICAgICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKFJhdGUgPT4gJERhdGF7UmVzdWx0fSkuJzsnOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyRkFRSXRlbVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9HZXRFeHBsb3Jlckxhc3RDaGFuZ2VJdGVtcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6U2hvdycpKSB7CiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgICAgIGZvcmVhY2ggKHF3KENhdGVnb3J5SUQpKSB7CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17JF99KSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgQEl0ZW1JRHMgPSAoKTsKICAgICAgICBpZihkZWZpbmVkKCRQYXJhbXtDYXRlZ29yeUlEfSkpIHsKICAgICAgICAgICAgIyBhZGQgY3VycmVudCBjYXRlZ29yeWlkCiAgICAgICAgICAgIG15IEBDYXRlZ29yeUlEcyA9ICgpOwogICAgICAgICAgICBpZigkUGFyYW17Q2F0ZWdvcnlJRH0pIHsKICAgICAgICAgICAgICAgIHB1c2goQENhdGVnb3J5SURzLCAoJFBhcmFte0NhdGVnb3J5SUR9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXtNb2RlfSkpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtNb2RlfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17Q3VzdG9tZXJVc2VyfSkpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJ9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBhZGQgc3ViY2F0ZWdvcnlpZHMKICAgICAgICAgICAgaWYoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OlNob3dTdWJDYXRlZ29yeUl0ZW1zJykpIHsKICAgICAgICAgICAgICAgIG15IEBTdWJDYXRlZ29yeUlEcyA9IEB7JFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeVN1YkNhdGVnb3J5SURMaXN0KAogICAgICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgICAgICBJdGVtU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgICAgICBNb2RlID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICl9OwogICAgICAgICAgICAgICAgcHVzaChAQ2F0ZWdvcnlJRHMsIEBTdWJDYXRlZ29yeUlEcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q2hhbmdlJwogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoQENhdGVnb3J5SURzKSB7CiAgICAgICAgICAgICAgICBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SURzID0+IFxAQ2F0ZWdvcnlJRHMsCiAgICAgICAgICAgICAgICAgICAgU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgICAgICBPcmRlciA9PiAnQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICAgICAgU29ydCA9PiAnZG93bicsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OkxpbWl0JykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckxhdGVzdENoYW5nZScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQEl0ZW1JRHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICAgICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICBPcmRlciA9PiAnQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICBTb3J0ID0+ICdkb3duJywKICAgICAgICAgICAgICAgIExpbWl0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpMaW1pdCcpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKEBJdGVtSURzKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRfKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q2hhbmdlRkFRSXRlbVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3ViIF9HZXRFeHBsb3Jlckxhc3RDcmVhdGVJdGVtcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgaWYoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDcmVhdGU6OlNob3cnKSkgewogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgICAgICBmb3JlYWNoIChxdyhDYXRlZ29yeUlEKSkgewogICAgICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15IEBJdGVtSURzID0gKCk7CiAgICAgICAgaWYoZGVmaW5lZCgkUGFyYW17Q2F0ZWdvcnlJRH0pKSB7CiAgICAgICAgICAgICMgYWRkIGN1cnJlbnQgY2F0ZWdvcnlpZAogICAgICAgICAgICBteSBAQ2F0ZWdvcnlJRHMgPSAoKTsKICAgICAgICAgICAgaWYoJFBhcmFte0NhdGVnb3J5SUR9KSB7CiAgICAgICAgICAgICAgICBwdXNoKEBDYXRlZ29yeUlEcywgKCRQYXJhbXtDYXRlZ29yeUlEfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17TW9kZX0pKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TW9kZX0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFte0N1c3RvbWVyVXNlcn0pKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgYWRkIHN1YmNhdGVnb3J5aWRzCiAgICAgICAgICAgIGlmKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpTaG93U3ViQ2F0ZWdvcnlJdGVtcycpKSB7CiAgICAgICAgICAgICAgICBteSBAU3ViQ2F0ZWdvcnlJRHMgPSBAeyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlTdWJDYXRlZ29yeUlETGlzdCgKICAgICAgICAgICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICAgICAgICAgSXRlbVN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICAgICAgTW9kZSA9PiAkUGFyYW17TW9kZX0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApfTsKICAgICAgICAgICAgICAgIHB1c2goQENhdGVnb3J5SURzLCBAU3ViQ2F0ZWdvcnlJRHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckxhdGVzdENyZWF0ZScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKEBDYXRlZ29yeUlEcykgewogICAgICAgICAgICAgICAgQEl0ZW1JRHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEcyA9PiBcQENhdGVnb3J5SURzLAogICAgICAgICAgICAgICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICAgICAgT3JkZXIgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICAgICAgICAgIFNvcnQgPT4gJ2Rvd24nLAogICAgICAgICAgICAgICAgICAgIExpbWl0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpMaW1pdCcpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDcmVhdGUnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIEBJdGVtSURzID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFTZWFyY2goCiAgICAgICAgICAgICAgICBTdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICAgICAgT3JkZXIgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICAgICAgU29ydCA9PiAnZG93bicsCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6TGltaXQnKQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIGR0bCBibG9jawogICAgICAgIGZvcmVhY2ggKEBJdGVtSURzKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRfKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q3JlYXRlRkFRSXRlbVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3ViIF9HZXRFeHBsb3JlclF1aWNrU2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6UXVpY2tTZWFyY2g6OlNob3cnKSkgewogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgICAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBkdGwgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlclF1aWNrU2VhcmNoJywKICAgICAgICAgICAgRGF0YSA9PiB7IENhdGVnb3J5SUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9IH0KICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN1YiBHZXRJdGVtVmlldyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1JRCk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgIGlmICghKCRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8iKTsKICAgICAgICB9CiAgICB9CiAgICAjIGRiIGFjdGlvbgogICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICMgaHRtbCBxdW90aW5nCiAgICBmb3JlYWNoIG15ICRLZXkgKHF3IChGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNikpIHsKICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpKSB7CiAgICAgICAgICAgIG15IEBBcnJheSA9IHNwbGl0IC9wcmU+LywgJEl0ZW1EYXRheyRLZXl9OwogICAgICAgICAgICBteSAkVGV4dCA9ICcnOwogICAgICAgICAgICBmb3JlYWNoIChAQXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmICgkXyA9fiAvKC4qKVw8XC8kLykgewogICAgICAgICAgICAgICAgICAgICRUZXh0IC49ICdwcmU+Jy4kXy4ncHJlPic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkXyA9fiBzL1xuL1w8YnJcPi9nOwogICAgICAgICAgICAgICAgICAgICRUZXh0IC49ICRfOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRJdGVtRGF0YXskS2V5fSA9ICRUZXh0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRLZXl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgTmV3TGluZSA9PiAwLAogICAgICAgICAgICAgICAgVGV4dCA9PiAkSXRlbURhdGF7JEtleX0sCiAgICAgICAgICAgICAgICBWTWF4ID0+IDUwMDAsCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICB9CiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIGlmICghZXhpc3RzKCRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXskSXRlbURhdGF7U3RhdGVUeXBlSUR9fSkpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICB9CiAgICAjIHVzZXIgaW5mbwogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntBZ2VudFVzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEl0ZW1EYXRhe0NyZWF0ZWRCeX0sCiAgICApOwogICAgJEZyb250ZW5ke0NyZWF0ZWRCeUxvZ2lufSA9ICRVc2VySW5mb3tVc2VyTG9naW59OwogICAgJVVzZXJJbmZvID0gJFNlbGYtPntBZ2VudFVzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEl0ZW1EYXRhe0NoYW5nZWRCeX0sCiAgICApOwogICAgJEZyb250ZW5ke0NoYW5nZWRCeUxvZ2lufSA9ICRVc2VySW5mb3tVc2VyTG9naW59OwogICAgIyBpdGVtIHZpZXcKICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKFJhdGUgPT4gJEl0ZW1EYXRhe1Jlc3VsdH0pLic7JzsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVmlldycsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUl0ZW1EYXRhLCAlRnJvbnRlbmQgfSwKICAgICk7CiAgICBpZiAoJFBhcmFte1Blcm1pc3Npb259ICYmICRQYXJhbXtQZXJtaXNzaW9ufSBlcSAncncnKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRSXRlbVZpZXdMaW5rVXBkYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUl0ZW1EYXRhLCAlRnJvbnRlbmQgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUl0ZW1WaWV3TGlua0RlbGV0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVJdGVtRGF0YSwgJUZyb250ZW5kIH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgRkFRIHBhdGgKICAgIGlmICgkU2VsZi0+X0dldEZBUVBhdGgoQ2F0ZWdvcnlJRCA9PiAkSXRlbURhdGF7Q2F0ZWdvcnlJRH0pKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiBcJUl0ZW1EYXRhLAogICAgICAgICk7CiAgICB9CiAgICAjIGl0ZW0gYXR0YWNobWVudAogICAgaWYgKGRlZmluZWQoJEl0ZW1EYXRhe0ZpbGVuYW1lfSkpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtVmlld0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEgfSwKICAgICAgICApOwogICAgfQogICAgIyBpdGVtIGZpZWxkcwogICAgJFNlbGYtPl9HZXRJdGVtRmllbGRzKAogICAgICAgIEl0ZW1EYXRhID0+IFwlSXRlbURhdGEKICAgICk7CiAgICAjIGl0ZW0gdm90aW5nCiAgICBteSAlU2hvd0l0ZW1Wb3RpbmcgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6Okl0ZW06OlZvdGluZzo6U2hvdycpfTsKICAgIGlmIChleGlzdHMoJFNob3dJdGVtVm90aW5neyRTZWxmLT57SW50ZXJmYWNlfXtOYW1lfX0pKSB7CiAgICAgICAgJFNlbGYtPl9HZXRJdGVtVm90aW5nKAogICAgICAgICAgICBJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhCiAgICAgICAgKTsKICAgIH0KICAgIGlmICgkUGFyYW17TGlua3N9ICYmICRQYXJhbXtMaW5rc30gPT0gMSkgewogICAgICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICAgICAgbXkgJUxpbmtzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+QWxsTGlua2VkT2JqZWN0cygKICAgICAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgICAgICBPYmplY3RJRCA9PiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gIkxpbmtzIiwKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgICAgIG15ICVMaW5rVHlwZUJveCA9ICgpOwogICAgICAgIGZvciBteSAkTGlua1R5cGUgKCBxdyhOb3JtYWwgUGFyZW50IENoaWxkKSApIHsKICAgICAgICAgICAgaWYgKCAhICRMaW5rc3skTGlua1R5cGV9ICkgewogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlT2JqZWN0VHlwZSA9ICV7JExpbmtzeyRMaW5rVHlwZX19OwogICAgICAgICAgICBmb3JlYWNoIG15ICRPYmplY3QgKHNvcnQga2V5cyAlT2JqZWN0VHlwZSkgewogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAleyRPYmplY3RUeXBleyRPYmplY3R9fTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEl0ZW0gKHNvcnQga2V5cyAlRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGlmICggISRMaW5rVHlwZUJveHskTGlua1R5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1R5cGUgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtUeXBlQm94eyRMaW5rVHlwZX0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXsgJERhdGF7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rVHlwZSA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIEdldEl0ZW1TbWFsbFZpZXcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgPSBxdyhJdGVtSUQpOwoKICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICBpZiAoISgkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfIik7CiAgICAgICAgfQogICAgfQogICAgIyBkYiBhY3Rpb24KICAgIG15ICVJdGVtRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICB9CiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIGlmKCFleGlzdHMoJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9eyRJdGVtRGF0YXtTdGF0ZVR5cGVJRH19KSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgIH0KICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSXRlbURhdGF7Q3JlYXRlZEJ5fSwKICAgICk7CiAgICAkRnJvbnRlbmR7Q3JlYXRlZEJ5TG9naW59ID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAlVXNlckluZm8gPSAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSXRlbURhdGF7Q2hhbmdlZEJ5fSwKICAgICk7CiAgICAkRnJvbnRlbmR7Q2hhbmdlZEJ5TG9naW59ID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAjIGl0ZW0gdmlldwogICAgJEZyb250ZW5ke0Nzc0NvbHVtblZvdGluZ1Jlc3VsdH0gPSAnY29sb3I6Jy4kU2VsZi0+e0xheW91dE9iamVjdH0tPkdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IoUmF0ZSA9PiAkSXRlbURhdGF7UmVzdWx0fSkuJzsnOwogICAgJEZyb250ZW5ke0l0ZW1GaWVsZFZhbHVlc30gPSAkU2VsZi0+X0dldEl0ZW1GaWVsZFZhbHVlcyhJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVmlld1NtYWxsJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEsICVGcm9udGVuZCB9LAogICAgKTsKICAgICMgRkFRIHBhdGgKICAgIGlmICgkU2VsZi0+X0dldEZBUVBhdGgoQ2F0ZWdvcnlJRCA9PiAkSXRlbURhdGF7Q2F0ZWdvcnlJRH0pKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiBcJUl0ZW1EYXRhLAogICAgICAgICk7CiAgICB9CiAgICAjIGl0ZW0gYXR0YWNobWVudAogICAgaWYgKGRlZmluZWQoJEl0ZW1EYXRhe0ZpbGVuYW1lfSkpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtVmlld0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEgfSwKICAgICAgICApOwogICAgfQogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICVMaW5rcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkFsbExpbmtlZE9iamVjdHMoCiAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgIE9iamVjdElEID0+ICRJdGVtRGF0YXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgZm9yZWFjaCBteSAkTGlua1R5cGUgKHNvcnQga2V5cyAlTGlua3MpIHsKICAgICAgICBteSAlT2JqZWN0VHlwZSA9ICV7JExpbmtzeyRMaW5rVHlwZX19OwogICAgICAgIGZvcmVhY2ggbXkgJE9iamVjdCAoc29ydCBrZXlzICVPYmplY3RUeXBlKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gJXskT2JqZWN0VHlwZXskT2JqZWN0fX07CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEl0ZW0gKHNvcnQga2V5cyAlRGF0YSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJMaW5rJExpbmtUeXBlIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRheyRJdGVtfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBHZXRJdGVtUHJpbnQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSBAUGFyYW1zID0gcXcoSXRlbUlEKTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgaWYgKCEoJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIpOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgYWN0aW9uCiAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgfQogICAgIyBodG1sIHF1b3RpbmcKICAgIGZvcmVhY2ggbXkgJEtleSAocXcgKEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewogICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpJdGVtOjpIVE1MJykpIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRLZXl9ID1+IHMvXG4vXDxiclw+L2c7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkSXRlbURhdGF7JEtleX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBOZXdMaW5lID0+IDAsCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRJdGVtRGF0YXskS2V5fSwKICAgICAgICAgICAgICAgIFZNYXggPT4gNTAwMCwKICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgaWYgKCFleGlzdHMoJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9eyRJdGVtRGF0YXtTdGF0ZVR5cGVJRH19KSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgIH0KICAgICMgYWRkIGFydGljbGUKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJpbnQnLAogICAgICAgIERhdGEgPT4gXCVJdGVtRGF0YSwKICAgICk7CiAgICAjIGZpZWxkcwogICAgJFNlbGYtPl9HZXRJdGVtRmllbGRzKAogICAgICAgIEl0ZW1EYXRhID0+IFwlSXRlbURhdGEKICAgICk7CiAgICAjIGxpbmtzCiAgICBpZiAoJFBhcmFte0xpbmtzfSAmJiAkUGFyYW17TGlua3N9ID09IDEpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rcycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgICAgIG15ICVMaW5rcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkFsbExpbmtlZE9iamVjdHMoCiAgICAgICAgICAgIE9iamVjdCA9PiAnRkFRJywKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAjIGxpbmtzCiAgICAgICAgZm9yZWFjaCBteSAkTGlua1R5cGUgKHNvcnQga2V5cyAlTGlua3MpIHsKICAgICAgICAgICAgbXkgJU9iamVjdFR5cGUgPSAleyRMaW5rc3skTGlua1R5cGV9fTsKICAgICAgICAgICAgZm9yZWFjaCBteSAkT2JqZWN0IChzb3J0IGtleXMgJU9iamVjdFR5cGUpIHsKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJXskT2JqZWN0VHlwZXskT2JqZWN0fX07CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRJdGVtIChzb3J0IGtleXMgJURhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJMaW5rJExpbmtUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YXskSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9HZXRJdGVtRmllbGRzIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1EYXRhKTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgaWYoIWV4aXN0cygkUGFyYW17JF99KSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfIik7CiAgICAgICAgfQogICAgfQogICAgIyBjb25maWcgdmFsdWVzCiAgICBteSAlSXRlbUZpZWxkcyA9ICgpOwogICAgZm9yKG15ICRpPTE7JGk8NzskaSsrKSB7CiAgICAgICAgbXkgJUl0ZW1Db25maWcgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6Okl0ZW06OkZpZWxkJy4kaSl9OwogICAgICAgIGlmKCRJdGVtQ29uZmlne1Nob3d9KSB7CiAgICAgICAgICAgICRJdGVtRmllbGRzeyJGaWVsZCIuJGl9ID0gXCVJdGVtQ29uZmlnOwogICAgICAgIH0KICAgIH0KICAgIGZvcmVhY2ggbXkgJEtleSAoc29ydCggeyAkSXRlbUZpZWxkc3skYX17UHJpb30gPD0+ICRJdGVtRmllbGRzeyRifXtQcmlvfSB9IGtleXMoJUl0ZW1GaWVsZHMpKSkgewogICAgICAgIG15ICVTdGF0ZVR5cGVEYXRhID0gJXskU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkSXRlbUZpZWxkc3skS2V5fXtTaG93fQogICAgICAgICl9OwogICAgICAgICMgc2hvdyB5ZXMgL25vCiAgICAgICAgaWYgKGV4aXN0cygkU2VsZi0+e0ludGVyZmFjZVN0YXRlc317JFN0YXRlVHlwZURhdGF7SUR9fSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUl0ZW1GaWVsZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRJdGVtRmllbGRzeyRLZXl9fSwKICAgICAgICAgICAgICAgICAgICAnU3RhdGVOYW1lJyA9PiAkU3RhdGVUeXBlRGF0YXtOYW1lfSwKICAgICAgICAgICAgICAgICAgICAnS2V5JyA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICdWYWx1ZScgPT4gJFBhcmFte0l0ZW1EYXRhfXskS2V5fSB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgX0dldEl0ZW1GaWVsZFZhbHVlcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgPSBxdyhJdGVtRGF0YSk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgIGlmICghZXhpc3RzKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8iKTsKICAgICAgICB9CiAgICB9CiAgICAjIGNvbmZpZyB2YWx1ZXMKICAgIG15ICVJdGVtRmllbGRzID0gKCk7CiAgICBmb3IgKG15ICRpPTE7JGk8NzskaSsrKSB7CiAgICAgICAgbXkgJUl0ZW1Db25maWcgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6Okl0ZW06OkZpZWxkJy4kaSl9OwogICAgICAgIGlmKCRJdGVtQ29uZmlne1Nob3d9KSB7CiAgICAgICAgICAgICRJdGVtRmllbGRzeyJGaWVsZCIuJGl9ID0gXCVJdGVtQ29uZmlnOwogICAgICAgIH0KICAgIH0KICAgIG15ICRTdHJpbmcgPSAnJzsKICAgIGZvcmVhY2ggbXkgJEtleSAoc29ydCggeyAkSXRlbUZpZWxkc3skYX17UHJpb30gPD0+ICRJdGVtRmllbGRzeyRifXtQcmlvfSB9IGtleXMoJUl0ZW1GaWVsZHMpKSkgewogICAgICAgIG15ICVTdGF0ZVR5cGVEYXRhID0gJXskU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkSXRlbUZpZWxkc3skS2V5fXtTaG93fQogICAgICAgICl9OwogICAgICAgICMgc2hvdyB5ZXMgL25vCiAgICAgICAgaWYoZXhpc3RzKCRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXskU3RhdGVUeXBlRGF0YXtJRH19KSkgewogICAgICAgICAgICAkU3RyaW5nIC49ICRQYXJhbXtJdGVtRGF0YX17JEtleX0gfHwgJyc7CiAgICAgICAgICAgICRTdHJpbmcgLj0gIlxuXG4iOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkU3RyaW5nOwp9CgpzdWIgX0dldEl0ZW1Wb3RpbmcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvcmVhY2ggKHF3KEl0ZW1EYXRhKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIik7CiAgICAgICAgfQogICAgfQogICAgbXkgJUl0ZW1EYXRhID0gJXskUGFyYW17SXRlbURhdGF9fTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gIlZvdGluZyIKICAgICk7CiAgICBteSAlVm90ZURhdGEgPSAleyRTZWxmLT57RkFRT2JqZWN0fS0+Vm90ZUdldCgKICAgICAgICBDcmVhdGVCeSA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9LAogICAgICAgIEludGVyZmFjZSA9PiAkU2VsZi0+e0ludGVyZmFjZX17SUR9LAogICAgICAgIElQID0+ICRFTlZ7J1JFTU9URV9BRERSJ30sCiAgICApfTsKCiAgICBteSAkRmxhZyA9IDA7CiAgICAjIGFscmVhZHkgdm90ZWQ/CiAgICBpZiglVm90ZURhdGEpIHsKICAgICAgICAjIGl0ZW0vY2hhbmdlX3RpbWUgPiB2b3RpbmcvY3JlYXRlX3RpbWUKICAgICAgICBteSAkSXRlbUNoYW5nZWRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoU3RyaW5nID0+ICRJdGVtRGF0YXtDaGFuZ2VkfSB8fCAnJyk7CiAgICAgICAgbXkgJFZvdGVDcmVhdGVkU3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKFN0cmluZyA9PiAkVm90ZURhdGF7Q3JlYXRlZH0gfHwgJycpOwoKICAgICAgICBpZiAoJEl0ZW1DaGFuZ2VkU3lzdGVtVGltZSA+ICRWb3RlQ3JlYXRlZFN5c3RlbVRpbWUpIHsKICAgICAgICAgICAgJEZsYWcgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaChAeyRTZWxmLT57Tm90aWZ5fX0sIFsnSW5mbycsICdZb3UgaGF2ZSBhbHJlYWR5IHZvdGVkISddKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRGbGFnID0gMTsKICAgIH0KICAgIGlmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZvdGUnICYmICRGbGFnKSB7CiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgICAgIGZvcmVhY2ggKHF3KEl0ZW1EYXRhKSkgewogICAgICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgICAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgICAgICBteSBAUGFyYW1zID0gcXcoSXRlbUlEIFJhdGUpOwogICAgICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICBpZigkR2V0UGFyYW17UmF0ZX0gZXEgJzAnIG9yICRHZXRQYXJhbXtSYXRlfSkgewogICAgICAgICAgICAkU2VsZi0+e0ZBUU9iamVjdH0tPlZvdGVBZGQoCiAgICAgICAgICAgICAgICBDcmVhdGVkQnkgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgSVAgPT4gJEVOVnsnUkVNT1RFX0FERFInfSwKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAkU2VsZi0+e0ludGVyZmFjZX17SUR9LAogICAgICAgICAgICAgICAgUmF0ZSA9PiAkR2V0UGFyYW17UmF0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2goQHskU2VsZi0+e05vdGlmeX19LCBbJ0luZm8nLCAnVGhhbmtzIGZvciB2b3RlISddKTsKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2goQHskU2VsZi0+e05vdGlmeX19LCBbJ0Vycm9yJywgJ05vIHJhdGUgc2VsZWN0ZWQhJ10pOwogICAgICAgICAgICAkU2VsZi0+R2V0SXRlbVZvdGluZ0Zvcm0oCiAgICAgICAgICAgICAgICBJdGVtRGF0YSA9PiAkUGFyYW17SXRlbURhdGF9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZm9ybQogICAgJFNlbGYtPl9HZXRJdGVtVm90aW5nRm9ybSgKICAgICAgICBJdGVtRGF0YSA9PiAkUGFyYW17SXRlbURhdGF9CiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIF9HZXRJdGVtVm90aW5nRm9ybSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgZm9yZWFjaCAocXcoSXRlbURhdGEpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVm90ZUZvcm0nLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICV7JFBhcmFte0l0ZW1EYXRhfX0gfQogICAgKTsKCiAgICBteSAlVm90aW5nUmF0ZXMgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6Okl0ZW06OlZvdGluZzo6UmF0ZXMnKX07CiAgICBmb3JlYWNoIG15ICRrZXkgKCBzb3J0KCB7ICRiIDw9PiAkYSB9IGtleXMoJVZvdGluZ1JhdGVzICkgKSApIHsKICAgICAgICBteSAlRGF0YSA9ICgiVmFsdWUiPT4ka2V5LCAiVGl0bGUiPT4kVm90aW5nUmF0ZXN7JGtleX0gKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICJWb3RpbmdSYXRlUm93IiwKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybjsKfQoKc3ViIEdldEl0ZW1TZWFyY2ggewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUdldFBhcmFtICAgID0gKCk7CiAgICBteSAlRnJvbnRlbmQgICAgPSAoKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIGZvcmVhY2ggKHF3KExhbmd1YWdlSURzIENhdGVnb3J5SURzKSkgewogICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAkXyk7CiAgICAgICAgaWYgKEBBcnJheSkgewogICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gXEBBcnJheTsKICAgICAgICB9CiAgICB9CiAgICBmb3JlYWNoIChxdyhRdWlja1NlYXJjaCBOdW1iZXIgVGl0bGUgV2hhdCBLZXl3b3JkKSkgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgfQogICAgIyBxdWlja3NlYXJjaCBpbiBzdWJjYXRlZ29yaWVzPwogICAgaWYgKCRHZXRQYXJhbXtRdWlja1NlYXJjaH0pIHsKICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6OlF1aWNrU2VhcmNoOjpTaG93U3ViQ2F0ZWdvcnlJdGVtcycpKSB7CiAgICAgICAgICAgIGlmICghJFBhcmFte01vZGV9KSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TW9kZX0gPSAnUHVibGljJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFte1VzZXJ9KSkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJ9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgQFN1YkNhdGVnb3J5SURzID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5U3ViQ2F0ZWdvcnlJRExpc3QoCiAgICAgICAgICAgICAgICBQYXJlbnRJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRHN9LT5bMF0sCiAgICAgICAgICAgICAgICBJdGVtU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcn0sCiAgICAgICAgICAgICAgICBNb2RlID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgKX07CiAgICAgICAgICAgIHB1c2goQHskR2V0UGFyYW17Q2F0ZWdvcnlJRHN9fSwgQFN1YkNhdGVnb3J5SURzKTsKICAgICAgICB9CiAgICB9CiAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICBEYXRhID0+IHsgJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUxpc3QoKSB9LAogICAgICAgIFNpemUgPT4gNSwKICAgICAgICBOYW1lID0+ICdMYW5ndWFnZUlEcycsCiAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJEdldFBhcmFte0xhbmd1YWdlSURzfSB8fCBbXSwKICAgICAgICBIVE1MUXVvdGUgPT4gMSwKICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICApOwogICAgbXkgJENhdGVnb3JpZXMgPSAoKTsKICAgIGlmICgkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdBZ2VudCcpIHsKICAgICAgICAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+R2V0VXNlckNhdGVnb3JpZXMoCiAgICAgICAgICAgIFVzZXJJRCA9PiAgJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlID0+ICdydycKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCRQYXJhbXtNb2RlfSAmJiAkUGFyYW17TW9kZX0gZXEgJ0N1c3RvbWVyJykgewogICAgICAgICRDYXRlZ29yaWVzID0gJFNlbGYtPntGQVFPYmplY3R9LT5HZXRDdXN0b21lckNhdGVnb3JpZXMoCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAgJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgIFR5cGUgPT4gJ3J3JwogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KCk7CiAgICB9CiAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyRDYXRlZ29yaWVzfSB9LAogICAgICAgIFNpemUgPT4gNSwKICAgICAgICBOYW1lID0+ICdDYXRlZ29yeUlEcycsCiAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICBTZWxlY3RlZElEcyA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRHN9IHx8IFtdLAogICAgICAgIEhUTUxRdW90ZSA9PiAxLAogICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1NlYXJjaCcsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUdldFBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICk7CgogICAgIyBidWlsZCByZXN1bHQKICAgIGlmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1N1Ym1pdCcpKSB7CiAgICAgICAgbXkgJENzc1JvdyA9ICcnOwoKICAgICAgICBteSBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgTGltaXQgPT4gMjUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICApOwogICAgICAgIGZvcmVhY2ggKEBJdGVtSURzKSB7CiAgICAgICAgICAgICVGcm9udGVuZCA9ICgpOwogICAgICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KEl0ZW1JRCA9PiAkXyk7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJ3JvJzsKICAgICAgICAgICAgaWYgKCRQYXJhbXtNb2RlfSAmJiAkUGFyYW17TW9kZX0gZXEgJ0FnZW50JykgewogICAgICAgICAgICAgICAgJFBlcm1pc3Npb24gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkNoZWNrQ2F0ZWdvcnlVc2VyUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJ9LAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJERhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdDdXN0b21lcicpIHsKICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uID0gJFNlbGYtPntGQVFPYmplY3R9LT5DaGVja0NhdGVnb3J5Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICREYXRhe0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFBlcm1pc3Npb24gbmUgJycpIHsKICAgICAgICAgICAgICAgIGlmKCRDc3NSb3cgZXEgJ3NlYXJjaHBhc3NpdmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRhe0Nzc1Jvd30gPSAkQ3NzUm93OwogICAgICAgICAgICAgICAgJEZyb250ZW5ke0Nzc0NvbHVtblZvdGluZ1Jlc3VsdH0gPSAnY29sb3I6Jy4kU2VsZi0+e0xheW91dE9iamVjdH0tPkdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IoUmF0ZSA9PiAkRGF0YXtSZXN1bHR9KS4nOyc7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hSZXN1bHRSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgR2V0U3lzdGVtSGlzdG9yeSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKCiAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgIFZhbHVlID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1N5c3RlbUhpc3RvcnknLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0gfSwKICAgICk7CgogICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnJzsKICAgIG15IEBIaXN0b3J5ID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkhpc3RvcnlHZXQoKX07CiAgICBmb3JlYWNoIG15ICRSb3cgKEBIaXN0b3J5KSB7CiAgICAgICAgIyBjc3MgY29uZmlndXJhdGlvbgogICAgICAgIGlmKCRGcm9udGVuZHtDc3NSb3d9IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnc2VhcmNocGFzc2l2ZSc7CiAgICAgICAgfQogICAgICAgIG15ICVEYXRhID0gJXskUm93fTsjJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRSb3ctPntJdGVtSUR9KTsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFJvdy0+e0NyZWF0ZWRCeX0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3lzdGVtSGlzdG9yeVJvdycsCiAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgJUZyb250ZW5kLCAlVXNlciwgTmFtZSA9PiAkUm93LT57TmFtZX0gfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50RkFRLnBtIC0gZmFxIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudEZBUS5wbSx2IDEuMTEgMjAwNy8wOS8yNiAxMTo1NTozNCByayBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEZBUTsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RkFROwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6Ok1vZHVsZXM6OkZBUTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKQElTQSA9IHF3KEtlcm5lbDo6TW9kdWxlczo6RkFRKTsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgIG15ICRTZWxmID0gbmV3IEtlcm5lbDo6TW9kdWxlczo6RkFRKCVQYXJhbSk7CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGludGVyZmFjZSBzZXR0aW5ncwogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgICRTZWxmLT57SW50ZXJmYWNlfSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlR2V0KAogICAgICAgIE5hbWUgPT4gJ2ludGVybmFsJwogICAgKTsKICAgICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyA9PiBbJ2ludGVybmFsJywnZXh0ZXJuYWwnLCdwdWJsaWMnXQogICAgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgZm9yZWFjaCAocXcoU2Vzc2lvbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpIGlmICghJFNlbGYtPnskX30pOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoJVBhcmFtKTsKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CgogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgUGFyYW10ZXIKICAgIG15IEBQYXJhbXMgPSAoKTsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgT3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICBteSAkSGVhZGVyID0gJyc7CiAgICBteSAkSGVhZGVyVGl0bGUgPSAgJyc7CiAgICBteSAkSGVhZGVyVHlwZSA9ICAnJzsKICAgIG15ICROYXZpZ2F0aW9uID0gJyc7CiAgICBteSAkTm90aWZ5ID0gJyc7CiAgICBteSAkQ29udGVudCA9ICcnOwogICAgbXkgJEZvb3RlciA9ICcnOwogICAgbXkgJEZvb3RlclR5cGUgPSAgJyc7CgogICAgbXkgJERlZmF1bHRIZWFkZXIgPSAnJzsKICAgIG15ICREZWZhdWx0TmF2aWdhdGlvbiA9ICcnOwogICAgbXkgJERlZmF1bHROb3RpZnkgPSAnJzsKICAgIG15ICREZWZhdWx0Q29udGVudCA9ICcnOwogICAgbXkgJERlZmF1bHRGb290ZXIgPSAnJzsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgQFBhcmFtcyA9IHF3KEl0ZW1JRCBJRCBOdW1iZXIgTmFtZSBDb21tZW50IENhdGVnb3J5SUQgUGFyZW50SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFRpdGxlIFVzZXJJRAogICAgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgRnJlZUtleTEgRnJlZUtleTIgRnJlZUtleTMgS2V5d29yZHMgT3JkZXIgU29ydCBOYXYpOwogICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pIHx8ICcnOwogICAgfQoKICAgICMgbmF2aWdhdGlvbiBPTi9PRkYKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICAkSGVhZGVyVHlwZSA9ICRTZWxmLT57TGFzdEZBUU5hdn07CiAgICBpZigkR2V0UGFyYW17TmF2fSBlcSAnTm9ybWFsJykgewogICAgICAgICRIZWFkZXJUeXBlID0gJyc7CiAgICB9IGVsc2lmICgkR2V0UGFyYW17TmF2fSBlcSAnTm9uZScgfHwgJFNlbGYtPntMYXN0RkFRTmF2fSkgewogICAgICAgICRIZWFkZXJUeXBlID0gJ1NtYWxsJzsKICAgICAgICAkTmF2aWdhdGlvbiA9ICcgJzsKICAgICAgICAkTm90aWZ5ICAgID0gJyAnOwogICAgfSBlbHNlIHsKICAgICAgICAkSGVhZGVyVHlwZSA9ICcnOwogICAgfQoKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSA9PiAnTGFzdEZBUU5hdicsCiAgICAgICAgVmFsdWUgPT4gJEhlYWRlclR5cGUsCiAgICApOwoKICAgICMgc3RvcmUgbmF2IHBhcmFtCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgPT4gJ0xhc3RGQVFOYXYnLAogICAgICAgIFZhbHVlID0+ICRIZWFkZXJUeXBlLAogICAgKTsKCiAgICAjIHZpZXcgc21hbGwKICAgICMkSGVhZGVyVHlwZSA9ICRTZWxmLT57TGFzdEZBUU5hdn0gfHwgJyc7CiAgICAjbXkgJE5hdiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTmF2JykgfHwgJyc7CgogICAgIyBvdXRwdXQKICAgICRPdXRwdXQgID0gJyc7CgogICAgIyBzdG9yZSBzZWFyY2ggcGFyYW1zCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgPT4gJ0xhc3RGQVFXaGF0JywKICAgICAgICBWYWx1ZSA9PiAkUGFyYW17V2hhdH0sCiAgICApOwogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdMYXN0RkFRS2V5d29yZCcsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte0tleXdvcmR9LAogICAgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsYW5ndWFnZSBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdMYW5ndWFnZScpIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGR0bAogICAgICAgICRGcm9udGVuZHtIZWFkbGluZX0gPSAnQWRkJzsKICAgICAgICAkRnJvbnRlbmR7QWRkTGlua30gPSAnKENsaWNrIGhlcmUgdG8gYWRkKSc7CiAgICAgICAgJEZyb250ZW5ke1N1YmFjdGlvbn0gPSAnTGFuZ3VhZ2VBZGQnOwogICAgICAgICRGcm9udGVuZHtMYW5ndWFnZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsgJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUxpc3QoVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkgfSwKICAgICAgICAgICAgU2l6ZSA9PiAxMCwKICAgICAgICAgICAgTmFtZSA9PiAnSUQnLAogICAgICAgICAgICBIVE1MUXVvdGUgPT4gMSwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICk7CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGxhbmd1YWdlIGFkZCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdMYW5ndWFnZUFjdGlvbicpIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjZ2V0IERhdGEKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgJFBhcmFtRGF0YXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgIGZvcmVhY2gocXcoTmFtZSkpIHsKICAgICAgICAgICAgaWYoISgkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyAhIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgaWYoISRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VEdXBsaWNhdGVDaGVjayhOYW1lPT4kUGFyYW1EYXRhe05hbWV9KSkgewogICAgICAgICAgICBpZiAoJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUFkZCglUGFyYW1EYXRhLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj1BZ2VudEZBUSZTdWJhY3Rpb249TGFuZ3VhZ2UiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJMYW5ndWFnZSAnJFBhcmFtRGF0YXtOYW1lfScgYWxyZWFkeSBleGlzdHMhIik7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsYW5ndWFnZSB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdMYW5ndWFnZUNoYW5nZScpIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjZ2V0IERhdGEKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgZm9yZWFjaChxdyhJRCkpIHsKICAgICAgICAgICAgaWYoISgkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyAhIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgbXkgJUxhbmd1YWdlRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VHZXQoSUQgPT4gJFBhcmFtRGF0YXtJRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgICAgIGlmICghJUxhbmd1YWdlRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7SGVhZGxpbmV9ID0gJ0NoYW5nZSc7CiAgICAgICAgJEZyb250ZW5ke0FkZExpbmt9ID0gJyc7CiAgICAgICAgJEZyb250ZW5ke1N1YmFjdGlvbn0gPSAnTGFuZ3VhZ2VDaGFuZ2UnOwogICAgICAgICRGcm9udGVuZHtMYW5ndWFnZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsgJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUxpc3QoVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkgfSwKICAgICAgICAgICAgU2l6ZSA9PiAxMCwKICAgICAgICAgICAgTmFtZSA9PiAnSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRMYW5ndWFnZURhdGF7TGFuZ3VhZ2VJRH0sCiAgICAgICAgICAgIEhUTUxRdW90ZSA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZCwgJUxhbmd1YWdlRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmQsICVMYW5ndWFnZURhdGF9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRJywKICAgICAgICApOwoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsYW5ndWFnZSB1cGRhdGUgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGFuZ3VhZ2VDaGFuZ2VBY3Rpb24nKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgRGF0YQogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICAkUGFyYW1EYXRhe1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgZm9yZWFjaChxdyhJRCBOYW1lKSkgewogICAgICAgICAgICBpZighKCRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfICEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkdXBsaWNhdGUgY2hlY2sKICAgICAgICBpZighJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUR1cGxpY2F0ZUNoZWNrKE5hbWU9PiRQYXJhbURhdGF7TmFtZX0sSUQ9PiRQYXJhbURhdGF7SUR9KSkgewogICAgICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgICAgICBpZiAoISRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VVcGRhdGUoJVBhcmFtRGF0YSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249QWdlbnRGQVEmU3ViYWN0aW9uPUxhbmd1YWdlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTGFuZ3VhZ2UgJyRQYXJhbURhdGF7TmFtZX0nIGFscmVhZHkgZXhpc3RzISIpOwogICAgICAgIH0KCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0ZWdvcnkgdXBkYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2F0ZWdvcnlDaGFuZ2UnKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhDYXRlZ29yeUlEKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBmb3JlYWNoKHF3KENhdGVnb3J5SUQpKSB7CiAgICAgICAgICAgIGlmKCEoJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8gISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIG15ICVDYXRlZ29yeURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5R2V0KENhdGVnb3J5SUQgPT4gJFBhcmFtRGF0YXtDYXRlZ29yeUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICAgICAgaWYgKCElQ2F0ZWdvcnlEYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIGR0bAogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeUxvbmdPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICAgICAgQ2F0ZWdvcnlMaXN0ID0+IHsgJXskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdChVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KX0gfSwKICAgICAgICAgICAgU2l6ZSA9PiAxMCwKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJENhdGVnb3J5RGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pfSB9LAogICAgICAgICAgICBTaXplID0+IDEsCiAgICAgICAgICAgIE5hbWUgPT4gJ1BhcmVudElEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkQ2F0ZWdvcnlEYXRhe1BhcmVudElEfSwKICAgICAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgUm9vdEVsZW1lbnQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgJEZyb250ZW5ke1ZhbGlkT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4geyRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKX0sCiAgICAgICAgICAgIE5hbWUgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRDYXRlZ29yeURhdGF7VmFsaWRJRH0sCiAgICAgICAgKTsKICAgICAgICBteSAkU2VsZWN0ZWRHcm91cHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkdldENhdGVnb3J5R3JvdXAoQ2F0ZWdvcnlJRCA9PiAkUGFyYW1EYXRhe0NhdGVnb3J5SUR9KTsKICAgICAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdChWYWxpZCA9PiAxKTsKICAgICAgICAkRnJvbnRlbmR7R3JvdXBPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJUdyb3VwcywKICAgICAgICAgICAgTmFtZSA9PiAnUGVybWlzc2lvbkdyb3VwcycsCiAgICAgICAgICAgIFNpemUgPT4gOCwKICAgICAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxlY3RlZEdyb3VwcywKICAgICAgICApOwogICAgICAgICRQYXJhbXtIZWFkbGluZX0gPSAnVXBkYXRlJzsKICAgICAgICAkUGFyYW17Rm9ybVN1YmFjdGlvbn0gPSAnQ2F0ZWdvcnlDaGFuZ2VBY3Rpb24nOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kLCAlQ2F0ZWdvcnlEYXRhIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yeUFkZExpbmsnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtIH0sCiAgICAgICAgKTsKCiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRlZ29yeSB1cGRhdGUgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2F0ZWdvcnlDaGFuZ2VBY3Rpb24nKSB7CiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBOYW1lIENvbW1lbnQpOwogICAgICAgIG15IEBQYXJhbXMgPSBxdyhQYXJlbnRJRCBWYWxpZElEKTsKICAgICAgICBmb3JlYWNoIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgaWYoIWRlZmluZWQoJFBhcmFtRGF0YXskX30pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZHVwbGljYXRlIGNoZWNrCiAgICAgICAgaWYoISRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlEdXBsaWNhdGVDaGVjayhOYW1lPT4kUGFyYW1EYXRhe05hbWV9LElEPT4kUGFyYW1EYXRhe0NhdGVnb3J5SUR9LFBhcmVudElEPT4kUGFyYW1EYXRhe1BhcmVudElEfSkpIHsKICAgICAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICAgICAgaWYgKCRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlVcGRhdGUoJVBhcmFtRGF0YSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkpIHsKICAgICAgICAgICAgICAgICMgc2V0IGNhdGVnb3J5Z3JvdXBzCiAgICAgICAgICAgICAgICBteSBAUGVybWlzc2lvbkdyb3VwcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAiUGVybWlzc2lvbkdyb3VwcyIpOwogICAgICAgICAgICAgICAgJFNlbGYtPntGQVFPYmplY3R9LT5TZXRDYXRlZ29yeUdyb3VwKAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJFBhcmFtRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgICAgICBHcm91cElEcyA9PiBcQFBlcm1pc3Npb25Hcm91cHMsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj1BZ2VudEZBUSZTdWJhY3Rpb249Q2F0ZWdvcnkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJDYXRlZ29yeSAnJFBhcmFtRGF0YXtOYW1lfScgYWxyZWFkeSBleGlzdHMhIik7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGVnb3J5IGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhdGVnb3J5JykgewogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawoKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgZHRsCgogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeUxvbmdPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICAgICAgQ2F0ZWdvcnlMaXN0ID0+IHsgJXskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdChVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KX0gfSAsCiAgICAgICAgICAgIFNpemUgPT4gMTAsCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgICAgICBIVE1MUXVvdGUgPT4gMSwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke0NhdGVnb3J5T3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb24oCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiB7ICV7JFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUxpc3QoVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSl9IH0sCiAgICAgICAgICAgIFNpemUgPT4gMSwKICAgICAgICAgICAgTmFtZSA9PiAnUGFyZW50SUQnLAogICAgICAgICAgICBIVE1MUXVvdGUgPT4gMSwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBSb290RWxlbWVudCA9PiAxLAogICAgICAgICk7CiAgICAgICAgIyBidWlsZCBWYWxpZElEIHN0cmluZwogICAgICAgICRGcm9udGVuZHtWYWxpZE9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHskU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCl9LAogICAgICAgICAgICBOYW1lID0+ICdWYWxpZElEJywKICAgICAgICApOwogICAgICAgICRQYXJhbXtIZWFkbGluZX0gPSAnQWRkJzsKICAgICAgICAkUGFyYW17Rm9ybVN1YmFjdGlvbn0gPSAnQ2F0ZWdvcnlBZGRBY3Rpb24nOwogICAgICAgICMgZ3JvdXAgcGVybWlzc2lvbgogICAgICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KFZhbGlkID0+IDEpOwogICAgICAgICRGcm9udGVuZHtHcm91cE9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlR3JvdXBzLAogICAgICAgICAgICBOYW1lID0+ICdQZXJtaXNzaW9uR3JvdXBzJywKICAgICAgICAgICAgU2l6ZSA9PiA4LAogICAgICAgICAgICBNdWx0aXBsZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnknLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICApOwoKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGVnb3J5IGFkZCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDYXRlZ29yeUFkZEFjdGlvbicpIHsKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBteSBAUmVxdWlyZWRQYXJhbXMgPSBxdyhOYW1lIENvbW1lbnQpOwogICAgICAgIG15IEBQYXJhbXMgPSBxdyhQYXJlbnRJRCBWYWxpZElEKTsKICAgICAgICBmb3JlYWNoIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighZGVmaW5lZCgkUGFyYW1EYXRheyRffSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGR1cGxpY2F0ZSBjaGVjawogICAgICAgIGlmKCEkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5RHVwbGljYXRlQ2hlY2soTmFtZT0+JFBhcmFtRGF0YXtOYW1lfSxQYXJlbnRJRD0+JFBhcmFtRGF0YXtQYXJlbnRJRH0pKSB7CiAgICAgICAgICAgIG15ICRDYXRlZ29yeUlEID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUFkZCglUGFyYW1EYXRhLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICAgICAgaWYgKCRDYXRlZ29yeUlEKSB7CiAgICAgICAgICAgICAgICAjIHNldCBjYXRlZ29yeWdyb3VwcwogICAgICAgICAgICAgICAgbXkgQFBlcm1pc3Npb25Hcm91cHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoUGFyYW0gPT4gIlBlcm1pc3Npb25Hcm91cHMiKTsKICAgICAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+U2V0Q2F0ZWdvcnlHcm91cCgKICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgICAgIEdyb3VwSURzID0+IFxAUGVybWlzc2lvbkdyb3VwcywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPUFnZW50RkFRJlN1YmFjdGlvbj1DYXRlZ29yeSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkNhdGVnb3J5ICckUGFyYW1EYXRhe05hbWV9JyBhbHJlYWR5IGV4aXN0cyEiKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcpIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2VJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gJFNlbGYtPntVc2VyTGFuZ3VhZ2V9LAogICAgICAgICk7CgogICAgICAgIG15ICRDYXRlZ29yaWVzID0gJFNlbGYtPntGQVFPYmplY3R9LT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgVXNlcklEID0+ICAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgPT4gJ3J3JwogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke0NhdGVnb3J5T3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb24oCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiAkQ2F0ZWdvcmllcywKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwoKICAgICAgICAkRnJvbnRlbmR7U3RhdGVPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkID0+ICdpbnRlcm5hbCAoYWdlbnQpJywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBZGQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICApOwoKICAgICAgICAjIGZpZWxkcwogICAgICAgICRTZWxmLT5fR2V0SXRlbUZpZWxkcygKICAgICAgICAgICAgSXRlbURhdGEgPT4ge30KICAgICAgICApOwoKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicpIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KFRpdGxlKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBUaXRsZSk7CiAgICAgICAgbXkgQFBhcmFtcyA9IHF3KFN0YXRlSUQgTGFuZ3VhZ2VJRCBGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNiBLZXl3b3JkcyBUaXRsZSk7CiAgICAgICAgZm9yZWFjaCAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgaWYoISRQYXJhbURhdGF7JF99KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoQFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAjIGluc2VydCBpdGVtCiAgICAgICAgbXkgJEl0ZW1JRCA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRQWRkKAogICAgICAgICAgICAlUGFyYW1EYXRhLAogICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApOwoKICAgICAgICBpZiAoJEl0ZW1JRCkgewogICAgICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFtRGF0YXtJdGVtSUR9KSAmJiAhJFBhcmFtRGF0YXtJdGVtSUR9KSB7CiAgICAgICAgICAgICAgICAkUGFyYW1EYXRhe0l0ZW1JRH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249VmlldyZJdGVtSUQ9JFBhcmFtRGF0YXtJdGVtSUR9Iik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gdXBkYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBkYXRlJykgewoKICAgICAgICBAUGFyYW1zID0gcXcoSXRlbUlEKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBJdGVtSUQpOwogICAgICAgIGZvcmVhY2ggKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCEkUGFyYW1EYXRheyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIG15ICVJdGVtRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KEl0ZW1JRCA9PiAkUGFyYW1EYXRhe0l0ZW1JRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgICAgIGlmICghJUl0ZW1EYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIGR0bAogICAgICAgICRGcm9udGVuZHtMYW5ndWFnZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsgJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUxpc3QoKSB9LAogICAgICAgICAgICBOYW1lID0+ICdMYW5ndWFnZUlEJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtMYW5ndWFnZUlEfSwKICAgICAgICApOwogICAgICAgIG15ICRDYXRlZ29yaWVzID0gJFNlbGYtPntGQVFPYmplY3R9LT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgVXNlcklEID0+ICAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgPT4gJ3J3JwogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke0NhdGVnb3J5T3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb24oCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiAkQ2F0ZWdvcmllcywKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkSXRlbURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7U3RhdGVPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEl0ZW1EYXRhe1N0YXRlSUR9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVJdGVtRGF0YSwgJUZyb250ZW5kIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmaWVsZHMKICAgICAgICAkU2VsZi0+X0dldEl0ZW1GaWVsZHMoCiAgICAgICAgICAgIEl0ZW1EYXRhID0+IFwlSXRlbURhdGEKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dAogICAgICAgICRIZWFkZXJUaXRsZSA9ICdFZGl0JzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVHlwZSA9PiAkSGVhZGVyVHlwZSwgVGl0bGUgPT4gJEhlYWRlclRpdGxlKTsKCiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIHVwZGF0ZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGVBY3Rpb24nKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhJdGVtSUQgVGl0bGUgQ2F0ZWdvcnlJRCBTdGF0ZUlEIExhbmd1YWdlSUQpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoVGl0bGUgQ2F0ZWdvcnlJRCk7CiAgICAgICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1JRCBTdGF0ZUlEIExhbmd1YWdlSUQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgS2V5d29yZHMpOwogICAgICAgIGZvcmVhY2ggKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCEkUGFyYW1EYXRheyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgaXRlbQogICAgICAgIGlmICgkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVVwZGF0ZSglUGFyYW1EYXRhLCAlVXBsb2FkU3R1ZmYsIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1WaWV3Jkl0ZW1JRD0kR2V0UGFyYW17SXRlbUlEfSIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgaXRlbSBzY3JlZW4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGUnKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhJdGVtSUQpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBJdGVtSUQpOwogICAgICAgIGZvcmVhY2ggKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCEkUGFyYW1EYXRheyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRQYXJhbURhdGF7SXRlbUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICAgICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgZHRsCgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlbGV0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVJdGVtRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnRGVsZXRlJzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVHlwZSA9PiAkSGVhZGVyVHlwZSwgVGl0bGUgPT4gJEhlYWRlclRpdGxlKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIGRlbGV0ZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGVBY3Rpb24nKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhJdGVtSUQpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBteSBAUmVxdWlyZWRQYXJhbXMgPSBxdyhDYXRlZ29yeUlEIEl0ZW1JRCk7CiAgICAgICAgZm9yZWFjaCAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgaWYoISRQYXJhbURhdGF7JF99KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRQYXJhbURhdGF7SXRlbUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICAgICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgIGlmICgkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUURlbGV0ZSglSXRlbURhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSRQYXJhbURhdGF7Q2F0ZWdvcnlJRH0iKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRvd25sb2FkIGl0ZW0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZCcpIHsKICAgICAgICBAUGFyYW1zID0gcXcoSXRlbUlEKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1JvfSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQogICAgICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgICAgICBmb3JlYWNoIChAUGFyYW1zKSB7CiAgICAgICAgICAgIGlmKCEoJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIG15ICVJdGVtRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICAgICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgIGlmICglSXRlbURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCglSXRlbURhdGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2VhcmNoIGEgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcpIHsKICAgICAgICAkU2VsZi0+R2V0SXRlbVNlYXJjaCgKICAgICAgICAgICAgTW9kZSA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRIZWFkZXJUaXRsZSA9ICdTZWFyY2gnOwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlLAogICAgICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgICk7CiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEnLAogICAgICAgICAgICBEYXRhID0+IHslRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaXRlbSBoaXN0b3J5CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSGlzdG9yeScpIHsKCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KENhdGVnb3J5SUQgSXRlbUlEKTsKICAgICAgICBmb3JlYWNoIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgICAgIG15ICVJdGVtRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KEl0ZW1JRCA9PiAkUGFyYW1EYXRhe0l0ZW1JRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgICAgIGlmICghJUl0ZW1EYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIGR0bAogICAgICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGlzdG9yeScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVJdGVtRGF0YSB9LAogICAgICAgICk7CgogICAgICAgICRIZWFkZXJUaXRsZSA9ICdIaXN0b3J5JzsKICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgIG15IEBIaXN0b3J5ID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUhpc3RvcnlHZXQoSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9KX07CiAgICAgICAgZm9yZWFjaCBteSAkUm93IChASGlzdG9yeSkgewoKICAgICAgICAgICAgIyBjc3MgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZigkRnJvbnRlbmR7Q3NzUm93fSBlcSAnc2VhcmNocGFzc2l2ZScpIHsKICAgICAgICAgICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEZyb250ZW5ke05hbWV9ID0gJFJvdy0+e05hbWV9OwogICAgICAgICAgICAkRnJvbnRlbmR7Q3JlYXRlZH0gPSAkUm93LT57Q3JlYXRlZH07CiAgICAgICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFJvdy0+e0NyZWF0ZWRCeX0sCiAgICAgICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZyb250ZW5ke0NyZWF0ZWRCeX0gPSAiJFVzZXJ7VXNlckxvZ2lufSAoJFVzZXJ7VXNlckZpcnN0bmFtZX0gJFVzZXJ7VXNlckxhc3RuYW1lfSkiOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0hpc3RvcnlSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVGcm9udGVuZCB9CiAgICAgICAgICAgICk7CgogICAgICAgIH0KCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc3lzdGVtIGhpc3RvcnkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTeXN0ZW1IaXN0b3J5JykgewogICAgICAgICRTZWxmLT5HZXRTeXN0ZW1IaXN0b3J5KCk7CiAgICAgICAgJEhlYWRlclRpdGxlID0gJ0hpc3RvcnknOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaXRlbSBwcmludAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ByaW50JyAmJiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpKSB7CiAgICAgICAgJFNlbGYtPkdldEl0ZW1QcmludChMaW5rcyA9PiAxKTsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlcigKICAgICAgICAgICAgVGl0bGUgPT4gJFNlbGYtPntJdGVtRGF0YX17U3ViamVjdH0KICAgICAgICApOwogICAgICAgICROYXZpZ2F0aW9uID0gJyAnOwogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7JUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICAgICApOwogICAgICAgICRGb290ZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50Rm9vdGVyKCk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZXhwbG9yZXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdFeHBsb3JlcicpIHsKICAgICAgICAkU2VsZi0+R2V0RXhwbG9yZXIoTW9kZSA9PiAnQWdlbnQnKTsKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnRXhwbG9yZXInOwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICAgICAgKTsKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUScsCiAgICAgICAgICAgIERhdGEgPT4geyVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaXRlbSB2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnSXRlbUlEJykpIHsKICAgICAgICBpZigkU2VsZi0+e0xhc3RGQVFOYXZ9KSB7CiAgICAgICAgICAgICRTZWxmLT5HZXRJdGVtU21hbGxWaWV3KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbXkgJUZBUUFydGljbGUgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCgKICAgICAgICAgICAgICAgIEZBUUlEID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnSXRlbUlEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJFNlbGYtPntGQVFPYmplY3R9LT5DaGVja0NhdGVnb3J5VXNlclBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkRkFRQXJ0aWNsZXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRQZXJtaXNzaW9uIGVxICcnKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiUGVybWlzc2lvbiBkZW5pZWQhIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPkdldEl0ZW1WaWV3KAogICAgICAgICAgICAgICAgTGlua3MgPT4gMSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gJFBlcm1pc3Npb24sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRIZWFkZXJUaXRsZSA9ICRTZWxmLT57SXRlbURhdGF9e051bWJlcn07CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgICAgICBUaXRsZSA9PiAkSGVhZGVyVGl0bGUKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHJlZGlyZWN0IHRvIGV4cGxvcmVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CiAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXtOYXZ9KSkgewogICAgICAgICAgICAkUGFyYW17TmF2fSA9ICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249RXhwbG9yZXImTmF2PSIuJFBhcmFte05hdn0pOwogICAgfQoKICAgICMgREVGQVVMVCBPVVRQVVQKICAgICREZWZhdWx0SGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICBUaXRsZSA9PiAkSGVhZGVyVGl0bGUKICAgICk7CiAgICAkRGVmYXVsdE5hdmlnYXRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICREZWZhdWx0Q29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRGQVEnLAogICAgICAgIERhdGEgPT4geyVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICApOwogICAgJERlZmF1bHRGb290ZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcihUeXBlID0+ICRGb290ZXJUeXBlKTsKCiAgICAjIE9VVFBVVAogICAgJE91dHB1dCAuPSAkSGVhZGVyIHx8ICREZWZhdWx0SGVhZGVyOwogICAgJE91dHB1dCAuPSAkTmF2aWdhdGlvbiB8fCAkRGVmYXVsdE5hdmlnYXRpb247CiAgICBpZighJE5vdGlmeSkgewogICAgICAgIGZvcmVhY2ggbXkgJE5vdGlmeSAoQHskU2VsZi0+e05vdGlmeX19KSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAkTm90aWZ5LT5bMF0sCiAgICAgICAgICAgICAgICBJbmZvID0+ICROb3RpZnktPlsxXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICAkT3V0cHV0IC49ICRDb250ZW50IHx8ICREZWZhdWx0Q29udGVudDsKICAgICRPdXRwdXQgLj0gJEZvb3RlciB8fCAkRGVmYXVsdEZvb3RlcjsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyRkFRLnBtIC0gZmFxIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDdXN0b21lckZBUS5wbSx2IDEuNCAyMDA3LzAxLzE4IDE0OjExOjIwIHJrIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyRkFROwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CnVzZSBLZXJuZWw6Ok1vZHVsZXM6OkZBUTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjQgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCm91ciBASVNBID0gcXcoS2VybmVsOjpNb2R1bGVzOjpGQVEpOwoKIyAtLQpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBteSAkU2VsZiA9IG5ldyBLZXJuZWw6Ok1vZHVsZXM6OkZBUSglUGFyYW0pOwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBpbnRlcmZhY2Ugc2V0dGluZ3MKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICAkU2VsZi0+e0ludGVyZmFjZX0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lID0+ICdleHRlcm5hbCcKICAgICk7CiAgICAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgPT4gWydleHRlcm5hbCcsJ3B1YmxpYyddCiAgICApOwogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgIGZvcmVhY2ggKHF3KFVzZXJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKSBpZiAoISRTZWxmLT57JF99KTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KIyAtLQpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIFBhcmFtdGVyCiAgICBteSBAUGFyYW1zID0gKCk7CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15ICVGcm9udGVuZCA9ICgpOwoKICAgICMgT3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICBteSAkSGVhZGVyID0gJyc7CiAgICBteSAkSGVhZGVyVGl0bGUgPSAgJyc7CiAgICBteSAkSGVhZGVyVHlwZSA9ICAnJzsKICAgIG15ICROYXZpZ2F0aW9uID0gJyc7CiAgICBteSAkTm90aWZ5ID0gJyc7CiAgICBteSAkQ29udGVudCA9ICcnOwogICAgbXkgJEZvb3RlciA9ICcnOwogICAgbXkgJEZvb3RlclR5cGUgPSAgJyc7CgogICAgbXkgJERlZmF1bHRIZWFkZXIgPSAnJzsKICAgIG15ICREZWZhdWx0TmF2aWdhdGlvbiA9ICcnOwogICAgbXkgJERlZmF1bHRDb250ZW50ID0gJyc7CiAgICBteSAkRGVmYXVsdEZvb3RlciA9ICcnOwoKICAgICMgbmF2aWdhdGlvbiBPTi9PRkYKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBpZiAoJEdldFBhcmFte05hdn0pIHsKICAgICAgICAkSGVhZGVyVHlwZSA9ICdTbWFsbCc7CiAgICB9IGVsc2UgewogICAgICAgICRIZWFkZXJUeXBlID0gJyc7CiAgICB9CiAgICAjIHN0b3JlIG5hdiBwYXJhbQogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdMYXN0RkFRTmF2JywKICAgICAgICBWYWx1ZSA9PiAkSGVhZGVyVHlwZSwKICAgICk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZXhwbG9yZXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdFeHBsb3JlcicpIHsKICAgICAgICAkU2VsZi0+R2V0RXhwbG9yZXIoCiAgICAgICAgICAgIE1vZGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgICRIZWFkZXJUaXRsZSA9ICdFeHBsb3Jlcic7CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJEhlYWRlclR5cGUsCiAgICAgICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgICAgICk7CiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEnLAogICAgICAgICAgICBEYXRhID0+IHsgJUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICAgICApOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2VhcmNoIGEgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcpIHsKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnU2VhcmNoJzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+R2V0SXRlbVNlYXJjaCgKICAgICAgICAgICAgTW9kZSA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICk7CgogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7JUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICAgICApOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZG93bmxvYWQgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkJykgewogICAgICAgICMgZ2V0IHBhcmFtCiAgICAgICAgbXkgJEl0ZW1JRCAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpOwogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRJdGVtSUQpOwogICAgICAgIGlmICghJUl0ZW1EYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTm8gRkFRIGZvdW5kISIpOwogICAgICAgIH0KICAgICAgICBpZiAoJEl0ZW1EYXRhe1N0YXRlVHlwZU5hbWV9IGVxICdleHRlcm5hbCcgfHwgJEl0ZW1EYXRhe1N0YXRlVHlwZU5hbWV9IGVxICdwdWJsaWMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoJUl0ZW1EYXRhKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiUGVybWlzc2lvbiBkZW5pZWQhIik7CiAgICAgICAgfQogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaXRlbSBwcmludAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ByaW50JyAmJiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpKSB7CiAgICAgICAgJFNlbGYtPkdldEl0ZW1QcmludCgpOwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiAkU2VsZi0+e0l0ZW1EYXRhfXtTdWJqZWN0fQogICAgICAgICk7CiAgICAgICAgJE5hdmlnYXRpb24gPSAnICc7CiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEnLAogICAgICAgICAgICBEYXRhID0+IHslRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgICAgICk7CiAgICAgICAgJEZvb3RlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIHZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdJdGVtSUQnKSkgewogICAgICAgIG15ICVGQVFBcnRpY2xlID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgICAgIEZBUUlEID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnSXRlbUlEJyksCiAgICAgICAgKTsKICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2hlY2tDYXRlZ29yeUN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkRkFRQXJ0aWNsZXtDYXRlZ29yeUlEfSwKICAgICAgICApOwogICAgICAgIGlmICgkUGVybWlzc2lvbiBlcSAnJykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiUGVybWlzc2lvbiBkZW5pZWQhIik7CiAgICAgICAgfQogICAgICAgICRTZWxmLT5HZXRJdGVtVmlldygKICAgICAgICAgICAgTGlua3MgPT4gMSwKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAkUGVybWlzc2lvbiwKICAgICAgICApOwoKICAgICAgICAkSGVhZGVyVGl0bGUgPSAkU2VsZi0+e0l0ZW1EYXRhfXtOdW1iZXJ9OwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgICAgICBUaXRsZSA9PiAkSGVhZGVyVGl0bGUKICAgICAgICApOwogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7JUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHJlZGlyZWN0IHRvIGV4cGxvcmVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUV4cGxvcmVyIik7CiAgICB9CgogICAgIyBERUZBVUxUIE9VVFBVVAogICAgJERlZmF1bHRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVySGVhZGVyKAogICAgICAgIFR5cGUgPT4gJEhlYWRlclR5cGUsCiAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICApOwogICAgJERlZmF1bHROYXZpZ2F0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKICAgICREZWZhdWx0Q29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJGQVEnLAogICAgICAgIERhdGEgPT4geyAlRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgKTsKICAgICREZWZhdWx0Rm9vdGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRGb290ZXJUeXBlKTsKCiAgICAjIE9VVFBVVAogICAgJE91dHB1dCAuPSAkSGVhZGVyIHx8ICREZWZhdWx0SGVhZGVyOwogICAgJE91dHB1dCAuPSAkTmF2aWdhdGlvbiB8fCAkRGVmYXVsdE5hdmlnYXRpb247CiAgICBpZighJE5vdGlmeSkgewogICAgICAgIGZvcmVhY2ggbXkgJE5vdGlmeSAoQHskU2VsZi0+e05vdGlmeX19KSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAkTm90aWZ5LT5bMF0sCiAgICAgICAgICAgICAgICBJbmZvID0+ICROb3RpZnktPlsxXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICAkT3V0cHV0IC49ICRDb250ZW50IHx8ICREZWZhdWx0Q29udGVudDsKICAgICRPdXRwdXQgLj0gJEZvb3RlciB8fCAkRGVmYXVsdEZvb3RlcjsKCiAgICByZXR1cm4gJE91dHB1dDsKfQojIC0tCgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyRkFRLnBtIC0gZmFxIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBQdWJsaWNGQVEucG0sdiAxLjIgMjAwNi8xMC8yMCAxMjowNjozNyByayBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpQdWJsaWNGQVE7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkZBUTsKdXNlIEtlcm5lbDo6TW9kdWxlczo6RkFROwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMiAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKb3VyIEBJU0EgPSBxdyhLZXJuZWw6Ok1vZHVsZXM6OkZBUSk7CgojIC0tCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgIG15ICRTZWxmID0gbmV3IEtlcm5lbDo6TW9kdWxlczo6RkFRKCVQYXJhbSk7CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGludGVyZmFjZSBzZXR0aW5ncwogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgICRTZWxmLT57SW50ZXJmYWNlfSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlR2V0KAogICAgICAgIE5hbWUgPT4gJ3B1YmxpYycKICAgICk7CiAgICAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgPT4gWydwdWJsaWMnXQogICAgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBPcGplY3RzCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIikgaWYgKCEkU2VsZi0+eyRffSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CiMgLS0Kc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBQYXJhbXRlcgogICAgbXkgQFBhcmFtcyA9ICgpOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKCiAgICAjIE91dHB1dAogICAgbXkgJE91dHB1dCA9ICcnOwogICAgbXkgJEhlYWRlciA9ICcnOwogICAgbXkgJEhlYWRlclRpdGxlID0gICcnOwogICAgbXkgJEhlYWRlclR5cGUgPSAgJyc7CiAgICBteSAkTmF2aWdhdGlvbiA9ICcnOwogICAgbXkgJE5vdGlmeSA9ICcnOwogICAgbXkgJENvbnRlbnQgPSAnJzsKICAgIG15ICRGb290ZXIgPSAnJzsKICAgIG15ICRGb290ZXJUeXBlID0gICcnOwoKICAgIG15ICREZWZhdWx0SGVhZGVyID0gJyc7CiAgICBteSAkRGVmYXVsdE5hdmlnYXRpb24gPSAnJzsKICAgIG15ICREZWZhdWx0Q29udGVudCA9ICcnOwogICAgbXkgJERlZmF1bHRGb290ZXIgPSAnJzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBleHBsb3JlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cGxvcmVyJykgewogICAgICAgICRIZWFkZXJUaXRsZSA9ICdFeHBsb3Jlcic7CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJEhlYWRlclR5cGUsCiAgICAgICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkdldEV4cGxvcmVyKCk7CiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEnLAogICAgICAgICAgICBEYXRhID0+IHslRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2VhcmNoIGEgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcpIHsKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnU2VhcmNoJzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+R2V0SXRlbVNlYXJjaCgpOwogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7JUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICAgICApOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZG93bmxvYWQgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkJykgewogICAgICAgICMgZ2V0IHBhcmFtCiAgICAgICAgbXkgJEl0ZW1JRCAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpOwogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRJdGVtSUQpOwogICAgICAgIGlmICghJUl0ZW1EYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTm8gRkFRIGZvdW5kISIpOwogICAgICAgIH0KICAgICAgICBpZiAoJEl0ZW1EYXRhe1N0YXRlVHlwZU5hbWV9IGVxICdwdWJsaWMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoJUl0ZW1EYXRhKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiUGVybWlzc2lvbiBkZW5pZWQhIik7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gcHJpbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdQcmludCcgJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdJdGVtSUQnKSkgewogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiAkU2VsZi0+e0l0ZW1EYXRhfXtTdWJqZWN0fQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkdldEl0ZW1QcmludCgpOwogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKICAgICAgICAkRm9vdGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpKSB7CiAgICAgICAgJFNlbGYtPkdldEl0ZW1WaWV3KCk7CiAgICAgICAgJEhlYWRlclRpdGxlID0gJFNlbGYtPntJdGVtRGF0YX17TnVtYmVyfTsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICAgICAgVGl0bGUgPT4gJEhlYWRlclRpdGxlCiAgICAgICAgKTsKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0ZBUScsCiAgICAgICAgICAgIERhdGEgPT4geyVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyByZWRpcmVjdCB0byBleHBsb3JlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FeHBsb3JlciIpOwogICAgfQoKICAgICMgREVGQVVMVCBPVVRQVVQKICAgICREZWZhdWx0SGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlcigKICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZQogICAgKTsKCiAgICAkRGVmYXVsdENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1B1YmxpY0ZBUScsCiAgICAgICAgRGF0YSA9PiB7ICVGcm9udGVuZCAsICVHZXRQYXJhbSB9CiAgICApOwogICAgJERlZmF1bHRGb290ZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJEZvb3RlclR5cGUpOwoKICAgICMgT1VUUFVUCiAgICAkT3V0cHV0IC49ICRIZWFkZXIgfHwgJERlZmF1bHRIZWFkZXI7CiAgICBpZighJE5vdGlmeSkgewogICAgICAgIGZvcmVhY2ggbXkgJE5vdGlmeSAoQHskU2VsZi0+e05vdGlmeX19KSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAkTm90aWZ5LT5bMF0sCiAgICAgICAgICAgICAgICBJbmZvID0+ICROb3RpZnktPlsxXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICAkT3V0cHV0IC49ICRDb250ZW50IHx8ICREZWZhdWx0Q29udGVudDsKICAgICRPdXRwdXQgLj0gJEZvb3RlciB8fCAkRGVmYXVsdEZvb3RlcjsKCiAgICByZXR1cm4gJE91dHB1dDsKfQojIC0tCgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRGQVEucG0gLSBwcm92aWRlcyBnZW5lcmljIGFnZW50IEhUTUwgb3V0cHV0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExheW91dEZBUS5wbSx2IDEuMiAyMDA3LzA3LzAzIDE0OjAyOjQ2IHJrIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0RkFROwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBBZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbiB7CgogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJE91dHB1dCA9ICcnOwogICAgbXkgJFNpemUgPSBkZWZpbmVkKCRQYXJhbXtTaXplfSkgPyAic2l6ZT0nJFBhcmFte1NpemV9JyIgOiAnJzsKICAgIG15ICRNYXhMZXZlbCA9IGRlZmluZWQoJFBhcmFte01heExldmVsfSkgPyAkUGFyYW17TWF4TGV2ZWx9IDogMTA7CiAgICBteSAkU2VsZWN0ZWQgPSBkZWZpbmVkKCRQYXJhbXtTZWxlY3RlZH0pID8gJFBhcmFte1NlbGVjdGVkfSA6ICcnOwogICAgbXkgJFNlbGVjdGVkSURzID0gJFBhcmFte1NlbGVjdGVkSURzfSB8fCBbXTsKICAgIG15ICRTZWxlY3RlZElEID0gZGVmaW5lZCgkUGFyYW17U2VsZWN0ZWRJRH0pID8gJFBhcmFte1NlbGVjdGVkSUR9IDogJyc7CiAgICBteSAkTXVsdGlwbGUgPSAkUGFyYW17TXVsdGlwbGV9ID8gJ211bHRpcGxlJyA6ICcnOwogICAgbXkgJE9uQ2hhbmdlU3VibWl0ID0gZGVmaW5lZCgkUGFyYW17T25DaGFuZ2VTdWJtaXR9KSA/ICRQYXJhbXtPbkNoYW5nZVN1Ym1pdH0gOiAnJzsKICAgIGlmICgkT25DaGFuZ2VTdWJtaXQpIHsKICAgICAgICAkT25DaGFuZ2VTdWJtaXQgPSAiIG9uY2hhbmdlPVwic3VibWl0KClcIiI7CiAgICB9CiAgICBpZiAoJFBhcmFte09uQ2hhbmdlfSkgewogICAgICAgICRPbkNoYW5nZVN1Ym1pdCA9ICIgb25jaGFuZ2U9XCIkUGFyYW17T25DaGFuZ2V9XCIiOwogICAgfQoKICAgIGlmIChkZWZpbmVkKCRQYXJhbXtTZWxlY3RlZElEfSkpIHsKICAgICAgICAkU2VsZWN0ZWRJRHMgPSBbJFNlbGVjdGVkSURdOwogICAgfQoKICAgIG15ICVDYXRlZ29yeUxpc3QgPSAleyRQYXJhbXtDYXRlZ29yeUxpc3R9fTsKICAgICNpZiAoISgkUGFyYW17Q2F0ZWdvcnlMaXN0fSAmJiByZWYoJFBhcmFte0NhdGVnb3J5TGlzdH0pIGVxICdIQVNIJyAmJiAleyRQYXJhbXtDYXRlZ29yeUxpc3R9fSkpIHsKICAgICMgICAgcmV0dXJuICRTZWxmLT5GYXRhbEVycm9yKAogICAgIyAgICAgICAgTWVzc2FnZSA9PiAnTmVlZCBDYXRlZ29yeUxpc3QgYXMgaGFzaCByZWYgJwogICAgIyAgICApOwogICAgI30KCiAgICAjIGJ1aWxkIHRyZWUgbGlzdAogICAgJE91dHB1dCAuPSAnPHNlbGVjdCBuYW1lPSInLiRQYXJhbXtOYW1lfS4iXCIgJFNpemUgJE11bHRpcGxlICRPbkNoYW5nZVN1Ym1pdD4iOwoKICAgIGlmKCRQYXJhbXtSb290RWxlbWVudH0pIHsKICAgICAgICAkT3V0cHV0IC49ICc8b3B0aW9uIHZhbHVlPSIwIj4tPC9vcHRpb24+JzsKICAgIH0KCiAgICBpZiAoJFBhcmFte0NhdGVnb3J5TGlzdH0gJiYgcmVmKCRQYXJhbXtDYXRlZ29yeUxpc3R9KSBlcSAnSEFTSCcgJiYgJXskUGFyYW17Q2F0ZWdvcnlMaXN0fX0pIHsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbkVsZW1lbnQoCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiBcJUNhdGVnb3J5TGlzdCwKICAgICAgICAgICAgTGV2ZWxDb3VudGVyID0+IDAsCiAgICAgICAgICAgIFBhcmVudElEID0+IDAsCiAgICAgICAgICAgIFNlbGVjdGVkSURzID0+ICRTZWxlY3RlZElEcwogICAgICAgICk7CiAgICB9CiAgICAkT3V0cHV0IC49ICc8L3NlbGVjdD4nOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgQWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb25FbGVtZW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRPdXRwdXQgPSAnJzsKCiAgICBteSAlQ2F0ZWdvcnlMaXN0ID0gJXsgJFBhcmFte0NhdGVnb3J5TGlzdH0gfTsKICAgIG15ICVDYXRlZ29yeUxldmVsTGlzdCA9ICUgeyAkQ2F0ZWdvcnlMaXN0eyRQYXJhbXtQYXJlbnRJRH19fTsKICAgIG15IEBTZWxlY3RlZElEcyA9IEB7JFBhcmFte1NlbGVjdGVkSURzfX07CiAgICBteSAkRmxhZyA9IDA7CgogICAgZm9yZWFjaCBteSAkQ2F0ZWdvcnlJRCAoc29ydCggeyAkQ2F0ZWdvcnlMZXZlbExpc3R7JGF9IGNtcCAkQ2F0ZWdvcnlMZXZlbExpc3R7JGJ9IH0ga2V5cyglQ2F0ZWdvcnlMZXZlbExpc3QpKSkgewogICAgICAgICRPdXRwdXQgLj0gJzxvcHRpb24gdmFsdWU9IicuJENhdGVnb3J5SUQuJyInOwogICAgICAgIGZvcihteSAkaT0wOyRpPEBTZWxlY3RlZElEczskaSsrKSB7CiAgICAgICAgICAgIGlmKCRQYXJhbXtTZWxlY3RlZElEc31bJGldIGVxICRDYXRlZ29yeUlEKSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICcgc2VsZWN0ZWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJz4nOwogICAgICAgIGZvcihteSAkaT0wOyRpPCRQYXJhbXtMZXZlbENvdW50ZXJ9OyRpKyspIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAnJm5ic3A7Jm5ic3A7JzsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkQ2F0ZWdvcnlMZXZlbExpc3R7JENhdGVnb3J5SUR9OwogICAgICAgICRPdXRwdXQgLj0gJzwvb3B0aW9uPic7CiAgICAgICAgaWYoZXhpc3RzKCRDYXRlZ29yeUxpc3R7JENhdGVnb3J5SUR9KSkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbkVsZW1lbnQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4gXCVDYXRlZ29yeUxpc3QsCiAgICAgICAgICAgICAgICBMZXZlbENvdW50ZXIgPT4gJFBhcmFte0xldmVsQ291bnRlcn0rMSwKICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRHMgPT4gXEBTZWxlY3RlZElEcwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgR2V0RkFRSXRlbVZvdGluZ1JhdGVDb2xvciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgaWYgKCEkUGFyYW17UmF0ZX0pIHsKICAgICAgICByZXR1cm4gJFNlbGYtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05lZWQgcmF0ZSEnCiAgICAgICAgKTsKICAgIH0KICAgIG15ICRDc3NUbXAgPSAnJzsKICAgIG15ICVWb3RpbmdSZXN1bHRDb2xvcnMgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpJdGVtTGlzdDo6Vm90aW5nUmVzdWx0Q29sb3JzJyl9OwogICAgZm9yZWFjaCBteSAkS2V5IChzb3J0KCB7ICRiIDw9PiAkYSB9IGtleXMoJVZvdGluZ1Jlc3VsdENvbG9ycykpKSB7CiAgICAgICAgaWYoJFBhcmFte1JhdGV9IDw9ICRLZXkpIHsKICAgICAgICAgICAgJENzc1RtcCA9ICRWb3RpbmdSZXN1bHRDb2xvcnN7JEtleX07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRDc3NUbXA7Cn0KCjE7Cg==
IyAtLQojIEZBUS5kdGwgLSBwcm92aWRlcyBIVE1MIHZpZXcgZm9yIGZhcSBhcnRpY2xlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRkFRLmR0bCx2IDEuOCAyMDA4LzAzLzE5IDEwOjU0OjU3IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgoKPCEtLSBkdGw6YmxvY2s6VmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJWaWV3In06ICRDb25maWd7IkZBUTo6RkFRSG9vayJ9ICRRRGF0YXsiTnVtYmVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSI+JFRleHR7IkJhY2sifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1QcmludCZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0mSXRlbUlEPSREYXRheyJJdGVtSUQifSIgdGFyZ2V0PSJwcmludCI+JFRleHR7IlByaW50In08L2E+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgY2xhc3M9Im1lbnUiPgoKICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9Ijc1JSIgY2xhc3M9Im1haW5ib2R5Ij4KCjwhLS0gZHRsOmJsb2NrOkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQgLS0+CiAgICAgICRDb25maWd7IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciJ9IDxiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSI+JFFEYXRheyJOYW1lIn08L2E+PC9iPgo8IS0tIGR0bDpibG9jazpGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IC0tPgoKICAgICAgPGgxPiRRRGF0YXsiVGl0bGUifTwvaDE+CgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtVmlld0F0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB2YWxpZ249InRvcCI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Eb3dubG9hZCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbVZpZXdBdHRhY2htZW50IC0tPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyNSUiIGNsYXNzPSJjb250ZW50a2V5IiB2YWxpZ249InRvcCI+JFRleHR7IiREYXRheyJDYXB0aW9uIn0ifTogIDxicj4gPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IiREYXRheyJTdGF0ZU5hbWUifSJ9KTwvaT48L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWx1ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KCiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSIzNSUiIGNsYXNzPSJtZW51Ij4KCiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9Ijk1JSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0ZWdvcnkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IkNhdGVnb3J5TmFtZSJ9Ij4kUURhdGF7IkNhdGVnb3J5TmFtZSIsIjMwIn08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3RhdGUifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlN0YXRlIn0iPiRRRGF0YXsiU3RhdGUifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiTGFuZ3VhZ2UifSI+JFFEYXRheyJMYW5ndWFnZSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IktleXdvcmRzIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJLZXl3b3JkcyJ9Ij4kUURhdGF7IktleXdvcmRzIiwiNDAifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXN1bHQifTo8L3RkPgogICAgICAgICAgPHRkIHN0eWxlPSIkRGF0YXsiQ3NzQ29sdW1uVm90aW5nUmVzdWx0In0iPiAkUURhdGF7IlJlc3VsdCJ9ICYjMzc7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZvdGVzIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJWb3RlcyJ9PC90ZD4KICAgICAgICA8L3RyPgoKICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUXVvdGV7IiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2hhbmdlZCJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUXVvdGV7IiRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZWQifSJ9In08L3RkPgogICAgICAgIDwvdHI+CgogICAgICA8L3RhYmxlPgoKPCEtLSBkdGw6YmxvY2s6Vm90ZUZvcm0gLS0+CiAgICAgIDxoMz4kVGV4dHsiJENvbmZpZ3siRkFROjpJdGVtOjpWb3Rpbmc6OlF1ZXN0aW9uTGFuZ0tleSJ9In08L2gzPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9InNwZWxsaW5nIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgogICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpWb3RpbmdSYXRlUm93IC0tPgogICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJSYXRlIiB2YWx1ZT0iJFFEYXRheyJWYWx1ZSJ9Ij48YnI+ICRRRGF0YXsiVGl0bGUifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlZvdGluZ1JhdGVSb3cgLS0+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CgogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgY2xhc3M9ImJ1dHRvbiI+CgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWb3RlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDYXRlZ29yeUlEIiB2YWx1ZT0iJERhdGF7IkNhdGVnb3J5SUQifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iJERhdGF7Ikl0ZW1JRCJ9Ij4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpWb3RlRm9ybSAtLT4KCiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlZpZXcgLS0+CgoKCgoKCgoKCgo8IS0tIGR0bDpibG9jazpQcmludCAtLT4KCjxoMT4kRGF0YXsiVGl0bGUifTwvaDE+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJENvbmZpZ3siRkFROjpGQVFIb29rIn06ICRRRGF0YXsiTnVtYmVyIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0ZWdvcnkifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFF1b3RleyIkRGF0YXsiQ2F0ZWdvcnlOYW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUXVvdGV7IiREYXRheyJTdGF0ZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGFuZ3VhZ2UifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFF1b3RleyIkRGF0YXsiTGFuZ3VhZ2UifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IktleXdvcmRzIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRdW90ZXsiJERhdGF7IktleXdvcmRzIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWb3RlcyJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IlZvdGVzIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzdWx0In06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiUmVzdWx0In0gJiMzNzs8L3RkPgogICAgICAgIDwvdHI+CgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhc3QgdXBkYXRlIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRdW90ZXsiJFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlZCJ9In0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGhyPjwvdGQ+CiAgICAgICAgPC90cj4KCjwhLS0gZHRsOmJsb2NrOkZBUUl0ZW1GaWVsZCAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiQ2FwdGlvbiJ9In06ICA8YnI+IDxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiU3RhdGVOYW1lIn0ifTwvaT4pIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlZhbHVlIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxocj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZBUUl0ZW1GaWVsZCAtLT4KCiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByaW50IC0tPgoKCgoKCgoKCjwhLS0gZHRsOmJsb2NrOlNlYXJjaCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZWFyY2gifTogJENvbmZpZ3siRkFROjpGQVFIb29rIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgIDx0YWJsZSB3aWR0aD0iNjAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3VibWl0IiB2YWx1ZT0ieWVzIj4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjI1JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOdW1iZXIifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTnVtYmVyIiB2YWx1ZT0iJFFEYXRheyJOdW1iZXIifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiVGl0bGUifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGdWxsdGV4dCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXaGF0IiB2YWx1ZT0iJFFEYXRheyJXaGF0In0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiS2V5d29yZCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJLZXl3b3JkIiB2YWx1ZT0iJFFEYXRheyJLZXl3b3JkIn0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhbmd1YWdlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiTGFuZ3VhZ2VPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRlZ29yeSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNhdGVnb3J5T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4gPGlucHV0IGFjY2Vzc2tleT0iZyIgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNlYXJjaCJ9Ij48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoIC0tPgoKCgoKCgo8IS0tIGR0bDpibG9jazpTZWFyY2hSZXN1bHQgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU2VhcmNoIn06ICRDb25maWd7IkZBUTo6RkFRSG9vayJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kQ29uZmlneyJGQVE6OkZBUUhvb2sifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGVnb3J5In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGFuZ3VhZ2UifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNoYW5nZWQifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoUmVzdWx0Um93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9Jkl0ZW1JRD0kUURhdGF7Ikl0ZW1JRCJ9Ij4kUURhdGF7Ik51bWJlciJ9PC9hPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iPiRRRGF0YXsiVGl0bGUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iPiRRRGF0YXsiQ2F0ZWdvcnlOYW1lIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij4kUURhdGF7Ikxhbmd1YWdlIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij4kUURhdGF7IlN0YXRlIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij4oJFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlZCJ9In0pPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZWFyY2hSZXN1bHRSb3cgLS0+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaFJlc3VsdCAtLT4KCgoKCgoKCgo8IS0tIGR0bDpibG9jazpFeHBsb3Jlci0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkV4cGxvcmVyIn06ICRDb25maWd7IkZBUTo6RkFRSG9vayJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJtZW51Ij4KPCEtLTxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuVmlldyJ9Ij4kVGV4dHsiQmFjayJ9PC9hPi0tPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iMzUlIiBjbGFzcz0ibWVudSI+CiAgICAgICZuYnNwOwogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgoKCjwhLS0gZHRsOmJsb2NrOkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQgLS0+CiAgICAgICRDb25maWd7IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciJ9IDxiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPSRFbnZ7IlN1YmFjdGlvbiJ9JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSI+JFFEYXRheyJOYW1lIn08L2E+PC9iPgo8IS0tIGR0bDpibG9jazpGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IC0tPgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJUaXRsZSAtLT4KICAgICAgPGgxPiRRRGF0YXsiTmFtZSJ9PC9oMT4KICAgICAgPHA+JFFEYXRheyJDb21tZW50In08L3A+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyVGl0bGUgLS0+CgoKCjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyQ2F0ZWdvcnlMaXN0IC0tPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8Y29sZ3JvdXA+PGNvbCB3aWR0aD0iMTUiIC8+PGNvbCB3aWR0aD0iKiIgLz48Y29sIHdpZHRoPSIxMDAiIC8+PGNvbCB3aWR0aD0iMTAwIiAvPjwvY29sZ3JvdXA+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGNvbHNwYW49IjIiPgogICAgICAgICAgICAkVGV4dHsiTmFtZSJ9IC8KICAgICAgICAgICAgJFRleHR7IkNvbW1lbnQifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICRUZXh0eyJTdWJDYXRlZ29yaWVzIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAkVGV4dHsiQXJ0aWNsZSJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyQ2F0ZWdvcnlSb3cgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iJEVudnsiSW1hZ2VzIn0kQ29uZmlneyJGQVE6OkNhdGVnb3J5OjpJY29uIn0iPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iPgogICAgICAgICAgICA8Yj48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj0kRW52eyJTdWJhY3Rpb24ifSZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4kUURhdGF7Ik5hbWUifTwvYT48L2I+CiAgICAgICAgICAgIDxicj4kUURhdGF7IkNvbW1lbnQifSZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+CiAgICAgICAgICAgICRRRGF0YXsiQ2F0ZWdvcnlOdW1iZXIifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+CiAgICAgICAgICAgICRRRGF0YXsiQXJ0aWNsZU51bWJlciJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyQ2F0ZWdvcnlSb3cgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyQ2F0ZWdvcnlMaXN0IC0tPgoKICAgICAgPGJyPgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJGQVFJdGVtTGlzdCAtLT4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAkVGV4dHsiVGl0bGUifQogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Jk9yZGVyPVRpdGxlJlNvcnQ9dXAiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+Jm5ic3A7LwogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Jk9yZGVyPVRpdGxlJlNvcnQ9ZG93biI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgJFRleHR7Ikxhbmd1YWdlIn0KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwbG9yZXImQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZPcmRlcj1MYW5ndWFnZSZTb3J0PXVwIj48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiZuYnNwOy8KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwbG9yZXImQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZPcmRlcj1MYW5ndWFnZSZTb3J0PWRvd24iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICRUZXh0eyJTdGF0ZSJ9CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JFFEYXRheyJDYXRlZ29yeUlEIn0mT3JkZXI9U3RhdGUmU29ydD11cCI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4mbmJzcDsvCiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JFFEYXRheyJDYXRlZ29yeUlEIn0mT3JkZXI9U3RhdGUmU29ydD1kb3duIj48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAkVGV4dHsiUmVzdWx0In0gKCYjMzc7KQogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Jk9yZGVyPVJlc3VsdCZTb3J0PXVwIj48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiZuYnNwOy8KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwbG9yZXImQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZPcmRlcj1SZXN1bHQmU29ydD1kb3duIj48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAkVGV4dHsiVm90ZXMifQogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FeHBsb3JlciZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0mT3JkZXI9Vm90ZXMmU29ydD11cCI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4mbmJzcDsvCiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZPcmRlcj1Wb3RlcyZTb3J0PWRvd24iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJGQVFJdGVtUm93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc1JvdyJ9Ij48aW1nIHNyYz0iJEVudnsiSW1hZ2VzIn0kQ29uZmlneyJGQVE6Okl0ZW06Okljb24ifSIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsiPiZuYnNwOzxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSIgdGl0bGU9IiRRRGF0YXsiVGl0bGUifSI+JFFEYXRheyJUaXRsZSIsIjYwIn08L2E+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+JFFEYXRheyJMYW5ndWFnZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSI+JFFEYXRheyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NSb3cifSIgc3R5bGU9IiREYXRheyJDc3NDb2x1bW5Wb3RpbmdSZXN1bHQifSI+JFFEYXRheyJSZXN1bHQifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzUm93In0iPiRRRGF0YXsiVm90ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJGQVFJdGVtUm93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJGQVFJdGVtTGlzdCAtLT4KCgoKCgogICAgPC90ZD4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJRdWlja1NlYXJjaCAtLT4KICAgICAgPGgzPiRUZXh0eyJRdWlja1NlYXJjaCJ9PC9oMz4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiIHN0eWxlPSJtYXJnaW46MHB4O3BhZGRpbmc6MHB4OyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3VibWl0IiB2YWx1ZT0ieWVzIj4KCjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyUXVpY2tTZWFyY2hDYXRlZ29yeSAtLT4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDYXRlZ29yeUlEcyIgdmFsdWU9IiREYXRheyJDYXRlZ29yeUlEIn0iPgo8IS0tIGR0bDpibG9jazpFeHBsb3JlclF1aWNrU2VhcmNoQ2F0ZWdvcnkgLS0+CgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlF1aWNrU2VhcmNoIiB2YWx1ZT0iMSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2F0ZWdvcnlJRHMiIHZhbHVlPSIkRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iV2hhdCIgdmFsdWU9IiRRRGF0YXsiV2hhdCJ9IiBzaXplPSIzMCIgbWF4bGVuZ3RoPSI1MCI+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWFyY2gifSI+PGJyPgogICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNlYXJjaCI+JFRleHR7IkRldGFpbFNlYXJjaCJ9PC9hPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyUXVpY2tTZWFyY2ggLS0+CgoKPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJMYXRlc3RDcmVhdGUgLS0+CiAgICAgIDxoMz4kVGV4dHsiTGF0ZXN0Q3JlYXRlZEl0ZW1zIn08L2gzPgogICAgICA8dGFibGU+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyTGF0ZXN0Q3JlYXRlRkFRSXRlbVJvdyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIkRW52eyJJbWFnZXMifSRDb25maWd7IkZBUTo6SXRlbTo6SWNvbiJ9Ij48L3RkPgogICAgICAgICAgPHRkPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSIgdGl0bGU9IiRRRGF0YXsiVGl0bGUifSAoJFFEYXRheyJDYXRlZ29yeU5hbWUifSkiPiRRRGF0YXsiVGl0bGUiLCI0MCJ9ICgkUURhdGF7IkNhdGVnb3J5TmFtZSIsIjQwIn0pPC9hPgogICAgICAgICAgICA8YnIvPgogICAgICAgICAgICA8aSBjbGFzcz0ic21hbGwiPigkUURhdGF7Ikxhbmd1YWdlIn0pICRUaW1lU2hvcnR7IiREYXRheyJDcmVhdGVkIn0ifTwvaT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJMYXRlc3RDcmVhdGVGQVFJdGVtUm93IC0tPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpFeHBsb3JlckxhdGVzdENyZWF0ZSAtLT4KCgo8IS0tIGR0bDpibG9jazpFeHBsb3JlckxhdGVzdENoYW5nZSAtLT4KICAgICAgPGgzPiRUZXh0eyJMYXRlc3RDaGFuZ2VkSXRlbXMifTwvaDM+CiAgICAgIDx0YWJsZT4KPCEtLSBkdGw6YmxvY2s6RXhwbG9yZXJMYXRlc3RDaGFuZ2VGQVFJdGVtUm93IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9JENvbmZpZ3siRkFROjpJdGVtOjpJY29uIn0iPjwvdGQ+CiAgICAgICAgICA8dGQ+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDYXRlZ29yeUlEPSRRRGF0YXsiQ2F0ZWdvcnlJRCJ9Jkl0ZW1JRD0kUURhdGF7Ikl0ZW1JRCJ9IiB0aXRsZT0iJFFEYXRheyJUaXRsZSJ9ICgkUURhdGF7IkNhdGVnb3J5TmFtZSJ9KSI+JFFEYXRheyJUaXRsZSIsIjQwIn0gKCRRRGF0YXsiQ2F0ZWdvcnlOYW1lIiwiNDAifSk8L2E+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgIDxpIGNsYXNzPSJzbWFsbCI+KCRRRGF0YXsiTGFuZ3VhZ2UifSkgJFRpbWVTaG9ydHsiJERhdGF7IkNoYW5nZWQifSJ9PC9pPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpFeHBsb3JlckxhdGVzdENoYW5nZUZBUUl0ZW1Sb3cgLS0+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyTGF0ZXN0Q2hhbmdlIC0tPgoKCiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkV4cGxvcmVyIC0tPgo=
IyAtLQojIEFnZW50RkFRLmR0bCAtIHByb3ZpZGVzIEhUTUwgdmlldyBmb3IgZmFxIGFydGljbGVzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudEZBUS5kdGwsdiAxLjE0IDIwMDgvMDMvMTkgMTA6NTQ6NTcgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOlZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVmlldyJ9OiAkQ29uZmlneyJGQVE6OkZBUUhvb2sifSAkUURhdGF7Ik51bWJlciJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0iPiRUZXh0eyJCYWNrIn08L2E+IC0KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbVZpZXdMaW5rVXBkYXRlIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1VcGRhdGUmQ2F0ZWdvcnlJRD0kRGF0YXsiQ2F0ZWdvcnlJRCJ9Jkl0ZW1JRD0kRGF0YXsiSXRlbUlEIn0iPiRUZXh0eyJFZGl0In08L2E+IC0KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbVZpZXdMaW5rVXBkYXRlIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1IaXN0b3J5JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JERhdGF7Ikl0ZW1JRCJ9Ij4kVGV4dHsiSGlzdG9yeSJ9PC9hPiAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByaW50JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JERhdGF7Ikl0ZW1JRCJ9IiB0YXJnZXQ9InByaW50Ij4kVGV4dHsiUHJpbnQifTwvYT4KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbVZpZXdMaW5rRGVsZXRlIC0tPgogICAgICAtIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRMaW5rT2JqZWN0JlNvdXJjZU9iamVjdD1GQVEmQ2F0ZWdvcnlJRD0kRGF0YXsiQ2F0ZWdvcnlJRCJ9JlNvdXJjZUlEPSREYXRheyJJdGVtSUQifSI+JFRleHR7IkxpbmsifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1EZWxldGUmQ2F0ZWdvcnlJRD0kRGF0YXsiQ2F0ZWdvcnlJRCJ9Jkl0ZW1JRD0kRGF0YXsiSXRlbUlEIn0iPiRUZXh0eyJEZWxldGUifTwvYT4KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbVZpZXdMaW5rRGVsZXRlIC0tPgogICAgPC90ZD4KICAgIDx0ZCBhbGlnbj0icmlnaHQiIGNsYXNzPSJtZW51Ij4KCiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJtYWluYm9keSI+CgoKPCEtLSBkdGw6YmxvY2s6RkFRUGF0aENhdGVnb3J5RWxlbWVudCAtLT4KICAgICAgJENvbmZpZ3siRkFROjpFeHBsb3Jlcjo6UGF0aDo6U2VwZXJhdG9yIn0gPGI+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RXhwbG9yZXImQ2F0ZWdvcnlJRD0kRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4kUURhdGF7Ik5hbWUifTwvYT48L2I+CjwhLS0gZHRsOmJsb2NrOkZBUVBhdGhDYXRlZ29yeUVsZW1lbnQgLS0+Cgo8IS0tIGR0bDpibG9jazpGQVFQYXRoSXRlbUVsZW1lbnQgLS0+CiAgICAgICRDb25maWd7IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciJ9IDxiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJUaXRsZSJ9PC9hPjwvYj4KPCEtLSBkdGw6YmxvY2s6RkFRUGF0aEl0ZW1FbGVtZW50IC0tPgoKCiAgICAgIDxoMT4kUURhdGF7IlRpdGxlIn08L2gxPgoKICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbVZpZXdBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Eb3dubG9hZCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbVZpZXdBdHRhY2htZW50IC0tPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyNSUiIGNsYXNzPSJjb250ZW50a2V5IiB2YWxpZ249InRvcCI+JFRleHR7IiREYXRheyJDYXB0aW9uIn0ifTogIDxicj4gPGkgY2xhc3M9InNtYWxsIj4oJFRleHR7IiREYXRheyJTdGF0ZU5hbWUifSJ9KTwvaT48L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWx1ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KCiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSIzNSUiIGNsYXNzPSJtZW51Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iOTUlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRlZ29yeSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2F0ZWdvcnlOYW1lIn0iPiRRRGF0YXsiQ2F0ZWdvcnlOYW1lIiwiMjUifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiU3RhdGUifSI+JFFEYXRheyJTdGF0ZSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhbmd1YWdlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJMYW5ndWFnZSJ9Ij4kUURhdGF7Ikxhbmd1YWdlIn08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiS2V5d29yZHMifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IktleXdvcmRzIn0iPiRRRGF0YXsiS2V5d29yZHMiLCIzMCJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3VsdCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9IiREYXRheyJDc3NDb2x1bW5Wb3RpbmdSZXN1bHQifSI+ICRRRGF0YXsiUmVzdWx0In0gJiMzNzs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVm90ZXMifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IlZvdGVzIn08L3RkPgogICAgICAgIDwvdHI+CgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KCiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0gKCREYXRheyJDcmVhdGVkQnlMb2dpbiJ9KTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDaGFuZ2VkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDaGFuZ2VkIn0ifSAoJERhdGF7IkNoYW5nZWRCeUxvZ2luIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDxicj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiMgb2JqZWN0IGxpbmtzCiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGlua2VkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48L3RkPgogICAgICAgIDwvdHI+Cgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7Jm5ic3A7JFRleHR7IiRRRGF0YXsiTGlua1R5cGUifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtJdGVtIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkZyb250ZW5kRGVzdCJ9JFFEYXRheyJJRCJ9IiB0aXRsZT0iJFFEYXRheyJPYmplY3QifTogJFFEYXRheyJOdW1iZXIifSAkUURhdGF7IlRpdGxlIn0iICREYXRheyJDc3MifT4kUURhdGF7IlRleHQifTwvYT4KPCEtLSBkdGw6YmxvY2s6TGlua0l0ZW0gLS0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CgogICAgICA8L3RhYmxlPgoKPCEtLSBkdGw6YmxvY2s6Vm90ZUZvcm0gLS0+CiAgICAgIDxoMz4kVGV4dHsiJENvbmZpZ3siRkFROjpJdGVtOjpWb3Rpbmc6OlF1ZXN0aW9uTGFuZ0tleSJ9In08L2gzPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9InNwZWxsaW5nIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgogICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpWb3RpbmdSYXRlUm93IC0tPgogICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJSYXRlIiB2YWx1ZT0iJFFEYXRheyJWYWx1ZSJ9Ij48YnI+ICRRRGF0YXsiVGl0bGUifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlZvdGluZ1JhdGVSb3cgLS0+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CgogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgY2xhc3M9ImJ1dHRvbiI+CgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50RkFRIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWb3RlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDYXRlZ29yeUlEIiB2YWx1ZT0iJERhdGF7IkNhdGVnb3J5SUQifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iJERhdGF7Ikl0ZW1JRCJ9Ij4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpWb3RlRm9ybSAtLT4KCiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlZpZXcgLS0+CgoKCjwhLS0gZHRsOmJsb2NrOlZpZXdTbWFsbCAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQoKZnVuY3Rpb24gdXBkYXRlTWVzc2FnZSgpCnsKICAgIGlmIChwYXJlbnQub3BlbmVyLmNsb3NlZCkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaGUgbWVzc2FnZSBiZWluZyBjb21wb3NlZCBoYXMgYmVlbiBjbG9zZWQuICBFeGl0aW5nLiJ9Jyk7CiAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIXBhcmVudC5vcGVuZXIuZG9jdW1lbnQuY29tcG9zZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaGlzIHdpbmRvdyBtdXN0IGJlIGNhbGxlZCBmcm9tIGNvbXBvc2Ugd2luZG93In0nKTsKICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIGNvcHkgc3ViamVjdCAqLwogICAgcGFyZW50Lm9wZW5lci5kb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPSBkb2N1bWVudC5zcGVsbGluZy5UaXRsZS52YWx1ZTsKCiAgICAvKiBjcmVhdGUgc2hvcnQgYWxpYXMgKi8KICAgIHZhciBpbnB1dCA9IHBhcmVudC5vcGVuZXIuZG9jdW1lbnQuY29tcG9zZS5Cb2R5OwoKICAgIC8qIGZvY3VzIG9yaWcgaW5wdXQgZmllbGQgKi8KICAgIGlucHV0LmZvY3VzKCk7CgogICAgLyogSUUgKi8KICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuc2VsZWN0aW9uICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdmFyIHJhbmdlID0gcGFyZW50Lm9wZW5lci5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKICAgICAgICB2YXIgaW5zVGV4dCA9IHJhbmdlLnRleHQ7CiAgICAgICAgcmFuZ2UudGV4dCA9IGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgKyBpbnNUZXh0OwogICAgICAgIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgcmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBkb2N1bWVudC5zcGVsbGluZy5Cb2R5LnZhbHVlLmxlbmd0aCArIGluc1RleHQubGVuZ3RoKTsKICAgICAgICByYW5nZS5zZWxlY3QoKTsKICAgIH0KICAgIC8qIGdlY2tvICovCiAgICBlbHNlIGlmICh0eXBlb2YgaW5wdXQuc2VsZWN0aW9uU3RhcnQgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICB2YXIgU3RhcnQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydDsKICAgICAgICB2YXIgRW5kID0gaW5wdXQuc2VsZWN0aW9uRW5kOwogICAgICAgIC8qIHNldCBmb2N1cyB0byBzdGFydCwgaWYgY3Vyc2VyIGl0IG5vdCBkZWRpY2F0ZWQgc2V0IHRvIHRoZSBlbmQgKG9ubHkgZG9uZSBhdXRvbWF0aWNhbHkgaWYgbW9yZSB0aGVuIDQwMCBjaGFycyBhdmFpbCkqLwogICAgICAgIGlmIChpbnB1dC52YWx1ZS5sZW5ndGggPiA0MDAgJiYgRW5kID09IGlucHV0LnZhbHVlLmxlbmd0aCAmJiBTdGFydCA9PSBpbnB1dC52YWx1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgU3RhcnQgPSAwOwogICAgICAgICAgICBFbmQgPSAwOwogICAgICAgIH0KICAgICAgICB2YXIgaW5zVGV4dCA9IGlucHV0LnZhbHVlLnN1YnN0cmluZyhTdGFydCwgRW5kKTsKICAgICAgICBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnN1YnN0cigwLCBTdGFydCkgKyBkb2N1bWVudC5zcGVsbGluZy5Cb2R5LnZhbHVlICsgaW5zVGV4dCArIGlucHV0LnZhbHVlLnN1YnN0cihFbmQpOwogICAgICAgIHZhciBwb3M7CiAgICAgICAgaWYgKGluc1RleHQubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgcG9zID0gU3RhcnQgKyBkb2N1bWVudC5zcGVsbGluZy5Cb2R5LnZhbHVlLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBvcyA9IFN0YXJ0ICsgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZS5sZW5ndGggKyBpbnNUZXh0Lmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBwb3M7CiAgICAgICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gcG9zOwogICAgfQogICAgLyogb3RoZXIsIGluc2VydCBvbiB0b3AgKi8KICAgIGVsc2UgewogICAgICAgIHBhcmVudC5vcGVuZXIuZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlID0gZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSArIHBhcmVudC5vcGVuZXIuZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlOwogICAgfQoKICAgIHRoaXMuY2xvc2UoKTsKfQoKLy8tLT4KPC9zY3JpcHQ+Cgo8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9InNwZWxsaW5nIj4KCiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICRFbnZ7IkJveDAifSRDb25maWd7IkZBUTo6RkFRSG9vayJ9OiAkUURhdGF7Ik51bWJlciJ9JEVudnsiQm94MSJ9CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+CiAgICAgIDx0ZCB3aWR0aD0iMTAwJSIgY2xhc3M9Im1haW5ib2R5Ij4KCgo8IS0tIGR0bDpibG9jazpGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IC0tPgogICAgICAgICRDb25maWd7IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciJ9IDxiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSI+JFFEYXRheyJOYW1lIn08L2E+PC9iPgo8IS0tIGR0bDpibG9jazpGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50IC0tPgoKPCEtLSBkdGw6YmxvY2s6RkFRUGF0aEl0ZW1FbGVtZW50IC0tPgogICAgICAgICRDb25maWd7IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNlcGVyYXRvciJ9IDxiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mQ2F0ZWdvcnlJRD0kUURhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJUaXRsZSJ9PC9hPjwvYj4KPCEtLSBkdGw6YmxvY2s6RkFRUGF0aEl0ZW1FbGVtZW50IC0tPgoKCiAgICAgICAgPGgxPiRRRGF0YXsiVGl0bGUifTwvaDE+CgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JENvbmZpZ3siRkFROjpGQVFIb29rIn06IDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJOdW1iZXIifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiVGl0bGUifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRlZ29yeSJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiQ2F0ZWdvcnkifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiU3RhdGUifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiTGFuZ3VhZ2UifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXl3b3JkcyJ9OiA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiS2V5d29yZHMifTwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtVmlld0F0dGFjaG1lbnQgLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTogPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Eb3dubG9hZCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPjwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGQVFJdGVtVmlld0F0dGFjaG1lbnQgLS0+CiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXN1bHQifTo8L3RkPgogICAgICAgICAgICA8dGQgc3R5bGU9IiREYXRheyJDc3NDb2x1bW5Wb3RpbmdSZXN1bHQifSI+ICRRRGF0YXsiUmVzdWx0In0gJiMzNzs8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZvdGVzIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IlZvdGVzIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxocj48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpdGxlIiB2YWx1ZT0iJFFEYXRheyJUaXRsZSJ9Ij4KICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQm9keSIgcm93cz0iMTQiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhRW1haWwifSIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSI+JERhdGF7Ikl0ZW1GaWVsZFZhbHVlcyJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aHI+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KCiAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0idXBkYXRlTWVzc2FnZSgpOyIgdmFsdWU9IiRUZXh0eyJEb25lIn0iPgogICAgICAgIDxpPigkVGV4dHsiUmV0dXJuIHRvIHRoZSBjb21wb3NlIHNjcmVlbiJ9KTwvaT4KCiAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0id2luZG93LmNsb3NlKCk7IiB2YWx1ZT0iJFRleHR7IkNhbmNlbCJ9Ij4KICAgICAgICA8aT4oJFRleHR7IkRpc2NhcmQgYWxsIGNoYW5nZXMgYW5kIHJldHVybiB0byB0aGUgY29tcG9zZSBzY3JlZW4ifSk8L2k+CgogICAgICAgIDxocj4KCiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CiAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpWaWV3U21hbGwgLS0+CgoKCgo8IS0tIGR0bDpibG9jazpIaXN0b3J5IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ikhpc3RvcnkifTogJENvbmZpZ3siRkFROjpGQVFIb29rIn0gJFFEYXRheyJOdW1iZXIifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICAgIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDYXRlZ29yeUlEPSREYXRheyJDYXRlZ29yeUlEIn0mSXRlbUlEPSREYXRheyJJdGVtSUQifSI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSJ9PC90ZD4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJVc2VyIn08L3RkPgogICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpIaXN0b3J5Um93IC0tPgogICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICA8dGQgY2xhc3M9IiREYXRheyJDc3NSb3cifSI+JFRleHR7IiREYXRheyJOYW1lIn0ifTwvdGQ+CiAgICAgICAgPHRkIGNsYXNzPSIkRGF0YXsiQ3NzUm93In0iPigkVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifSk8L3RkPgogICAgICAgIDx0ZCBjbGFzcz0iJERhdGF7IkNzc1JvdyJ9Ij4kRGF0YXsiQ3JlYXRlZEJ5In08L3RkPgogICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpIaXN0b3J5Um93IC0tPgogICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6SGlzdG9yeSAtLT4KCgoKPCEtLSBkdGw6YmxvY2s6QWRkIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkKewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGl0bGUudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBhcnRpY2xlIHNob3VsZCBoYXZlIGEgdGl0bGUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpdGxlLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPHRyPgogIDx0ZCBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICRFbnZ7IkJveDAifSRUZXh0eyJOZXcgRkFRIEFydGljbGUifSRFbnZ7IkJveDEifQogIDwvdGQ+CjwvdHI+Cjx0cj4KICA8dGQgd2lkdGg9IjEwMCUiIGNsYXNzPSJtYWluYm9keSI+CiAgICA8YnI+CiAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICA8L3RyPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQWRkQWN0aW9uIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iJERhdGF7Ikl0ZW1JRCJ9Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkRGF0YXsiVGl0bGUifSIgc2l6ZT0iNzUiIG1heGxlbmd0aD0iMTIwIj48L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiS2V5d29yZHMifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IktleXdvcmRzIiB2YWx1ZT0iJERhdGF7IktleXdvcmRzIn0iIHNpemU9Ijc1IiBtYXhsZW5ndGg9IjEyMCI+PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGVnb3J5In06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJDYXRlZ29yeU9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN0YXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJTdGF0ZU9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhbmd1YWdlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJMYW5ndWFnZU9wdGlvbiJ9IDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiPiZuYnNwOzxhIG5hbWU9ImF0dGFjaG1lbnQiPjwvYT48L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxocj48L3RkPgogICAgICAgICAgICAgIDwvdHI+Cgo8IS0tIGR0bDpibG9jazpGQVFJdGVtRmllbGQgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkNhcHRpb24ifSJ9OiAgPGJyPiA8aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiJERhdGF7IlN0YXRlTmFtZSJ9In0pPC9pPiA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjx0ZXh0YXJlYSBuYW1lPSIkRGF0YXsiS2V5In0iIHJvd3M9IjEyIiBjb2xzPSI3NSIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSI+JERhdGF7IlZhbHVlIn08L3RleHRhcmVhPjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGhyPjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbUZpZWxkIC0tPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj48aW5wdXQgYWNjZXNza2V5PSJnIiBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+PC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxicj4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6QWRkIC0tPgoKCgoKPCEtLSBkdGw6YmxvY2s6VXBkYXRlIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkKewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGl0bGUudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBhcnRpY2xlIHNob3VsZCBoYXZlIGEgdGl0bGUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpdGxlLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KLy8tLT4KPC9zY3JpcHQ+CgoKICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkVkaXQifTogJENvbmZpZ3siRkFROjpGQVFIb29rIn0gJFFEYXRheyJOdW1iZXIifSRFbnZ7IkJveDEifQogICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JERhdGF7Ikl0ZW1JRCJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJVcGRhdGVBY3Rpb24iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iJERhdGF7Ikl0ZW1JRCJ9Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iJFFEYXRheyJUaXRsZSJ9IiBzaXplPSI3NSIgbWF4bGVuZ3RoPSIxMjAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXl3b3JkcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IktleXdvcmRzIiB2YWx1ZT0iJFFEYXRheyJLZXl3b3JkcyJ9IiBzaXplPSI3NSIgbWF4bGVuZ3RoPSIxMjAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRlZ29yeSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IkNhdGVnb3J5T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3RhdGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJTdGF0ZU9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSIzMCIgY2xhc3M9ImZpeGVkIj4mbmJzcDs8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJGaWxlbmFtZSJ9CiMgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlIiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYW5ndWFnZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7Ikxhbmd1YWdlT3B0aW9uIn0gPC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aHI+PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbUZpZWxkIC0tPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkNhcHRpb24ifSJ9OiAgPGJyPiA8aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiJERhdGF7IlN0YXRlTmFtZSJ9In0pPC9pPiA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48dGV4dGFyZWEgbmFtZT0iJERhdGF7IktleSJ9IiByb3dzPSIxMiIgY29scz0iNzUiIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iPiRRRGF0YXsiVmFsdWUifTwvdGV4dGFyZWE+PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aHI+PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RkFRSXRlbUZpZWxkIC0tPgogICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj48aW5wdXQgYWNjZXNza2V5PSJnIiBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpVcGRhdGUgLS0+CgoKCjwhLS0gZHRsOmJsb2NrOkRlbGV0ZSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJEZWxldGUifTogJENvbmZpZ3siQXJ0ZWZhY3Q6OkFydGVmYWN0SG9vayJ9ICRRRGF0YXsiTnVtYmVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNhdGVnb3J5SUQ9JERhdGF7IkNhdGVnb3J5SUQifSZJdGVtSUQ9JERhdGF7Ikl0ZW1JRCJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjM1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjUlIiBjbGFzcz0iY29udGVudGtleSI+JENvbmZpZ3siRkFROjpGQVFIb29rIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik51bWJlciJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpdGxlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGl0bGUifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBPYmplY3Q/In06PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSIkUURhdGF7IkNhdGVnb3J5SUQifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iJFFEYXRheyJJdGVtSUQifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJObyJ9Ij4KICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTAiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRGVsZXRlQWN0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDYXRlZ29yeUlEIiB2YWx1ZT0iJFFEYXRheyJDYXRlZ29yeUlEIn0iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IiRRRGF0YXsiSXRlbUlEIn0iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiWWVzIn0iPgogICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6RGVsZXRlIC0tPgoKCgo8IS0tIGR0bDpibG9jazpTeXN0ZW1IaXN0b3J5IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlN5c3RlbSBIaXN0b3J5In06ICRDb25maWd7IkZBUTo6RkFRSG9vayJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kQ29uZmlneyJGQVE6OkZBUUhvb2sifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGVnb3J5In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3lzdGVtSGlzdG9yeVJvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iJERhdGF7IkNzc1JvdyJ9Ij48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9Jkl0ZW1JRD0kUURhdGF7Ikl0ZW1JRCJ9Ij4kUURhdGF7Ik51bWJlciJ9PC9hPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiREYXRheyJDc3NSb3cifSI+JFFEYXRheyJTdWJqZWN0In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkRGF0YXsiQ3NzUm93In0iPiRRRGF0YXsiQ2F0ZWdvcnkifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiREYXRheyJDc3NSb3cifSI+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiREYXRheyJDc3NSb3cifSI+KCRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9KTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3lzdGVtSGlzdG9yeVJvdyAtLT4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U3lzdGVtSGlzdG9yeSAtLT4KCgo8IS0tIGR0bDpibG9jazpMYW5ndWFnZSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJGQVEgTGFuZ3VhZ2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNDAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJMYW5ndWFnZUNoYW5nZSI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDaGFuZ2UifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kRGF0YXsiTGFuZ3VhZ2VPcHRpb24ifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPjxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQ2hhbmdlIn0iPjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjYwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iJEVudnsiU3ViYWN0aW9uIn1BY3Rpb24iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iJERhdGF7IklEIn0iPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiJERhdGF7IkhlYWRsaW5lIn0ifSA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1MYW5ndWFnZSI+JFRleHR7IiREYXRheyJBZGRMaW5rIn0ifTwvYT48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGFuZ3VhZ2UifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBzaXplPSI1IiBtYXhsZW5ndGg9IjUwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IiREYXRheyJIZWFkbGluZSJ9In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9mb3JtPgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpMYW5ndWFnZSAtLT4KCgoKPCEtLSBkdGw6YmxvY2s6Q2F0ZWdvcnkgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5OYW1lLnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgY2F0ZWdvcnkgc2hvdWxkIGhhdmUgYSBuYW1lISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5OYW1lLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5Db21tZW50LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgY2F0ZWdvcnkgc2hvdWxkIGhhdmUgYSBjb21tZW50ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Db21tZW50LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KLy8tLT4KPC9zY3JpcHQ+CiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRkFRIENhdGVnb3J5In0kRW52eyJCb3gxIn0KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCB3aWR0aD0iNDAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDYXRlZ29yeUNoYW5nZSI+CiAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDaGFuZ2UifTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgd2lkdGg9IjQ2JSIgY2xhc3M9ImNvbnRlbnRib2R5Ij4kRGF0YXsiQ2F0ZWdvcnlMb25nT3B0aW9uIn08L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj48aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkNoYW5nZSJ9Ij48L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Zvcm0+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCB3aWR0aD0iNjAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSIkRGF0YXsiRm9ybVN1YmFjdGlvbiJ9Ij4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhdGVnb3J5SUQiIHZhbHVlPSIkRGF0YXsiQ2F0ZWdvcnlJRCJ9Ij4KICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAkVGV4dHsiJERhdGF7IkhlYWRsaW5lIn0ifQogICAgICAgICAgICAgICAgPCEtLSBkdGw6YmxvY2s6Q2F0ZWdvcnlBZGRMaW5rIC0tPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249Q2F0ZWdvcnkiPiRUZXh0eyIoQ2xpY2sgaGVyZSB0byBhZGQpIn08L2E+CiAgICAgICAgICAgICAgICA8IS0tIGR0bDpibG9jazpDYXRlZ29yeUFkZExpbmsgLS0+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0ZWdvcnkifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBzaXplPSIzNSIgbWF4bGVuZ3RoPSI1MCI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YkNhdGVnb3J5T2YifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+JERhdGF7IkNhdGVnb3J5T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiB2YWx1ZT0iJFFEYXRheyJDb21tZW50In0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjgwIj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+JERhdGF7IlZhbGlkT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVybWlzc2lvbiJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJHcm91cE9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7IiB2YWx1ZT0iJFRleHR7IiREYXRheyJIZWFkbGluZSJ9In0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkNhdGVnb3J5IC0tPgo=
IyAtLQojIEN1c3RvbWVyRkFRLmR0bCAtIHByb3ZpZGVzIEhUTUwgdmlldyBmb3IgZmFxIGFydGljbGVzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgTWFydGluIEVkZW5ob2ZlciA8bWFydGluK2NvZGVAb3Rycy5vcmc+CiMgLS0KIyAkSWQ6IEN1c3RvbWVyRkFRLmR0bCx2IDEuMS4xLjEgMjAwNi8wNi8yOSAwOToyOTo1MSBjdCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0K
IyAtLQojIFB1YmxpY0ZBUS5kdGwgLSBwcm92aWRlcyBIVE1MIHZpZXcgZm9yIGZhcSBhcnRpY2xlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IE1hcnRpbiBFZGVuaG9mZXIgPG1hcnRpbitjb2RlQG90cnMub3JnPgojIC0tCiMgJElkOiBQdWJsaWNGQVEuZHRsLHYgMS4xLjEuMSAyMDA2LzA2LzI5IDA5OjI5OjUxIGN0IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRkFRLnBtIC0gYWxsIGZhcSBmdW5rdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZBUS5wbSx2IDEuMTYgMjAwOC8wMy8xNCAxNTo1MDo0NCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RkFROwoKdXNlIHN0cmljdDsKdXNlIE1JTUU6OkJhc2U2NDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMTYgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RkFRIC0gZmFxIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZmFxIGZ1bmN0aW9ucy4gRS4gZy4gdG8gYWRkIGZhcXMgb3IgdG8gZ2V0IGZhcXMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIGZhcSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkZBUTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkRkFRT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZBUS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJJRCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KICAgICRTZWxmLT57R3JvdXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q3VzdG9tZXJHcm91cE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJVBhcmFtKTsKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRkFRR2V0KCkKCmdldCBhbiBhcnRpY2xlCgogICAgbXkgJUFydGljbGUgPSAkRkFRT2JqZWN0LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZBUUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBGYWlsdXJlcyByZW5hbWUgZnJvbSBJdGVtSUQgdG8gRkFRSUQKICAgIGlmKCRQYXJhbXtGQVFJRH0pIHsKICAgICAgICAkUGFyYW17SXRlbUlEfSA9ICRQYXJhbXtGQVFJRH07CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICBteSAlRGF0YSA9ICgpOwogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaS5mX25hbWUsIGkuZl9sYW5ndWFnZV9pZCwgaS5mX3N1YmplY3QsICIuCiAgICAgICAgICAgICIgaS5mX2ZpZWxkMSwgaS5mX2ZpZWxkMiwgaS5mX2ZpZWxkMywgIi4KICAgICAgICAgICAgIiBpLmZfZmllbGQ0LCBpLmZfZmllbGQ1LCBpLmZfZmllbGQ2LCAiLgogICAgICAgICAgICAiIGkuZnJlZV9rZXkxLCBpLmZyZWVfdmFsdWUxLCBpLmZyZWVfa2V5MiwgaS5mcmVlX3ZhbHVlMiwgIi4KICAgICAgICAgICAgIiBpLmZyZWVfa2V5MywgaS5mcmVlX3ZhbHVlMywgaS5mcmVlX2tleTQsIGkuZnJlZV92YWx1ZTQsICIuCiAgICAgICAgICAgICIgaS5jcmVhdGVkLCBpLmNyZWF0ZWRfYnksIGkuY2hhbmdlZCwgaS5jaGFuZ2VkX2J5LCAiLgogICAgICAgICAgICAiIGkuY2F0ZWdvcnlfaWQsIGkuc3RhdGVfaWQsIGMubmFtZSwgcy5uYW1lLCBsLm5hbWUsIGkuZl9rZXl3b3JkcywgaS5mX251bWJlciwgc3QuaWQsIHN0Lm5hbWUgIi4KICAgICAgICAgICAgIiBGUk9NIGZhcV9pdGVtIGksIGZhcV9jYXRlZ29yeSBjLCBmYXFfc3RhdGUgcywgZmFxX3N0YXRlX3R5cGUgc3QsIGZhcV9sYW5ndWFnZSBsICIuCiAgICAgICAgICAgICIgV0hFUkUgIi4KICAgICAgICAgICAgIiBpLnN0YXRlX2lkID0gcy5pZCBBTkQgIi4KICAgICAgICAgICAgIiBzLnR5cGVfaWQgPSBzdC5pZCBBTkQgIi4KICAgICAgICAgICAgIiBpLmNhdGVnb3J5X2lkID0gYy5pZCBBTkQgIi4KICAgICAgICAgICAgIiBpLmZfbGFuZ3VhZ2VfaWQgPSBsLmlkIEFORCAiLgogICAgICAgICAgICAiIGkuaWQgPSAkUGFyYW17SXRlbUlEfSI7CiAgICAjJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAkU1FMKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBteSAlVm90ZURhdGEgPSAleyRTZWxmLT5JdGVtVm90ZURhdGFHZXQoSXRlbUlEPT4kUGFyYW17SXRlbUlEfSl9OwogICAgICAgICVEYXRhID0gKAogICAgICAgICAgICAjIHZhciBmb3Igb2xkIHZlcnNpb25zCiAgICAgICAgICAgIElEID0+ICRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBGQVFJRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgIwogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIE5hbWUgPT4gJFJvd1swXSwKICAgICAgICAgICAgTGFuZ3VhZ2VJRCA9PiAkUm93WzFdLAogICAgICAgICAgICBUaXRsZSA9PiAkUm93WzJdLAogICAgICAgICAgICBGaWVsZDEgPT4gJFJvd1szXSwKICAgICAgICAgICAgRmllbGQyID0+ICRSb3dbNF0sCiAgICAgICAgICAgIEZpZWxkMyA9PiAkUm93WzVdLAogICAgICAgICAgICBGaWVsZDQgPT4gJFJvd1s2XSwKICAgICAgICAgICAgRmllbGQ1ID0+ICRSb3dbN10sCiAgICAgICAgICAgIEZpZWxkNiA9PiAkUm93WzhdLAogICAgICAgICAgICBGcmVlS2V5MSA9PiAkUm93WzldLAogICAgICAgICAgICBGcmVlVGV4dDEgPT4gJFJvd1sxMF0sCiAgICAgICAgICAgIEZyZWVLZXkyID0+ICRSb3dbMTFdLAogICAgICAgICAgICBGcmVlVGV4dDIgPT4gJFJvd1sxMl0sCiAgICAgICAgICAgIEZyZWVLZXkzID0+ICRSb3dbMTNdLAogICAgICAgICAgICBGcmVlVGV4dDMgPT4gJFJvd1sxNF0sCiAgICAgICAgICAgIEZyZWVLZXk0ID0+ICRSb3dbMTVdLAogICAgICAgICAgICBGcmVlVGV4dDQgPT4gJFJvd1sxNl0sCiAgICAgICAgICAgIENyZWF0ZWQgPT4gJFJvd1sxN10sCiAgICAgICAgICAgIENyZWF0ZWRCeSA9PiAkUm93WzE4XSwKICAgICAgICAgICAgQ2hhbmdlZCA9PiAkUm93WzE5XSwKICAgICAgICAgICAgQ2hhbmdlZEJ5ID0+ICRSb3dbMjBdLAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRSb3dbMjFdLAogICAgICAgICAgICBTdGF0ZUlEID0+ICRSb3dbMjJdLAogICAgICAgICAgICBDYXRlZ29yeU5hbWUgPT4gJFJvd1syM10sCiAgICAgICAgICAgIFN0YXRlID0+ICRSb3dbMjRdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkUm93WzI1XSwKICAgICAgICAgICAgS2V5d29yZHMgPT4gJFJvd1syNl0sCiAgICAgICAgICAgIE51bWJlciA9PiAkUm93WzI3XSwKICAgICAgICAgICAgU3RhdGVUeXBlSUQgPT4gJFJvd1syOF0sCiAgICAgICAgICAgIFN0YXRlVHlwZU5hbWUgPT4gJFJvd1syOV0sCiAgICAgICAgICAgIFJlc3VsdCA9PiBzcHJpbnRmKCIlMC4iLiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJGQVE6OkV4cGxvcmVyOjpJdGVtTGlzdDo6Vm90aW5nUmVzdWx0RGVjaW1hbFBsYWNlcyIpLiJmIiwkVm90ZURhdGF7UmVzdWx0fSB8fCAwKSwKICAgICAgICAgICAgVm90ZXMgPT4gJFZvdGVEYXRhe1ZvdGVzfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCElRGF0YSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5vIHN1Y2ggSXRlbUlEICRQYXJhbXtJdGVtSUR9ISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgdXBkYXRlIG51bWJlcgogICAgaWYgKCEkRGF0YXtOdW1iZXJ9KSB7CiAgICAgICAgbXkgJE51bWJlciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpLiIwMCIuJERhdGF7SXRlbUlEfTsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIGZhcV9pdGVtIFNFVCBmX251bWJlciA9ICckTnVtYmVyJyBXSEVSRSBpZCA9ICREYXRhe0l0ZW1JRH0iLAogICAgICAgICk7CiAgICAgICAgJERhdGF7TnVtYmVyfSA9ICROdW1iZXI7CiAgICB9CiAgICAjIGdldCBhdHRhY2htZW50CiAgICAkU1FMID0gIlNFTEVDVCBmaWxlbmFtZSwgY29udGVudF90eXBlLCBjb250ZW50X3NpemUsIGNvbnRlbnQgIi4KICAgICAgICAiIEZST00gZmFxX2F0dGFjaG1lbnQgV0hFUkUgZmFxX2lkID0gJFBhcmFte0l0ZW1JRH0iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwsIEVuY29kZSA9PiBbMSwxLDEsMF0pOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICMgZGVjb2RlIGF0dGFjaG1lbnQgaWYgaXQncyBhIHBvc3RncmVzcWwgYmFja2VuZCBhbmQgbm90IEJMT0IKICAgICAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykpIHsKICAgICAgICAgICAgJFJvd1szXSA9IGRlY29kZV9iYXNlNjQoJFJvd1szXSk7CiAgICAgICAgfQogICAgICAgICREYXRhe0ZpbGVuYW1lfSA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7Q29udGVudFR5cGV9ID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXtDb250ZW50U2l6ZX0gPSAkUm93WzJdOwogICAgICAgICREYXRhe0NvbnRlbnR9ID0gJFJvd1szXTsKICAgIH0KICAgIG15ICRIYXNoID0gJFNlbGYtPkdldENhdGVnb3J5VHJlZSgpOwogICAgJERhdGF7Q2F0ZWdvcnlOYW1lfSA9ICRIYXNoLT57JERhdGF7Q2F0ZWdvcnlJRH19OwogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBJdGVtVm90ZURhdGFHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCBudW1iZXIgYW5kIHJlc3VsdCBvZiBhIGl0ZW0KCiAgICBteSAlRmxhZyA9ICRGQVFPYmplY3QtPkl0ZW1Wb3RlRGF0YUdldCgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICk7Cgo9Y3V0CnN1YiBJdGVtVm90ZURhdGFHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgbXkgJFNRTCA9ICIgU0VMRUNUIGNvdW50KCopLCBhdmcocmF0ZSkgRlJPTSBmYXFfdm90aW5nIFdIRVJFIGl0ZW1faWQgPSAiIC4gJFBhcmFte0l0ZW1JRH07CgogICAgbXkgJUhhc2ggPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMLCBMaW1pdCA9PiAkUGFyYW17TGltaXR9IHx8IDUwMCk7CiAgICBpZihteSBARGF0YSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkSGFzaHtWb3Rlc30gID0gJERhdGFbMF07CiAgICAgICAgJEhhc2h7UmVzdWx0fSA9ICREYXRhWzFdOwogICAgfQogICAgcmV0dXJuIFwlSGFzaDsKfQoKPWl0ZW0gRkFRQWRkKCkKCmFkZCBhbiBhcnRpY2xlCgogICAgbXkgJEl0ZW1JRCA9ICRGQVFPYmplY3QtPkZBUUFkZCgKICAgICAgICBOdW1iZXIgPT4gJzEzNDAyJywKICAgICAgICBUaXRsZSA9PiAnU29tZSBUZXh0JywKICAgICAgICBDYXRlZ29yeUlEID0+IDEsCiAgICAgICAgU3RhdGVJRCA9PiAxLAogICAgICAgIExhbmd1YWdlSUQgPT4gMSwKICAgICAgICBLZXl3b3JkcyA9PiAnc29tZSBrZXl3b3JkcycsCiAgICAgICAgRmllbGQxID0+ICdQcm9ibGVtLi4uJywKICAgICAgICBGaWVsZDIgPT4gJ1NvbHV0aW9uLi4uJywKICAgICAgICBGcmVlS2V5MSA9PiAnU29mdHdhcmUnLAogICAgICAgIEZyZWVUZXh0MSA9PiAnQXBhY2hlIDMuNC4yJywKICAgICAgICBGcmVlS2V5MiA9PiAnT1MnLAogICAgICAgIEZyZWVUZXh0MiA9PiAnT3BlbkJTRCA0LjIuMicsCiAgICAgICAgIyBhdHRhY2htZW50IG9wdGlvbnMgKG5vdCByZXF1aXJlZCkKICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgQ29udGVudCA9PiAkQ29udGVudCwKICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICApOwoKPWN1dAoKc3ViIEZBUUFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQ2F0ZWdvcnlJRCBTdGF0ZUlEIExhbmd1YWdlSUQgVGl0bGUpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgICMgY2hlY2sgbmFtZQogICAgaWYgKCEkUGFyYW17TmFtZX0pIHsKICAgICAgICAkUGFyYW17TmFtZX0gPSB0aW1lKCkuJy0nLnJhbmQoMTAwKTsKICAgIH0KICAgICMgY2hlY2sgbnVtYmVyCiAgICBpZiAoISRQYXJhbXtOdW1iZXJ9KSB7CiAgICAgICAgJFBhcmFte051bWJlcn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3lzdGVtSUQnKS5yYW5kKDEwMCk7CiAgICB9CiAgICAjIGRiIHF1b3RlIChqdXN0IG5vdCBDb250ZW50LCB1c2UgZGIgQmluZCB2YWx1ZXMpCiAgICBmb3JlYWNoIChxdyhOdW1iZXIgTmFtZSBUaXRsZSBLZXl3b3JkcyBGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNiBGcmVlS2V5MSBGcmVlVGV4dDEgRnJlZUtleTIgRnJlZVRleHQyIEZyZWVLZXkzIEZyZWVUZXh0MyBGcmVlS2V5NCBGcmVlVGV4dDQgRmlsZW5hbWUgQ29udGVudFR5cGUgRmlsZXNpemUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBmb3JlYWNoIG15ICRUeXBlIChxdyhGaWVsZCBGcmVlS2V5IEZyZWVUZXh0KSkgewogICAgICAgIGZvcmVhY2ggKDEuLjYpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXskVHlwZS4kX30pKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFR5cGUuJF99ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIGZhcV9pdGVtIChmX251bWJlciwgZl9uYW1lLCBmX2xhbmd1YWdlX2lkLCBmX3N1YmplY3QsICIuCiAgICAgICAgICAgICIgY2F0ZWdvcnlfaWQsIHN0YXRlX2lkLCBmX2tleXdvcmRzLCAiLgogICAgICAgICAgICAiIGZfZmllbGQxLCBmX2ZpZWxkMiwgZl9maWVsZDMsIGZfZmllbGQ0LCBmX2ZpZWxkNSwgZl9maWVsZDYsICIuCiAgICAgICAgICAgICIgZnJlZV9rZXkxLCBmcmVlX3ZhbHVlMSwgZnJlZV9rZXkyLCBmcmVlX3ZhbHVlMiwgIi4KICAgICAgICAgICAgIiBmcmVlX2tleTMsIGZyZWVfdmFsdWUzLCBmcmVlX2tleTQsIGZyZWVfdmFsdWU0LCAiLgogICAgICAgICAgICAiIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpIi4KICAgICAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAgICAgIiAoJyRQYXJhbXtOdW1iZXJ9JywgJyRQYXJhbXtOYW1lfScsICRQYXJhbXtMYW5ndWFnZUlEfSwgJyRQYXJhbXtUaXRsZX0nLCAiLgogICAgICAgICAgICAiICRQYXJhbXtDYXRlZ29yeUlEfSwgJFBhcmFte1N0YXRlSUR9LCAnJFBhcmFte0tleXdvcmRzfScsICIuCiAgICAgICAgICAgICIgJyRQYXJhbXtGaWVsZDF9JywgJyRQYXJhbXtGaWVsZDJ9JywgJyRQYXJhbXtGaWVsZDN9JywgIi4KICAgICAgICAgICAgIiAnJFBhcmFte0ZpZWxkNH0nLCAnJFBhcmFte0ZpZWxkNX0nLCAnJFBhcmFte0ZpZWxkNn0nLCAiLgogICAgICAgICAgICAiICckUGFyYW17RnJlZUtleTF9JywgJyRQYXJhbXtGcmVlVGV4dDF9JywgIi4KICAgICAgICAgICAgIiAnJFBhcmFte0ZyZWVLZXkyfScsICckUGFyYW17RnJlZVRleHQyfScsICIuCiAgICAgICAgICAgICIgJyRQYXJhbXtGcmVlS2V5M30nLCAnJFBhcmFte0ZyZWVUZXh0M30nLCAiLgogICAgICAgICAgICAiICckUGFyYW17RnJlZUtleTR9JywgJyRQYXJhbXtGcmVlVGV4dDR9JywgIi4KICAgICAgICAgICAgIiBjdXJyZW50X3RpbWVzdGFtcCwgJFNlbGYtPntVc2VySUR9LCAiLgogICAgICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0pIjsKCiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICMgZ2V0IGlkCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gZmFxX2l0ZW0gV0hFUkUgIi4KICAgICAgICAgICAgImZfbmFtZSA9ICckUGFyYW17TmFtZX0nIEFORCBmX2xhbmd1YWdlX2lkID0gJFBhcmFte0xhbmd1YWdlSUR9ICIuCiAgICAgICAgICAgICIgQU5EIGZfc3ViamVjdCA9ICckUGFyYW17VGl0bGV9JyIsCiAgICAgICAgKTsKICAgICAgICBteSAkSUQgPSAwOwogICAgICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJElEID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgIyB1cGRhdGUgbnVtYmVyCiAgICAgICAgbXkgJE51bWJlciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpLiIwMCIuJElEOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgZmFxX2l0ZW0gU0VUIGZfbnVtYmVyID0gJyROdW1iZXInIFdIRVJFIGlkID0gJElEIiwKICAgICAgICApOwogICAgICAgICMgYWRkIGF0dGFjaG1lbnQKICAgICAgICBpZigkUGFyYW17Q29udGVudH0gJiYgJFBhcmFte0NvbnRlbnRUeXBlfSAmJiAkUGFyYW17RmlsZW5hbWV9KSB7CiAgICAgICAgICAgICRTZWxmLT5BdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJRCwKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFBhcmFte0NvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJFBhcmFte0NvbnRlbnRUeXBlfSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+ICRQYXJhbXtGaWxlbmFtZX0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5GQVFIaXN0b3J5QWRkKAogICAgICAgICAgICBOYW1lID0+ICdDcmVhdGVkJywKICAgICAgICAgICAgSXRlbUlEID0+ICRJRCwKICAgICAgICApOwogICAgICAgIHJldHVybiAkSUQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cgp9Cgo9aXRlbSBBdHRhY2htZW50QWRkKCkKCj1jdXQKCnN1YiBBdHRhY2htZW50QWRkIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtSUQgQ29udGVudCBDb250ZW50VHlwZSBGaWxlbmFtZSkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhdHRhY2htZW50IHNpemUKICAgIHsKICAgICAgICB1c2UgYnl0ZXM7CiAgICAgICAgJFBhcmFte0ZpbGVzaXplfSA9IGxlbmd0aCgkUGFyYW17Q29udGVudH0pOwogICAgICAgIG5vIGJ5dGVzOwogICAgfQogICAgIyBlbmNvZGUgYXR0YWNoZW1udCBpZiBpdCdzIGEgcG9zdGdyZXNxbCBiYWNrZW5kISEhCiAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykpIHsKICAgICAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZU91dHB1dChcJFBhcmFte0NvbnRlbnR9KTsKICAgICAgICAkUGFyYW17Q29udGVudH0gPSBlbmNvZGVfYmFzZTY0KCRQYXJhbXtDb250ZW50fSk7CiAgICB9CgogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyBmYXFfYXR0YWNobWVudCAiLgogICAgICAgICIgKGZhcV9pZCwgZmlsZW5hbWUsIGNvbnRlbnRfdHlwZSwgY29udGVudF9zaXplLCBjb250ZW50LCAiLgogICAgICAgICIgY3JlYXRlZCwgY3JlYXRlZF9ieSwgY2hhbmdlZCwgY2hhbmdlZF9ieSkgIiAuCiAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAiICgkUGFyYW17SXRlbUlEfSwgJyRQYXJhbXtGaWxlbmFtZX0nLCAnJFBhcmFte0NvbnRlbnRUeXBlfScsICckUGFyYW17RmlsZXNpemV9JywgPywgIi4KICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0sIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0pIjsKICAgICMgd3JpdGUgYXR0YWNobWVudCB0byBkYgogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCwgQmluZCA9PiBbXCRQYXJhbXtDb250ZW50fV0pKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKPWl0ZW0gQXR0YWNobWVudEdldCgpCgo9Y3V0CgpzdWIgQXR0YWNobWVudEdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbUlEIENvbnRlbnQgQ29udGVudFR5cGUgRmlsZW5hbWUpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9Cn0KCj1pdGVtIEF0dGFjaG1lbnREZWxldGUoKQoKPWN1dAoKc3ViIEF0dGFjaG1lbnREZWxldGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCBDb250ZW50IENvbnRlbnRUeXBlIEZpbGVuYW1lKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBBdHRhY2htZW50U2VhcmNoKCkKCj1jdXQKCnN1YiBBdHRhY2htZW50U2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtSUQgQ29udGVudCBDb250ZW50VHlwZSBGaWxlbmFtZSkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gRkFRVXBkYXRlKCkKCnVwZGF0ZSBhbiBhcnRpY2xlCgogICAgJEZBUU9iamVjdC0+RkFRVXBkYXRlKAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAxLAogICAgICAgIFN0YXRlSUQgPT4gMSwKICAgICAgICBMYW5ndWFnZUlEID0+IDEsCiAgICAgICAgVGl0bGUgPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgRmllbGQxID0+ICdQcm9ibGVtLi4uJywKICAgICAgICBGaWVsZDIgPT4gJ1NvbHV0aW9uLi4uJywKICAgICAgICBGcmVlS2V5MSA9PiAnU29mdHdhcmUnLAogICAgICAgIEZyZWVUZXh0MSA9PiAnQXBhY2hlIDMuNC4yJywKICAgICAgICBGcmVlS2V5MiA9PiAnT1MnLAogICAgICAgIEZyZWVUZXh0MiA9PiAnT3BlbkJTRCA0LjIuMicsCiAgICAgICAgIyBhdHRhY2htZW50IG9wdGlvbnMgKG5vdCByZXF1aXJlZCkKICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgQ29udGVudCA9PiAkQ29udGVudCwKICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICApOwoKPWN1dAoKc3ViIEZBUVVwZGF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbUlEIENhdGVnb3J5SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFRpdGxlKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBjaGVjayBuYW1lCiAgICBpZiAoISRQYXJhbXtOYW1lfSkgewogICAgICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPkZBUUdldCglUGFyYW0pOwogICAgICAgICRQYXJhbXtOYW1lfSA9ICRBcnRpY2xle05hbWV9OwogICAgfQogICAgIyBkYiBxdW90ZSAoanVzdCBub3QgQ29udGVudCwgdXNlIGRiIEJpbmQgdmFsdWVzKQogICAgZm9yZWFjaCAocXcoTnVtYmVyIE5hbWUgVGl0bGUgS2V5d29yZHMgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgRnJlZUtleTEgRnJlZVRleHQxIEZyZWVLZXkyIEZyZWVUZXh0MiBGcmVlS2V5MyBGcmVlVGV4dDMgRnJlZUtleTQgRnJlZVRleHQ0IEZpbGVuYW1lIENvbnRlbnRUeXBlIEZpbGVzaXplKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhJdGVtSUQgQ2F0ZWdvcnlJRCBTdGF0ZUlEIExhbmd1YWdlSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBmaWxsIHVwIGVtcHR5IHN0dWZmCiAgICBmb3JlYWNoIG15ICRUeXBlIChxdyhGaWVsZCBGcmVlS2V5IEZyZWVUZXh0KSkgewogICAgICAgIGZvcmVhY2ggKDEuLjYpIHsKICAgICAgICAgICAgaWYgKCEkUGFyYW17JFR5cGUuJF99KSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFR5cGUuJF99ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFNRTCA9ICJVUERBVEUgZmFxX2l0ZW0gU0VUIGZfbmFtZSA9ICckUGFyYW17TmFtZX0nLCAiLgogICAgICAgICAgICAiIGZfbGFuZ3VhZ2VfaWQgPSAkUGFyYW17TGFuZ3VhZ2VJRH0sIGZfc3ViamVjdCA9ICckUGFyYW17VGl0bGV9JywgIi4KICAgICAgICAgICAgIiBjYXRlZ29yeV9pZCA9ICRQYXJhbXtDYXRlZ29yeUlEfSwgc3RhdGVfaWQgPSAkUGFyYW17U3RhdGVJRH0sICIuCiAgICAgICAgICAgICIgZl9rZXl3b3JkcyA9ICckUGFyYW17S2V5d29yZHN9JywgIi4KICAgICAgICAgICAgIiBmX2ZpZWxkMSA9ICckUGFyYW17RmllbGQxfScsIGZfZmllbGQyID0gJyRQYXJhbXtGaWVsZDJ9JywgIi4KICAgICAgICAgICAgIiBmX2ZpZWxkMyA9ICckUGFyYW17RmllbGQzfScsIGZfZmllbGQ0ID0gJyRQYXJhbXtGaWVsZDR9JywgIi4KICAgICAgICAgICAgIiBmX2ZpZWxkNSA9ICckUGFyYW17RmllbGQ1fScsIGZfZmllbGQ2ID0gJyRQYXJhbXtGaWVsZDZ9JywgIi4KICAgICAgICAgICAgIiBmcmVlX2tleTEgPSAnJFBhcmFte0ZyZWVLZXkxfScsIGZyZWVfdmFsdWUxID0gJyRQYXJhbXtGcmVlVGV4dDF9JywgIi4KICAgICAgICAgICAgIiBmcmVlX2tleTIgPSAnJFBhcmFte0ZyZWVLZXkyfScsIGZyZWVfdmFsdWUyID0gJyRQYXJhbXtGcmVlVGV4dDJ9JywgIi4KICAgICAgICAgICAgIiBmcmVlX2tleTMgPSAnJFBhcmFte0ZyZWVLZXkzfScsIGZyZWVfdmFsdWUzID0gJyRQYXJhbXtGcmVlVGV4dDN9JywgIi4KICAgICAgICAgICAgIiBmcmVlX2tleTQgPSAnJFBhcmFte0ZyZWVLZXk0fScsIGZyZWVfdmFsdWU0ID0gJyRQYXJhbXtGcmVlVGV4dDR9JywgIi4KICAgICAgICAgICAgIiBjaGFuZ2VkID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZWRfYnkgPSAkU2VsZi0+e1VzZXJJRH0gIi4KICAgICAgICAgICAgIiBXSEVSRSBpZCA9ICRQYXJhbXtJdGVtSUR9ICI7CgogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICAjIGFkZCBhdHRhY2htZW50CiAgICAgICAgaWYgKCRQYXJhbXtDb250ZW50fSAmJiAkUGFyYW17Q29udGVudFR5cGV9ICYmICRQYXJhbXtGaWxlbmFtZX0pIHsKICAgICAgICAgICAgIyBnZXQgYXR0YWNobWVudCBzaXplCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVzZSBieXRlczsKICAgICAgICAgICAgICAgICRQYXJhbXtGaWxlc2l6ZX0gPSBsZW5ndGgoJFBhcmFte0NvbnRlbnR9KTsKICAgICAgICAgICAgICAgIG5vIGJ5dGVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgZW5jb2RlIGF0dGFjaGVtbnQgaWYgaXQncyBhIHBvc3RncmVzcWwgYmFja2VuZCEhIQogICAgICAgICAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57RW5jb2RlT2JqZWN0fS0+RW5jb2RlT3V0cHV0KFwkUGFyYW17Q29udGVudH0pOwogICAgICAgICAgICAgICAgJFBhcmFte0NvbnRlbnR9ID0gZW5jb2RlX2Jhc2U2NCgkUGFyYW17Q29udGVudH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgZGVsZXRlIG9sZCBhdHRhY2htZW50CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gZmFxX2F0dGFjaG1lbnQgV0hFUkUgZmFxX2lkID0gJFBhcmFte0l0ZW1JRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIGZhcV9hdHRhY2htZW50ICIuCiAgICAgICAgICAgICAgICAiIChmYXFfaWQsIGZpbGVuYW1lLCBjb250ZW50X3R5cGUsIGNvbnRlbnRfc2l6ZSwgY29udGVudCwgIi4KICAgICAgICAgICAgICAgICIgY3JlYXRlZCwgY3JlYXRlZF9ieSwgY2hhbmdlZCwgY2hhbmdlZF9ieSkgIiAuCiAgICAgICAgICAgICAgICAiIFZBTFVFUyAiLgogICAgICAgICAgICAgICAgIiAoJFBhcmFte0l0ZW1JRH0sICckUGFyYW17RmlsZW5hbWV9JywgJyRQYXJhbXtDb250ZW50VHlwZX0nLCAnJFBhcmFte0ZpbGVzaXplfScsID8sICIuCiAgICAgICAgICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0sIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0pIjsKICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50IHRvIGRiCiAgICAgICAgICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwsIEJpbmQgPT4gW1wkUGFyYW17Q29udGVudH1dKSkgewoKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZi0+RkFRSGlzdG9yeUFkZCgKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlZCcsCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cgo9aXRlbSBGQVFDb3VudCgpCgpjb3VudCBhbiBhcnRpY2xlCgogICAgJEZBUU9iamVjdC0+RkFRQ291bnQoCiAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gWzEsMiwzLDRdLAogICAgKTsKCj1jdXQKCnN1YiBGQVFDb3VudCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENhdGVnb3J5SURzIEl0ZW1TdGF0ZXMpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNRTCA9ICIiOwogICAgbXkgJEV4dCA9ICIiOwogICAgJFNRTCA9ICJTRUxFQ1QgQ09VTlQoKikiIC4KICAgICAgICAiIEZST00gZmFxX2l0ZW0gaSwgZmFxX3N0YXRlIHMiLgogICAgICAgICIgV0hFUkUgaS5jYXRlZ29yeV9pZCBJTiAoJyR7XChqb2luICdcJywgXCcnLCBAeyRQYXJhbXtDYXRlZ29yeUlEc319KX0nKSIuCiAgICAgICAgIiBBTkQgaS5zdGF0ZV9pZCA9IHMuaWQiOwogICAgaWYgKCRQYXJhbXtJdGVtU3RhdGVzfSAmJiByZWYoJFBhcmFte0l0ZW1TdGF0ZXN9KSBlcSAnSEFTSCcgJiYgJXskUGFyYW17SXRlbVN0YXRlc319KSB7CiAgICAgICAgJEV4dCAuPSAiIEFORCBzLnR5cGVfaWQgSU4gKCcke1woam9pbiAnXCcsIFwnJywga2V5cygleyRQYXJhbXtJdGVtU3RhdGVzfX0pKX0nKSI7CiAgICB9CiAgICAkRXh0IC49ICIgR1JPVVAgQlkgY2F0ZWdvcnlfaWQiOwogICAgJFNRTCAuPSAkRXh0OwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMLCBMaW1pdCA9PiAyMDApOwoKICAgIGlmKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcmV0dXJuICRSb3dbMF07CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgfQp9Cgo9aXRlbSBWb3RlQWRkKCkKCmFkZCBhbiBhcnRpY2xlCgogICAgbXkgJE9rID0gJEZBUU9iamVjdC0+Vm90ZUFkZCgKICAgICAgICBDcmVhdGVkQnkgPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgSXRlbUlEID0+ICcxMjM0NTYnLAogICAgICAgIElQID0+ICc1NC40My4zMC4xJywKICAgICAgICBJbnRlcmZhY2UgPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgUmF0ZSA9PiAxMDAsCiAgICApOwoKPWN1dAoKc3ViIFZvdGVBZGQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENyZWF0ZWRCeSBJdGVtSUQgSVAgSW50ZXJmYWNlKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoQ3JlYXRlZEJ5IEludGVyZmFjZSBJUCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoSXRlbUlEIFJhdGUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gZmFxX3ZvdGluZyAoICIuCiAgICAgICAgIiBjcmVhdGVkX2J5LCBpdGVtX2lkLCBpcCwgaW50ZXJmYWNlLCByYXRlLCBjcmVhdGVkIi4KICAgICAgICAiICkgVkFMVUVTICgiLgogICAgICAgICIgJyRQYXJhbXtDcmVhdGVkQnl9JywgIi4KICAgICAgICAiICRQYXJhbXtJdGVtSUR9LCAiLgogICAgICAgICIgJyRQYXJhbXtJUH0nLCAiLgogICAgICAgICIgJyRQYXJhbXtJbnRlcmZhY2V9JywgIi4KICAgICAgICAiICRQYXJhbXtSYXRlfSwgIi4KICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wICIuCiAgICAgICAgIiApIjsKICAgICMkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICRTUUwpOwogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgfQoKfQoKPWl0ZW0gVm90ZUdldCgpCgphZGQgYW4gYXJ0aWNsZQoKICAgIG15ICVWb3RlRGF0YSA9ICV7JEZBUU9iamVjdC0+Vm90ZUdldCgKICAgICAgICBDcmVhdGVCeSA9PiAnU29tZSBUZXh0JywKICAgICAgICBJdGVtSUQgPT4gJzEyMzQ1NicsCiAgICAgICAgSVAgICAgID0+ICcxMjcuMC4wLjEnLAogICAgICAgIEludGVyZmFjZSA9PiAnU29tZSBUZXh0JywKICAgICl9OwoKPWN1dAoKc3ViIFZvdGVHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENyZWF0ZUJ5IEl0ZW1JRCBJbnRlcmZhY2UgSVApKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CiAgICB9CgogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoQ3JlYXRlZEJ5IEludGVyZmFjZSBJUCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoSXRlbUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBteSAkRXh0ID0gIiI7CiAgICBteSAkU1FMID0gIiBTRUxFQ1QgY3JlYXRlZF9ieSwgaXRlbV9pZCwgaW50ZXJmYWNlLCBpcCwgY3JlYXRlZCwgcmF0ZSBGUk9NIGZhcV92b3RpbmcgV0hFUkUiOwoKICAgICMgcHVibGljCiAgICBpZigkUGFyYW17SW50ZXJmYWNlfSBlcSAnMycpIHsKICAgICAgICAkRXh0IC49ICIgaXAgTElLRSAnJFBhcmFte0lQfScgQU5EIi4KICAgICAgICAgICAgICAgICIgaXRlbV9pZCA9ICRQYXJhbXtJdGVtSUR9IjsKCiAgICAjIGN1c3RvbWVyCiAgICB9IGVsc2lmKCRQYXJhbXtJbnRlcmZhY2V9IGVxICcyJykgewogICAgICAgICRFeHQgLj0gIiBjcmVhdGVkX2J5IExJS0UgJyRQYXJhbXtDcmVhdGVCeX0nIEFORCIuCiAgICAgICAgICAgICAgICAiIGl0ZW1faWQgPSAkUGFyYW17SXRlbUlEfSI7CgogICAgIyBpbnRlcm5hbAogICAgfSBlbHNpZigkUGFyYW17SW50ZXJmYWNlfSBlcSAnMScpIHsKICAgICAgICAkRXh0IC49ICIgY3JlYXRlZF9ieSBMSUtFICckUGFyYW17Q3JlYXRlQnl9JyBBTkQiLgogICAgICAgICAgICAgICAgIiBpdGVtX2lkID0gJFBhcmFte0l0ZW1JRH0iOwogICAgfQogICAgJFNRTCAuPSAkRXh0OwogICAgIyRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJFNRTCk7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgbXkgJURhdGEgPSAoKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRSb3dbMF0sCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUm93WzFdLAogICAgICAgICAgICBJbnRlcmZhY2UgPT4gJFJvd1syXSwKICAgICAgICAgICAgSVAgPT4gJFJvd1szXSwKICAgICAgICAgICAgQ3JlYXRlZCA9PiAkUm93WzRdLAogICAgICAgICAgICBSYXRlID0+ICRSb3dbNV0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICghJURhdGEpIHsKICAgICAgICAjJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTm8gdm90aW5nIGZvciB0aGlzIGZhcSBhcnRpY2xlISBLZXJuZWw6OlN5c3RlbTo6RkFROjpWb3RlR2V0KCkiKTsKICAgICAgICByZXR1cm4ge307CiAgICB9CiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSBWb3RlU2VhcmNoKCkKCnJldHVybnMgYSBhcnJheSB3aXRoIFZvdGVJRHMKCiAgICBteSBAVm90ZUlEcyA9IEB7JEZBUU9iamVjdC0+Vm90ZVNlYXJjaCgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICl9OwoKPWN1dAoKc3ViIFZvdGVTZWFyY2ggewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgbXkgJEV4dCA9ICIiOwogICAgbXkgJFNRTCA9ICIgU0VMRUNUIGlkIEZST00gZmFxX3ZvdGluZyBXSEVSRSI7CgogICAgaWYoZGVmaW5lZCgkUGFyYW17SXRlbUlEfSkpIHsKICAgICAgICAkRXh0IC49ICIgaXRlbV9pZCA9ICIgLiAkUGFyYW17SXRlbUlEfTsKICAgIH0KCiAgICAkU1FMIC49ICRFeHQ7CgogICAgbXkgQExpc3QgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMLCBMaW1pdCA9PiAkUGFyYW17TGltaXR9IHx8IDUwMCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcHVzaCAoQExpc3QsICRSb3dbMF0pOwogICAgfQogICAgcmV0dXJuIFxATGlzdDsKfQoKPWl0ZW0gVm90ZURlbGV0ZSgpCgphZGQgYW4gYXJ0aWNsZQoKICAgIG15ICRPayA9ICRGQVFPYmplY3QtPlZvdGVEZWxldGUoCiAgICAgICAgVm90ZUlEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFZvdGVEZWxldGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhWb3RlSUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhWb3RlSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIG15ICRTUUwgPSAiREVMRVRFIEZST00gZmFxX3ZvdGluZyBXSEVSRSBpZCA9ICIuJFBhcmFte1ZvdGVJRH07CgogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgfQoKfQoKPWl0ZW0gRkFRRGVsZXRlKCkKCmRlbGV0ZSBhbiBhcnRpY2xlCgogICAgJEZsYWcgPSAkRkFRT2JqZWN0LT5GQVFEZWxldGUoSXRlbUlEID0+IDEpOwoKPWN1dAoKc3ViIEZBUURlbGV0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbUlEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhJdGVtSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgI2lmICgkU2VsZi0+QXR0YWNobWVudERlbGV0ZSglUGFyYW0pKSB7CiAgICAgICAgbXkgQFZvdGVJRHMgPSBAeyRTZWxmLT5Wb3RlU2VhcmNoKEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSl9OwogICAgICAgIGZvcmVhY2ggbXkgJFRtcFZvdGVJRCAoQFZvdGVJRHMpIHsKICAgICAgICAgICAgaWYoISRTZWxmLT5Wb3RlRGVsZXRlKFZvdGVJRCA9PiAkVG1wVm90ZUlEKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkU2VsZi0+RkFRSGlzdG9yeURlbGV0ZSglUGFyYW0pKSB7CiAgICAgICAgICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIkRFTEVURSBGUk9NIGZhcV9pdGVtIFdIRVJFIGlkID0gJFBhcmFte0l0ZW1JRH0iKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAjfQogICAgcmV0dXJuIDA7Cn0KCj1pdGVtIEZBUUhpc3RvcnlBZGQoKQoKYWRkIGFuIGhpc3RvcnkgdG8gYW4gYXJ0aWNsZQoKICAgICRGbGFnID0gJEZBUU9iamVjdC0+RkFRSGlzdG9yeUFkZCgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICAgICBOYW1lID0+ICdVcGRhdGVkIEFydGljbGUuJywKICAgICk7Cgo9Y3V0CgpzdWIgRkFRSGlzdG9yeUFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbUlEIE5hbWUpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KE5hbWUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgIH0KICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIGZhcV9oaXN0b3J5IChuYW1lLCBpdGVtX2lkLCAiLgogICAgICAgICAgICAiIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpIi4KICAgICAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAgICAgIiAoJyRQYXJhbXtOYW1lfScsICRQYXJhbXtJdGVtSUR9LCAiLgogICAgICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0sICIuCiAgICAgICAgICAgICIgY3VycmVudF90aW1lc3RhbXAsICRTZWxmLT57VXNlcklEfSkiOwoKICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfQoKPWl0ZW0gRkFRSGlzdG9yeUdldCgpCgpnZXQgYSBhcnJheSB3aXRoIGhhY2hyZWYgKE5hbWUsIENyZWF0ZWQpIHdpdGggaGlzdG9yeSBvZiBhbiBhcnRpY2xlIGJhY2sKCiAgICBteSBARGF0YSA9IEB7JEZBUU9iamVjdC0+RkFRSGlzdG9yeUdldCgKICAgICAgICBJdGVtSUQgPT4gMSwKICAgICl9OwoKPWN1dAoKc3ViIEZBUUhpc3RvcnlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICBteSBARGF0YSA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgbmFtZSwgY3JlYXRlZCwgY3JlYXRlZF9ieSBGUk9NIGZhcV9oaXN0b3J5IFdIRVJFIGl0ZW1faWQgPSAkUGFyYW17SXRlbUlEfSIsCiAgICApOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVSZWNvcmQgPSAoCiAgICAgICAgICAgIE5hbWUgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ3JlYXRlZCA9PiAkUm93WzFdLAogICAgICAgICAgICBDcmVhdGVkQnkgPT4gJFJvd1syXSwKICAgICAgICApOwogICAgICAgIHB1c2ggKEBEYXRhLCBcJVJlY29yZCk7CiAgICB9CiAgICByZXR1cm4gXEBEYXRhOwp9Cgo9aXRlbSBGQVFIaXN0b3J5RGVsZXRlKCkKCmRlbGV0ZSBhbiBoaXN0b3J5IG9mIGFuIGFydGljbGUKCiAgICAkRkFRT2JqZWN0LT5GQVFIaXN0b3J5RGVsZXRlKAogICAgICAgIEl0ZW1JRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGQVFIaXN0b3J5RGVsZXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJdGVtSUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGZhcV9oaXN0b3J5IFdIRVJFIGl0ZW1faWQgPSAkUGFyYW17SXRlbUlEfSIsCiAgICApOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEhpc3RvcnlHZXQoKQoKZ2V0IHRoZSBzeXN0ZW0gaGlzdG9yeQoKICAgIG15IEBEYXRhID0gQHskRkFRT2JqZWN0LT5IaXN0b3J5R2V0KCl9OwoKPWN1dAoKc3ViIEhpc3RvcnlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVlcnkKICAgIG15ICRTUUwgPSAiU0VMRUNUIGkuaWQsIGgubmFtZSwgaC5jcmVhdGVkLCBoLmNyZWF0ZWRfYnksIGMubmFtZSwgaS5mX3N1YmplY3QsIGkuZl9udW1iZXIgRlJPTSIuCiAgICAgICAgIiBmYXFfaXRlbSBpLCBmYXFfc3RhdGUgcywgZmFxX2hpc3RvcnkgaCwgZmFxX2NhdGVnb3J5IGMgV0hFUkUiLgogICAgICAgICIgcy5pZCA9IGkuc3RhdGVfaWQgQU5EIGguaXRlbV9pZCA9IGkuaWQgQU5EIGkuY2F0ZWdvcnlfaWQgPSBjLmlkIjsKICAgIGlmICgkUGFyYW17U3RhdGVzfSAmJiByZWYoJFBhcmFte1N0YXRlc30pIGVxICdBUlJBWScgJiYgQHskUGFyYW17U3RhdGVzfX0pIHsKICAgICAgICAkU1FMIC49ICIgQU5EIHMubmFtZSBJTiAoJyR7XChqb2luICdcJywgXCcnLCBAeyRQYXJhbXtTdGF0ZXN9fSl9JykgIjsKICAgIH0KICAgICRTUUwgLj0gJyBPUkRFUiBCWSBjcmVhdGVkIERFU0MnOwogICAgbXkgQERhdGEgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMLCBMaW1pdCA9PiAyMDApOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVSZWNvcmQgPSAoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUm93WzBdLAogICAgICAgICAgICBBY3Rpb24gPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ3JlYXRlZCA9PiAkUm93WzJdLAogICAgICAgICAgICBDcmVhdGVkQnkgPT4gJFJvd1szXSwKICAgICAgICAgICAgQ2F0ZWdvcnkgPT4gJFJvd1s0XSwKICAgICAgICAgICAgU3ViamVjdCA9PiAkUm93WzVdLAogICAgICAgICAgICBOdW1iZXIgPT4gJFJvd1s2XSwKICAgICAgICApOwogICAgICAgIHB1c2ggKEBEYXRhLCBcJVJlY29yZCk7CiAgICB9CiAgICByZXR1cm4gXEBEYXRhOwp9Cgo9aXRlbSBDYXRlZ29yeUxpc3QoKQoKZ2V0IHRoZSBjYXRlZ29yeSBsaXN0IGFzIGhhc2gKCiAgICBteSAlQ2F0ZWdvcmllcyA9ICV7JEZBUU9iamVjdC0+Q2F0ZWdvcnlMaXN0KAogICAgICAgIFZhbGlkID0+IDEsCiAgICApfTsKCj1jdXQKCnN1YiBDYXRlZ29yeUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KICAgIH0KICAgICMgc3FsCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCwgcGFyZW50X2lkLCBuYW1lIEZST00gZmFxX2NhdGVnb3J5ICc7CiAgICBpZihkZWZpbmVkKCRQYXJhbXtWYWxpZH0pKSB7CiAgICAgICAgJFNRTCAuPSAnV0hFUkUgdmFsaWRfaWQgPSAxJzsKICAgIH0KICAgIG15ICVEYXRhID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7JFJvd1sxXX17JFJvd1swXX0gPSAkUm93WzJdOwogICAgfQoKICAgIHJldHVybiBcJURhdGE7Cn0KCj1pdGVtIENhdGVnb3J5U2VhcmNoKCkKCmdldCB0aGUgY2F0ZWdvcnkgc2VhcmNoIGFzIGhhc2gKCiAgICBteSBAQ2F0ZWdvcmllSURzID0gQHskRkFRT2JqZWN0LT5DYXRlZ29yeVNlYXJjaCgKICAgICAgICBOYW1lID0+ICJOYW1lIgogICAgKX07Cgo9Y3V0CgpzdWIgQ2F0ZWdvcnlTZWFyY2ggewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgc3FsCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIGZhcV9jYXRlZ29yeSBXSEVSRSB2YWxpZF9pZCA9IDEgIjsKICAgIG15ICRFeHQgPSAnJzsKCiAgICAjIFdIRVJFCiAgICBpZiAoZGVmaW5lZCgkUGFyYW17TmFtZX0pKSB7CiAgICAgICAgJEV4dCAuPSAiIEFORCBuYW1lIExJS0UgJyUiLiRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17TmFtZX0pLiIlJyI7CiAgICB9CiAgICBlbHNpZiAoZGVmaW5lZCgkUGFyYW17UGFyZW50SUR9KSkgewogICAgICAgICRFeHQgLj0gIiBBTkQgcGFyZW50X2lkID0gJyIuJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXtQYXJlbnRJRH0sICdJbnRlZ2VyJykuIiciOwogICAgfQogICAgZWxzaWYgKGRlZmluZWQoJFBhcmFte1BhcmVudElEc30pICYmIHJlZigkUGFyYW17UGFyZW50SURzfSkgZXEgJ0FSUkFZJyAmJiBAeyRQYXJhbXtQYXJlbnRJRHN9fSkgewogICAgICAgICRFeHQgPSAiIEFORCBwYXJlbnRfaWQgSU4gKCI7CiAgICAgICAgZm9yZWFjaCBteSAkUGFyZW50SUQgKEB7JFBhcmFte1BhcmVudElEc319KSB7CiAgICAgICAgICAgICRFeHQgLj0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJlbnRJRCwgJ0ludGVnZXInKS4iLCI7CiAgICAgICAgfQogICAgICAgICRFeHQgPSBzdWJzdHIoJEV4dCwwLC0xKTsKICAgICAgICAkRXh0IC49ICIpIjsKICAgIH0KICAgIGVsc2lmIChkZWZpbmVkKCRQYXJhbXtDYXRlZ29yeUlEc30pICYmIHJlZigkUGFyYW17Q2F0ZWdvcnlJRHN9KSBlcSAnQVJSQVknICYmIEB7JFBhcmFte0NhdGVnb3J5SURzfX0pIHsKICAgICAgICAkRXh0ID0gIiBBTkQgaWQgSU4gKCI7CiAgICAgICAgZm9yZWFjaCBteSAkQ2F0ZWdvcnlJRCAoQHskUGFyYW17Q2F0ZWdvcnlJRHN9fSkgewogICAgICAgICAgICAkRXh0IC49ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkQ2F0ZWdvcnlJRCwgJ0ludGVnZXInKS4iLCI7CiAgICAgICAgfQogICAgICAgICRFeHQgPSBzdWJzdHIoJEV4dCwwLC0xKTsKICAgICAgICAkRXh0IC49ICIpIjsKICAgIH0KICAgICNpZiAoZGVmaW5lZCgkUGFyYW17VmFsaWRJRH0pKSB7CiAgICAjICAgICRFeHQgLj0gIiBBTkQgdmFsaWRfaWQgPSAnIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte1ZhbGlkSUR9LCAnSW50ZWdlcicpLiInICI7CiAgICAjfQoKICAgICMgT1JERVIgQlkKICAgIGlmICgkUGFyYW17T3JkZXJ9KSB7CiAgICAgICAgJEV4dCAuPSAiIE9SREVSIEJZICI7CiAgICAgICAgaWYoJFBhcmFte09yZGVyfSBlcSAnTmFtZScpIHsKICAgICAgICAgICAgJEV4dCAuPSAibmFtZSI7CiAgICAgICAgfQogICAgICAgICNkZWZhdWx0CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFeHQgLj0gIm5hbWUiOwogICAgICAgIH0KICAgICAgICAjIFNPUlQKICAgICAgICBpZiAoJFBhcmFte1NvcnR9KSB7CiAgICAgICAgICAgIGlmICgkUGFyYW17U29ydH0gZXEgJ3VwJykgewogICAgICAgICAgICAgICAgJEV4dCAuPSAiIEFTQyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRQYXJhbXtTb3J0fSBlcSAnZG93bicpIHsKICAgICAgICAgICAgICAgICRFeHQgLj0gIiBERVNDIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFNRTCBTVEFURU1FTlQKICAgICRTUUwgLj0gJEV4dDsKCiAgICBteSBATGlzdCA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwsIExpbWl0ID0+IDUwMCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcHVzaCAoQExpc3QsICRSb3dbMF0pOwogICAgfQogICAgcmV0dXJuIFxATGlzdDsKfQoKPWl0ZW0gQ2F0ZWdvcnlHZXQoKQoKZ2V0IGEgY2F0ZWdvcnkgYXMgaGFzaAoKICAgIG15ICVDYXRlZ29yeSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5R2V0KAogICAgICAgIElEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENhdGVnb3J5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhDYXRlZ29yeUlEKSkgewogICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoQ2F0ZWdvcnlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbAogICAgbXkgJURhdGEgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBwYXJlbnRfaWQsIG5hbWUsIGNvbW1lbnRzLCB2YWxpZF9pZCBGUk9NIGZhcV9jYXRlZ29yeSBXSEVSRSBpZCA9ICRQYXJhbXtDYXRlZ29yeUlEfSAiLAogICAgKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkUm93WzBdLAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkUm93WzFdLAogICAgICAgICAgICBOYW1lID0+ICRSb3dbMl0sCiAgICAgICAgICAgIENvbW1lbnQgPT4gJFJvd1szXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkUm93WzRdLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIENhdGVnb3J5U3ViQ2F0ZWdvcnlJRExpc3QoKQoKZ2V0IGFsbCBzdWJjYXRlZ29yeSBpZHMgb2Ygb2YgYSBjYXRlZ29yeQoKICAgIG15ICVDYXRlZ29yeSA9ICRGQVFPYmplY3QtPkNhdGVnb3J5U3ViQ2F0ZWdvcmllSURMaXN0KAogICAgICAgIFBhcmVudElEID0+IDEsCiAgICAgICAgSXRlbVN0YXRlcyA9PiBbMSwyLDNdCiAgICApOwoKPWN1dAoKc3ViIENhdGVnb3J5U3ViQ2F0ZWdvcnlJRExpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQYXJlbnRJRCBJdGVtU3RhdGVzKSkgewogICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgfQogICAgbXkgQFN1YkNhdGVnb3J5SURzID0gKCk7CiAgICBpZiAoJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQWdlbnQnKSB7CiAgICAgICAgIyBhZGQgc3ViY2F0ZWdvcnlpZHMKICAgICAgICBAU3ViQ2F0ZWdvcnlJRHMgPSBAeyRTZWxmLT5BZ2VudENhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICAgICBTdGF0ZXMgPT4gJFBhcmFte0l0ZW1TdGF0ZXN9LAogICAgICAgICAgICBPcmRlciA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgIFNvcnQgPT4gJ2Rvd24nLAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKX07CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInKSB7CiAgICAgICAgIyBhZGQgc3ViY2F0ZWdvcnlpZHMKICAgICAgICBAU3ViQ2F0ZWdvcnlJRHMgPSBAeyRTZWxmLT5DdXN0b21lckNhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICAgICBTdGF0ZXMgPT4gJFBhcmFte0l0ZW1TdGF0ZXN9LAogICAgICAgICAgICBPcmRlciA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgIFNvcnQgPT4gJ2Rvd24nLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgKX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIGFkZCBzdWJjYXRlZ29yeWlkcwogICAgICAgIEBTdWJDYXRlZ29yeUlEcyA9IEB7JFNlbGYtPkNhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICAgICBTdGF0ZXMgPT4gJFBhcmFte0l0ZW1TdGF0ZXN9LAogICAgICAgICAgICBPcmRlciA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgIFNvcnQgPT4gJ2Rvd24nLAogICAgICAgICl9OwogICAgfQogICAgbXkgQFJlc3VsdCA9IEBTdWJDYXRlZ29yeUlEczsKICAgIGZvcmVhY2ggbXkgJFN1YkNhdGVnb3J5SUQgKEBTdWJDYXRlZ29yeUlEcykgewogICAgICAgIG15IEBUZW1wID0gQHskU2VsZi0+Q2F0ZWdvcnlTdWJDYXRlZ29yeUlETGlzdCgKICAgICAgICAgICAgUGFyZW50SUQgPT4gJFN1YkNhdGVnb3J5SUQsCiAgICAgICAgICAgIEl0ZW1TdGF0ZXMgPT4gJFBhcmFte0l0ZW1TdGF0ZXN9LAogICAgICAgICAgICBNb2RlID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKX07CiAgICAgICAgaWYoQFRlbXApIHsKICAgICAgICAgICAgcHVzaChAUmVzdWx0LCBAVGVtcCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFxAUmVzdWx0Owp9Cgo9aXRlbSBDYXRlZ29yeUFkZCgpCgphZGQgYSBjYXRlZ29yeQoKICAgIG15ICRJRCA9ICRGQVFPYmplY3QtPkNhdGVnb3J5QWRkKAogICAgICAgIE5hbWUgPT4gJ1NvbWUgQ2F0ZWdvcnknLAogICAgICAgIENvbW1lbnQgPT4gJ3NvbWUgY29tbWVudCAuLi4nLAogICAgKTsKCj1jdXQKCnN1YiBDYXRlZ29yeUFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUGFyZW50SUQgTmFtZSkpIHsKICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgZm9yZWFjaCAocXcoUGFyZW50SUQgVXNlcklEIFZhbGlkSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyBmYXFfY2F0ZWdvcnkgKG5hbWUsIHBhcmVudF9pZCwgY29tbWVudHMsIHZhbGlkX2lkLCAiLgogICAgICAgICAgICAiIGNyZWF0ZWQsIGNyZWF0ZWRfYnksIGNoYW5nZWQsIGNoYW5nZWRfYnkpIi4KICAgICAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAgICAgIiAoJyRQYXJhbXtOYW1lfScsICRQYXJhbXtQYXJlbnRJRH0sICckUGFyYW17Q29tbWVudH0nLCAkUGFyYW17VmFsaWRJRH0sICIuCiAgICAgICAgICAgICIgY3VycmVudF90aW1lc3RhbXAsICRTZWxmLT57VXNlcklEfSwgIi4KICAgICAgICAgICAgIiBjdXJyZW50X3RpbWVzdGFtcCwgJFNlbGYtPntVc2VySUR9KSI7CiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICMgZ2V0IG5ldyBjYXRlZ29yeSBpZAogICAgICAgICRTUUwgPSAiU0VMRUNUIGlkICIuCiAgICAgICAgICAgICIgRlJPTSAiIC4KICAgICAgICAgICAgIiBmYXFfY2F0ZWdvcnkgIiAuCiAgICAgICAgICAgICIgV0hFUkUgIiAuCiAgICAgICAgICAgICIgbmFtZSA9ICckUGFyYW17TmFtZX0nIjsKICAgICAgICBteSAkSUQgPSAnJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICRJRCA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgICMgbG9nIG5vdGljZQogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSA9PiAiRkFRQ2F0ZWdvcnk6ICckUGFyYW17TmFtZX0nIElEOiAnJElEJyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSAoJFNlbGYtPntVc2VySUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRJRDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gQ2F0ZWdvcnlVcGRhdGUoKQoKdXBkYXRlIGEgY2F0ZWdvcnkKCiAgICAkRkFRT2JqZWN0LT5DYXRlZ29yeVVwZGF0ZSgKICAgICAgICBJRCA9PiAxLAogICAgICAgIE5hbWUgPT4gJ1NvbWUgQ2F0ZWdvcnknLAogICAgICAgIENvbW1lbnQgPT4gJ3NvbWUgY29tbWVudCAuLi4nLAogICAgKTsKCj1jdXQKCnN1YiBDYXRlZ29yeVVwZGF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQ2F0ZWdvcnlJRCBQYXJlbnRJRCBOYW1lKSkgewogICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CiAgICBmb3JlYWNoIChxdyhDYXRlZ29yeUlEIFBhcmVudElEIFZhbGlkSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgICMgc3FsCiAgICBteSAkU1FMID0gIlVQREFURSBmYXFfY2F0ZWdvcnkgU0VUICIuCiAgICAgICAgIiBwYXJlbnRfaWQgPSAkUGFyYW17UGFyZW50SUR9LCAiLgogICAgICAgICIgbmFtZSA9ICckUGFyYW17TmFtZX0nLCAiLgogICAgICAgICIgY29tbWVudHMgPSAnJFBhcmFte0NvbW1lbnR9JywgIi4KICAgICAgICAiIHZhbGlkX2lkID0gJyRQYXJhbXtWYWxpZElEfScsICIuCiAgICAgICAgIiBjaGFuZ2VkID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZWRfYnkgPSAkU2VsZi0+e1VzZXJJRH0gIi4KICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte0NhdGVnb3J5SUR9IjsKICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgIyBsb2cgbm90aWNlCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlID0+ICJGQVFDYXRlZ29yeTogJyRQYXJhbXtOYW1lfScgSUQ6ICckUGFyYW17Q2F0ZWdvcnlJRH0nIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICgkU2VsZi0+e1VzZXJJRH0pISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gQ2F0ZWdvcnlEdXBsaWNhdGVDaGVjaygpCgpjaGVjayBhIGNhdGVnb3J5CgogICAgJEZBUU9iamVjdC0+Q2F0ZWdvcnlEdXBsaWNhdGVDaGVjaygKICAgICAgICBJRCA9PiAxLCAjIG9yCiAgICAgICAgTmFtZSA9PiAnU29tZSBOYW1lJywKICAgICAgICBQYXJlbnRJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDYXRlZ29yeUR1cGxpY2F0ZUNoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhOYW1lKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CiAgICBmb3JlYWNoIChxdyhJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgIyBzcWwKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gZmFxX2NhdGVnb3J5IFdIRVJFICI7CiAgICBpZihkZWZpbmVkKCRQYXJhbXtOYW1lfSkpIHsKICAgICAgICAkU1FMIC49ICJuYW1lID0gJyRQYXJhbXtOYW1lfScgQU5EIHBhcmVudF9pZCA9ICRQYXJhbXtQYXJlbnRJRH0gIjsKICAgICAgICBpZihkZWZpbmVkKCRQYXJhbXtJRH0pKSB7CiAgICAgICAgICAgICRTUUwgLj0gIkFORCBpZCAhPSAnJFBhcmFte0lEfScgIjsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICBpZiAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9Cgo9aXRlbSBDYXRlZ29yeUNvdW50KCkKCmNvdW50IGFuIGFydGljbGUKCiAgICAkRkFRT2JqZWN0LT5DYXRlZ29yeUNvdW50KAogICAgICAgIFBhcmVudElEcyA9PiBbMSwyLDMsNF0sCiAgICApOwoKPWN1dAoKc3ViIENhdGVnb3J5Q291bnQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQYXJlbnRJRHMpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNRTCA9ICIiOwogICAgbXkgJEV4dCA9ICIiOwoKICAgICRTUUwgPSAiU0VMRUNUIENPVU5UKCopIiAuCiAgICAgICAgIiBGUk9NIGZhcV9jYXRlZ29yeSBXSEVSRSB2YWxpZF9pZCA9IDEiOwoKICAgIGlmKGRlZmluZWQoJFBhcmFte1BhcmVudElEc30pKSB7CiAgICAgICAgJEV4dCA9ICIgQU5EIHBhcmVudF9pZCBJTiAoIjsKICAgICAgICBmb3JlYWNoIG15ICRQYXJlbnRJRCAoQHskUGFyYW17UGFyZW50SURzfX0pIHsKICAgICAgICAgICAgJEV4dCAuPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmVudElELCdJbnRlZ2VyJykuIiwiOwogICAgICAgIH0KICAgICAgICAkRXh0ID0gc3Vic3RyKCRFeHQsMCwtMSk7CiAgICAgICAgJEV4dCAuPSAiKSI7CiAgICB9CiAgICAkRXh0IC49ICIgR1JPVVAgQlkgcGFyZW50X2lkIjsKCiAgICAkU1FMIC49ICRFeHQ7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCwgTGltaXQgPT4gMjAwKTsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgaWYobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICByZXR1cm4gJFJvd1swXTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cgp9Cgo9aXRlbSBTdGF0ZVR5cGVMaXN0KCkKCmdldCB0aGUgc3RhdGUgdHlwZSBsaXN0IGFzIGhhc2gKCiAgICBteSAlU3RhdGVUeXBlcyA9ICRGQVFPYmplY3QtPlN0YXRlVHlwZUxpc3QoKTsKCj1jdXQKCnN1YiBTdGF0ZVR5cGVMaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBteSAkU1FMID0gJyc7CiAgICBteSAkRXh0ID0gJyc7CiAgICAkU1FMID0gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIGZhcV9zdGF0ZV90eXBlIjsKCiAgICBpZigkUGFyYW17VHlwZXN9KSB7CiAgICAgICAgbXkgQFN0YXRlcyA9IEB7JFBhcmFte1R5cGVzfX07CiAgICAgICAgJEV4dCA9ICIgV0hFUkUiOwogICAgICAgIGZvcmVhY2ggbXkgJFN0YXRlIChAU3RhdGVzKSB7CiAgICAgICAgICAgICRFeHQgLj0gIiBuYW1lIExJS0UgJyIuJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRTdGF0ZSkuIicgT1IiOwogICAgICAgIH0KICAgICAgICAkRXh0ID0gc3Vic3RyKCRFeHQsMCwtMyk7CiAgICB9CiAgICAkU1FMIC49ICRFeHQ7CgogICAgIyBzcWwKICAgIG15ICVMaXN0ID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJExpc3R7JFJvd1swXX0gPSAkUm93WzFdOwogICAgfQogICAgcmV0dXJuIFwlTGlzdDsKfQoKPWl0ZW0gU3RhdGVMaXN0KCkKCmdldCB0aGUgc3RhdGUgbGlzdCBhcyBoYXNoCgogICAgbXkgJVN0YXRlcyA9ICRGQVFPYmplY3QtPlN0YXRlTGlzdCgpOwoKPWN1dAoKc3ViIFN0YXRlTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIHNxbAogICAgbXkgJUxpc3QgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lIEZST00gZmFxX3N0YXRlJyk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJExpc3R7JFJvd1swXX0gPSAkUm93WzFdOwogICAgfQogICAgcmV0dXJuICVMaXN0Owp9Cgo9aXRlbSBTdGF0ZVVwZGF0ZSgpCgp1cGRhdGUgYSBzdGF0ZQoKICAgICRGQVFPYmplY3QtPlN0YXRlVXBkYXRlKAogICAgICAgIElEID0+IDEsCiAgICAgICAgTmFtZSA9PiAncHVibGljJywKICAgICAgICBUeXBlSUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdGVVcGRhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KElEIE5hbWUgVHlwZUlEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgZm9yZWFjaCAocXcoSUQgVHlwZUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsCiAgICBteSAkU1FMID0gIlVQREFURSBmYXFfc3RhdGUgU0VUIG5hbWUgPSAnJFBhcmFte05hbWV9JywgdHlwZV9pZCA9ICRQYXJhbXtUeXBlSUR9LCAiLgogICAgICAgICIgV0hFUkUgaWQgPSAkUGFyYW17SUR9IjsKICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIFN0YXRlQWRkKCkKCmFkZCBhIHN0YXRlCgogICAgbXkgJElEID0gJEZBUU9iamVjdC0+U3RhdGVBZGQoCiAgICAgICAgSUQgPT4gMSwKICAgICAgICBOYW1lID0+ICdwdWJsaWMnLAogICAgICAgIFR5cGVJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0ZUFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTmFtZSBUeXBlSUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhOYW1lKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CiAgICBmb3JlYWNoIChxdyhUeXBlSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyBmYXFfc3RhdGUgKG5hbWUsIHR5cGVfaWQpICIuCiAgICAgICAgIiBWQUxVRVMgIi4KICAgICAgICAiICgnJFBhcmFte05hbWV9JywgJFBhcmFte1R5cGVJRH0pICI7CgogICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gU3RhdGVHZXQoKQoKZ2V0IGEgc3RhdGUgYXMgaGFzaAoKICAgIG15ICVTdGF0ZSA9ICRGQVFPYmplY3QtPlN0YXRlR2V0KAogICAgICAgIElEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRlR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhJRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsCiAgICBteSAlRGF0YSA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBmYXFfc3RhdGUgV0hFUkUgaWQgPSAkUGFyYW17SUR9IiwKICAgICk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJURhdGEgPSAoCiAgICAgICAgICAgIElEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAkUm93WzJdLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFN0YXRlVHlwZUdldCgpCgpnZXQgYSBzdGF0ZSBhcyBoYXNoCgogICAgbXkgJVN0YXRlID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlR2V0KAogICAgICAgIElEID0+IDEsICMgb3IKICAgICAgICBOYW1lID0+ICdpbnRlcm5hbCcsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRlVHlwZUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgbXkgJFNRTCA9ICIiOwogICAgbXkgJEV4dCA9ICIiOwoKICAgICRTUUwgPSAiU0VMRUNUIGlkLCBuYW1lICIuCiAgICAgICAgIiBGUk9NIGZhcV9zdGF0ZV90eXBlIFdIRVJFIjsKCiAgICBpZihkZWZpbmVkKCRQYXJhbXtJRH0pKSB7CiAgICAgICAgJEV4dCAuPSAiIGlkID0gIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte0lEfSwgJ0ludGVnZXInKQogICAgfQogICAgZWxzaWYoZGVmaW5lZCgkUGFyYW17TmFtZX0pKSB7CiAgICAgICAgJEV4dCAuPSAiIG5hbWUgTElLRSAnIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte05hbWV9KS4iJyIKICAgIH0KICAgICRTUUwgLj0gJEV4dDsKICAgICMgc3FsCiAgICBteSAlRGF0YSA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICRTUUwsCiAgICApOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICVEYXRhID0gKAogICAgICAgICAgICBJRCA9PiAkUm93WzBdLAogICAgICAgICAgICBOYW1lID0+ICRSb3dbMV0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJURhdGE7Cn0KCj1pdGVtIExhbmd1YWdlTGlzdCgpCgpnZXQgdGhlIGxhbmd1YWdlIGxpc3QgYXMgaGFzaAoKICAgIG15ICVMYW5ndWFnZXMgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUxpc3QoKTsKCj1jdXQKCnN1YiBMYW5ndWFnZUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgc3FsCiAgICBteSAlTGlzdCA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICdTRUxFQ1QgaWQsIG5hbWUgRlJPTSBmYXFfbGFuZ3VhZ2UnKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkTGlzdHskUm93WzBdfSA9ICRSb3dbMV07CiAgICB9CiAgICByZXR1cm4gJUxpc3Q7Cn0KCj1pdGVtIExhbmd1YWdlVXBkYXRlKCkKCnVwZGF0ZSBhIGxhbmd1YWdlCgogICAgJEZBUU9iamVjdC0+TGFuZ3VhZ2VVcGRhdGUoCiAgICAgICAgSUQgPT4gMSwKICAgICAgICBOYW1lID0+ICdTb21lIENhdGVnb3J5JywKICAgICk7Cgo9Y3V0CgpzdWIgTGFuZ3VhZ2VVcGRhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KElEIE5hbWUpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhOYW1lKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICB9CiAgICBmb3JlYWNoIChxdyhJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbAogICAgbXkgJFNRTCA9ICJVUERBVEUgZmFxX2xhbmd1YWdlIFNFVCBuYW1lID0gJyRQYXJhbXtOYW1lfScgIi4KICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte0lEfSI7CiAgICBpZiAoJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cgo9aXRlbSBMYW5ndWFnZUR1cGxpY2F0ZUNoZWNrKCkKCmNoZWNrIGEgbGFuZ3VhZ2UKCiAgICAkRkFRT2JqZWN0LT5MYW5ndWFnZUR1cGxpY2F0ZUNoZWNrKAogICAgICAgIE5hbWUgPT4gJ1NvbWUgTmFtZScsCiAgICAgICAgSUQgPT4gMSwgIyBmb3IgdXBkYXRlCiAgICApOwoKPWN1dAoKc3ViIExhbmd1YWdlRHVwbGljYXRlQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKHF3KE5hbWUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgIH0KICAgIGZvcmVhY2ggKHF3KElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICAjIHNxbAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBmYXFfbGFuZ3VhZ2UgV0hFUkUgIjsKICAgIGlmKGRlZmluZWQoJFBhcmFte05hbWV9KSkgewogICAgICAgICRTUUwgLj0gIm5hbWUgPSAnJFBhcmFte05hbWV9JyAiOwogICAgfQogICAgaWYoZGVmaW5lZCgkUGFyYW17SUR9KSkgewogICAgICAgICRTUUwgLj0gIkFORCBpZCAhPSAnJFBhcmFte0lEfScgIjsKICAgIH0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCj1pdGVtIExhbmd1YWdlQWRkKCkKCmFkZCBhIGxhbmd1YWdlCgogICAgbXkgJElEID0gJEZBUU9iamVjdC0+TGFuZ3VhZ2VBZGQoCiAgICAgICAgTmFtZSA9PiAnU29tZSBDYXRlZ29yeScsCiAgICApOwoKPWN1dAoKc3ViIExhbmd1YWdlQWRkIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhOYW1lKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyBmYXFfbGFuZ3VhZ2UgKG5hbWUpICIuCiAgICAgICAgICAgICIgVkFMVUVTICIuCiAgICAgICAgICAgICIgKCckUGFyYW17TmFtZX0nKSAiOwoKICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIExhbmd1YWdlR2V0KCkKCmdldCBhIGxhbmd1YWdlIGFzIGhhc2gKCiAgICBteSAlTGFuZ3VhZ2UgPSAkRkFRT2JqZWN0LT5MYW5ndWFnZUdldCgKICAgICAgICBJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMYW5ndWFnZUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGRiIHF1b3RlCiAgICBmb3JlYWNoIChxdyhJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbAogICAgbXkgJURhdGEgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBuYW1lIEZST00gZmFxX2xhbmd1YWdlIFdIRVJFIGlkID0gJFBhcmFte0lEfSIsCiAgICApOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICVEYXRhID0gKAogICAgICAgICAgICBJRCA9PiAkUm93WzBdLAogICAgICAgICAgICBOYW1lID0+ICRSb3dbMV0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gRkFRU2VhcmNoKCkKCnNlYXJjaCBpbiBhcnRpY2xlcwoKICAgIG15IEBJRHMgPSAkRkFRT2JqZWN0LT5GQVFTZWFyY2goCiAgICAgICAgTnVtYmVyID0+ICcqMTM0KicsCiAgICAgICAgV2hhdCA9PiAnKnNvbWUgdGV4dConLAogICAgICAgIEtleXdvcmQgPT4gJyp3ZWJzZXJ2ZXIqJywKICAgICAgICBTdGF0ZXMgPT4gWydwdWJsaWMnLCAnaW50ZXJuYWwnXSwKICAgICAgICBPcmRlciA9PiAnQ2hhbmdlZCcsCiAgICAgICAgU29ydCA9PiAnQVNDJywKICAgICAgICBMaW1pdCA9PiAxNTAsCiAgICApOwoKPWN1dAoKc3ViIEZBUVNlYXJjaCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc3FsCiAgICBteSAkU1FMID0gIlNFTEVDVCBpLmlkLCBjb3VudCggdi5pdGVtX2lkICkgYXMgdm90ZXMsIGF2Zyggdi5yYXRlICkgYXMgdnJhdGUiLgogICAgICAgICIgRlJPTSBmYXFfaXRlbSBpICIuCiAgICAgICAgIiBMRUZUIEpPSU4gZmFxX3ZvdGluZyB2IE9OIHYuaXRlbV9pZCA9IGkuaWQiLgogICAgICAgICIgTEVGVCBKT0lOIGZhcV9zdGF0ZSBzIE9OIHMuaWQgPSBpLnN0YXRlX2lkIi4KICAgICAgICAiIFdIRVJFIjsKICAgIG15ICRFeHQgPSAnJzsKICAgIGZvcmVhY2ggbXkgJEtleSAocXcoZl9zdWJqZWN0IGZfa2V5d29yZHMgZl9maWVsZDEgZl9maWVsZDIgZl9maWVsZDMgZl9maWVsZDQgZl9maWVsZDUgZl9maWVsZDYpKSB7CiAgICAgICAgaWYgKCRFeHQpIHsKICAgICAgICAgICAgJEV4dCAuPSAnIE9SICc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0IC49ICcgKCc7CiAgICAgICAgfQogICAgICAgIGlmICgkUGFyYW17V2hhdH0pIHsKICAgICAgICAgICAgbXkgQExpc3QgPSBzcGxpdCgvOy8sICRQYXJhbXtXaGF0fSk7CiAgICAgICAgICAgIG15ICRXaGF0ID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFZhbHVlIChATGlzdCkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gIlwlJFZhbHVlXCUiOwogICAgICAgICAgICAgICAgJFZhbHVlID1+IHMvXCovJS9nOwogICAgICAgICAgICAgICAgJFZhbHVlID1+IHMvJSUvJS9nOwogICAgICAgICAgICAgICAgaWYgKCRXaGF0KSB7CiAgICAgICAgICAgICAgICAgICAgJFdoYXQgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQojIHByZXBhcmVkIGZvciBPVFJTIDIuMy54CiAgICAgICAgICAgICAgICBteSAkVmFsdWVJbnNlcnQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFZhbHVlKTsKIyAgICAgICAgICAgICAgICBteSAkVmFsdWVJbnNlcnQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFZhbHVlLCAnTGlrZScpOwojICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEQk9iamVjdH0tPkdldERhdGFiYXNlRnVuY3Rpb24oJ05vTG93ZXJJbkxhcmdlVGV4dCcpICkgewogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0RGF0YWJhc2VGdW5jdGlvbignVHlwZScpIGVxICdtc3NxbCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJFdoYXQgLj0gIiBpLiRLZXkgTElLRSAnJFZhbHVlSW5zZXJ0JyI7CiAgICAgICAgICAgICAgICB9CiMgcHJlcGFyZWQgZm9yIE9UUlMgMi4zLngKIyAgICAgICAgICAgICAgICBlbHNpZiAoICRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMY2FzZUxpa2VJbkxhcmdlVGV4dCcpICkgewogICAgICAgICAgICAgICAgZWxzaWYgKCAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0RGF0YWJhc2VGdW5jdGlvbignVHlwZScpIGVxICdkYjInICkgewogICAgICAgICAgICAgICAgICAgICRXaGF0IC49ICIgTENBU0UoaS4kS2V5KSBMSUtFIExDQVNFKCckVmFsdWVJbnNlcnQnKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkV2hhdCAuPSAiIExPV0VSKGkuJEtleSkgTElLRSBMT1dFUignJFZhbHVlSW5zZXJ0JykiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRFeHQgLj0gJFdoYXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0IC49ICIgaS4kS2V5IExJS0UgJyUnIjsKICAgICAgICB9CiAgICB9CiAgICAkRXh0IC49ICcgKSc7CiAgICBpZiAoJFBhcmFte051bWJlcn0pIHsKICAgICAgICAkUGFyYW17TnVtYmVyfSA9fiBzL1wqLyUvZzsKICAgICAgICAkUGFyYW17TnVtYmVyfSA9fiBzLyUlLyUvZzsKICAgICAgICAkUGFyYW17TnVtYmVyfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17TnVtYmVyfSk7CiAgICAgICAgJEV4dCAuPSAiIEFORCBMT1dFUihpLmZfbnVtYmVyKSBMSUtFIExPV0VSKCckUGFyYW17TnVtYmVyfScpIjsKICAgIH0KICAgIGlmICgkUGFyYW17VGl0bGV9KSB7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICJcJSRQYXJhbXtUaXRsZX1cJSI7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9fiBzL1wqLyUvZzsKICAgICAgICAkUGFyYW17VGl0bGV9ID1+IHMvJSUvJS9nOwogICAgICAgICRQYXJhbXtUaXRsZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte1RpdGxlfSk7CiAgICAgICAgJEV4dCAuPSAiIEFORCBMT1dFUihpLmZfc3ViamVjdCkgTElLRSBMT1dFUignIi4kUGFyYW17VGl0bGV9LiInKSI7CiAgICB9CiAgICBpZiAoJFBhcmFte0xhbmd1YWdlSURzfSAmJiByZWYoJFBhcmFte0xhbmd1YWdlSURzfSkgZXEgJ0FSUkFZJyAmJiBAeyRQYXJhbXtMYW5ndWFnZUlEc319KSB7CiAgICAgICAgJEV4dCAuPSAiIEFORCBpLmZfbGFuZ3VhZ2VfaWQgSU4gKCI7CiAgICAgICAgZm9yZWFjaCBteSAkTGFuZ3VhZ2VJRCAoQHskUGFyYW17TGFuZ3VhZ2VJRHN9fSkgewogICAgICAgICAgICAkRXh0IC49ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkTGFuZ3VhZ2VJRCwgJ0ludGVnZXInKS4iLCI7CiAgICAgICAgfQogICAgICAgICRFeHQgPSBzdWJzdHIoJEV4dCwwLC0xKTsKICAgICAgICAkRXh0IC49ICIpIjsKICAgIH0KICAgIGlmICgkUGFyYW17Q2F0ZWdvcnlJRHN9ICYmIHJlZigkUGFyYW17Q2F0ZWdvcnlJRHN9KSBlcSAnQVJSQVknICYmIEB7JFBhcmFte0NhdGVnb3J5SURzfX0pIHsKICAgICAgICAkRXh0IC49ICIgQU5EIChpLmNhdGVnb3J5X2lkIElOICAoIjsKICAgICAgICBteSAkQ291bnRlcj0wOwogICAgICAgIGZvcmVhY2ggbXkgJENhdGVnb3J5SUQgKEB7JFBhcmFte0NhdGVnb3J5SURzfX0pIHsKICAgICAgICAgICAgJEV4dCAuPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJENhdGVnb3J5SUQsICdJbnRlZ2VyJykuIiwiOwogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICBpZighKCRDb3VudGVyJTUwMCkpIHsKICAgICAgICAgICAgICAgICRFeHQgPSBzdWJzdHIoJEV4dCwwLC0xKTsKICAgICAgICAgICAgICAgICRFeHQgLj0gIikiOwogICAgICAgICAgICAgICAgJEV4dCAuPSAiIE9SIGkuY2F0ZWdvcnlfaWQgSU4gICgiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRFeHQgPSBzdWJzdHIoJEV4dCwwLC0xKTsKICAgICAgICAkRXh0IC49ICIpKSI7CiAgICB9CiAgICBpZiAoJFBhcmFte1N0YXRlc30gJiYgcmVmKCRQYXJhbXtTdGF0ZXN9KSBlcSAnSEFTSCcgJiYgJXskUGFyYW17U3RhdGVzfX0pIHsKICAgICAgICAkRXh0IC49ICIgQU5EIHMudHlwZV9pZCBJTiAoIjsKICAgICAgICBmb3JlYWNoIG15ICRTdGF0ZUlEIChrZXlzKCV7JFBhcmFte1N0YXRlc319KSkgewogICAgICAgICAgICAkRXh0IC49ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkU3RhdGVJRCwgJ0ludGVnZXInKS4iLCI7CiAgICAgICAgfQogICAgICAgICRFeHQgPSBzdWJzdHIoJEV4dCwwLC0xKTsKICAgICAgICAkRXh0IC49ICIpIjsKICAgIH0KICAgIGlmICgkUGFyYW17S2V5d29yZH0pIHsKICAgICAgICAkUGFyYW17S2V5d29yZH0gPSAiXCUkUGFyYW17S2V5d29yZH1cJSI7CiAgICAgICAgJFBhcmFte0tleXdvcmR9ID1+IHMvXCovJS9nOwogICAgICAgICRQYXJhbXtLZXl3b3JkfSA9fiBzLyUlLyUvZzsKICAgICAgICAkUGFyYW17S2V5d29yZH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte0tleXdvcmR9KTsKIyBwcmVwYXJlZCBmb3IgT1RSUyAyLjMueAojICAgICAgICAkUGFyYW17S2V5d29yZH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte0tleXdvcmR9LCAnTGlrZScpOwojICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdOb0xvd2VySW5MYXJnZVRleHQnKSApIHsKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdUeXBlJykgZXEgJ21zc3FsJyApIHsKICAgICAgICAgICAgJEV4dCAuPSAiIEFORCBpLmZfa2V5d29yZHMgTElLRSAnIi4kUGFyYW17S2V5d29yZH0uIiciOwogICAgICAgIH0KIyBwcmVwYXJlZCBmb3IgT1RSUyAyLjMueAojICAgICAgICBlbHNpZiAoICRTZWxmLT57REJPYmplY3R9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMY2FzZUxpa2VJbkxhcmdlVGV4dCcpICkgewogICAgICAgIGVsc2lmICggJFNlbGYtPntEQk9iamVjdH0tPkdldERhdGFiYXNlRnVuY3Rpb24oJ1R5cGUnKSBlcSAnZGIyJyApIHsKICAgICAgICAgICAgJEV4dCAuPSAiIEFORCBMQ0FTRShpLmZfa2V5d29yZHMpIExJS0UgTENBU0UoJyIuJFBhcmFte0tleXdvcmR9LiInKSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0IC49ICIgQU5EIExPV0VSKGkuZl9rZXl3b3JkcykgTElLRSBMT1dFUignIi4kUGFyYW17S2V5d29yZH0uIicpIjsKICAgICAgICB9CiAgICB9CiAgICAkRXh0IC49ICIgR1JPVVAgQlkgaS5pZCwgaS5mX3N1YmplY3QsIGkuZl9sYW5ndWFnZV9pZCwgaS5jcmVhdGVkLCBpLmNoYW5nZWQsIHMubmFtZSwgdi5pdGVtX2lkIjsKICAgIGlmICgkUGFyYW17T3JkZXJ9KSB7CiAgICAgICAgJEV4dCAuPSAiIE9SREVSIEJZICI7CgogICAgICAgICMgdGl0bGUKICAgICAgICBpZiAoJFBhcmFte09yZGVyfSBlcSAnVGl0bGUnKSB7CiAgICAgICAgICAgICRFeHQgLj0gImkuZl9zdWJqZWN0IjsKICAgICAgICB9CiAgICAgICAgIyBsYW5ndWFnZQogICAgICAgIGVsc2lmICgkUGFyYW17T3JkZXJ9IGVxICdMYW5ndWFnZScpIHsKICAgICAgICAgICAgJEV4dCAuPSAiaS5mX2xhbmd1YWdlX2lkIjsKICAgICAgICB9CiAgICAgICAgIyBzdGF0ZQogICAgICAgIGVsc2lmICgkUGFyYW17T3JkZXJ9IGVxICdTdGF0ZScpIHsKICAgICAgICAgICAgJEV4dCAuPSAicy5uYW1lIjsKICAgICAgICB9CiAgICAgICAgIyB2b3RlcwogICAgICAgIGVsc2lmICgkUGFyYW17T3JkZXJ9IGVxICdWb3RlcycpIHsKICAgICAgICAgICAgJEV4dCAuPSAidm90ZXMiOwogICAgICAgIH0KICAgICAgICAjIHJhdGVzCiAgICAgICAgZWxzaWYgKCRQYXJhbXtPcmRlcn0gZXEgJ1Jlc3VsdCcpIHsKICAgICAgICAgICAgJEV4dCAuPSAidnJhdGUiOwogICAgICAgIH0KICAgICAgICAjIGNoYW5nZWQKICAgICAgICBlbHNpZiAoJFBhcmFte09yZGVyfSBlcSAnQ3JlYXRlZCcpIHsKICAgICAgICAgICAgJEV4dCAuPSAiaS5jcmVhdGVkIjsKICAgICAgICB9CiAgICAgICAgIyBjcmVhdGVkCiAgICAgICAgZWxzaWYgKCRQYXJhbXtPcmRlcn0gZXEgJ0NoYW5nZWQnKSB7CiAgICAgICAgICAgICRFeHQgLj0gImkuY2hhbmdlZCI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJFBhcmFte1NvcnR9KSB7CiAgICAgICAgICAgIGlmICgkUGFyYW17U29ydH0gZXEgJ3VwJykgewogICAgICAgICAgICAgICAgJEV4dCAuPSAiIEFTQyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRQYXJhbXtTb3J0fSBlcSAnZG93bicpIHsKICAgICAgICAgICAgICAgICRFeHQgLj0gIiBERVNDIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRTUUwgLj0gJEV4dDsKICAgIG15IEBMaXN0ID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCwgTGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCA1MDApOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIHB1c2ggKEBMaXN0LCAkUm93WzBdKTsKICAgIH0KICAgIHJldHVybiBATGlzdDsKfQo9aXRlbSBGQVFQYXRoTGlzdEdldCgpCgpyZXR1cm5zIGEgY2F0ZWdvcnkgYXJyYXkKCiAgICBteSBASURzID0gJEZBUU9iamVjdC0+RkFRUGF0aExpc3RHZXQoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAxNTAsCiAgICApOwoKPWN1dAoKc3ViIEZBUVBhdGhMaXN0R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBteSBAQ2F0ZWdvcnlMaXN0ID0gKCk7CiAgICBteSAkVGVtcENhdGVnb3J5SUQgPSAkUGFyYW17Q2F0ZWdvcnlJRH07CiAgICB3aGlsZSgkVGVtcENhdGVnb3J5SUQpIHsKICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT5DYXRlZ29yeUdldChDYXRlZ29yeUlEID0+ICRUZW1wQ2F0ZWdvcnlJRCk7CiAgICAgICAgaWYoJURhdGEpIHsKICAgICAgICAgICAgJENhdGVnb3J5TGlzdFskI0NhdGVnb3J5TGlzdCsxXSA9IFwlRGF0YTsKICAgICAgICB9CiAgICAgICAgJFRlbXBDYXRlZ29yeUlEID0gJERhdGF7UGFyZW50SUR9OwogICAgfQogICAgQENhdGVnb3J5TGlzdCA9IHJldmVyc2UoQENhdGVnb3J5TGlzdCk7CgogICAgcmV0dXJuIFxAQ2F0ZWdvcnlMaXN0OwoKfQoKPWl0ZW0gR2V0Q2F0ZWdvcnlUcmVlKCkKCmdldCBhbGwgY2F0ZWdvcmllcyBhcyB0cmVlCgogICAgbXkgJEhhc2ggPSAkRkFRT2JqZWN0LT5HZXRDYXRlZ29yeVRyZWUoCiAgICAgICAgVmFsaWQgPT4gMCwgIyBpZiAxIHRoZW4gY2hlY2sgdmFsaWQgY2F0ZWdvcnkKICAgICk7Cgo9Y3V0CgpzdWIgR2V0Q2F0ZWdvcnlUcmVlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVIYXNoID0gKCk7CiAgICBteSAkU1FMID0gJyc7CiAgICAjIHNxbAogICAgJFNRTCA9ICJTRUxFQ1QgaWQsIHBhcmVudF9pZCwgbmFtZSBGUk9NIGZhcV9jYXRlZ29yeSI7CiAgICBpZiAoJFBhcmFte1ZhbGlkfSkgewogICAgICAgICRTUUwgLj0gIiBXSEVSRSB2YWxpZF9pZCA9IDEiOwogICAgfQogICAgJFNRTCAuPSAiIE9SREVSIEJZIG5hbWUiOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgIyB0cmVlCiAgICBteSBARGF0YTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIHB1c2ggKEBEYXRhLCBcQFJvdyk7CiAgICB9CiAgICBmb3JlYWNoIG15ICRSb3cgKEBEYXRhKSB7CiAgICAgICAgbXkgQFJvd0RhdGEgPSBAeyRSb3d9OwogICAgICAgICRIYXNoeyRSb3dEYXRhWzFdfXskUm93RGF0YVswXX0gPSAkUm93RGF0YVsyXTsKICAgIH0KICAgICMgcmV0dXJuIHRyZWUKICAgIG15ICRDYXRlZ29yaWVzID0gJFNlbGYtPl9NYWtlVHJlZShQYXJlbnRJRCA9PiAwLCBQYXJlbnQgPT4gJycsIEhhc2ggPT4gXCVIYXNoLCBUcmVlID0+IHt9LCk7CiAgICBpZiAoISRDYXRlZ29yaWVzKSB7CiAgICAgICAgJENhdGVnb3JpZXMgPSB7fTsKICAgIH0KICAgIHJldHVybiAkQ2F0ZWdvcmllczsKfQoKc3ViIF9NYWtlVHJlZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBmb3JlYWNoIG15ICRJRCAoa2V5cygleyRQYXJhbXtIYXNofS0+eyRQYXJhbXtQYXJlbnRJRH19fSkpIHsKICAgICAgICAkUGFyYW17VHJlZX0tPnskSUR9ID0gJFBhcmFte1BhcmVudH0uJFBhcmFte0hhc2h9LT57JFBhcmFte1BhcmVudElEfX17JElEfTsKICAgICAgICBpZiAoZGVmaW5lZCgkUGFyYW17SGFzaH0tPnskSUR9KSkgewogICAgICAgICAgICAkU2VsZi0+X01ha2VUcmVlKAogICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJElELAogICAgICAgICAgICAgICAgSGFzaCA9PiAkUGFyYW17SGFzaH0sCiAgICAgICAgICAgICAgICBUcmVlID0+ICRQYXJhbXtUcmVlfSwKICAgICAgICAgICAgICAgIFBhcmVudCA9PiAkUGFyYW17VHJlZX0tPnskSUR9Lic6OicsCiAgICAgICAgICAgICkKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJFBhcmFte1RyZWV9Owp9Cgo9aXRlbSBTZXRDYXRlZ29yeUdyb3VwKCkKc2V0IGdyb3VwcyB0byBhIGNhdGVnb3J5CgogICAgICAgICRGQVFPYmplY3QtPlNldENhdGVnb3J5R3JvdXAoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gMywKICAgICAgICAgICAgR3JvdXBJRHMgPT4gWzIsNCwxLDUsNzddLAogICAgICAgICk7Cgo9Y3V0CgpzdWIgU2V0Q2F0ZWdvcnlHcm91cCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkU1FMID0gJyc7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQ2F0ZWdvcnlJRCBHcm91cElEcykpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICRQYXJhbXtDYXRlZ29yeUlEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17Q2F0ZWdvcnlJRH0sICdJbnRlZ2VyJyk7CiAgICAjIGRlbGV0ZSBvbGQgZ3JvdXBzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBmYXFfY2F0ZWdvcnlfZ3JvdXAgV0hFUkUgY2F0ZWdvcnlfaWQgPSAkUGFyYW17Q2F0ZWdvcnlJRH0iLAogICAgKTsKICAgICMgaW5zZXJ0IGdyb3VwcwogICAgZm9yZWFjaCBteSAkS2V5IChAeyRQYXJhbXtHcm91cElEc319KSB7CiAgICAgICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJEtleSwgJ0ludGVnZXInKTsKICAgICAgICAkU1FMID0gIklOU0VSVCBJTlRPIGZhcV9jYXRlZ29yeV9ncm91cCAiLgogICAgICAgICAgICAiIChjYXRlZ29yeV9pZCwgZ3JvdXBfaWQsIGNoYW5nZWQsIGNoYW5nZWRfYnksIGNyZWF0ZWQsIGNyZWF0ZWRfYnkpIFZBTFVFUyIgLgogICAgICAgICAgICAiICgkUGFyYW17Q2F0ZWdvcnlJRH0sICRHcm91cElELCBjdXJyZW50X3RpbWVzdGFtcCwgJFNlbGYtPntVc2VySUR9LCAiLgogICAgICAgICAgICAiIGN1cnJlbnRfdGltZXN0YW1wLCAkU2VsZi0+e1VzZXJJRH0pIjsKICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnQgdG8gZGIKICAgICAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEdldENhdGVnb3J5R3JvdXAoKQpnZXQgZ3JvdXBzIGZyb20gYSBjYXRlZ29yeQoKICAgICRGQVFPYmplY3QtPkdldENhdGVnb3J5R3JvdXAoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAzLAogICAgKTsKCj1jdXQKCnN1YiBHZXRDYXRlZ29yeUdyb3VwIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRTUUwgPSAnJzsKICAgIG15IEBHcm91cHMgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhDYXRlZ29yeUlEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJFBhcmFte0NhdGVnb3J5SUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXtDYXRlZ29yeUlEfSwgJ0ludGVnZXInKTsKICAgICMgZ2V0IGdyb3VwcwogICAgJFNRTCA9ICJTRUxFQ1QgZ3JvdXBfaWQgRlJPTSBmYXFfY2F0ZWdvcnlfZ3JvdXAgV0hFUkUgY2F0ZWdvcnlfaWQgPSAkUGFyYW17Q2F0ZWdvcnlJRH0iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIHB1c2goQEdyb3VwcywgJFJvd1swXSk7CiAgICB9CiAgICByZXR1cm4gXEBHcm91cHM7Cn0KCj1pdGVtIEdldEFsbENhdGVnb3J5R3JvdXAoKQpnZXQgYWxsIGNhdGVnb3J5LWdyb3VwcwoKICAgICRGQVFPYmplY3QtPkdldEFsbENhdGVnb3J5R3JvdXAoKTsKCj1jdXQKCnN1YiBHZXRBbGxDYXRlZ29yeUdyb3VwIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRTUUwgPSAnJzsKICAgIG15ICVHcm91cHMgPSAoKTsKICAgICMgZ2V0IGdyb3VwcwogICAgJFNRTCA9ICJTRUxFQ1QgZ3JvdXBfaWQsIGNhdGVnb3J5X2lkIEZST00gZmFxX2NhdGVnb3J5X2dyb3VwIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIHdoaWxlICAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkR3JvdXBzeyRSb3dbMV19LT57JFJvd1swXX0gPSAxOwogICAgfQogICAgcmV0dXJuIFwlR3JvdXBzOwp9Cgo9aXRlbSBHZXRVc2VyQ2F0ZWdvcmllcygpCmdldCBhbGwgY2F0ZWdvcnktZ3JvdXBzCgogICAgbXkgJEhhc2hyZWYgPSAkRkFRT2JqZWN0LT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICBVc2VySUQgPT4gJzEyMzQ1NicsCiAgICAgICAgVHlwZSA9PiAncncnCiAgICApOwoKPWN1dAoKc3ViIEdldFVzZXJDYXRlZ29yaWVzIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEIFR5cGUpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhdGVnb3JpZXMgPSAkU2VsZi0+Q2F0ZWdvcnlMaXN0KFZhbGlkID0+IDEpOwogICAgbXkgJENhdGVnb3J5R3JvdXBzID0gJFNlbGYtPkdldEFsbENhdGVnb3J5R3JvdXAoKTsKICAgIG15ICVVc2VyR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICk7CgogICAgbXkgJUhhc2ggPSAoKTsKICAgICRTZWxmLT5fVXNlckNhdGVnb3JpZXMoCiAgICAgICAgQ2F0ZWdvcmllcyA9PiAkQ2F0ZWdvcmllcywKICAgICAgICBDYXRlZ29yeUdyb3VwcyA9PiAkQ2F0ZWdvcnlHcm91cHMsCiAgICAgICAgVXNlckdyb3VwcyA9PiBcJVVzZXJHcm91cHMsCiAgICAgICAgUGFyZW50SUQgPT4gMCwKICAgICAgICBOZXdIYXNoID0+IFwlSGFzaCwKICAgICk7CiAgICByZXR1cm4gXCVIYXNoOwp9CgpzdWIgX1VzZXJDYXRlZ29yaWVzIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVIYXNoID0gKCk7CiAgICBmb3JlYWNoIG15ICRDYXRlZ29yeUlEIChrZXlzICV7JFBhcmFte0NhdGVnb3JpZXN9LT57JFBhcmFte1BhcmVudElEfX19KSB7CiAgICAgICAgIyBjaGVjayBjYXRlZ29yeSBncm91cHMKICAgICAgICBpZiAoZGVmaW5lZCgkUGFyYW17Q2F0ZWdvcnlHcm91cHN9LT57JENhdGVnb3J5SUR9KSkgewogICAgICAgICAgICAjIGNoZWNrIHVzZXIgZ3JvdXBzCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEdyb3VwSUQgKGtleXMgJXskUGFyYW17Q2F0ZWdvcnlHcm91cHN9LT57JENhdGVnb3J5SUR9fSkgewogICAgICAgICAgICAgICAgaWYgKGRlZmluZWQoJFBhcmFte1VzZXJHcm91cHN9LT57JEdyb3VwSUR9KSkgewogICAgICAgICAgICAgICAgICAgICMgYWRkIGNhdGVnb3J5IHRvIG5ldyBoYXNoCiAgICAgICAgICAgICAgICAgICAgJEhhc2h7JENhdGVnb3J5SUR9ID0gJFBhcmFte0NhdGVnb3JpZXN9LT57JFBhcmFte1BhcmVudElEfX17JENhdGVnb3J5SUR9OwogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgICMgcmVjdXJzaW9uCiAgICAgICAgJFNlbGYtPl9Vc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgQ2F0ZWdvcmllcyA9PiAkUGFyYW17Q2F0ZWdvcmllc30sCiAgICAgICAgICAgIENhdGVnb3J5R3JvdXBzID0+ICRQYXJhbXtDYXRlZ29yeUdyb3Vwc30sCiAgICAgICAgICAgIFVzZXJHcm91cHMgPT4gJFBhcmFte1VzZXJHcm91cHN9LAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICAgICAgTmV3SGFzaCA9PiAkUGFyYW17TmV3SGFzaH0sCiAgICAgICAgKTsKICAgIH0KICAgICRQYXJhbXtOZXdIYXNofS0+eyRQYXJhbXtQYXJlbnRJRH19ID0gXCVIYXNoOwogICAgcmV0dXJuOwp9Cgo9aXRlbSBHZXRDdXN0b21lckNhdGVnb3JpZXMoKQpnZXQgYWxsIGNhdGVnb3J5LWdyb3VwcwoKICAgIG15ICRIYXNocmVmID0gJEZBUU9iamVjdC0+R2V0Q3VzdG9tZXJDYXRlZ29yaWVzKAogICAgICAgIEN1c3RvbWVyVXNlciA9PiAnaGFucycsCiAgICAgICAgVHlwZSA9PiAncncnCiAgICApOwoKPWN1dAoKc3ViIEdldEN1c3RvbWVyQ2F0ZWdvcmllcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEN1c3RvbWVyVXNlciBUeXBlKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYXRlZ29yaWVzID0gJFNlbGYtPkNhdGVnb3J5TGlzdChWYWxpZCA9PiAxKTsKICAgIG15ICRDYXRlZ29yeUdyb3VwcyA9ICRTZWxmLT5HZXRBbGxDYXRlZ29yeUdyb3VwKCk7CiMgICAgbXkgJVVzZXJHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAojICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiMgICAgICAgIFR5cGUgPT4gJFBhcmFte1R5cGV9LAojICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAojICAgICk7CgogICAgbXkgJVVzZXJHcm91cHMgPSAkU2VsZi0+e0N1c3RvbWVyR3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgIFR5cGUgPT4gJ3JvJywKICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgKTsKICAgIG15ICVIYXNoID0gKCk7CiAgICAkU2VsZi0+X1VzZXJDYXRlZ29yaWVzKAogICAgICAgIENhdGVnb3JpZXMgPT4gJENhdGVnb3JpZXMsCiAgICAgICAgQ2F0ZWdvcnlHcm91cHMgPT4gJENhdGVnb3J5R3JvdXBzLAogICAgICAgIFVzZXJHcm91cHMgPT4gXCVVc2VyR3JvdXBzLAogICAgICAgIFBhcmVudElEID0+IDAsCiAgICAgICAgTmV3SGFzaCA9PiBcJUhhc2gsCiAgICApOwogICAgcmV0dXJuIFwlSGFzaDsKfQoKPWl0ZW0gQ2hlY2tDYXRlZ29yeVVzZXJQZXJtaXNzaW9uKCkKZ2V0IHVzZXJwZXJtaXNzaW9uIGZyb20gYSBjYXRlZ29yeQoKICAgICRGQVFPYmplY3QtPkNoZWNrQ2F0ZWdvcnlVc2VyUGVybWlzc2lvbigKICAgICAgICBVc2VySUQgPT4gJzEyMzQ1NicsCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAnMTIzJywKICAgICk7Cgo9Y3V0CgpzdWIgQ2hlY2tDYXRlZ29yeVVzZXJQZXJtaXNzaW9uIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEIENhdGVnb3J5SUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBmb3JlYWNoIG15ICRQZXJtaXNzaW9uIChxdyhydyBybykpIHsKICAgICAgICBteSAkSGFzaCA9ICRTZWxmLT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBUeXBlID0+ICdybycKICAgICAgICApOwogICAgICAgIGZvcmVhY2ggbXkgJFBhcmVudElEIChrZXlzICV7JEhhc2h9KSB7CiAgICAgICAgICAgIG15ICRDYXRlZ29yeUhhc2ggPSAkSGFzaC0+eyRQYXJlbnRJRH07CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJENhdGVnb3J5SUQgKGtleXMgJXskQ2F0ZWdvcnlIYXNofSkgewogICAgICAgICAgICAgICAgaWYgKCRDYXRlZ29yeUlEID09ICRQYXJhbXtDYXRlZ29yeUlEfSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkUGVybWlzc2lvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAnJzsKfQoKPWl0ZW0gQ2hlY2tDYXRlZ29yeUN1c3RvbWVyUGVybWlzc2lvbigpCmdldCB1c2VycGVybWlzc2lvbiBmcm9tIGEgY2F0ZWdvcnkKCiAgICAkRkFRT2JqZWN0LT5DaGVja0NhdGVnb3J5Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgIFVzZXJJRCA9PiAnMTIzNDU2JywKICAgICAgICBDYXRlZ29yeUlEID0+ICcxMjMnLAogICAgKTsKCj1jdXQKCnN1YiBDaGVja0NhdGVnb3J5Q3VzdG9tZXJQZXJtaXNzaW9uIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQ3VzdG9tZXJVc2VyIENhdGVnb3J5SUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBmb3JlYWNoIG15ICRQZXJtaXNzaW9uIChxdyhydyBybykpIHsKICAgICAgICBteSAkSGFzaCA9ICRTZWxmLT5HZXRDdXN0b21lckNhdGVnb3JpZXMoCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgVHlwZSA9PiAncm8nCiAgICAgICAgKTsKICAgICAgICBmb3JlYWNoIG15ICRQYXJlbnRJRCAoa2V5cyAleyRIYXNofSkgewogICAgICAgICAgICBteSAkQ2F0ZWdvcnlIYXNoID0gJEhhc2gtPnskUGFyZW50SUR9OwogICAgICAgICAgICBmb3JlYWNoIG15ICRDYXRlZ29yeUlEIChrZXlzICV7JENhdGVnb3J5SGFzaH0pIHsKICAgICAgICAgICAgICAgIGlmICgkQ2F0ZWdvcnlJRCA9PSAkUGFyYW17Q2F0ZWdvcnlJRH0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFBlcm1pc3Npb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJyc7Cn0KCj1pdGVtIEFnZW50Q2F0ZWdvcnlTZWFyY2goKQoKZ2V0IHRoZSBjYXRlZ29yeSBzZWFyY2ggYXMgaGFzaAoKICAgIG15IEBDYXRlZ29yaWVJRHMgPSBAeyRGQVFPYmplY3QtPkFnZW50Q2F0ZWdvcnlTZWFyY2goCiAgICAgICAgTmFtZSA9PiAiTmFtZSIKICAgICl9OwoKPWN1dAoKc3ViIEFnZW50Q2F0ZWdvcnlTZWFyY2ggewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpc3QgPSAoKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCFkZWZpbmVkKCRQYXJhbXtQYXJlbnRJRH0pKSB7CiAgICAgICAgJFBhcmFte1BhcmVudElEfSA9IDA7CiAgICB9CiAgICBteSAkSGFzaHJlZiA9ICRTZWxmLT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSA9PiAncm8nCiAgICApOwogICAgbXkgJUNhdGVnb3J5SGFzaCA9ICV7JEhhc2hyZWYtPnskUGFyYW17UGFyZW50SUR9fX07CiAgICBATGlzdCA9IHNvcnQgeyRDYXRlZ29yeUhhc2h7JGF9IGNtcCAkQ2F0ZWdvcnlIYXNoeyRifX0gKGtleXMgJUNhdGVnb3J5SGFzaCk7CiAgICByZXR1cm4gXEBMaXN0Owp9Cgo9aXRlbSBDdXN0b21lckNhdGVnb3J5U2VhcmNoKCkKCmdldCB0aGUgY2F0ZWdvcnkgc2VhcmNoIGFzIGhhc2gKCiAgICBteSBAQ2F0ZWdvcmllSURzID0gQHskRkFRT2JqZWN0LT5DdXN0b21lckNhdGVnb3J5U2VhcmNoKAogICAgICAgIE5hbWUgPT4gIk5hbWUiCiAgICApfTsKCj1jdXQKCnN1YiBDdXN0b21lckNhdGVnb3J5U2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBMaXN0ID0gKCk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEN1c3RvbWVyVXNlcikpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuICgpOwogICAgICAgIH0KICAgIH0KICAgIGlmICghZGVmaW5lZCgkUGFyYW17UGFyZW50SUR9KSkgewogICAgICAgICRQYXJhbXtQYXJlbnRJRH0gPSAwOwogICAgfQogICAgbXkgJEhhc2hyZWYgPSAkU2VsZi0+R2V0Q3VzdG9tZXJDYXRlZ29yaWVzKAogICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICBUeXBlID0+ICdybycsCiAgICApOwogICAgbXkgJUNhdGVnb3J5SGFzaCA9ICV7JEhhc2hyZWYtPnskUGFyYW17UGFyZW50SUR9fX07CiAgICBATGlzdCA9IHNvcnQgeyRDYXRlZ29yeUhhc2h7JGF9IGNtcCAkQ2F0ZWdvcnlIYXNoeyRifX0gKGtleXMgJUNhdGVnb3J5SGFzaCk7CiAgICByZXR1cm4gXEBMaXN0Owp9Cgo9aXRlbSBQdWJsaWNDYXRlZ29yeVNlYXJjaCgpCgpnZXQgdGhlIGNhdGVnb3J5IHNlYXJjaCBhcyBoYXNoCgogICAgbXkgQENhdGVnb3JpZUlEcyA9IEB7JEZBUU9iamVjdC0+UHVibGljQ2F0ZWdvcnlTZWFyY2goCiAgICAgICAgTmFtZSA9PiAiTmFtZSIKICAgICl9OwoKPWN1dAoKc3ViIFB1YmxpY0NhdGVnb3J5U2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRTUUwgPSAnJzsKICAgIG15ICRTdGF0ZSA9IDA7CgogICAgIyBnZXQgJ3B1YmxpYycgc3RhdGUgaWQKICAgICRTUUwgPSAiU0VMRUNUIGlkIGZyb20gZmFxX3N0YXRlX3R5cGUgV0hFUkUgbmFtZSA9ICdwdWJsaWMnIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMLCBMaW1pdCA9PiA1MDApOwogICAgd2hpbGUgIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRTdGF0ZSA9ICRSb3dbMF07CiAgICB9CgogICAgIyBnZXQgY2F0ZWdvcnkgaWRzCiAgICAkU1FMID0gIlNFTEVDVCBkaXN0aW5jdChmYXFfaXRlbS5jYXRlZ29yeV9pZCkgRlJPTSBmYXFfaXRlbSAiLgogICAgICAgICJMRUZUIEpPSU4gZmFxX2NhdGVnb3J5IE9OIGZhcV9pdGVtLmNhdGVnb3J5X2lkID0gZmFxX2NhdGVnb3J5LmlkICIuCiAgICAgICAgIldIRVJFIGZhcV9jYXRlZ29yeS52YWxpZF9pZCA9IDEgQU5EIGZhcV9pdGVtLnN0YXRlX2lkID0gJFN0YXRlIjsKICAgIGlmIChkZWZpbmVkKCRQYXJhbXtQYXJlbnRJRH0pKSB7CiAgICAgICAgJFNRTCAuPSAiIEFORCBmYXFfY2F0ZWdvcnkucGFyZW50X2lkID0gIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte1BhcmVudElEfSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBteSBATGlzdCA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwsIExpbWl0ID0+IDUwMCk7CiAgICB3aGlsZSAgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcHVzaCAoQExpc3QsICRSb3dbMF0pOwogICAgfQogICAgcmV0dXJuIFxATGlzdDsKfQoKMTsKCj1iYWNrCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE2ICQgJERhdGU6IDIwMDgvMDMvMTQgMTU6NTA6NDQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9GQVEucG0gLSB0byBsaW5rIGZhcSBvYmplY3RzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGQVEucG0sdiAxLjQgMjAwOC8wMy8wMiAyMzowMDo0NCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDo6RkFROwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS40ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgSW5pdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgJFNlbGYtPntGQVFPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZBUS0+bmV3KCV7JFNlbGZ9KTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIEZpbGxEYXRhTWFwIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIGZvcmVhY2ggKHF3KElEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCgKICAgICAgICBGQVFJRCA9PiAkUGFyYW17SUR9LAogICAgKTsKICAgIHJldHVybiAoCiAgICAgICAgVGV4dCA9PiAnRjonLiRBcnRpY2xle051bWJlcn0sCiAgICAgICAgTnVtYmVyID0+ICRBcnRpY2xle051bWJlcn0sCiAgICAgICAgVGl0bGUgID0+ICRBcnRpY2xle1RpdGxlfSwKICAgICAgICBJRCA9PiAkUGFyYW17SUR9LAogICAgICAgIE9iamVjdCA9PiAnRkFRJywKICAgICAgICBGcm9udGVuZERlc3QgPT4gIkFjdGlvbj1BZ2VudEZBUSZJdGVtSUQ9IiwKICAgICk7Cn0KCnN1YiBCYWNrZW5kTGlua09iamVjdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICByZXR1cm4gMTsKfQoKc3ViIEJhY2tlbmRVbmxpbmtPYmplY3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgcmV0dXJuIDE7Cn0KCnN1YiBMaW5rU2VhcmNoUGFyYW1zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIHJldHVybiAoCiAgICAgICAgeyBOYW1lID0+ICdGQVFOdW1iZXInLCBUZXh0ID0+ICdGQVEjJ30sCiAgICAgICAgeyBOYW1lID0+ICdGQVFUaXRsZScsIFRleHQgPT4gJ1RpdGxlJ30sCiAgICAgICAgeyBOYW1lID0+ICdGQVFGdWxsdGV4dCcsIFRleHQgPT4gJ0Z1bGx0ZXh0J30sCiAgICApOwp9CgpzdWIgTGlua1NlYXJjaCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBAUmVzdWx0V2l0aERhdGEgPSAoKTsKICAgIG15IEBSZXN1bHQgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICBOdW1iZXIgPT4gJFBhcmFte0ZBUU51bWJlcn0sCiAgICAgICAgVGl0bGUgPT4gJFBhcmFte0ZBUVRpdGxlfSwKICAgICAgICBXaGF0ID0+ICRQYXJhbXtGQVFGdWxsdGV4dH0sCiAgICApOwogICAgZm9yZWFjaCAoQFJlc3VsdCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoRkFRSUQgPT4gJF8pOwogICAgICAgIHB1c2ggKEBSZXN1bHRXaXRoRGF0YSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICBJRCA9PiAkQXJ0aWNsZXtJdGVtSUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gQFJlc3VsdFdpdGhEYXRhOwp9CgpzdWIgTGlua0l0ZW1EYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtJRH0sCiAgICApOwoKICAgIG15ICRCb2R5ID0gJyc7CiAgICBmb3JlYWNoICgxLi4xMCkgewogICAgICAgIGlmICgkQXJ0aWNsZXsiRmllbGQkXyJ9KSB7CiAgICAgICAgICAgICRCb2R5IC49ICRBcnRpY2xleyJGaWVsZCRfIn07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoCiAgICAgICAgJUFydGljbGUsCiAgICAgICAgSUQgPT4gJEFydGljbGV7SXRlbUlEfSwKICAgICAgICBCb2R5ID0+ICRCb2R5LAogICAgICAgIERldGFpbExpbmsgPT4gIkFjdGlvbj1BZ2VudEZBUSZJdGVtSUQ9JFBhcmFte0lEfSIsCiAgICApOwp9CgoxOwo=
IyAtLQojIEZBUS50IC0gRkFRIHRlc3RzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGQVEudCx2IDEuMyAyMDA4LzAzLzA1IDIzOjQ2OjEyIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgp1c2UgS2VybmVsOjpTeXN0ZW06OkZBUTsKCiRTZWxmLT57RkFRT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpGQVEtPm5ldygleyRTZWxmfSwgVXNlcklEID0+IDEpOwoKbXkgJEZBUUlEID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFBZGQoCiAgICBUaXRsZSA9PiAnU29tZSBUZXh0JywKICAgIENhdGVnb3J5SUQgPT4gMSwKICAgIFN0YXRlSUQgPT4gMSwKICAgIExhbmd1YWdlSUQgPT4gMSwKICAgIEtleXdvcmRzID0+ICdzb21lIGtleXdvcmRzJywKICAgIEZpZWxkMSA9PiAnUHJvYmxlbS4uLicsCiAgICBGaWVsZDIgPT4gJ1NvbHV0aW9uLi4uJywKICAgIEZyZWVLZXkxID0+ICdTb2Z0d2FyZScsCiAgICBGcmVlVGV4dDEgPT4gJ0FwYWNoZSAzLjQuMicsCiAgICBGcmVlS2V5MiA9PiAnT1MnLAogICAgRnJlZVRleHQyID0+ICdPcGVuQlNEIDQuMi4yJywKICAgIEZyZWVLZXkzID0+ICdLZXkzJywKICAgIEZyZWVUZXh0MyA9PiAnVmFsdWUzJywKICAgIEZyZWVLZXk0ID0+ICdLZXk0JywKICAgIEZyZWVUZXh0NCA9PiAnVmFsdWU0JywKKTsKCiRTZWxmLT5UcnVlKAogICAgJEZBUUlEIHx8IDAsCiAgICAiRkFRQWRkKCkgLSAxIiwKKTsKCm15ICVGQVEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCgKICAgIEl0ZW1JRCA9PiAkRkFRSUQsCik7CgpteSAlRkFRVGVzdCA9ICgKICAgIFRpdGxlID0+ICdTb21lIFRleHQnLAogICAgQ2F0ZWdvcnlJRCA9PiAxLAogICAgU3RhdGVJRCA9PiAxLAogICAgTGFuZ3VhZ2VJRCA9PiAxLAogICAgS2V5d29yZHMgPT4gJ3NvbWUga2V5d29yZHMnLAogICAgRmllbGQxID0+ICdQcm9ibGVtLi4uJywKICAgIEZpZWxkMiA9PiAnU29sdXRpb24uLi4nLAogICAgRnJlZUtleTEgPT4gJ1NvZnR3YXJlJywKICAgIEZyZWVUZXh0MSA9PiAnQXBhY2hlIDMuNC4yJywKICAgIEZyZWVLZXkyID0+ICdPUycsCiAgICBGcmVlVGV4dDIgPT4gJ09wZW5CU0QgNC4yLjInLAogICAgRnJlZUtleTMgPT4gJ0tleTMnLAogICAgRnJlZVRleHQzID0+ICdWYWx1ZTMnLAogICAgRnJlZUtleTQgPT4gJ0tleTQnLAogICAgRnJlZVRleHQ0ID0+ICdWYWx1ZTQnLAopOwoKZm9yIG15ICRUZXN0ICggc29ydCBrZXlzICVGQVFUZXN0ICkgewogICAgJFNlbGYtPklzKAogICAgICAgICRGQVF7JFRlc3R9IHx8IDAsCiAgICAgICAgJEZBUVRlc3R7JFRlc3R9IHx8ICcnLAogICAgICAgICJGQVFHZXQoKSAtICRUZXN0IiwKICAgICk7Cn0KCm15ICRGQVFVcGRhdGUgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVVwZGF0ZSgKICAgIEl0ZW1JRCA9PiAkRkFRSUQsCiAgICBDYXRlZ29yeUlEID0+IDEsCiAgICBTdGF0ZUlEID0+IDIsCiAgICBMYW5ndWFnZUlEID0+IDIsCiAgICBUaXRsZSA9PiAnU29tZSBUZXh0MicsCiAgICBLZXl3b3JkcyA9PiAnc29tZSBrZXl3b3JkczInLAogICAgRmllbGQxID0+ICdQcm9ibGVtLi4uMicsCiAgICBGaWVsZDIgPT4gJ1NvbHV0aW9uLi4uMicsCiAgICBGcmVlS2V5MSA9PiAnU29mdHdhcmUyJywKICAgIEZyZWVUZXh0MSA9PiAnQXBhY2hlIDMuNC4yMicsCiAgICBGcmVlS2V5MiA9PiAnT1MyJywKICAgIEZyZWVUZXh0MiA9PiAnT3BlbkJTRCA0LjIuMjInLAogICAgRnJlZUtleTMgPT4gJ0tleTMyJywKICAgIEZyZWVUZXh0MyA9PiAnVmFsdWUzMicsCiAgICBGcmVlS2V5NCA9PiAnS2V5NDInLAogICAgRnJlZVRleHQ0ID0+ICdWYWx1ZTQyJywKKTsKCiVGQVEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCgKICAgIEl0ZW1JRCA9PiAkRkFRSUQsCik7CgolRkFRVGVzdCA9ICgKICAgIFRpdGxlID0+ICdTb21lIFRleHQyJywKICAgIENhdGVnb3J5SUQgPT4gMSwKICAgIFN0YXRlSUQgPT4gMiwKICAgIExhbmd1YWdlSUQgPT4gMiwKICAgIEtleXdvcmRzID0+ICdzb21lIGtleXdvcmRzMicsCiAgICBGaWVsZDEgPT4gJ1Byb2JsZW0uLi4yJywKICAgIEZpZWxkMiA9PiAnU29sdXRpb24uLi4yJywKICAgIEZyZWVLZXkxID0+ICdTb2Z0d2FyZTInLAogICAgRnJlZVRleHQxID0+ICdBcGFjaGUgMy40LjIyJywKICAgIEZyZWVLZXkyID0+ICdPUzInLAogICAgRnJlZVRleHQyID0+ICdPcGVuQlNEIDQuMi4yMicsCiAgICBGcmVlS2V5MyA9PiAnS2V5MzInLAogICAgRnJlZVRleHQzID0+ICdWYWx1ZTMyJywKICAgIEZyZWVLZXk0ID0+ICdLZXk0MicsCiAgICBGcmVlVGV4dDQgPT4gJ1ZhbHVlNDInLAopOwoKZm9yIG15ICRUZXN0ICggc29ydCBrZXlzICVGQVFUZXN0ICkgewogICAgJFNlbGYtPklzKAogICAgICAgICRGQVFUZXN0eyRUZXN0fSB8fCAnJywKICAgICAgICAkRkFReyRUZXN0fSB8fCAwLAogICAgICAgICJGQVFHZXQoKSAtICRUZXN0IiwKICAgICk7Cn0KCm15ICRPayA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Vm90ZUFkZCgKICAgIENyZWF0ZWRCeSA9PiAnU29tZSBUZXh0JywKICAgIEl0ZW1JRCA9PiAkRkFRSUQsCiAgICBJUCA9PiAnNTQuNDMuMzAuMScsCiAgICBJbnRlcmZhY2UgPT4gJzInLAogICAgUmF0ZSA9PiAxMDAsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRPayB8fCAwLAogICAgIlZvdGVBZGQoKSIsCik7CgpteSAkVm90ZSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Vm90ZUdldCgKICAgIENyZWF0ZUJ5ID0+ICdTb21lIFRleHQnLAogICAgSXRlbUlEID0+ICRGQVFJRCwKICAgIElQID0+ICc1NC40My4zMC4xJywKICAgIEludGVyZmFjZSA9PiAnMicsCik7CgokU2VsZi0+SXMoCiAgICAkVm90ZS0+e0lQfSB8fCAwLAogICAgJzU0LjQzLjMwLjEnLAogICAgIlZvdGVHZXQoKSAtIElQIiwKKTsKCm15ICRGQVFJRDIgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUFkZCgKICAgIFRpdGxlID0+ICdUaXRsZScsCiAgICBDYXRlZ29yeUlEID0+IDEsCiAgICBTdGF0ZUlEID0+IDEsCiAgICBMYW5ndWFnZUlEID0+IDEsCiAgICBLZXl3b3JkcyA9PiAnJywKICAgIEZpZWxkMSA9PiAnUHJvYmxlbTEuLi4nLAogICAgRmllbGQyID0+ICdTb2x1dGlvbjEuLi4nLAogICAgRnJlZUtleTEgPT4gJ1NvZnR3YXJlMScsCiAgICBGcmVlVGV4dDEgPT4gJ0FwYWNoZSAzLjQuMicsCiAgICBGcmVlS2V5MiA9PiAnT1MnLAogICAgRnJlZVRleHQyID0+ICdPcGVuQlNEIDQuMi4yJywKICAgIEZyZWVLZXkzID0+ICdLZXkzJywKICAgIEZyZWVUZXh0MyA9PiAnVmFsdWUzJywKICAgIEZyZWVLZXk0ID0+ICdLZXk0JywKICAgIEZyZWVUZXh0NCA9PiAnVmFsdWU0JywKKTsKCiRTZWxmLT5UcnVlKAogICAgJEZBUUlEMiB8fCAwLAogICAgIkZBUUFkZCgpIC0gMiIsCik7CgpteSBARkFRSURzID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFTZWFyY2goCiAgICBOdW1iZXIgPT4gJyonLAogICAgV2hhdCA9PiAnKnMqJywKICAgIEtleXdvcmQgPT4gJ3NvbWUqJywKICAgIFN0YXRlcyA9PiBbJ3B1YmxpYycsICdpbnRlcm5hbCddLAogICAgT3JkZXIgPT4gJ1ZvdGVzJywKICAgIFNvcnQgPT4gJ0FTQycsCiAgICBMaW1pdCA9PiAxNTAsCik7CgpteSAkRkFRU2VhcmNoRm91bmQgPSAwOwpteSAkRkFRU2VhcmNoRm91bmQyID0gMDsKZm9yIG15ICRGQVFJRFNlYXJjaCAoIEBGQVFJRHMgKSB7CiAgICBpZiAoICRGQVFJRFNlYXJjaCBlcSAkRkFRSUQgKSB7CiAgICAgICAgJEZBUVNlYXJjaEZvdW5kID0gMTsKICAgIH0KICAgIGlmICggJEZBUUlEU2VhcmNoIGVxICRGQVFJRDIgKSB7CiAgICAgICAgJEZBUVNlYXJjaEZvdW5kMiA9IDE7CiAgICB9Cn0KJFNlbGYtPlRydWUoCiAgICAkRkFRU2VhcmNoRm91bmQsCiAgICAiRkFRU2VhcmNoKCkgLSAkRkFRSUQiLAopOwokU2VsZi0+RmFsc2UoCiAgICAkRkFRU2VhcmNoRm91bmQyLAogICAgIkZBUVNlYXJjaCgpIC0gJEZBUUlEMiIsCik7CgpARkFRSURzID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFTZWFyY2goCiAgICBOdW1iZXIgPT4gJyonLAogICAgVGl0bGUgPT4gJ3RJVExlJywKICAgIFdoYXQgID0+ICdsJywKICAgIFN0YXRlcyA9PiBbJ3B1YmxpYycsICdpbnRlcm5hbCddLAogICAgT3JkZXIgPT4gJ0NyZWF0ZWQnLAogICAgU29ydCA9PiAnQVNDJywKICAgIExpbWl0ID0+IDE1MCwKKTsKCiRGQVFTZWFyY2hGb3VuZCA9IDA7CiRGQVFTZWFyY2hGb3VuZDIgPSAwOwpmb3IgbXkgJEZBUUlEU2VhcmNoICggQEZBUUlEcyApIHsKICAgIGlmICggJEZBUUlEU2VhcmNoIGVxICRGQVFJRCApIHsKICAgICAgICAkRkFRU2VhcmNoRm91bmQgPSAxOwogICAgfQogICAgaWYgKCAkRkFRSURTZWFyY2ggZXEgJEZBUUlEMiApIHsKICAgICAgICAkRkFRU2VhcmNoRm91bmQyID0gMTsKICAgIH0KfQokU2VsZi0+RmFsc2UoCiAgICAkRkFRU2VhcmNoRm91bmQsCiAgICAiRkFRU2VhcmNoKCkgLSAkRkFRSUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRGQVFTZWFyY2hGb3VuZDIsCiAgICAiRkFRU2VhcmNoKCkgLSAkRkFRSUQyIiwKKTsKCm15IEBWb3RlSURzID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPlZvdGVTZWFyY2goCiAgICBJdGVtSUQgPT4gJEZBUUlELAopfTsKCmZvciBteSAkVm90ZUlEICggQFZvdGVJRHMgKSB7CiAgICBteSAkVm90ZURlbGV0ZSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Vm90ZURlbGV0ZSgKICAgICAgICBWb3RlSUQgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVm90ZURlbGV0ZSB8fCAwLAogICAgICAgICJWb3RlRGVsZXRlKCkiLAogICAgKTsKfQoKbXkgJEZBUURlbGV0ZSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRRGVsZXRlKAogICAgSXRlbUlEID0+ICRGQVFJRCwKKTsKJFNlbGYtPlRydWUoCiAgICAkRkFRRGVsZXRlIHx8IDAsCiAgICAiRkFRRGVsZXRlKCkiLAopOwoKbXkgJEZBUURlbGV0ZTIgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUURlbGV0ZSgKICAgIEl0ZW1JRCA9PiAkRkFRSUQyLAopOwokU2VsZi0+VHJ1ZSgKICAgICRGQVFEZWxldGUyIHx8IDAsCiAgICAiRkFRRGVsZXRlKCkiLAopOwoKMTsK
iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAIAAACUZLgLAAABgklEQVQokZWTMUsjQRiGny/GUvIDDjsLQRCikP8g2Jx2FoKFiAjRKxQEEQ5ETg5EBcHCvyCYzsLG0kIFjTZeJVhYaIJhszuzO/mu2M1uQhTxLQZ2Zp/vfeeFEVUFgPHVfygCKgIKXP0d4jOpqqoWVx680HnGJatxnnHFlQf9RHmgWL47+zPSsAAIiSeMDjyOlUMVBFE03r8+GAXyAM42wu4ILSTHxq9JQEFy0IIcCsWlq5vD8Tygka0HH11AmFmr9uz2J27q7JsF6AMXr0ofLG5W1xcGZ0uFlDi9Z3232sZarh6AsLHVNXtu5sdsqbB3gZM4enYUu4V1w8729cTPsf2prkDLJ0lJqZwN21hkagHO2Oc3po+TwSKdP7dZJTImC/lucH7wUoM0T2oiab8gOD/IKmlYIj+oeT1Mx1eMu2aGhZ4h9L373z1td6tSuZw/94EcQCtKx3wp12ymbtGrTxj4lcrll1gU+IDEL2B48ujp1iYn0nEjFaSjGaX5VM6w7+o/Xh/qfCGTpFEAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAIAAABmX9r1AAABeklEQVQokYWRvUtCYRTGz1WuphDUIoX/gFQiREPgcKGpghanBqOWKAfBoKkWawsaLvedhYaGcCqTjFDpvhEO4VCD2od4DfwqvVlZ2IechmtXA8lnejjnx+E55zCICN2k6Uq0IEopIYRpEyGEUtqCKKUcxxn7B4LhM6lUjd8UfP6jl4aB4ziFYxDR4/FYx+zTU5OMRqMvbgNArDaXf3yOBvZMPR88z4MS/DYnF+SanPAiIiLKCa+fpnwH52azGRGbUPK+rBBywqsa8eIaABCxGTxfqaW1S0/JjQy7rC7Va9QrhkFEQsgra7IMjxh1LMtqRw27ACDhwvFJqCSleJ7XAIDNZlt3zZ5GwncZKVcoKsT+YWBtxeVwOJqT1CsE/Vt9OimdrWiNFufiZusZ+CsAqMvxRuPrvRRJ0dX2FqPihJDEZdQ5M5jOVmJXn0O2Cbfb3WHSWzXzXS8/ZEKBnfk/LdUJgmAft6r7C4LQAUJEURQVQhTF9nor0z/6AQncFoIjEATtAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wDpAIB4rBT8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gUPDBkpSJgCpAAABRhJREFUOMvVlWto3fUZxz+//+3cTy4nOznJqWmaxjQGpY1EITHOpZrVigEtoogS71GE0rlBYLCNbbgZdayUMelopdgO9IWV1tZ6r7fWqqm21SRq6+mapjnpyeXcci7/c/6X316IeyHK3g32hefFA9/n4eF5vjxf+H+D+G+EmXeOd+VOTt0V1J1fGCp+o6GezLFxckLZXY6v+PW1vxxJ/mjxkSPTQ7v3fLTiu/zTEwuR17a+2jN5/+iOmc4rk4XBQemePi2dZFI6c3Myf/fdctHjkye7rpqa/HC850cnHr73pV3JlP/mcFj/wPDoFCtc1nfxSOdjJ8ZwN2xAHR1FX7cOoWlIoJjOUHjrPQq/+S1n/vi7P9x05+2//35jDaBcNejvv6Th40+Xbs2WJTcONqF92Y71xGuwZg16Po+YmoJcDlwXMZPE7unj/LYd1IblD+94fj5rPLLl+CvTSW7o6Ahh2hLdUNk42MDt4jOM555Di8ehsxOEgHwe9+mnqdY38P4dD3DUU523rep8NpslFou9MDQ09Pfu7u6sNn3+Yk1ra3j9wPoIbx9dAFVlw/oYK3c8ie/L/YBAdncj+vogEsEtm1imhbH9GX6yezsXbvp5VFOU6M6dO/H7/Y8fOHBg47Zt24bUrstvC0x9Y49OnC7T0RHGF9RJpm16Zo4Su7IN66mnYGgIdB23UsHRdErXDbA0/CDnzl/kM6dMqVhkcmKCarXK3NxcS2NjY7/WN9BeE1nlcGqyRLkqaYz7WNkaoOm+xylZeZQ9e7DHxpDlMlJRcNJpquemkSObKdxwM4MHdxHL5VkDHAY+lpJ4PH6NFjEXRn6mzLPh4atxVRXFNFEmJ9H/uh9l714EoA0Po65diwyFsBcWcfftQ/3Ln4h39eCLBWlYWqRDwJ3AM0CNz3dWy3w+wcpfbUZtaUExDNRCAW12Frl6NXLLFpRNm9CiUdRUCmnbuJdfgXvLbRRffxdr7M/4SyWchQVcwAA2A28mEnu1Qks76tiTMP4J2DZOczNWby/092MsL6M9/zzqoUOQSIDjoHl9eAeuJz3yGJne66g7eRgnl/+PzFygPh5HUy6kcO69B3vkIZAShED/6isCW7fi2bcPJZXCRWDaEsuy8C5lCex6lhWH3yF5fQe1AzahTpfKGUFxXFIxBeHmZrSmNw7cGHpiFHnppSiOg7K0hDo/D6pKQTFIqD6WxDJWvYCgjhH0EKn3EP9wkVCzn/A1fsJVH5QcrCGTiX96qI03oznSaRNnEngSCWQ4TKWunploE2nSzE79C8UnMWI+alsNmtYZNP40hN7QQDHXSuCiieYVoHjBddCbXSIjIQKt0aJ48W//6K89eWq7Xsy1Wl6/lY3FLwR61y5HJkZ6tUyGgO4n2uanpj2MqKsB3QOaFxA4lo2omCjFNJQKUFzmm6Umjiz0RQVAJpNRTNO8WghRjsVip6ZPHLw/cvzWZ42AgV4TgmAYAkEIhsDrA90ACdhV3HyOUrqAWirgs5f5Ot3JJ9VNUQ2grq7OBT767rLpmc8vafE7oKugat+GroPhAX8APF5SF0qkzoVIZa9wFjP2qzo27bXJa1FETW101bff7fuouMYXp821rNLPomsCdAG6im05JKZMZtMtFKtt++uaul5oWR0/flVj41kpJV9/Mb6iUlh8NBaJmT/oIIcOvizijbV3zJ45tlHXlWFbuiAUbNdzLFi/6oOGWOuLgUDgRFtbm/0/97x/A0fIGqQPAQaeAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAB3ElEQVQ4y7WVPW4UQRCFv/nxD7IEEgkiceAjWCKBhIwLEJmAtdCKY3AKSMYWSOQcgICIEyACRESAOICRmJnuriqC7vX02LPekaUdqVTV6u7Xb1696SnMjG089eN3f94f7FeLvaokeCE4JTjBpxyc4jfk4ATxioog/V/UXXyoD/arxbPjB/QO+g66HrouRQttB22bIq9b0BKcgROwMjItigtwnxf1nd2avgfnYngH3qcIEAKIpMhqzWKkZrVDwS713R3jycNhQwgQEkjIwue1H7L3hgiYGWYgzvj4qaS+twdPD4cDm6ZhuVxubI5ZBFNVVA1Vw8xwvfHla0l5G1esA13VmFGj84C7t4djO73+NQkax1Ca3s7HK7Y5qJkhqpgZ9ZQUTdOMxlOaD3JYatzqgBXwBOM5zZtinEtRz2meql1qmjfturZD3uiKqY03gaoqYDc3b93G9aAzpMg3mRl2dkQBVCv7vfhxpWlpXSJaTvl40vTXXLGGdSJaTxE+Pz8bjU9OXl4ynaN9BFYdLT49fTXJZs5bRSnSl6lieB/iAonNEY1a5XeBPv+GqqU5Rf91aNJUbQB1zsV7+dGb73Z0v0K8IEFi9mGog6D5XMoqutZNP3+3FNv655Vs6fkPvQLKVHtth28AAAAASUVORK5CYII=
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBmYXEucGwgLSB0aGUgZ2xvYmFsIENHSSBoYW5kbGUgZmlsZSBmb3IgT1RSUwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmYXEucGwsdiAxLjEgMjAwNi8wOS8yOCAxNzoyODoxMCByayBFeHAgJAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojIC0tCgojIHVzZSAuLi8uLi8gYXMgbGliIGxvY2F0aW9uCnVzZSBGaW5kQmluIHF3KCRCaW4pOwp1c2UgbGliICIkQmluLy4uLy4uIjsKdXNlIGxpYiAiJEJpbi8uLi8uLi9LZXJuZWwvY3Bhbi1saWIiOwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OIEBJTkMpOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKIyAtLQojIDA9b2ZmOzE9b247CiMgLS0KbXkgJERlYnVnID0gMDsKCiMgLS0KIyBjaGVjayBASU5DIGZvciBtb2RfcGVybCAoYWRkIGxpYiBwYXRoIGZvciAicmVxdWlyZSBtb2R1bGUiISkKIyAtLQpwdXNoIChASU5DLCAiJEJpbi8uLi8uLiIsICIkQmluLy4uLy4uL0tlcm5lbC9jcGFuLWxpYiIpOwoKcHJpbnQgImxvY2F0aW9uOiBwdWJsaWMucGw/QWN0aW9uPVB1YmxpY0ZBUVxuIjsKcHJpbnQgIlxuIjsKcHJpbnQgIjxhIGhyZWY9J3B1YmxpYy5wbD9BY3Rpb249UHVibGljRkFRJz5tb3ZlZDwvYT5cbiI7Cgo=
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBmYXEucGwgLSB0aGUgZ2xvYmFsIENHSSBoYW5kbGUgZmlsZSBmb3IgT1RSUwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmYXEuZnBsLHYgMS4xIDIwMDYvMDkvMjggMTc6Mjg6MTAgcmsgRXhwICQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIyAtLQoKIyB1c2UgLi4vLi4vIGFzIGxpYiBsb2NhdGlvbgp1c2UgRmluZEJpbiBxdygkQmluKTsKdXNlIGxpYiAiJEJpbi8uLi8uLiI7CnVzZSBsaWIgIiRCaW4vLi4vLi4vS2VybmVsL2NwYW4tbGliIjsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdygkVkVSU0lPTiBASU5DKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiMgLS0KIyAwPW9mZjsxPW9uOwojIC0tCm15ICREZWJ1ZyA9IDA7CgojIC0tCiMgY2hlY2sgQElOQyBmb3IgbW9kX3BlcmwgKGFkZCBsaWIgcGF0aCBmb3IgInJlcXVpcmUgbW9kdWxlIiEpCiMgLS0KcHVzaCAoQElOQywgIiRCaW4vLi4vLi4iLCAiJEJpbi8uLi8uLi9LZXJuZWwvY3Bhbi1saWIiKTsKCnByaW50ICJsb2NhdGlvbjogcHVibGljLmZwbD9BY3Rpb249UHVibGljRkFRXG4iOwpwcmludCAiXG4iOwpwcmludCAiPGEgaHJlZj0ncHVibGljLmZwbD9BY3Rpb249UHVibGljRkFRJz5tb3ZlZDwvYT5cbiI7Cgo=
en
de
internal
external
public
internal (agent)
1
external (customer)
2
public (all)
3
Misc
Misc Comment
1
current_timestamp
1
current_timestamp
1
0
Created
1
current_timestamp
1
current_timestamp
1