FAQ
1.3.1
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Added new features, Insert FAQ at cursor position of compose window, support of multiple attachments and RSS support for public FAQ interface.
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-04-08 22:19:03
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==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9GQVEucG0gLSBwcm92aWRlcyBkZSBsYW5ndWFnZSB0cmFuc2xhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfRkFRLnBtLHYgMS40IDIwMDgvMDMvMjYgMDg6NDM6MDEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9GQVE7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkVHJhbnNsYXRpb24gPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRUcmFuc2xhdGlvbiBuZSAnSEFTSCc7CgogICAgIyAkJFNUQVJUJCQKCiAgICAjIG93biB0cmFuc2xhdGlvbnMKICAgICRUcmFuc2xhdGlvbi0+eydZb3UgaGF2ZSBhbHJlYWR5IHZvdGVkISd9ID0gJ1NpZSBoYWJlbiBiZXJlaXRzIGJld2VydGV0ISc7CiAgICAkVHJhbnNsYXRpb24tPnsnTm8gcmF0ZSBzZWxlY3RlZCEnfSA9ICdLZWluZSBCZXdlcnR1bmcgYXVzd+RobHQhJzsKICAgICRUcmFuc2xhdGlvbi0+eydUaGFua3MgZm9yIHZvdGUhJ30gPSAnRGFua2UgZvxyIElocmUgQmV3ZXJ0dW5nZW4hJzsKICAgICRUcmFuc2xhdGlvbi0+e1ZvdGVzfSA9ICdCZXdlcnR1bmdlbic7CiAgICAkVHJhbnNsYXRpb24tPntMYXRlc3RDaGFuZ2VkSXRlbXN9ID0gJ3p1bGV0enQgZ2XkbmRlcnRlIEFydGlrZWwnOwogICAgJFRyYW5zbGF0aW9uLT57TGF0ZXN0Q3JlYXRlZEl0ZW1zfSA9ICd6dWxldHp0IGVyc3RlbGx0ZSBBcnRpa2VsJzsKICAgICRUcmFuc2xhdGlvbi0+e0FydGljbGVWb3RpbmdRdWVzdGlvbn0gPSAnV2llIGd1dCB3dXJkZSBtaXQgZGllc2VtIEFydGlrZWwgSWhyZSBGcmFnZSBiZWFudHdvcnRldD8nOwogICAgJFRyYW5zbGF0aW9uLT57U3ViQ2F0ZWdvcnlPZn0gPSAnVW50ZXJrYXRlZ29yaWUgdm9uJzsKICAgICRUcmFuc2xhdGlvbi0+e1F1aWNrU2VhcmNofSA9ICdTY2huZWxsc3VjaGUnOwogICAgJFRyYW5zbGF0aW9uLT57RGV0YWlsU2VhcmNofSA9ICdEZXRhaWxzdWNoZSc7CiAgICAkVHJhbnNsYXRpb24tPntDYXRlZ29yaWVzfSA9ICdLYXRlZ29yaWVuJzsKICAgICRUcmFuc2xhdGlvbi0+e1N1YkNhdGVnb3JpZXN9ID0gJ1N1YmthdGVnb3JpZW4nOwogICAgJFRyYW5zbGF0aW9uLT57J0EgY2F0ZWdvcnkgc2hvdWxkIGhhdmUgYSBuYW1lISd9ID0gJ0VpbmUgS2F0ZWdvcmllbiBzb2xsdGUgZWluZW4gTmFtZW4gaGFiZW4hJzsKICAgICRUcmFuc2xhdGlvbi0+eydBIGNhdGVnb3J5IHNob3VsZCBoYXZlIGEgY29tbWVudCEnfSA9ICdFaW5lIEthdGVnb3JpZW4gc29sbHRlIGVpbmVuIEtvbW1lbnRhciBoYWJlbiEnOwogICAgJFRyYW5zbGF0aW9uLT57J0ZBUSBOZXdzIChuZXcgY3JlYXRlZCknfSA9ICdGQVEgTmV3cyAobmV1IGVyc3RlbGx0ZSknOwogICAgJFRyYW5zbGF0aW9uLT57J0ZBUSBOZXdzIChyZWNlbnRseSBjaGFuZ2VkKSd9ID0gJ0ZBUSBOZXdzICh6dWxldHp0IGdl5G5kZXJ0ZSknOwogICAgJFRyYW5zbGF0aW9uLT57J05vIGNhdGVnb3J5IGFjY2VzYWJsZS4gVG8gY3JlYXRlIGFuIGFydGljbGUgeW91IG5lZWQgaGF2ZSBhdCBsZWFzZSBhY2Nlc3MgdG8gbWluLiBvbmUgY2F0ZWdvcnkuIFBsZWFzZSBjaGVjayB5b3VyIGdyb3VwL2NhdGVnb3J5IHBlcm1pc3Npb24gdW5kZXIgLWNhdGVnb3J5IG1lbnUtISd9ID0gJ0tlaW5lIEthdGVnb3JpZS1BdXN3YWhsIG32Z2xpY2guIFVtIGVpbmVuIEFydGlrZWwgZXJzdGVsbGVuIHp1IGv2bm5lbiwgbXVzcyBtYW4gbWluLiBadWdyaWZmIGF1ZiBlaW5lIEthdGVnb3JpZSBoYWJlbi4gQml0dGUg/GJlcnBy/GZlbiBTaWUgZGllIEdydXBwZW4vS2F0ZWdvcmllIEJlcmVjaHRpZ3VuZyBpbSBNZW51cHVua3QgLUthdGVnb3JpZS0hJzsKICAgICRUcmFuc2xhdGlvbi0+eydBZ2VudCBHcm91cHMgd2hpY2ggY2FuIGFjY2VzcyB0aGlzIGNhdGVnb3J5Lid9ID0gJ0FnZW50ZW4gR3J1cHBlIHdlbGNoZSBhdWYgZGllc2UgS2F0ZWdvcmllIFp1Z3JpZmYgaGF0Lic7CiAgICAkVHJhbnNsYXRpb24tPnsnQSBjYXRlZ29yeSBuZWVkIG1pbi4gb25lIHBlcm1pc3Npb24gZ3JvdXAhJ30gPSAnRWluZSBLYXRlZ29yaWUgbXVzcyBtaW4uIGVpbmUgQmVyZWNodGlndW5nLUdydXBwZSBoYWJlbi4nOwogICAgJFRyYW5zbGF0aW9uLT57J1dpbGwgYmUgc2hvd24gYXMgY29tbWVudCBpbiBFeHBsb3JlLid9ID0gJ1dpcmQgIGltIEV4cGxvcmVyIGFscyBLb21tZW50YXIgYW5nZXplaWd0Lic7CgogICAgIyAkJFNUT1AkJAogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lbl9GQVEucG0gLSBwcm92aWRlcyBlbiBsYW5ndWFnZSB0cmFuc2xhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZW5fRkFRLnBtLHYgMS4zIDIwMDgvMDMvMTkgMTA6NTU6NDMgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjplbl9GQVE7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkVHJhbnNsYXRpb24gPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRUcmFuc2xhdGlvbiBuZSAnSEFTSCc7CgogICAgIyAkJFNUQVJUJCQKCiAgICAjIG93biB0cmFuc2xhdGlvbnMKICAgICRUcmFuc2xhdGlvbi0+e1ZvdGVzfSA9ICdWb3Rlcyc7CiAgICAkVHJhbnNsYXRpb24tPntMYXRlc3RDaGFuZ2VkSXRlbXN9ID0gJ2xhdGVzdCBjaGFuZ2VkIGFydGljbGUnOwogICAgJFRyYW5zbGF0aW9uLT57TGF0ZXN0Q3JlYXRlZEl0ZW1zfSA9ICdsYXRlc3QgY3JlYXRlZCBhcnRpY2xlJzsKICAgICRUcmFuc2xhdGlvbi0+e0FydGljbGVWb3RpbmdRdWVzdGlvbn0gPSAnRGlkIHRoaXMgYXJ0aWNsZSBoZWxwPyc7CiAgICAkVHJhbnNsYXRpb24tPntRdWlja1NlYXJjaH0gPSAnUXVpY2sgU2VhcmNoJzsKICAgICRUcmFuc2xhdGlvbi0+e0RldGFpbFNlYXJjaH0gPSAnRGV0YWlsIFNlYXJjaCc7CiAgICAkVHJhbnNsYXRpb24tPnsnWW91IGhhdmUgYWxyZWFkeSB2b3RlZCEnfSA9ICdZb3UgaGF2ZSBhbHJlYWR5IHZvdGUhJzsKICAgICRUcmFuc2xhdGlvbi0+eydObyByYXRlIHNlbGVjdGVkISd9ID0gJ05vIHJhdGUgc2VsZWN0ZWQhJzsKICAgICRUcmFuc2xhdGlvbi0+eydUaGFua3MgZm9yIHZvdGUhJ30gPSAnVGhhbmtzIGZvciB2b3RlISc7CiAgICAkVHJhbnNsYXRpb24tPntDYXRlZ29yaWVzfSA9ICdDYXRlZ29yaWVzJzsKICAgICRUcmFuc2xhdGlvbi0+e1N1YkNhdGVnb3JpZXN9ID0gJ1N1YmNhdGVnb3JpZXMnOwoKICAgICMgJCRTVE9QJCQKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0ZBUS5wbSAtIGZhcSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZBUS5wbSx2IDEuMTMgMjAwOC8wMy8yNiAwODo0MjoyNyBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkZBUTsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBPcGplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0IFVzZXJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKSBpZiAoISRTZWxmLT57JF99KTsKICAgIH0KCiAgICAjIGZhcSBvYmplY3QKICAgICRTZWxmLT57RkFRT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpGQVEtPm5ldyglUGFyYW0pOwogICAgIyBsaW5rIG9iamVjdAogICAgJFNlbGYtPntMaW5rT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKICAgICMgYWdlbnQgdXNlcgogICAgJFNlbGYtPntBZ2VudFVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyglUGFyYW0pOwoKICAgICMgaW50ZXJmYWNlIHNldHRpbmdzCgogICAgJFNlbGYtPntJbnRlcmZhY2V9ID0gJFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgTmFtZSA9PiAncHVibGljJwogICAgKTsKICAgICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyA9PiBbJ3B1YmxpYyddCiAgICApOwoKICAgICMgZ2xvYmFsIG91dHB1dCB2YXJzCiAgICAkU2VsZi0+e05vdGlmeX0gPSBbXTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRFeHBsb3JlciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgQFBhcmFtcyA9IHF3KE9yZGVyIFNvcnQpOwoKICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgICRHZXRQYXJhbXtDYXRlZ29yeUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnQ2F0ZWdvcnlJRCcpIHx8IDA7CiAgICAkR2V0UGFyYW17T3JkZXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdPcmRlcicpIHx8ICdUaXRsZSc7CiAgICAkR2V0UGFyYW17U29ydH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1NvcnQnKSB8fCAndXAnOwogICAgZm9yIChAUGFyYW1zKSB7CiAgICAgICAgaWYoISRHZXRQYXJhbXskX30gJiYgISgkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKSkpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIpOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgYWN0aW9uCiAgICBteSAlQ2F0ZWdvcnlEYXRhID0gKCk7CiAgICBpZigkR2V0UGFyYW17Q2F0ZWdvcnlJRH0pIHsKICAgICAgICAlQ2F0ZWdvcnlEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUdldChDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICAgICAgaWYgKCElQ2F0ZWdvcnlEYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQogICAgIyBkdGwgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXInLAogICAgICAgIERhdGEgPT4geyAlQ2F0ZWdvcnlEYXRhLCAlRnJvbnRlbmQgfSwKICAgICk7CiAgICAjIEZBUSBwYXRoCiAgICAkU2VsZi0+X0dldEZBUVBhdGgoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICApOwogICAgIyBleHBsb3JlciB0aXRsZQogICAgaWYoJEdldFBhcmFte0NhdGVnb3J5SUR9KSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAkQ2F0ZWdvcnlEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkQ2F0ZWdvcnlEYXRhe0NvbW1lbnR9CiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RGVmYXVsdDo6Um9vdENhdGVnb3J5TmFtZScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlDb21tZW50JykKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgIyBleHBsb3JlciBjYXRlZ29yeSBsaXN0CiAgICBpZiAoISRQYXJhbXtNb2RlfSkgewogICAgICAgICRQYXJhbXtNb2RlfSA9ICdQdWJsaWMnOwogICAgfQogICAgaWYgKCFkZWZpbmVkKCRQYXJhbXtDdXN0b21lclVzZXJ9KSkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJ9ID0gJyc7CiAgICB9CiAgICBpZiAoJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInKSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3JlckNhdGVnb3J5TGlzdCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIE9yZGVyID0+ICdOYW1lJywKICAgICAgICAgICAgU29ydCA9PiAndXAnLAogICAgICAgICAgICBNb2RlID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+X0dldEV4cGxvcmVyQ2F0ZWdvcnlMaXN0KAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgT3JkZXIgPT4gJ05hbWUnLAogICAgICAgICAgICBTb3J0ID0+ICd1cCcsCiAgICAgICAgICAgIE1vZGUgPT4gJFBhcmFte01vZGV9LAogICAgICAgICk7CiAgICB9CiAgICAjIGV4cGxvcmVyIGl0ZW0gbGlzdAogICAgJFNlbGYtPl9HZXRFeHBsb3Jlckl0ZW1MaXN0KAogICAgICAgIENhdGVnb3J5SUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgIE9yZGVyID0+ICRHZXRQYXJhbXtPcmRlcn0gfHwgJ1RpdGxlJywKICAgICAgICBTb3J0ID0+ICRHZXRQYXJhbXtTb3J0fSB8fCAndXAnCiAgICApOwogICAgIyBxdWlja3NlYXJjaAogICAgbXkgJVNob3dRdWlja1NlYXJjaCA9ICV7JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6OlF1aWNrU2VhcmNoOjpTaG93Jyl9OwogICAgaWYgKGV4aXN0cygkU2hvd1F1aWNrU2VhcmNoeyRTZWxmLT57SW50ZXJmYWNlfXtOYW1lfX0pKSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3JlclF1aWNrU2VhcmNoKAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICApOwogICAgfQogICAgIyBsYXRlc3QgY2hhbmdlIGZhcSBpdGVtcwogICAgbXkgJVNob3dMYXN0Q2hhbmdlID0gJXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6U2hvdycpfTsKICAgIGlmIChleGlzdHMoJFNob3dMYXN0Q2hhbmdleyRTZWxmLT57SW50ZXJmYWNlfXtOYW1lfX0pKSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3Jlckxhc3RDaGFuZ2VJdGVtcygKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIE1vZGUgPT4gJFBhcmFte01vZGV9LAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgKTsKICAgIH0KICAgICMgbGF0ZXN0IGNyZWF0ZSBmYXEgaXRlbXMKICAgIG15ICVTaG93TGFzdENyZWF0ZSA9ICV7JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDcmVhdGU6OlNob3cnKX07CiAgICBpZiAoZXhpc3RzKCRTaG93TGFzdENyZWF0ZXskU2VsZi0+e0ludGVyZmFjZX17TmFtZX19KSkgewogICAgICAgICRTZWxmLT5fR2V0RXhwbG9yZXJMYXN0Q3JlYXRlSXRlbXMoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBNb2RlID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICk7CiAgICB9Cn0KCnN1YiBfR2V0RkFRUGF0aCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50JywKICAgICAgICBEYXRhID0+IHsgJ05hbWUnID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeU5hbWUnKSwKICAgICAgICAgICAgJ0NhdGVnb3J5SUQnID0+ICcwJwogICAgICAgIH0sCiAgICApOwoKICAgIGlmKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpQYXRoOjpTaG93JykpIHsKICAgICAgICBteSBAQ2F0ZWdvcnlMaXN0ID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVBhdGhMaXN0R2V0KENhdGVnb3J5SUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9KX07CiAgICAgICAgZm9yIG15ICREYXRhIChAQ2F0ZWdvcnlMaXN0KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAleyREYXRhfSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdWIgX0dldEV4cGxvcmVyQ2F0ZWdvcnlMaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzCiAgICBmb3IgKHF3KE9yZGVyIFNvcnQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKQogICAgICAgIH0KICAgIH0KICAgIG15IEBDYXRlZ29yeUlEcyA9ICgpOwogICAgaWYgKCRQYXJhbXtNb2RlfSAmJiAkUGFyYW17TW9kZX0gZXEgJ0FnZW50JykgewogICAgICAgIEBDYXRlZ29yeUlEcyA9IEB7JFNlbGYtPntGQVFPYmplY3R9LT5BZ2VudENhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKX07CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInKSB7CiAgICAgICAgQENhdGVnb3J5SURzID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkN1c3RvbWVyQ2F0ZWdvcnlTZWFyY2goCiAgICAgICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICl9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQENhdGVnb3J5SURzID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPlB1YmxpY0NhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgKX07CiAgICB9CgogICAgaWYoQENhdGVnb3J5SURzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJDYXRlZ29yeUxpc3QnLAogICAgICAgICk7CiAgICAgICAgZm9yIChAQ2F0ZWdvcnlJRHMpIHsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5R2V0KENhdGVnb3J5SUQgPT4gJF8pOwogICAgICAgICAgICAkRGF0YXtDYXRlZ29yeU51bWJlcn0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5Q291bnQoCiAgICAgICAgICAgICAgICBQYXJlbnRJRHMgPT4gWyRfXQogICAgICAgICAgICApOwogICAgICAgICAgICAkRGF0YXtBcnRpY2xlTnVtYmVyfSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRQ291bnQoCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEcyA9PiBbJF9dLAogICAgICAgICAgICAgICAgSXRlbVN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3NzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgaWYoJEZyb250ZW5ke0Nzc1Jvd30gZXEgJ3NlYXJjaHBhc3NpdmUnKSB7CiAgICAgICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnc2VhcmNocGFzc2l2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyQ2F0ZWdvcnlSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBfR2V0RXhwbG9yZXJJdGVtTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgZm9yIChxdyhPcmRlciBTb3J0KSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIikKICAgICAgICB9CiAgICB9CgogICAgbXkgJENzc1JvdyA9ICcnOwogICAgbXkgQEl0ZW1JRHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICBDYXRlZ29yeUlEcyA9PiBbJFBhcmFte0NhdGVnb3J5SUR9XSwKICAgICAgICBTdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgIE9yZGVyID0+ICRQYXJhbXtPcmRlcn0sCiAgICAgICAgU29ydCA9PiAkUGFyYW17U29ydH0sCiAgICAgICAgTGltaXQgPT4gMzAwLAogICAgKTsKCiAgICBpZiAoQEl0ZW1JRHMpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckZBUUl0ZW1MaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfQogICAgICAgICk7CiAgICAgICAgZm9yIChASXRlbUlEcykgewogICAgICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJF8pOwoKICAgICAgICAgICAgIyBjc3MgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZigkQ3NzUm93IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICRDc3NSb3c7CiAgICAgICAgICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKFJhdGUgPT4gJERhdGF7UmVzdWx0fSkuJzsnOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyRkFRSXRlbVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9HZXRFeHBsb3Jlckxhc3RDaGFuZ2VJdGVtcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6U2hvdycpKSB7CiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgICAgIGZvciAocXcoQ2F0ZWdvcnlJRCkpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIikKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSBASXRlbUlEcyA9ICgpOwogICAgICAgIGlmKGRlZmluZWQoJFBhcmFte0NhdGVnb3J5SUR9KSkgewogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGNhdGVnb3J5aWQKICAgICAgICAgICAgbXkgQENhdGVnb3J5SURzID0gKCk7CiAgICAgICAgICAgIGlmKCRQYXJhbXtDYXRlZ29yeUlEfSkgewogICAgICAgICAgICAgICAgcHVzaChAQ2F0ZWdvcnlJRHMsICgkUGFyYW17Q2F0ZWdvcnlJRH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFte01vZGV9KSkgewogICAgICAgICAgICAgICAgJFBhcmFte01vZGV9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXtDdXN0b21lclVzZXJ9KSkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcn0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIGFkZCBzdWJjYXRlZ29yeWlkcwogICAgICAgICAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6U2hvd1N1YkNhdGVnb3J5SXRlbXMnKSkgewogICAgICAgICAgICAgICAgbXkgQFN1YkNhdGVnb3J5SURzID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5U3ViQ2F0ZWdvcnlJRExpc3QoCiAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICAgICAgICAgIE1vZGUgPT4gJFBhcmFte01vZGV9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKX07CiAgICAgICAgICAgICAgICBwdXNoKEBDYXRlZ29yeUlEcywgQFN1YkNhdGVnb3J5SURzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDaGFuZ2UnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFBhcmFte01vZGV9ID1+IC9wdWJsaWMvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDaGFuZ2VSc3MnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQENhdGVnb3J5SURzKSB7CiAgICAgICAgICAgICAgICBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SURzID0+IFxAQ2F0ZWdvcnlJRHMsCiAgICAgICAgICAgICAgICAgICAgU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgICAgICBPcmRlciA9PiAnQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICAgICAgU29ydCA9PiAnZG93bicsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OkxpbWl0JykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckxhdGVzdENoYW5nZScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQEl0ZW1JRHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICAgICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICBPcmRlciA9PiAnQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICBTb3J0ID0+ICdkb3duJywKICAgICAgICAgICAgICAgIExpbWl0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpMaW1pdCcpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGZvciAoQEl0ZW1JRHMpIHsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJF8pOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDaGFuZ2VGQVFJdGVtUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdWIgX0dldEV4cGxvcmVyTGFzdENyZWF0ZUl0ZW1zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6U2hvdycpKSB7CiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgICAgIGZvciAocXcoQ2F0ZWdvcnlJRCkpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIikKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSBASXRlbUlEcyA9ICgpOwogICAgICAgIGlmKGRlZmluZWQoJFBhcmFte0NhdGVnb3J5SUR9KSkgewogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGNhdGVnb3J5aWQKICAgICAgICAgICAgbXkgQENhdGVnb3J5SURzID0gKCk7CiAgICAgICAgICAgIGlmKCRQYXJhbXtDYXRlZ29yeUlEfSkgewogICAgICAgICAgICAgICAgcHVzaChAQ2F0ZWdvcnlJRHMsICgkUGFyYW17Q2F0ZWdvcnlJRH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWRlZmluZWQoJFBhcmFte01vZGV9KSkgewogICAgICAgICAgICAgICAgJFBhcmFte01vZGV9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRQYXJhbXtDdXN0b21lclVzZXJ9KSkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcn0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIGFkZCBzdWJjYXRlZ29yeWlkcwogICAgICAgICAgICBpZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6U2hvd1N1YkNhdGVnb3J5SXRlbXMnKSkgewogICAgICAgICAgICAgICAgbXkgQFN1YkNhdGVnb3J5SURzID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5U3ViQ2F0ZWdvcnlJRExpc3QoCiAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICAgICAgICAgIE1vZGUgPT4gJFBhcmFte01vZGV9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKX07CiAgICAgICAgICAgICAgICBwdXNoKEBDYXRlZ29yeUlEcywgQFN1YkNhdGVnb3J5SURzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDcmVhdGUnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFBhcmFte01vZGV9ID1+IC9wdWJsaWMvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDcmVhdGVSc3MnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQENhdGVnb3J5SURzKSB7CiAgICAgICAgICAgICAgICBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SURzID0+IFxAQ2F0ZWdvcnlJRHMsCiAgICAgICAgICAgICAgICAgICAgU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgICAgICBPcmRlciA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgU29ydCA9PiAnZG93bicsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDcmVhdGU6OkxpbWl0JykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckxhdGVzdENyZWF0ZScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQEl0ZW1JRHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICAgICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICBPcmRlciA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICBTb3J0ID0+ICdkb3duJywKICAgICAgICAgICAgICAgIExpbWl0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpMaW1pdCcpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgZHRsIGJsb2NrCiAgICAgICAgZm9yIChASXRlbUlEcykgewogICAgICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KEl0ZW1JRCA9PiAkXyk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckxhdGVzdENyZWF0ZUZBUUl0ZW1Sb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN1YiBfR2V0RXhwbG9yZXJRdWlja1NlYXJjaCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgaWYoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6OlF1aWNrU2VhcmNoOjpTaG93JykpIHsKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIChxdygpKSB7CiAgICAgICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBkdGwgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlclF1aWNrU2VhcmNoJywKICAgICAgICAgICAgRGF0YSA9PiB7IENhdGVnb3J5SUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9IH0KICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN1YiBHZXRJdGVtVmlldyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1JRCk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgZm9yIChAUGFyYW1zKSB7CiAgICAgICAgaWYgKCEoJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIpOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgYWN0aW9uCiAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCgKICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAjIGh0bWwgcXVvdGluZwogICAgZm9yIG15ICRLZXkgKHF3IChGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNikpIHsKICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpKSB7CiAgICAgICAgICAgIG15IEBBcnJheSA9IHNwbGl0IC9wcmU+LywgJEl0ZW1EYXRheyRLZXl9OwogICAgICAgICAgICBteSAkVGV4dCA9ICcnOwogICAgICAgICAgICBmb3IgKEBBcnJheSkgewogICAgICAgICAgICAgICAgaWYgKCRfID1+IC8oLiopXDxcLyQvKSB7CiAgICAgICAgICAgICAgICAgICAgJFRleHQgLj0gJ3ByZT4nLiRfLidwcmU+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRfID1+IHMvXG4vXDxiclw+L2c7CiAgICAgICAgICAgICAgICAgICAgJFRleHQgLj0gJF87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEl0ZW1EYXRheyRLZXl9ID0gJFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkSXRlbURhdGF7JEtleX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBOZXdMaW5lID0+IDAsCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRJdGVtRGF0YXskS2V5fSwKICAgICAgICAgICAgICAgIFZNYXggPT4gNTAwMCwKICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGlmICghJUl0ZW1EYXRhKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgIH0KICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgaWYgKCFleGlzdHMoJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9eyRJdGVtRGF0YXtTdGF0ZVR5cGVJRH19KSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgIH0KICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSXRlbURhdGF7Q3JlYXRlZEJ5fSwKICAgICk7CiAgICAkRnJvbnRlbmR7Q3JlYXRlZEJ5TG9naW59ID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAlVXNlckluZm8gPSAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSXRlbURhdGF7Q2hhbmdlZEJ5fSwKICAgICk7CiAgICAkRnJvbnRlbmR7Q2hhbmdlZEJ5TG9naW59ID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAjIGl0ZW0gdmlldwogICAgJEZyb250ZW5ke0Nzc0NvbHVtblZvdGluZ1Jlc3VsdH0gPSAnY29sb3I6Jy4kU2VsZi0+e0xheW91dE9iamVjdH0tPkdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IoUmF0ZSA9PiAkSXRlbURhdGF7UmVzdWx0fSkuJzsnOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdWaWV3JywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEsICVGcm9udGVuZCB9LAogICAgKTsKICAgIGlmICgkUGFyYW17UGVybWlzc2lvbn0gJiYgJFBhcmFte1Blcm1pc3Npb259IGVxICdydycpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtVmlld0xpbmtVcGRhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEsICVGcm9udGVuZCB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRSXRlbVZpZXdMaW5rRGVsZXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUl0ZW1EYXRhLCAlRnJvbnRlbmQgfSwKICAgICAgICApOwogICAgfQogICAgIyBGQVEgcGF0aAogICAgaWYgKCRTZWxmLT5fR2V0RkFRUGF0aChDYXRlZ29yeUlEID0+ICRJdGVtRGF0YXtDYXRlZ29yeUlEfSkpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFQYXRoSXRlbUVsZW1lbnQnLAogICAgICAgICAgICBEYXRhID0+IFwlSXRlbURhdGEsCiAgICAgICAgKTsKICAgIH0KICAgICMgaXRlbSBhdHRhY2htZW50CiAgICBteSBAQXR0YWNobWVudEluZGV4ID0gJFNlbGYtPntGQVFPYmplY3R9LT5BdHRhY2htZW50SW5kZXgoCiAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgKTsKICAgIGlmICggQEF0dGFjaG1lbnRJbmRleCApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtVmlld0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHsgJUl0ZW1EYXRhIH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAQXR0YWNobWVudEluZGV4ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRSXRlbVZpZXdBdHRhY2htZW50Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlSXRlbURhdGEsICV7ICRBdHRhY2htZW50IH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICAjIGl0ZW0gZmllbGRzCiAgICAkU2VsZi0+X0dldEl0ZW1GaWVsZHMoCiAgICAgICAgSXRlbURhdGEgPT4gXCVJdGVtRGF0YQogICAgKTsKICAgICMgaXRlbSB2b3RpbmcKICAgIG15ICVTaG93SXRlbVZvdGluZyA9ICV7JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpTaG93Jyl9OwogICAgaWYgKGV4aXN0cygkU2hvd0l0ZW1Wb3Rpbmd7JFNlbGYtPntJbnRlcmZhY2V9e05hbWV9fSkpIHsKICAgICAgICAkU2VsZi0+X0dldEl0ZW1Wb3RpbmcoCiAgICAgICAgICAgIEl0ZW1EYXRhID0+IFwlSXRlbURhdGEKICAgICAgICApOwogICAgfQogICAgaWYgKCRQYXJhbXtMaW5rc30gJiYgJFBhcmFte0xpbmtzfSA9PSAxKSB7CiAgICAgICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgICAgICBteSAlTGlua3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5BbGxMaW5rZWRPYmplY3RzKAogICAgICAgICAgICBPYmplY3QgPT4gJ0ZBUScsCiAgICAgICAgICAgIE9iamVjdElEID0+ICRJdGVtRGF0YXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAiTGlua3MiLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICAgICAgbXkgJUxpbmtUeXBlQm94ID0gKCk7CiAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIHF3KE5vcm1hbCBQYXJlbnQgQ2hpbGQpICkgewogICAgICAgICAgICBpZiAoICEgJExpbmtzeyRMaW5rVHlwZX0gKSB7CiAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVPYmplY3RUeXBlID0gJXskTGlua3N7JExpbmtUeXBlfX07CiAgICAgICAgICAgIGZvciBteSAkT2JqZWN0IChzb3J0IGtleXMgJU9iamVjdFR5cGUpIHsKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJXskT2JqZWN0VHlwZXskT2JqZWN0fX07CiAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKHNvcnQga2V5cyAlRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGlmICggISRMaW5rVHlwZUJveHskTGlua1R5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1R5cGUgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtUeXBlQm94eyRMaW5rVHlwZX0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXsgJERhdGF7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rVHlwZSA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIEdldEl0ZW1TbWFsbFZpZXcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgPSBxdyhJdGVtSUQpOwoKICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgIGZvciAoQFBhcmFtcykgewogICAgICAgIGlmICghKCRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8iKTsKICAgICAgICB9CiAgICB9CiAgICAjIGRiIGFjdGlvbgogICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgfQogICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICBpZighZXhpc3RzKCRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXskSXRlbURhdGF7U3RhdGVUeXBlSUR9fSkpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICB9CiAgICAjIHVzZXIgaW5mbwogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntBZ2VudFVzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEl0ZW1EYXRhe0NyZWF0ZWRCeX0sCiAgICApOwogICAgJEZyb250ZW5ke0NyZWF0ZWRCeUxvZ2lufSA9ICRVc2VySW5mb3tVc2VyTG9naW59OwogICAgJVVzZXJJbmZvID0gJFNlbGYtPntBZ2VudFVzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEl0ZW1EYXRhe0NoYW5nZWRCeX0sCiAgICApOwogICAgJEZyb250ZW5ke0NoYW5nZWRCeUxvZ2lufSA9ICRVc2VySW5mb3tVc2VyTG9naW59OwogICAgIyBpdGVtIHZpZXcKICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKFJhdGUgPT4gJEl0ZW1EYXRhe1Jlc3VsdH0pLic7JzsKICAgICRGcm9udGVuZHtJdGVtRmllbGRWYWx1ZXN9ID0gJFNlbGYtPl9HZXRJdGVtRmllbGRWYWx1ZXMoSXRlbURhdGEgPT4gXCVJdGVtRGF0YSk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1ZpZXdTbWFsbCcsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUl0ZW1EYXRhLCAlRnJvbnRlbmQgfSwKICAgICk7CiAgICAjIEZBUSBwYXRoCiAgICBpZiAoJFNlbGYtPl9HZXRGQVFQYXRoKENhdGVnb3J5SUQgPT4gJEl0ZW1EYXRhe0NhdGVnb3J5SUR9KSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUVBhdGhJdGVtRWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVJdGVtRGF0YSwKICAgICAgICApOwogICAgfQogICAgIyBpdGVtIGF0dGFjaG1lbnQKICAgIGlmIChkZWZpbmVkKCRJdGVtRGF0YXtGaWxlbmFtZX0pKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRSXRlbVZpZXdBdHRhY2htZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUl0ZW1EYXRhIH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICBteSAlTGlua3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5BbGxMaW5rZWRPYmplY3RzKAogICAgICAgIE9iamVjdCA9PiAnRkFRJywKICAgICAgICBPYmplY3RJRCA9PiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGZvciBteSAkTGlua1R5cGUgKHNvcnQga2V5cyAlTGlua3MpIHsKICAgICAgICBteSAlT2JqZWN0VHlwZSA9ICV7JExpbmtzeyRMaW5rVHlwZX19OwogICAgICAgIGZvciBteSAkT2JqZWN0IChzb3J0IGtleXMgJU9iamVjdFR5cGUpIHsKICAgICAgICAgICAgbXkgJURhdGEgPSAleyRPYmplY3RUeXBleyRPYmplY3R9fTsKICAgICAgICAgICAgZm9yIG15ICRJdGVtIChzb3J0IGtleXMgJURhdGEpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiTGluayRMaW5rVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YXskSXRlbX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgR2V0SXRlbVByaW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1JRCk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgZm9yIChAUGFyYW1zKSB7CiAgICAgICAgaWYgKCEoJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIpOwogICAgICAgIH0KICAgIH0KICAgICMgZGIgYWN0aW9uCiAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCgKICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICB9CiAgICAjIGh0bWwgcXVvdGluZwogICAgZm9yIG15ICRLZXkgKHF3IChGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNikpIHsKICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpKSB7CiAgICAgICAgICAgICRJdGVtRGF0YXskS2V5fSA9fiBzL1xuL1w8YnJcPi9nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRLZXl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgTmV3TGluZSA9PiAwLAogICAgICAgICAgICAgICAgVGV4dCA9PiAkSXRlbURhdGF7JEtleX0sCiAgICAgICAgICAgICAgICBWTWF4ID0+IDUwMDAsCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIGlmICghZXhpc3RzKCRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXskSXRlbURhdGF7U3RhdGVUeXBlSUR9fSkpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICB9CiAgICAjIGFkZCBhcnRpY2xlCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1ByaW50JywKICAgICAgICBEYXRhID0+IFwlSXRlbURhdGEsCiAgICApOwogICAgIyBmaWVsZHMKICAgICRTZWxmLT5fR2V0SXRlbUZpZWxkcygKICAgICAgICBJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhCiAgICApOwogICAgIyBsaW5rcwogICAgaWYgKCRQYXJhbXtMaW5rc30gJiYgJFBhcmFte0xpbmtzfSA9PSAxKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua3MnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICAgICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgICAgICBteSAlTGlua3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5BbGxMaW5rZWRPYmplY3RzKAogICAgICAgICAgICBPYmplY3QgPT4gJ0ZBUScsCiAgICAgICAgICAgIE9iamVjdElEID0+ICRJdGVtRGF0YXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyBsaW5rcwogICAgICAgIGZvciBteSAkTGlua1R5cGUgKHNvcnQga2V5cyAlTGlua3MpIHsKICAgICAgICAgICAgbXkgJU9iamVjdFR5cGUgPSAleyRMaW5rc3skTGlua1R5cGV9fTsKICAgICAgICAgICAgZm9yIG15ICRPYmplY3QgKHNvcnQga2V5cyAlT2JqZWN0VHlwZSkgewogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAleyRPYmplY3RUeXBleyRPYmplY3R9fTsKICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoc29ydCBrZXlzICVEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiTGluayRMaW5rVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGF7JEl0ZW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBfR2V0SXRlbUZpZWxkcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgPSBxdyhJdGVtRGF0YSk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgZm9yIChAUGFyYW1zKSB7CiAgICAgICAgaWYoIWV4aXN0cygkUGFyYW17JF99KSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfIik7CiAgICAgICAgfQogICAgfQogICAgIyBjb25maWcgdmFsdWVzCiAgICBteSAlSXRlbUZpZWxkcyA9ICgpOwogICAgZm9yKG15ICRpPTE7JGk8NzskaSsrKSB7CiAgICAgICAgbXkgJUl0ZW1Db25maWcgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6Okl0ZW06OkZpZWxkJy4kaSl9OwogICAgICAgIGlmKCRJdGVtQ29uZmlne1Nob3d9KSB7CiAgICAgICAgICAgICRJdGVtRmllbGRzeyJGaWVsZCIuJGl9ID0gXCVJdGVtQ29uZmlnOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkS2V5IChzb3J0KCB7ICRJdGVtRmllbGRzeyRhfXtQcmlvfSA8PT4gJEl0ZW1GaWVsZHN7JGJ9e1ByaW99IH0ga2V5cyglSXRlbUZpZWxkcykpKSB7CiAgICAgICAgbXkgJVN0YXRlVHlwZURhdGEgPSAleyRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlR2V0KAogICAgICAgICAgICBOYW1lID0+ICRJdGVtRmllbGRzeyRLZXl9e1Nob3d9CiAgICAgICAgKX07CiAgICAgICAgIyBzaG93IHllcyAvbm8KICAgICAgICBpZiAoZXhpc3RzKCRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXskU3RhdGVUeXBlRGF0YXtJRH19KSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRSXRlbUZpZWxkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEl0ZW1GaWVsZHN7JEtleX19LAogICAgICAgICAgICAgICAgICAgICdTdGF0ZU5hbWUnID0+ICRTdGF0ZVR5cGVEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgICAgICdLZXknID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgJ1ZhbHVlJyA9PiAkUGFyYW17SXRlbURhdGF9eyRLZXl9IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBfR2V0SXRlbUZpZWxkVmFsdWVzIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1EYXRhKTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICBpZiAoIWV4aXN0cygkUGFyYW17JF99KSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfIik7CiAgICAgICAgfQogICAgfQogICAgIyBjb25maWcgdmFsdWVzCiAgICBteSAlSXRlbUZpZWxkcyA9ICgpOwogICAgZm9yIChteSAkaT0xOyRpPDc7JGkrKykgewogICAgICAgIG15ICVJdGVtQ29uZmlnID0gJXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpJdGVtOjpGaWVsZCcuJGkpfTsKICAgICAgICBpZigkSXRlbUNvbmZpZ3tTaG93fSkgewogICAgICAgICAgICAkSXRlbUZpZWxkc3siRmllbGQiLiRpfSA9IFwlSXRlbUNvbmZpZzsKICAgICAgICB9CiAgICB9CiAgICBteSAkU3RyaW5nID0gJyc7CiAgICBmb3IgbXkgJEtleSAoc29ydCggeyAkSXRlbUZpZWxkc3skYX17UHJpb30gPD0+ICRJdGVtRmllbGRzeyRifXtQcmlvfSB9IGtleXMoJUl0ZW1GaWVsZHMpKSkgewogICAgICAgIG15ICVTdGF0ZVR5cGVEYXRhID0gJXskU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkSXRlbUZpZWxkc3skS2V5fXtTaG93fQogICAgICAgICl9OwogICAgICAgICMgc2hvdyB5ZXMgL25vCiAgICAgICAgaWYoZXhpc3RzKCRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXskU3RhdGVUeXBlRGF0YXtJRH19KSkgewogICAgICAgICAgICAkU3RyaW5nIC49ICRQYXJhbXtJdGVtRGF0YX17JEtleX0gfHwgJyc7CiAgICAgICAgICAgICRTdHJpbmcgLj0gIlxuXG4iOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkU3RyaW5nOwp9CgpzdWIgX0dldEl0ZW1Wb3RpbmcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvciAocXcoSXRlbURhdGEpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiKTsKICAgICAgICB9CiAgICB9CiAgICBteSAlSXRlbURhdGEgPSAleyRQYXJhbXtJdGVtRGF0YX19OwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAiVm90aW5nIgogICAgKTsKICAgIG15ICVWb3RlRGF0YSA9ICV7JFNlbGYtPntGQVFPYmplY3R9LT5Wb3RlR2V0KAogICAgICAgIENyZWF0ZUJ5ID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgSW50ZXJmYWNlID0+ICRTZWxmLT57SW50ZXJmYWNlfXtJRH0sCiAgICAgICAgSVAgPT4gJEVOVnsnUkVNT1RFX0FERFInfSwKICAgICl9OwoKICAgIG15ICRGbGFnID0gMDsKICAgICMgYWxyZWFkeSB2b3RlZD8KICAgIGlmKCVWb3RlRGF0YSkgewogICAgICAgICMgaXRlbS9jaGFuZ2VfdGltZSA+IHZvdGluZy9jcmVhdGVfdGltZQogICAgICAgIG15ICRJdGVtQ2hhbmdlZFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZShTdHJpbmcgPT4gJEl0ZW1EYXRhe0NoYW5nZWR9IHx8ICcnKTsKICAgICAgICBteSAkVm90ZUNyZWF0ZWRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoU3RyaW5nID0+ICRWb3RlRGF0YXtDcmVhdGVkfSB8fCAnJyk7CgogICAgICAgIGlmICgkSXRlbUNoYW5nZWRTeXN0ZW1UaW1lID4gJFZvdGVDcmVhdGVkU3lzdGVtVGltZSkgewogICAgICAgICAgICAkRmxhZyA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoKEB7JFNlbGYtPntOb3RpZnl9fSwgWydJbmZvJywgJ1lvdSBoYXZlIGFscmVhZHkgdm90ZWQhJ10pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEZsYWcgPSAxOwogICAgfQogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVm90ZScgJiYgJEZsYWcpIHsKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIChxdyhJdGVtRGF0YSkpIHsKICAgICAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIikKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1JRCBSYXRlKTsKICAgICAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICBpZigkR2V0UGFyYW17UmF0ZX0gZXEgJzAnIG9yICRHZXRQYXJhbXtSYXRlfSkgewogICAgICAgICAgICAkU2VsZi0+e0ZBUU9iamVjdH0tPlZvdGVBZGQoCiAgICAgICAgICAgICAgICBDcmVhdGVkQnkgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICAgICAgSVAgPT4gJEVOVnsnUkVNT1RFX0FERFInfSwKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAkU2VsZi0+e0ludGVyZmFjZX17SUR9LAogICAgICAgICAgICAgICAgUmF0ZSA9PiAkR2V0UGFyYW17UmF0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2goQHskU2VsZi0+e05vdGlmeX19LCBbJ0luZm8nLCAnVGhhbmtzIGZvciB2b3RlISddKTsKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2goQHskU2VsZi0+e05vdGlmeX19LCBbJ0Vycm9yJywgJ05vIHJhdGUgc2VsZWN0ZWQhJ10pOwogICAgICAgICAgICAkU2VsZi0+R2V0SXRlbVZvdGluZ0Zvcm0oCiAgICAgICAgICAgICAgICBJdGVtRGF0YSA9PiAkUGFyYW17SXRlbURhdGF9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZm9ybQogICAgJFNlbGYtPl9HZXRJdGVtVm90aW5nRm9ybSgKICAgICAgICBJdGVtRGF0YSA9PiAkUGFyYW17SXRlbURhdGF9CiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIF9HZXRJdGVtVm90aW5nRm9ybSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgZm9yIChxdyhJdGVtRGF0YSkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIpCiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdWb3RlRm9ybScsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJXskUGFyYW17SXRlbURhdGF9fSB9CiAgICApOwoKICAgIG15ICVWb3RpbmdSYXRlcyA9ICV7JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcycpfTsKICAgIGZvciBteSAka2V5ICggc29ydCggeyAkYiA8PT4gJGEgfSBrZXlzKCVWb3RpbmdSYXRlcyApICkgKSB7CiAgICAgICAgbXkgJURhdGEgPSAoIlZhbHVlIj0+JGtleSwgIlRpdGxlIj0+JFZvdGluZ1JhdGVzeyRrZXl9ICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAiVm90aW5nUmF0ZVJvdyIsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBHZXRJdGVtU2VhcmNoIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVHZXRQYXJhbSAgICA9ICgpOwogICAgbXkgJUZyb250ZW5kICAgID0gKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBmb3IgKHF3KExhbmd1YWdlSURzIENhdGVnb3J5SURzKSkgewogICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAkXyk7CiAgICAgICAgaWYgKEBBcnJheSkgewogICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gXEBBcnJheTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKHF3KFF1aWNrU2VhcmNoIE51bWJlciBUaXRsZSBXaGF0IEtleXdvcmQpKSB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICB9CiAgICAjIHF1aWNrc2VhcmNoIGluIHN1YmNhdGVnb3JpZXM/CiAgICBpZiAoJEdldFBhcmFte1F1aWNrU2VhcmNofSkgewogICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6UXVpY2tTZWFyY2g6OlNob3dTdWJDYXRlZ29yeUl0ZW1zJykpIHsKICAgICAgICAgICAgaWYgKCEkUGFyYW17TW9kZX0pIHsKICAgICAgICAgICAgICAgICRQYXJhbXtNb2RlfSA9ICdQdWJsaWMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgkUGFyYW17VXNlcn0pKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VXNlcn0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSBAU3ViQ2F0ZWdvcnlJRHMgPSBAeyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlTdWJDYXRlZ29yeUlETGlzdCgKICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEc30tPlswXSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VyfSwKICAgICAgICAgICAgICAgIE1vZGUgPT4gJFBhcmFte01vZGV9LAogICAgICAgICAgICApfTsKICAgICAgICAgICAgcHVzaChAeyRHZXRQYXJhbXtDYXRlZ29yeUlEc319LCBAU3ViQ2F0ZWdvcnlJRHMpOwogICAgICAgIH0KICAgIH0KICAgICRGcm9udGVuZHtMYW5ndWFnZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgPT4geyAkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlTGlzdCgpIH0sCiAgICAgICAgU2l6ZSA9PiA1LAogICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlSURzJywKICAgICAgICBNdWx0aXBsZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkR2V0UGFyYW17TGFuZ3VhZ2VJRHN9IHx8IFtdLAogICAgICAgIEhUTUxRdW90ZSA9PiAxLAogICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICk7CiAgICBteSAkQ2F0ZWdvcmllcyA9ICgpOwogICAgaWYgKCRQYXJhbXtNb2RlfSAmJiAkUGFyYW17TW9kZX0gZXEgJ0FnZW50JykgewogICAgICAgICRDYXRlZ29yaWVzID0gJFNlbGYtPntGQVFPYmplY3R9LT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgVXNlcklEID0+ICAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgPT4gJ3J3JwogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInKSB7CiAgICAgICAgJENhdGVnb3JpZXMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkdldEN1c3RvbWVyQ2F0ZWdvcmllcygKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgVHlwZSA9PiAncncnCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDYXRlZ29yaWVzID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUxpc3QoKTsKICAgIH0KICAgICRGcm9udGVuZHtDYXRlZ29yeU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgIENhdGVnb3J5TGlzdCA9PiB7ICV7JENhdGVnb3JpZXN9IH0sCiAgICAgICAgU2l6ZSA9PiA1LAogICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5SURzJywKICAgICAgICBNdWx0aXBsZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSURzID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEc30gfHwgW10sCiAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU2VhcmNoJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlR2V0UGFyYW0sICVGcm9udGVuZCB9LAogICAgKTsKCiAgICAjIGJ1aWxkIHJlc3VsdAogICAgaWYgKCRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU3VibWl0JykpIHsKICAgICAgICBteSAkQ3NzUm93ID0gJyc7CgogICAgICAgIG15IEBJdGVtSURzID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFTZWFyY2goCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBTdGF0ZXMgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICBMaW1pdCA9PiAyNSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaFJlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICk7CiAgICAgICAgZm9yIChASXRlbUlEcykgewogICAgICAgICAgICAlRnJvbnRlbmQgPSAoKTsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJF8pOwogICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICdybyc7CiAgICAgICAgICAgIGlmICgkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdBZ2VudCcpIHsKICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uID0gJFNlbGYtPntGQVFPYmplY3R9LT5DaGVja0NhdGVnb3J5VXNlclBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VyfSwKICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICREYXRhe0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInKSB7CiAgICAgICAgICAgICAgICAkUGVybWlzc2lvbiA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2hlY2tDYXRlZ29yeUN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRQZXJtaXNzaW9uIG5lICcnKSB7CiAgICAgICAgICAgICAgICBpZigkQ3NzUm93IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgICAgICRDc3NSb3cgPSAnc2VhcmNoYWN0aXZlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDc3NSb3cgPSAnc2VhcmNocGFzc2l2ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXtDc3NSb3d9ID0gJENzc1JvdzsKICAgICAgICAgICAgICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicuJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKFJhdGUgPT4gJERhdGF7UmVzdWx0fSkuJzsnOwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoUmVzdWx0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIEdldFN5c3RlbUhpc3RvcnkgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUZyb250ZW5kID0gKCk7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTeXN0ZW1IaXN0b3J5JywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtIH0sCiAgICApOwoKICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJyc7CiAgICBteSBASGlzdG9yeSA9IEB7JFNlbGYtPntGQVFPYmplY3R9LT5IaXN0b3J5R2V0KCl9OwogICAgZm9yIG15ICRSb3cgKEBIaXN0b3J5KSB7CiAgICAgICAgIyBjc3MgY29uZmlndXJhdGlvbgogICAgICAgIGlmKCRGcm9udGVuZHtDc3NSb3d9IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnc2VhcmNocGFzc2l2ZSc7CiAgICAgICAgfQogICAgICAgIG15ICVEYXRhID0gJXskUm93fTsjJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRSb3ctPntJdGVtSUR9KTsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFJvdy0+e0NyZWF0ZWRCeX0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3lzdGVtSGlzdG9yeVJvdycsCiAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgJUZyb250ZW5kLCAlVXNlciwgTmFtZSA9PiAkUm93LT57TmFtZX0gfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50RkFRLnBtIC0gZmFxIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRGQVEucG0sdiAxLjEyIDIwMDgvMDMvMjYgMDg6NDI6MjcgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEZBUTsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RkFROwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6Ok1vZHVsZXM6OkZBUTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEyICQpIFsxXTsKCkBJU0EgPSBxdyhLZXJuZWw6Ok1vZHVsZXM6OkZBUSk7CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBteSAkU2VsZiA9IG5ldyBLZXJuZWw6Ok1vZHVsZXM6OkZBUSglUGFyYW0pOwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBpbnRlcmZhY2Ugc2V0dGluZ3MKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICAkU2VsZi0+e0ludGVyZmFjZX0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUdldCgKICAgICAgICBOYW1lID0+ICdpbnRlcm5hbCcKICAgICk7CiAgICAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgVHlwZXMgPT4gWydpbnRlcm5hbCcsJ2V4dGVybmFsJywncHVibGljJ10KICAgICk7CgogICAgIyBjaGVjayBuZWVkZWQgT2JqZWN0cwogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgIGZvciAocXcoU2Vzc2lvbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpIGlmICghJFNlbGYtPnskX30pOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoJVBhcmFtKTsKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CgogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgUGFyYW10ZXIKICAgIG15IEBQYXJhbXMgPSAoKTsKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgT3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICBteSAkSGVhZGVyID0gJyc7CiAgICBteSAkSGVhZGVyVGl0bGUgPSAgJyc7CiAgICBteSAkSGVhZGVyVHlwZSA9ICAnJzsKICAgIG15ICROYXZpZ2F0aW9uID0gJyc7CiAgICBteSAkTm90aWZ5ID0gJyc7CiAgICBteSAkQ29udGVudCA9ICcnOwogICAgbXkgJEZvb3RlciA9ICcnOwogICAgbXkgJEZvb3RlclR5cGUgPSAgJyc7CgogICAgbXkgJERlZmF1bHRIZWFkZXIgPSAnJzsKICAgIG15ICREZWZhdWx0TmF2aWdhdGlvbiA9ICcnOwogICAgbXkgJERlZmF1bHROb3RpZnkgPSAnJzsKICAgIG15ICREZWZhdWx0Q29udGVudCA9ICcnOwogICAgbXkgJERlZmF1bHRGb290ZXIgPSAnJzsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgQFBhcmFtcyA9IHF3KEl0ZW1JRCBJRCBOdW1iZXIgTmFtZSBDb21tZW50IENhdGVnb3J5SUQgUGFyZW50SUQgU3RhdGVJRCBMYW5ndWFnZUlEIFRpdGxlIFVzZXJJRAogICAgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgRnJlZUtleTEgRnJlZUtleTIgRnJlZUtleTMgS2V5d29yZHMgT3JkZXIgU29ydCBOYXYpOwogICAgZm9yIChAUGFyYW1zKSB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykgfHwgJyc7CiAgICB9CgogICAgIyBuYXZpZ2F0aW9uIE9OL09GRgogICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKICAgICRIZWFkZXJUeXBlID0gJFNlbGYtPntMYXN0RkFRTmF2fTsKICAgIGlmKCRHZXRQYXJhbXtOYXZ9IGVxICdOb3JtYWwnKSB7CiAgICAgICAgJEhlYWRlclR5cGUgPSAnJzsKICAgIH0KICAgIGVsc2lmICgkR2V0UGFyYW17TmF2fSBlcSAnTm9uZScgfHwgJFNlbGYtPntMYXN0RkFRTmF2fSkgewogICAgICAgICRIZWFkZXJUeXBlID0gJ1NtYWxsJzsKICAgICAgICAkTmF2aWdhdGlvbiA9ICcgJzsKICAgICAgICAkTm90aWZ5ICAgID0gJyAnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEhlYWRlclR5cGUgPSAnJzsKICAgIH0KCiAgICAjIHN0b3JlIG5hdiBwYXJhbQogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdMYXN0RkFRTmF2JywKICAgICAgICBWYWx1ZSA9PiAkSGVhZGVyVHlwZSwKICAgICk7CgogICAgIyB2aWV3IHNtYWxsCiAgICAjJEhlYWRlclR5cGUgPSAkU2VsZi0+e0xhc3RGQVFOYXZ9IHx8ICcnOwogICAgI215ICROYXYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ05hdicpIHx8ICcnOwoKICAgICMgb3V0cHV0CiAgICAkT3V0cHV0ICA9ICcnOwoKICAgICMgc3RvcmUgc2VhcmNoIHBhcmFtcwogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdMYXN0RkFRV2hhdCcsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte1doYXR9LAogICAgKTsKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSA9PiAnTGFzdEZBUUtleXdvcmQnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtLZXl3b3JkfSwKICAgICk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbGFuZ3VhZ2UgYWRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGFuZ3VhZ2UnKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7SGVhZGxpbmV9ID0gJ0FkZCc7CiAgICAgICAgJEZyb250ZW5ke0FkZExpbmt9ID0gJyhDbGljayBoZXJlIHRvIGFkZCknOwogICAgICAgICRGcm9udGVuZHtTdWJhY3Rpb259ID0gJ0xhbmd1YWdlQWRkJzsKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pIH0sCiAgICAgICAgICAgIFNpemUgPT4gMTAsCiAgICAgICAgICAgIE5hbWUgPT4gJ0lEJywKICAgICAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYW5ndWFnZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsYW5ndWFnZSBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGFuZ3VhZ2VBY3Rpb24nKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgI2dldCBEYXRhCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgICRQYXJhbURhdGF7VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICBmb3JlYWNoKHF3KE5hbWUpKSB7CiAgICAgICAgICAgIGlmKCEoJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8gISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIGlmKCEkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlRHVwbGljYXRlQ2hlY2soTmFtZT0+JFBhcmFtRGF0YXtOYW1lfSkpIHsKICAgICAgICAgICAgaWYgKCRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VBZGQoJVBhcmFtRGF0YSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249QWdlbnRGQVEmU3ViYWN0aW9uPUxhbmd1YWdlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTGFuZ3VhZ2UgJyRQYXJhbURhdGF7TmFtZX0nIGFscmVhZHkgZXhpc3RzISIpOwogICAgICAgIH0KCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbGFuZ3VhZ2UgdXBkYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGFuZ3VhZ2VDaGFuZ2UnKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgI2dldCBEYXRhCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIGZvcmVhY2gocXcoSUQpKSB7CiAgICAgICAgICAgIGlmKCEoJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8gISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIG15ICVMYW5ndWFnZURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlR2V0KElEID0+ICRQYXJhbURhdGF7SUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICBpZiAoISVMYW5ndWFnZURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgZHRsCiAgICAgICAgJEZyb250ZW5ke0hlYWRsaW5lfSA9ICdDaGFuZ2UnOwogICAgICAgICRGcm9udGVuZHtBZGRMaW5rfSA9ICcnOwogICAgICAgICRGcm9udGVuZHtTdWJhY3Rpb259ID0gJ0xhbmd1YWdlQ2hhbmdlJzsKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pIH0sCiAgICAgICAgICAgIFNpemUgPT4gMTAsCiAgICAgICAgICAgIE5hbWUgPT4gJ0lEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkTGFuZ3VhZ2VEYXRhe0xhbmd1YWdlSUR9LAogICAgICAgICAgICBIVE1MUXVvdGUgPT4gMSwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhbmd1YWdlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmQsICVMYW5ndWFnZURhdGF9LAogICAgICAgICk7CgogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kLCAlTGFuZ3VhZ2VEYXRhfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUScsCiAgICAgICAgKTsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbGFuZ3VhZ2UgdXBkYXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0xhbmd1YWdlQ2hhbmdlQWN0aW9uJykgewoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IERhdGEKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgJFBhcmFtRGF0YXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgIGZvcmVhY2gocXcoSUQgTmFtZSkpIHsKICAgICAgICAgICAgaWYoISgkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXykpKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyAhIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZHVwbGljYXRlIGNoZWNrCiAgICAgICAgaWYoISRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VEdXBsaWNhdGVDaGVjayhOYW1lPT4kUGFyYW1EYXRhe05hbWV9LElEPT4kUGFyYW1EYXRhe0lEfSkpIHsKICAgICAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICAgICAgaWYgKCEkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlVXBkYXRlKCVQYXJhbURhdGEsIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPUFnZW50RkFRJlN1YmFjdGlvbj1MYW5ndWFnZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkxhbmd1YWdlICckUGFyYW1EYXRhe05hbWV9JyBhbHJlYWR5IGV4aXN0cyEiKTsKICAgICAgICB9CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGVnb3J5IHVwZGF0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhdGVnb3J5Q2hhbmdlJykgewoKICAgICAgICBAUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgZm9yZWFjaChxdyhDYXRlZ29yeUlEKSkgewogICAgICAgICAgICBpZighKCRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfICEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICBteSAlQ2F0ZWdvcnlEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUdldCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkUGFyYW1EYXRhe0NhdGVnb3J5SUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCElQ2F0ZWdvcnlEYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIGR0bAogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeUxvbmdPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICAgICAgQ2F0ZWdvcnlMaXN0ID0+IHsgJXskU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdChVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KX0gfSwKICAgICAgICAgICAgU2l6ZSA9PiAxMCwKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJENhdGVnb3J5RGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pfSB9LAogICAgICAgICAgICBTaXplID0+IDEsCiAgICAgICAgICAgIE5hbWUgPT4gJ1BhcmVudElEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkQ2F0ZWdvcnlEYXRhe1BhcmVudElEfSwKICAgICAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgUm9vdEVsZW1lbnQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgJEZyb250ZW5ke1ZhbGlkT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4geyRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKX0sCiAgICAgICAgICAgIE5hbWUgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRDYXRlZ29yeURhdGF7VmFsaWRJRH0sCiAgICAgICAgKTsKICAgICAgICBteSAkU2VsZWN0ZWRHcm91cHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkdldENhdGVnb3J5R3JvdXAoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJFBhcmFtRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICApOwogICAgICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KFZhbGlkID0+IDEpOwogICAgICAgICRGcm9udGVuZHtHcm91cE9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlR3JvdXBzLAogICAgICAgICAgICBOYW1lID0+ICdQZXJtaXNzaW9uR3JvdXBzJywKICAgICAgICAgICAgU2l6ZSA9PiAxMiwKICAgICAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxlY3RlZEdyb3VwcywKICAgICAgICApOwogICAgICAgICRQYXJhbXtIZWFkbGluZX0gPSAnVXBkYXRlJzsKICAgICAgICAkUGFyYW17Rm9ybVN1YmFjdGlvbn0gPSAnQ2F0ZWdvcnlDaGFuZ2VBY3Rpb24nOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kLCAlQ2F0ZWdvcnlEYXRhIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yeUFkZExpbmsnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtIH0sCiAgICAgICAgKTsKCiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRlZ29yeSB1cGRhdGUgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2F0ZWdvcnlDaGFuZ2VBY3Rpb24nKSB7CiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBOYW1lIENvbW1lbnQpOwogICAgICAgIG15IEBQYXJhbXMgPSBxdyhQYXJlbnRJRCBWYWxpZElEKTsKICAgICAgICBmb3IgKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCEkUGFyYW1EYXRheyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoQFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCFkZWZpbmVkKCRQYXJhbURhdGF7JF99KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGR1cGxpY2F0ZSBjaGVjawogICAgICAgIGlmKCEkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5RHVwbGljYXRlQ2hlY2soTmFtZT0+JFBhcmFtRGF0YXtOYW1lfSxJRD0+JFBhcmFtRGF0YXtDYXRlZ29yeUlEfSxQYXJlbnRJRD0+JFBhcmFtRGF0YXtQYXJlbnRJRH0pKSB7CiAgICAgICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgICAgIGlmICgkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5VXBkYXRlKCVQYXJhbURhdGEsIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pKSB7CiAgICAgICAgICAgICAgICAjIHNldCBjYXRlZ29yeWdyb3VwcwogICAgICAgICAgICAgICAgbXkgQFBlcm1pc3Npb25Hcm91cHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoUGFyYW0gPT4gIlBlcm1pc3Npb25Hcm91cHMiKTsKICAgICAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+U2V0Q2F0ZWdvcnlHcm91cCgKICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRQYXJhbURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICAgICAgICAgR3JvdXBJRHMgPT4gXEBQZXJtaXNzaW9uR3JvdXBzLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249QWdlbnRGQVEmU3ViYWN0aW9uPUNhdGVnb3J5Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiQ2F0ZWdvcnkgJyRQYXJhbURhdGF7TmFtZX0nIGFscmVhZHkgZXhpc3RzISIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRlZ29yeSBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDYXRlZ29yeScpIHsKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGR0bAoKICAgICAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlMb25nT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb24oCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiB7ICV7JFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUxpc3QoVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSl9IH0gLAogICAgICAgICAgICBTaXplID0+IDEwLAogICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yeUlEJywKICAgICAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pfSB9LAogICAgICAgICAgICBTaXplID0+IDEsCiAgICAgICAgICAgIE5hbWUgPT4gJ1BhcmVudElEJywKICAgICAgICAgICAgSFRNTFF1b3RlID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgUm9vdEVsZW1lbnQgPT4gMSwKICAgICAgICApOwogICAgICAgICMgYnVpbGQgVmFsaWRJRCBzdHJpbmcKICAgICAgICAkRnJvbnRlbmR7VmFsaWRPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7JFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpfSwKICAgICAgICAgICAgTmFtZSA9PiAnVmFsaWRJRCcsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17SGVhZGxpbmV9ID0gJ0FkZCc7CiAgICAgICAgJFBhcmFte0Zvcm1TdWJhY3Rpb259ID0gJ0NhdGVnb3J5QWRkQWN0aW9uJzsKICAgICAgICAjIGdyb3VwIHBlcm1pc3Npb24KICAgICAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdChWYWxpZCA9PiAxKTsKICAgICAgICAkRnJvbnRlbmR7R3JvdXBPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJUdyb3VwcywKICAgICAgICAgICAgTmFtZSA9PiAnUGVybWlzc2lvbkdyb3VwcycsCiAgICAgICAgICAgIFNpemUgPT4gMTIsCiAgICAgICAgICAgIE11bHRpcGxlID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yeScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICk7CgogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0ZWdvcnkgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhdGVnb3J5QWRkQWN0aW9uJykgewogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSd30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KE5hbWUgQ29tbWVudCk7CiAgICAgICAgbXkgQFBhcmFtcyA9IHF3KFBhcmVudElEIFZhbGlkSUQpOwogICAgICAgIGZvciAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgaWYoISRQYXJhbURhdGF7JF99KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighZGVmaW5lZCgkUGFyYW1EYXRheyRffSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGR1cGxpY2F0ZSBjaGVjawogICAgICAgIGlmKCEkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5RHVwbGljYXRlQ2hlY2soTmFtZT0+JFBhcmFtRGF0YXtOYW1lfSxQYXJlbnRJRD0+JFBhcmFtRGF0YXtQYXJlbnRJRH0pKSB7CiAgICAgICAgICAgIG15ICRDYXRlZ29yeUlEID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUFkZCglUGFyYW1EYXRhLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICAgICAgaWYgKCRDYXRlZ29yeUlEKSB7CiAgICAgICAgICAgICAgICAjIHNldCBjYXRlZ29yeWdyb3VwcwogICAgICAgICAgICAgICAgbXkgQFBlcm1pc3Npb25Hcm91cHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoUGFyYW0gPT4gIlBlcm1pc3Npb25Hcm91cHMiKTsKICAgICAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+U2V0Q2F0ZWdvcnlHcm91cCgKICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgICAgIEdyb3VwSURzID0+IFxAUGVybWlzc2lvbkdyb3VwcywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPUFnZW50RkFRJlN1YmFjdGlvbj1DYXRlZ29yeSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkNhdGVnb3J5ICckUGFyYW1EYXRhe05hbWV9JyBhbHJlYWR5IGV4aXN0cyEiKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcpIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2VJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gJFNlbGYtPntVc2VyTGFuZ3VhZ2V9LAogICAgICAgICk7CgogICAgICAgIG15ICRDYXRlZ29yaWVzID0gJFNlbGYtPntGQVFPYmplY3R9LT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgVXNlcklEID0+ICAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgPT4gJ3J3JwogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke0NhdGVnb3J5T3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb24oCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiAkQ2F0ZWdvcmllcywKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwoKICAgICAgICAkRnJvbnRlbmR7U3RhdGVPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkID0+ICdpbnRlcm5hbCAoYWdlbnQpJywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBZGQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICApOwoKICAgICAgICAjIGZpZWxkcwogICAgICAgICRTZWxmLT5fR2V0SXRlbUZpZWxkcygKICAgICAgICAgICAgSXRlbURhdGEgPT4ge30KICAgICAgICApOwoKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicpIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KFRpdGxlKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBUaXRsZSk7CiAgICAgICAgbXkgQFBhcmFtcyA9IHF3KFN0YXRlSUQgTGFuZ3VhZ2VJRCBGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNiBLZXl3b3JkcyBUaXRsZSk7CiAgICAgICAgZm9yIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBpbnNlcnQgaXRlbQogICAgICAgIG15ICRJdGVtSUQgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUFkZCgKICAgICAgICAgICAgJVBhcmFtRGF0YSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICk7CgogICAgICAgIGlmICggISRJdGVtSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CiAgICAgICAgaWYgKCAlVXBsb2FkU3R1ZmYgKSB7CiAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+QXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1WaWV3Jkl0ZW1JRD0kSXRlbUlEIiwKICAgICAgICApOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaXRlbSB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGUnKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhJdGVtSUQpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1J3fSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KENhdGVnb3J5SUQgSXRlbUlEKTsKICAgICAgICBmb3IgKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCAhJFBhcmFtRGF0YXskX30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2VJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkSXRlbURhdGF7TGFuZ3VhZ2VJRH0sCiAgICAgICAgKTsKICAgICAgICBteSAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+R2V0VXNlckNhdGVnb3JpZXMoCiAgICAgICAgICAgIFVzZXJJRCA9PiAgJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlID0+ICdydycKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4gJENhdGVnb3JpZXMsCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEl0ZW1EYXRhe0NhdGVnb3J5SUR9LAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke1N0YXRlT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4geyAkU2VsZi0+e0ZBUU9iamVjdH0tPlN0YXRlTGlzdCgpIH0sCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtTdGF0ZUlEfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlSXRlbURhdGEsICVGcm9udGVuZCB9LAogICAgICAgICk7CiAgICAgICAgIyBhZGQgYXR0YWNobWVudHMKICAgICAgICBteSBAQXR0YWNobWVudEluZGV4ID0gJFNlbGYtPntGQVFPYmplY3R9LT5BdHRhY2htZW50SW5kZXgoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAQXR0YWNobWVudEluZGV4ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJUl0ZW1EYXRhLCAleyAkQXR0YWNobWVudCB9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGZpZWxkcwogICAgICAgICRTZWxmLT5fR2V0SXRlbUZpZWxkcygKICAgICAgICAgICAgSXRlbURhdGEgPT4gXCVJdGVtRGF0YQogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0CiAgICAgICAgJEhlYWRlclRpdGxlID0gJ0VkaXQnOwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUeXBlID0+ICRIZWFkZXJUeXBlLCBUaXRsZSA9PiAkSGVhZGVyVGl0bGUpOwoKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gdXBkYXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZUFjdGlvbicpIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KEl0ZW1JRCBUaXRsZSBDYXRlZ29yeUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawoKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBteSBAUmVxdWlyZWRQYXJhbXMgPSBxdyhUaXRsZSBDYXRlZ29yeUlEKTsKICAgICAgICBteSBAUGFyYW1zID0gcXcoSXRlbUlEIFN0YXRlSUQgTGFuZ3VhZ2VJRCBGaWVsZDEgRmllbGQyIEZpZWxkMyBGaWVsZDQgRmllbGQ1IEZpZWxkNiBLZXl3b3JkcwogICAgICAgIEF0dGFjaG1lbnRVcGxvYWQgQXR0YWNobWVudERlbGV0ZTAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2KTsKICAgICAgICBmb3IgKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgICAgIGlmKCAhJFBhcmFtRGF0YXskX30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChAUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICB9CgogICAgICAgIG15ICRSZWRpcmVjdCA9IDE7CiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciAoIDAgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFtRGF0YXsiQXR0YWNobWVudERlbGV0ZSRfIn0gKSB7CiAgICAgICAgICAgICAgICAkUmVkaXJlY3QgPSAwOwogICAgICAgICAgICAgICAgJFNlbGYtPntGQVFPYmplY3R9LT5BdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRfLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJFBhcmFtRGF0YXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJFJlZGlyZWN0ID0gMDsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAiZmlsZV91cGxvYWQiLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0ZBUU9iamVjdH0tPkF0dGFjaG1lbnRBZGQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFtRGF0YXtJdGVtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgaXRlbQogICAgICAgIG15ICRVcGRhdGUgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVVwZGF0ZSgKICAgICAgICAgICAgJVBhcmFtRGF0YSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVXBkYXRlICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUmVkaXJlY3QgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVZpZXcmSXRlbUlEPSRHZXRQYXJhbXtJdGVtSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVVwZGF0ZSZJdGVtSUQ9JEdldFBhcmFte0l0ZW1JRH0mQ2F0ZWdvcnlJRD0kR2V0UGFyYW17Q2F0ZWdvcnlJRH0iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZSBpdGVtIHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScpIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KEl0ZW1JRCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawoKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBteSBAUmVxdWlyZWRQYXJhbXMgPSBxdyhDYXRlZ29yeUlEIEl0ZW1JRCk7CiAgICAgICAgZm9yIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRQYXJhbURhdGF7SXRlbUlEfSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSk7CiAgICAgICAgaWYgKCElSXRlbURhdGEpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgZHRsCgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlbGV0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVJdGVtRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnRGVsZXRlJzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVHlwZSA9PiAkSGVhZGVyVHlwZSwgVGl0bGUgPT4gJEhlYWRlclRpdGxlKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIGRlbGV0ZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGVBY3Rpb24nKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhJdGVtSUQpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBteSBAUmVxdWlyZWRQYXJhbXMgPSBxdyhDYXRlZ29yeUlEIEl0ZW1JRCk7CiAgICAgICAgZm9yIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldChJdGVtSUQgPT4gJFBhcmFtRGF0YXtJdGVtSUR9LCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9KTsKICAgICAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZWxmLT57RkFRT2JqZWN0fS0+RkFRRGVsZXRlKCVJdGVtRGF0YSkpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUV4cGxvcmVyJkNhdGVnb3J5SUQ9JFBhcmFtRGF0YXtDYXRlZ29yeUlEfSIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZG93bmxvYWQgaXRlbQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkJykgewogICAgICAgIEBQYXJhbXMgPSBxdyhJdGVtSUQgRmlsZUlEKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSb30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CiAgICAgICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgICAgIGZvciAoQFBhcmFtcykgewogICAgICAgICAgICBpZiggIWRlZmluZWQgKCRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZGIgYWN0aW9uCiAgICAgICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoISVJdGVtRGF0YSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXR0YWNobWVudHMKICAgICAgICBteSAlRmlsZSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+QXR0YWNobWVudEdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBGaWxlSUQgPT4gJEdldFBhcmFte0ZpbGVJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICVGaWxlICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KCVGaWxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlYXJjaCBhIGl0ZW0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZWFyY2gnKSB7CiAgICAgICAgJFNlbGYtPkdldEl0ZW1TZWFyY2goCiAgICAgICAgICAgIE1vZGUgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnU2VhcmNoJzsKICAgICAgICAkSGVhZGVyID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgICAgIFRpdGxlID0+ICRIZWFkZXJUaXRsZSwKICAgICAgICAgICAgVHlwZSA9PiAkSGVhZGVyVHlwZSwKICAgICAgICApOwogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7JUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGl0ZW0gaGlzdG9yeQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0hpc3RvcnknKSB7CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBteSBAUmVxdWlyZWRQYXJhbXMgPSBxdyhDYXRlZ29yeUlEIEl0ZW1JRCk7CiAgICAgICAgZm9yIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgICAgICBpZighJFBhcmFtRGF0YXskX30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgICAgIG15ICVJdGVtRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KEl0ZW1JRCA9PiAkUGFyYW1EYXRhe0l0ZW1JRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0pOwogICAgICAgIGlmICghJUl0ZW1EYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIGR0bAogICAgICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGlzdG9yeScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVJdGVtRGF0YSB9LAogICAgICAgICk7CgogICAgICAgICRIZWFkZXJUaXRsZSA9ICdIaXN0b3J5JzsKICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgIG15IEBIaXN0b3J5ID0gQHskU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUhpc3RvcnlHZXQoSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9KX07CiAgICAgICAgZm9yIG15ICRSb3cgKEBIaXN0b3J5KSB7CgogICAgICAgICAgICAjIGNzcyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGlmKCRGcm9udGVuZHtDc3NSb3d9IGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnc2VhcmNoYWN0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRnJvbnRlbmR7TmFtZX0gPSAkUm93LT57TmFtZX07CiAgICAgICAgICAgICRGcm9udGVuZHtDcmVhdGVkfSA9ICRSb3ctPntDcmVhdGVkfTsKICAgICAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUm93LT57Q3JlYXRlZEJ5fSwKICAgICAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkRnJvbnRlbmR7Q3JlYXRlZEJ5fSA9ICIkVXNlcntVc2VyTG9naW59ICgkVXNlcntVc2VyRmlyc3RuYW1lfSAkVXNlcntVc2VyTGFzdG5hbWV9KSI7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSGlzdG9yeVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJUZyb250ZW5kIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgfQoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzeXN0ZW0gaGlzdG9yeQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N5c3RlbUhpc3RvcnknKSB7CiAgICAgICAgJFNlbGYtPkdldFN5c3RlbUhpc3RvcnkoKTsKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnSGlzdG9yeSc7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIHByaW50CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUHJpbnQnICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnSXRlbUlEJykpIHsKICAgICAgICAkU2VsZi0+R2V0SXRlbVByaW50KExpbmtzID0+IDEpOwogICAgICAgICRIZWFkZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiAkU2VsZi0+e0l0ZW1EYXRhfXtTdWJqZWN0fQogICAgICAgICk7CiAgICAgICAgJE5hdmlnYXRpb24gPSAnICc7CiAgICAgICAgJENvbnRlbnQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdGQVEnLAogICAgICAgICAgICBEYXRhID0+IHslRnJvbnRlbmQgLCAlR2V0UGFyYW0gfQogICAgICAgICk7CiAgICAgICAgJEZvb3RlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBleHBsb3JlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cGxvcmVyJykgewogICAgICAgICRTZWxmLT5HZXRFeHBsb3JlcihNb2RlID0+ICdBZ2VudCcpOwogICAgICAgICRIZWFkZXJUaXRsZSA9ICdFeHBsb3Jlcic7CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgICAgICBUeXBlID0+ICRIZWFkZXJUeXBlLAogICAgICAgICAgICBUaXRsZSA9PiAkSGVhZGVyVGl0bGUKICAgICAgICApOwogICAgICAgICRDb250ZW50ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRkFRJywKICAgICAgICAgICAgRGF0YSA9PiB7JUZyb250ZW5kICwgJUdldFBhcmFtIH0KICAgICAgICApOwoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIHZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdJdGVtSUQnKSkgewogICAgICAgIGlmKCRTZWxmLT57TGFzdEZBUU5hdn0pIHsKICAgICAgICAgICAgJFNlbGYtPkdldEl0ZW1TbWFsbFZpZXcoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgc3RvcmUgbGFzdCBzY3JlZW4gKHRvIGdldCBiYWNrIGZyb20gbGlua2luIG9iamVjdCBtYXNrKQogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVGQVFBcnRpY2xlID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgICAgICAgICBGQVFJRCA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0l0ZW1JRCcpLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2hlY2tDYXRlZ29yeVVzZXJQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEZBUUFydGljbGV7Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICk7Ci