LinkObject2 1.1.1 OTRS AG http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Build for OTRS::ITSM 1.1.1. Build for OTRS::ITSM 1.1.0 rc1. Build for OTRS::ITSM 1.1.0 beta4. Build for OTRS::ITSM 1.1.0 beta3. Build for OTRS::ITSM 1.1.0 beta2. Build for OTRS::ITSM 1.1.0 beta1. Testbuild for OTRS::ITSM 1.1.0 beta1. The LinkObject2 package. Das LinkObject2 Paket. 2.2.6 2.2.x CVS <br> WELCOME<br> <br> You are about to install the OTRS module LinkObject2.<br> <br> <br> ATTENTION<br> <br> Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WILLKOMMEN<br> <br> Sie sind im Begriff das OTRS-Modul LinkObject2 zu installieren.<br> <br> <br> ACHTUNG<br> <br> Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WELCOME<br> <br> You are about to upgrade the OTRS module LinkObject2.<br> <br> <br> ATTENTION<br> <br> Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WILLKOMMEN<br> <br> Sie sind im Begriff das OTRS-Modul LinkObject2 zu aktualisieren.<br> <br> <br> ACHTUNG<br> <br> Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br> <br> <br> ((enjoy))<br> <br> require Kernel::System::Group; $Self->{GroupObject} = Kernel::System::Group->new(%{$Self}); # add group linkobject2 $Self->{GroupObject}->GroupAdd( Name => 'linkobject2', Comment => 'Group for LinkObject2 mask access in the agent interface.', ValidID => 1, UserID => 1, ); # add user root to linkobject2 admin group $Self->{GroupObject}->GroupMemberAdd( GID => $Self->{GroupObject}->GetGroupIdByName(Group => 'linkobject2'), UID => 1, Permission => { ro => 1, move_into => 1, create => 1, owner => 1, priority => 1, rw => 1, }, UserID => 1, ); require Kernel::System::Group; $Self->{GroupObject} = Kernel::System::Group->new(%{$Self}); # add group linkobject2 $Self->{GroupObject}->GroupAdd( Name => 'linkobject2', Comment => 'Group for LinkObject2 mask access in the agent interface.', ValidID => 1, UserID => 1, ); # add user root to linkobject2 admin group $Self->{GroupObject}->GroupMemberAdd( GID => $Self->{GroupObject}->GetGroupIdByName(Group => 'linkobject2'), UID => 1, Permission => { ro => 1, move_into => 1, create => 1, owner => 1, priority => 1, rw => 1, }, UserID => 1, ); 2008-05-04 16:26:57 opms.otrs.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBMaW5rT2JqZWN0Mi54bWwsdiAxLjkgMjAwOC8wMi8yNiAxODo1MTowNyBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50TGlua09iamVjdDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRMaW5rT2JqZWN0MiBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50TGlua09iamVjdDItT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+bGlua29iamVjdDI8L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkxpbmtPYmplY3QyPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5MaW5rT2JqZWN0MjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5MaW5rT2JqZWN0MjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRMaW5rT2JqZWN0MlNlYXJjaCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudExpbmtPYmplY3QyU2VhcmNoIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRMaW5rT2JqZWN0MlNlYXJjaC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5saW5rb2JqZWN0MjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TGlua09iamVjdDI8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkxpbmtPYmplY3QyPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkxpbmtPYmplY3QyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudExpbmtPYmplY3QyQWRkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50TGlua09iamVjdDJBZGQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudExpbmtPYmplY3QyQWRkLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmxpbmtvYmplY3QyPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5MaW5rT2JqZWN0MjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+TGlua09iamVjdDI8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+TGlua09iamVjdDI8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDAwLUJhY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBiYWNrIGxpbmsgaW4gbGluayBvYmplY3QgMiBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBadXL8Y2stTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgTGlua09iamVjdDItQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpMaW5rT2JqZWN0Mjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0Mk1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPiRFbnZ7IkxpbmtPYmplY3QyTGFzdFNjcmVlbiJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMTAwLUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGFkZCBsaW5rIGluIGxpbmsgb2JqZWN0IDIgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgSGluenVm/Gdlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBMaW5rT2JqZWN0Mi1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkxpbmtPYmplY3QyOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3QyTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkFkZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkFkZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudExpbmtPYmplY3QyU2VhcmNoJmFtcDtTb3VyY2VDbGFzcz0kUURhdGF7IlNvdXJjZUNsYXNzIn0mYW1wO1NvdXJjZUtleT0kUURhdGF7IlNvdXJjZUtleSJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50TGlua09iamVjdDJUZW1wIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50TGlua09iamVjdDJUZW1wIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRMaW5rT2JqZWN0MlRlbXAtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+bGlua29iamVjdDI8L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkxpbmtPYmplY3QyPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5MaW5rT2JqZWN0MjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5MaW5rT2JqZWN0MjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRMaW5rT2JqZWN0MlRlbXBTZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRMaW5rT2JqZWN0MlRlbXBTZWFyY2ggb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudExpbmtPYmplY3QyVGVtcFNlYXJjaC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5saW5rb2JqZWN0MjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TGlua09iamVjdDI8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkxpbmtPYmplY3QyPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkxpbmtPYmplY3QyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudExpbmtPYmplY3QyVGVtcEFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudExpbmtPYmplY3QyVGVtcEFkZCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50TGlua09iamVjdDJUZW1wQWRkLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmxpbmtvYmplY3QyPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5MaW5rT2JqZWN0MjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+TGlua09iamVjdDI8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+TGlua09iamVjdDI8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDI6OlR5cGUjIyNOb3JtYWwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5MaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxpbmsgVHlwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3QyOjpUeXBlczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3JtYWxOYW1lIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJldmVyc2VOYW1lIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0Mjo6VHlwZSMjI1BhcmVudENoaWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MaW5rIFR5cC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0Mjo6VHlwZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm9ybWFsTmFtZSI+UGFyZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXZlcnNlTmFtZSI+Q2hpbGQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+ IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19MaW5rT2JqZWN0Mi5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgTGlua09iamVjdDIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGJnX0xpbmtPYmplY3QyLnBtLHYgMS41IDIwMDgvMDMvMTkgMTU6NDM6MzUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19MaW5rT2JqZWN0MjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J1JlbGF0ZWQgT2JqZWN0cyd9ICAgICAgID0gJ9Hi+vDn4O3oIO7h5ery6Cc7CiAgICAkTGFuZy0+eydTb3VyY2UgT2JqZWN0J30gICAgICAgICA9ICfO4eXq8ugt6Ofy7vft6PboJzsKICAgICRMYW5nLT57J1RhcmdldCBPYmplY3QnfSAgICAgICAgID0gJ87h5ery6C325evoJzsKICAgICRMYW5nLT57J0xpbmt0eXBlJ30gICAgICAgICAgICAgID0gJ9Lo7yDt4CDi8Prn6uDy4Cc7CiAgICAkTGFuZy0+eydUYXJnZXQgT2JqZWN0cyBhcmUuLi4nfSA9ICfI5+Hw4O3o8uUg7uHl6vLoIPHgIC4uLic7CiAgICAkTGFuZy0+eydOb3JtYWwnfSAgICAgICAgICAgICAgICA9ICfN7vDs4Ovt4Cc7CiAgICAkTGFuZy0+eydQYXJlbnQnfSAgICAgICAgICAgICAgICA9ICfQ7uTo8uXrJzsKICAgICRMYW5nLT57J0NoaWxkJ30gICAgICAgICAgICAgICAgID0gJ8Tl8uUnOwoKICAgIHJldHVybiAxOwp9CgoxOwo= IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9MaW5rT2JqZWN0Mi5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBMaW5rT2JqZWN0MgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogY3pfTGlua09iamVjdDIucG0sdiAxLjQgMjAwOC8wMy8xOSAxNTo0MzozNSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0xpbmtPYmplY3QyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnUmVsYXRlZCBPYmplY3RzJ30gICAgICAgPSAnTmF2w6F6YW7DqSBvYmpla3R5JzsKICAgICRMYW5nLT57J1NvdXJjZSBPYmplY3QnfSAgICAgICAgID0gJ1pkb3Jqb3bDqSBvYmpla3R5JzsKICAgICRMYW5nLT57J1RhcmdldCBPYmplY3QnfSAgICAgICAgID0gJ0PDrWxvdsOpIG9iamVrdHknOwogICAgJExhbmctPnsnTGlua3R5cGUnfSAgICAgICAgICAgICAgPSAnTGluayB0eXBlJzsKICAgICRMYW5nLT57J1RhcmdldCBPYmplY3RzIGFyZS4uLid9ID0gJ1p2b2xlbsOpIG9iamVrdHkganNvdSAuLi4nOwogICAgJExhbmctPnsnTm9ybWFsJ30gICAgICAgICAgICAgICAgPSAnTm9ybcOhbG7DrSc7CiAgICAkTGFuZy0+eydQYXJlbnQnfSAgICAgICAgICAgICAgICA9ICdSb2RpxI0nOwogICAgJExhbmctPnsnQ2hpbGQnfSAgICAgICAgICAgICAgICAgPSAnRMOtdMSbJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9MaW5rT2JqZWN0Mi5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgTGlua09iamVjdDIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0xpbmtPYmplY3QyLnBtLHYgMS4xMiAyMDA4LzAzLzE5IDE1OjQzOjM1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfTGlua09iamVjdDI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEyICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnUmVsYXRlZCBPYmplY3RzJ30gICAgICAgPSAnQWJo5G5naWdlIE9iamVrdGUnOwogICAgJExhbmctPnsnU291cmNlIE9iamVjdCd9ICAgICAgICAgPSAnUXVlbGwgT2JqZWt0JzsKICAgICRMYW5nLT57J1RhcmdldCBPYmplY3QnfSAgICAgICAgID0gJ1ppZWwgT2JqZWt0JzsKICAgICRMYW5nLT57J0xpbmt0eXBlJ30gICAgICAgICAgICAgID0gJ1Zlcmtu/HBmdW5nc3R5cCc7CiAgICAkTGFuZy0+eydUYXJnZXQgT2JqZWN0cyBhcmUuLi4nfSA9ICdaaWVsIE9iamVrdGUgc2luZC4uLic7CiAgICAkTGFuZy0+eydOb3JtYWwnfSAgICAgICAgICAgICAgICA9ICdOb3JtYWwnOwogICAgJExhbmctPnsnUGFyZW50J30gICAgICAgICAgICAgICAgPSAnRWx0ZXJuJzsKICAgICRMYW5nLT57J0NoaWxkJ30gICAgICAgICAgICAgICAgID0gJ0tpbmQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo= IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDIucG0gLSB0aGUgbGluayBvYmplY3QgMiBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDIucG0sdiAxLjIwIDIwMDgvMDIvMjYgMTM6MTg6MDMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50TGlua09iamVjdDI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yMCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xpbmtPYmplY3QyfSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU291cmNlQ2xhc3MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJTb3VyY2VDbGFzcyIgKTsKICAgIG15ICRTb3VyY2VLZXkgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNvdXJjZUtleSIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNvdXJjZUNsYXNzIHx8ICEkU291cmNlS2V5ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBTb3VyY2VDbGFzcyBhbmQgU291cmNlS2V5IGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgbGlua3MKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdMaW5rRGVsZXRlJyApIHsKCiAgICAgICAgIyBnZXQgZGVsZXRlIGlkcwogICAgICAgIG15IEBEZWxldGVJRHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICJEZWxldGVJRCIgKTsKCiAgICAgICAgIyBkZWxldGUgbGlua3MKICAgICAgICBpZiAoQERlbGV0ZUlEcykgewogICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3QyfS0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgIExpbmtJRCA9PiBcQERlbGV0ZUlEcywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gbGluayBvYmplY3QgbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDI6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyAgID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3QyOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIH07CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkTWVudSAoIHNvcnQga2V5cyAlTWVudXMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgJENvdW50ZXIgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUNsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHNvdXJjZSBvdmVydmlldyBkYXRhCiAgICBteSAkU291cmNlT2JqZWN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPk9iamVjdE92ZXJ2aWV3R2V0KAogICAgICAgIENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICBLZXkgICA9PiAkU291cmNlS2V5LAogICAgKTsKCiAgICAjIGdldCBjbGFzcyBuYW1lCiAgICBteSAkU291cmNlQ2xhc3NOYW1lID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPkNsYXNzTmFtZUdldCgKICAgICAgICBDbGFzcyA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgS2V5ICAgPT4gJFNvdXJjZUtleSwKICAgICk7CgogICAgIyBvdXRwdXQgc291cmNlIG9iamVjdCBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTb3VyY2VPYmplY3QnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDbGFzc05hbWUgPT4gJFNvdXJjZUNsYXNzTmFtZQogICAgICAgIH0sCiAgICApOwoKICAgIGZvciBteSAkUm93RGF0YSAoIEB7JFNvdXJjZU9iamVjdH0gKSB7CgogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCAkUm93RGF0YS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgJFJvd0RhdGEtPntDb250ZW50fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFJvd0RhdGEtPntDb250ZW50fSApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgc291cmNlIG9iamVjdCByb3cgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTb3VyY2VPYmplY3RSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsgJXskUm93RGF0YX0gfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcnRuZXIgbGluayBkYXRhIGxpc3QKICAgIG15ICRQYXJ0bmVyTGlua0RhdGFMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlBhcnRuZXJMaW5rRGF0YUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgIEtleSAgID0+ICRTb3VyY2VLZXksCiAgICApOwoKICAgICMgZ2VuZXJhdGUgYmxvY2sgbGlzdAogICAgbXkgJEJsb2NrTGlzdCA9IHt9OwogICAgZm9yIG15ICRJdGVtICggQHskUGFydG5lckxpbmtEYXRhTGlzdH0gKSB7CiAgICAgICAgJEJsb2NrTGlzdC0+eyAkSXRlbS0+e0Jsb2NrbmFtZTF9IH0tPnsgJEl0ZW0tPntCbG9ja25hbWUyfSB9LT57ICRJdGVtLT57TGlua0lEfSB9ID0gJEl0ZW07CiAgICB9CgogICAgIyBzdGFydCBwYXJ0bmVyIG91dHB1dAogICAgZm9yIG15ICRCbG9ja25hbWUxICggc29ydCBrZXlzICV7JEJsb2NrTGlzdH0gKSB7CiAgICAgICAgZm9yIG15ICRCbG9ja25hbWUyICggc29ydCBrZXlzICV7ICRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0gfSApIHsKICAgICAgICAgICAgbXkgJEl0ZW1MaXN0ID0gJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfTsKCiAgICAgICAgICAgICMgZ2V0IHBhcnRuZXIgdGFibGUgY29sdW1ucwogICAgICAgICAgICBteSBATGlua0lEcyAgICAgICAgICAgID0ga2V5cyAleyRJdGVtTGlzdH07CiAgICAgICAgICAgIG15ICRQYXJ0bmVyVGFibGVDb2x1bW4gPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lclRhYmxlQ29sdW1uR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJEl0ZW1MaXN0LT57ICRMaW5rSURzWzBdIH0tPntQYXJ0bmVyQ2xhc3N9LAogICAgICAgICAgICAgICAgTGlua1R5cGVDb2x1bW4gPT4gMSwKICAgICAgICAgICAgICAgIERlbGV0ZUNvbHVtbiAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvdW50IGNvbHVtbnMKICAgICAgICAgICAgbXkgJENvbHVtbkNvdW50ID0gQHskUGFydG5lclRhYmxlQ29sdW1ufTsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgQmxvY2tuYW1lMSAgPT4gJEJsb2NrbmFtZTEsCiAgICAgICAgICAgICAgICAgICAgQmxvY2tuYW1lMiAgPT4gJEJsb2NrbmFtZTIsCiAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiAgICAgPT4gJENvbHVtbkNvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGNvbHVtbiB3aWR0aCBibG9jawogICAgICAgICAgICBmb3IgbXkgJENvbHVtbiAoIEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0gKSB7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayBoZWFkZXIgY29sdW1uIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtDb2x1bW5XaWR0aCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFdpZHRoID0+ICRDb2x1bW4tPntIVE1MT3V0cHV0fS0+e1RhYmxlV2lkdGh9IHx8ICcqJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUgY29sdW1uIGJsb2NrCiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uICggQHskUGFydG5lclRhYmxlQ29sdW1ufSApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGhlYWRlciBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua0hlYWRlckNvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbHVtbi0+e0hlYWRsaW5lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkTGlua0RhdGEgKCBzb3J0IGtleXMgJXsgJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdMaW5rUm93JyApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQ29sdW1uRGF0YSAoIEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgbG9va3VwIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdDJDb250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfS0+eyRMaW5rRGF0YX0tPntQYXJ0bmVyQ2xhc3N9LAogICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5EYXRhID0+ICRDb2x1bW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rRGF0YSAgID0+ICRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0tPnskQmxvY2tuYW1lMn0tPnskTGlua0RhdGF9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgcm93IGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtSb3dDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgID0+ICRDb250ZW50U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdPdmVydmlldycgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudExpbmtPYmplY3QyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBvdXRwdXQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDJBZGQucG0gLSB0aGUgbGluayBvYmplY3QgMiBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJBZGQucG0sdiAxLjE4IDIwMDgvMDIvMTkgMTQ6MjU6MDQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50TGlua09iamVjdDJBZGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xOCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xpbmtPYmplY3QyfSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU291cmNlQ2xhc3MgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiU291cmNlQ2xhc3MiICk7CiAgICBteSAkU291cmNlS2V5ICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiU291cmNlS2V5IiApOwogICAgbXkgJFBhcnRuZXJDbGFzcyAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlBhcnRuZXJDbGFzcyIgKTsKICAgIG15ICRQYXJ0bmVyT2JqZWN0ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJQYXJ0bmVyT2JqZWN0IiApOwogICAgbXkgJFBhcnRuZXJMaW5rVHlwZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlBhcnRuZXJMaW5rVHlwZSIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNvdXJjZUNsYXNzIHx8ICEkU291cmNlS2V5IHx8ICEkUGFydG5lckNsYXNzIHx8ICEkUGFydG5lck9iamVjdCB8fCAhJFBhcnRuZXJMaW5rVHlwZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIk5vIFNvdXJjZUNsYXNzLCBTb3VyY2VLZXksIFBhcnRuZXJDbGFzcywgUGFydG5lck9iamVjdCBhbmQgUGFydG5lckxpbmtUeXBlIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsaW5rIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdMaW5rQWRkJyApIHsKCiAgICAgICAgIyBnZXQgdGFyZ2V0IGtleXMKICAgICAgICBteSBAVGFyZ2V0S2V5cyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gIlRhcmdldEtleSIgKTsKICAgICAgICBteSAkUmV2ZXJzZTsKICAgICAgICBteSAkTGlua1R5cGU7CgogICAgICAgIGlmICggJFBhcnRuZXJMaW5rVHlwZSA9fiAvXiguKz8pOjooLiopJC94bXMgKSB7CiAgICAgICAgICAgICRMaW5rVHlwZSA9ICQxOwogICAgICAgICAgICBpZiAoICQyIGVxICdSZXZlcnNlJyApIHsKICAgICAgICAgICAgICAgICRSZXZlcnNlID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbGlua3MKICAgICAgICBmb3IgbXkgJE9uZUtleSAoQFRhcmdldEtleXMpIHsKICAgICAgICAgICAgaWYgKCRSZXZlcnNlKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3QyfS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICA9PiAkT25lS2V5LAogICAgICAgICAgICAgICAgICAgIFRhcmdldENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0Mn0tPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUNsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgIFRhcmdldENsYXNzID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgPT4gJE9uZUtleSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRMaW5rT2JqZWN0MiZTb3VyY2VDbGFzcz0kU291cmNlQ2xhc3MmU291cmNlS2V5PSRTb3VyY2VLZXkiCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IHNvdXJjZSBvdmVydmlldyBkYXRhCiAgICAgICAgbXkgJFNvdXJjZU9iamVjdCA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5PYmplY3RPdmVydmlld0dldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICBLZXkgICA9PiAkU291cmNlS2V5LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNvdXJjZSBjbGFzcyBuYW1lCiAgICAgICAgbXkgJFNvdXJjZUNsYXNzTmFtZSA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5DbGFzc05hbWVHZXQoCiAgICAgICAgICAgIENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgS2V5ICAgPT4gJFNvdXJjZUtleSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBzb3VyY2Ugb2JqZWN0IGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU291cmNlT2JqZWN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc05hbWUgPT4gJFNvdXJjZUNsYXNzTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBzb3VyY2Ugb2JqZWN0IHJvdyBibG9jawogICAgICAgIGZvciBteSAkUm93RGF0YSAoIEB7JFNvdXJjZU9iamVjdH0gKSB7CgogICAgICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgICAgICBpZiAoICRSb3dEYXRhLT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAgICAgJFJvd0RhdGEtPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRSb3dEYXRhLT57Q29udGVudH0gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU291cmNlT2JqZWN0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAleyRSb3dEYXRhfSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFydG5lciBzZWFyY2ggZm9ybSBkYXRhCiAgICAgICAgbXkgJEZvcm1EYXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MlBhcnRuZXJTZWFyY2hGb3JtR2V0KAogICAgICAgICAgICBDbGFzcyAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgT2JqZWN0ID0+ICRQYXJ0bmVyT2JqZWN0LAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgcGFydG5lciBzZWFyY2gKICAgICAgICBteSAkUGFydG5lcklEcyA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyT2JqZWN0U2VhcmNoKAogICAgICAgICAgICBDbGFzcyAgICA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICBPYmplY3QgICA9PiAkUGFydG5lck9iamVjdCwKICAgICAgICAgICAgRm9ybURhdGEgPT4gJEZvcm1EYXRhLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgbmVlZGxlc3MgaWRzCiAgICAgICAgJFBhcnRuZXJJRHMgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lckxpbmtEYXRhTmVlZGxlc3NEZWxldGUoCiAgICAgICAgICAgIFNvdXJjZUNsYXNzICAgICA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgICAgIFNvdXJjZUtleSAgICAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICBQYXJ0bmVyQ2xhc3MgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgUGFydG5lcklEcyAgICAgID0+ICRQYXJ0bmVySURzLAogICAgICAgICAgICBQYXJ0bmVyTGlua1R5cGUgPT4gJFBhcnRuZXJMaW5rVHlwZSwKICAgICAgICApOwoKICAgICAgICBpZiAoIEB7JFBhcnRuZXJJRHN9ICkgewoKICAgICAgICAgICAgIyBnZXQgcGFydG5lciBkYXRhCiAgICAgICAgICAgIG15ICRQYXJ0bmVySW5mbyA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyQWRkRGF0YUxpc3QoCiAgICAgICAgICAgICAgICBTb3VyY2VDbGFzcyAgICAgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgU291cmNlS2V5ICAgICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICBQYXJ0bmVyQ2xhc3MgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgIFBhcnRuZXJJRHMgICAgICA9PiAkUGFydG5lcklEcywKICAgICAgICAgICAgICAgIFBhcnRuZXJMaW5rVHlwZSA9PiAkUGFydG5lckxpbmtUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcGFydG5lciB0YWJsZSBjb2x1bW5zCiAgICAgICAgICAgIG15ICRQYXJ0bmVyVGFibGVDb2x1bW4gPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lclRhYmxlQ29sdW1uR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgIEFkZENvbHVtbiAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBMaW5rVHlwZUNvbHVtbiA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgbGluayBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTb3VyY2VDbGFzcyAgICAgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgIFBhcnRuZXJDbGFzcyAgICA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICAgICAgICAgIFBhcnRuZXJPYmplY3QgICA9PiAkUGFydG5lck9iamVjdCwKICAgICAgICAgICAgICAgICAgICBQYXJ0bmVyTGlua1R5cGUgPT4gJFBhcnRuZXJMaW5rVHlwZSwKICAgICAgICAgICAgICAgICAgICBCbG9ja25hbWUxICAgICAgPT4gJFBhcnRuZXJJbmZvLT5bMF0tPntCbG9ja25hbWUxfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBCbG9ja25hbWUyICAgICAgPT4gJFBhcnRuZXJJbmZvLT5bMF0tPntCbG9ja25hbWUyfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuICAgICAgICAgPT4gc2NhbGFyIEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgY29sdW1uIHdpZHRoIGJsb2NrCiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uICggQHskUGFydG5lclRhYmxlQ29sdW1ufSApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGhlYWRlciBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua0NvbHVtbldpZHRoJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGggPT4gJENvbHVtbi0+e0hUTUxPdXRwdXR9LT57VGFibGVXaWR0aH0gfHwgJyonLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBoZWFkbGluZSBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKCBAeyRQYXJ0bmVyVGFibGVDb2x1bW59ICkgewoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgaGVhZGVyIGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rSGVhZGVyQ29sdW1uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29sdW1uLT57SGVhZGxpbmV9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJExpbmtEYXRhICggQHskUGFydG5lckluZm99ICkgewoKICAgICAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdMaW5rUm93JyApOwogICAgICAgICAgICAgICAgZm9yIG15ICRDb2x1bW5EYXRhICggQHskUGFydG5lclRhYmxlQ29sdW1ufSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBsb29rdXAgY29udGVudAogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRGF0YSA9PiAkQ29sdW1uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgTGlua0RhdGEgICA9PiAkTGlua0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayByb3cgY29sdW1uIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua1Jvd0NvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgPT4gJENvbnRlbnRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IG5vIHJlc3VsdCBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdOb1Jlc3VsdCcgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ0xpbmsnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TGlua09iamVjdDJBZGQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVG90YWxIaXRzID0+IHNjYWxhciBAeyRQYXJ0bmVySURzfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDJTZWFyY2gucG0gLSB0aGUgbGluayBvYmplY3QgMiBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJTZWFyY2gucG0sdiAxLjE0IDIwMDgvMDIvMTkgMTQ6MjU6MDQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50TGlua09iamVjdDJTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xpbmtPYmplY3QyfSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU291cmNlQ2xhc3MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJTb3VyY2VDbGFzcyIgKTsKICAgIG15ICRTb3VyY2VLZXkgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNvdXJjZUtleSIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNvdXJjZUNsYXNzIHx8ICEkU291cmNlS2V5ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBTb3VyY2VDbGFzcyBhbmQgU291cmNlS2V5IGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc291cmNlIG92ZXJ2aWV3IGRhdGEKICAgIG15ICRTb3VyY2VPYmplY3QgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+T2JqZWN0T3ZlcnZpZXdHZXQoCiAgICAgICAgQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgIEtleSAgID0+ICRTb3VyY2VLZXksCiAgICApOwoKICAgICMgZ2V0IGNsYXNzIG5hbWUKICAgIG15ICRTb3VyY2VDbGFzc05hbWUgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+Q2xhc3NOYW1lR2V0KAogICAgICAgIENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICBLZXkgICA9PiAkU291cmNlS2V5LAogICAgKTsKCiAgICAjIG91dHB1dCBzb3VyY2Ugb2JqZWN0IGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1NvdXJjZU9iamVjdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzTmFtZSA9PiAkU291cmNlQ2xhc3NOYW1lLAogICAgICAgIH0sCiAgICApOwoKICAgICMgb3V0cHV0IHNvdXJjZSBvYmplY3Qgcm93IGJsb2NrCiAgICBmb3IgbXkgJFJvd0RhdGEgKCBAeyRTb3VyY2VPYmplY3R9ICkgewoKICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICggJFJvd0RhdGEtPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICRSb3dEYXRhLT57Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRSb3dEYXRhLT57Q29udGVudH0gKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU291cmNlT2JqZWN0Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRSb3dEYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcnRuZXIgb2JqZWN0CiAgICBteSAkUGFydG5lck9iamVjdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlBhcnRuZXJPYmplY3QiICkgfHwgJyc7CiAgICBpZiAoICRQYXJ0bmVyT2JqZWN0IGVxICctJyApIHsKICAgICAgICAkUGFydG5lck9iamVjdCA9ICcnOwogICAgfQoKICAgICMgZ2VuZXJhdGUgcGFydG5lciBjbGFzcwogICAgbXkgJFBhcnRuZXJDbGFzcyA9ICRQYXJ0bmVyT2JqZWN0OwogICAgaWYgKCAkUGFydG5lckNsYXNzID1+IC9eKC4rPyk6Oi4qJC94bXMgKSB7CiAgICAgICAgJFBhcnRuZXJDbGFzcyA9ICQxOwogICAgfQoKICAgICMgZ2V0IHBhcnRuZXIgbGluayB0eXBlCiAgICBteSAkUGFydG5lckxpbmtUeXBlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiUGFydG5lckxpbmtUeXBlIiApIHx8ICcnOwogICAgaWYgKCAkUGFydG5lckxpbmtUeXBlIGVxICctJyApIHsKICAgICAgICAkUGFydG5lckxpbmtUeXBlID0gJyc7CiAgICB9CgogICAgIyBnZXQgcGFydG5lciBvYmplY3QgbGlzdAogICAgbXkgJFBhcnRuZXJPYmplY3RMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlBhcnRuZXJPYmplY3RMaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICRTb3VyY2VDbGFzcywKICAgICAgICBTZWxlY3RlZEtleSA9PiAkUGFydG5lck9iamVjdCwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBQYXJ0bmVyT2JqZWN0U3RyZwogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CiAgICBteSAkUGFydG5lck9iamVjdFN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFydG5lck9iamVjdExpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdQYXJ0bmVyT2JqZWN0JywKICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIE9uQ2hhbmdlICAgICA9PiAnZG9jdW1lbnQudGFyZ2V0b2JqZWN0LnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7JywKICAgICk7CgogICAgIyBnZXQgcGFydG5lciBsaW5rIHR5cGUgbGlzdAogICAgbXkgJFBhcnRuZXJMaW5rVHlwZUxpc3QgPSBbXTsKICAgIGlmICgkUGFydG5lckNsYXNzKSB7CiAgICAgICAgJFBhcnRuZXJMaW5rVHlwZUxpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lckxpbmtUeXBlTGlzdCgKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgUGFydG5lckNsYXNzID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgIFNlbGVjdGVkS2V5ICA9PiAkUGFydG5lckxpbmtUeXBlLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBQYXJ0bmVyTGlua1R5cGVTdHJnCiAgICBteSAkUGFydG5lckxpbmtUeXBlU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJ0bmVyTGlua1R5cGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnUGFydG5lckxpbmtUeXBlJywKICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBPbkNoYW5nZSAgICAgPT4gJ2RvY3VtZW50LnRhcmdldG9iamVjdC5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOycsCiAgICApOwoKICAgICMgb3V0cHV0IHBhcnRuZXIgb2JqZWN0IHNlbGVjdCBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQYXJ0bmVyT2JqZWN0U2VsZWN0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgU291cmNlQ2xhc3MgICAgICAgICA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgICAgIFNvdXJjZUtleSAgICAgICAgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgUGFydG5lck9iamVjdFN0cmcgICA9PiAkUGFydG5lck9iamVjdFN0cmcsCiAgICAgICAgICAgIFBhcnRuZXJMaW5rVHlwZVN0cmcgPT4gJFBhcnRuZXJMaW5rVHlwZVN0cmcsCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFydG5lckNsYXNzICYmICRQYXJ0bmVyTGlua1R5cGUgKSB7CgogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGUgbGlzdAogICAgICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlNlYXJjaEF0dHJpYnV0ZUxpc3QoCiAgICAgICAgICAgIENsYXNzICA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICBPYmplY3QgPT4gJFBhcnRuZXJPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgcGFydG5lciBvYmplY3Qgc2VhcmNoIGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUGFydG5lck9iamVjdFNlYXJjaCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgICAgID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgUGFydG5lckNsYXNzICAgID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgICAgICBQYXJ0bmVyT2JqZWN0ICAgPT4gJFBhcnRuZXJPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJ0bmVyTGlua1R5cGUgPT4gJFBhcnRuZXJMaW5rVHlwZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHN0YXJ0IHNlYXJjaCBhdHRyaWJ1dGUgb3V0cHV0CiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyRTZWFyY2hBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHBhcnRuZXIgb2JqZWN0IHNlYXJjaCB0YWJsZSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGUnICk7CiAgICAgICAgICAgIGlmICggJFJvdy0+e1R5cGV9ICYmICRSb3ctPntUeXBlfSBlcSAnU2VwYXJhdG9yJyApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBwYXJ0bmVyIG9iamVjdCBzZWFyY2ggdGFibGUgc2VwYXJhdG9yIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGVTZXBhcmF0b3InICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGlucHV0IGVsZW1lbnQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdDJTZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRSb3csCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IHBhcnRuZXIgb2JqZWN0IHNlYXJjaCB0YWJsZSByb3cgYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUGFydG5lck9iamVjdFNlYXJjaFRhYmxlUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFJvdy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmluZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdTZWFyY2gnICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRMaW5rT2JqZWN0MlNlYXJjaCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBTb3VyY2VDbGFzcyA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgICAgIFNvdXJjZUtleSAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgfSwKICAgICk7CgogICAgIyBvdXRwdXQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDJUZW1wLnBtIC0gdGhlIGxpbmsgb2JqZWN0IDIgdGVtcCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJUZW1wLnBtLHYgMS4zIDIwMDgvMDIvMjcgMTU6Mjk6MTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50TGlua09iamVjdDJUZW1wOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0MjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xpbmtPYmplY3QyfSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU291cmNlQ2xhc3MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJTb3VyY2VDbGFzcyIgKTsKICAgIG15ICRTb3VyY2VLZXkgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNvdXJjZUtleSIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNvdXJjZUNsYXNzIHx8ICEkU291cmNlS2V5ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBTb3VyY2VDbGFzcyBhbmQgU291cmNlS2V5IGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgbGlua3MKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdMaW5rRGVsZXRlJyApIHsKCiAgICAgICAgIyBnZXQgZGVsZXRlIGlkcwogICAgICAgIG15IEBEZWxldGVJRHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICJEZWxldGVJRCIgKTsKCiAgICAgICAgIyBkZWxldGUgbGlua3MKICAgICAgICBpZiAoQERlbGV0ZUlEcykgewogICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3QyfS0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgIExpbmtJRCAgID0+IFxARGVsZXRlSURzLAogICAgICAgICAgICAgICAgVGVtcE1vZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcGFydG5lciBsaW5rIGRhdGEgbGlzdAogICAgbXkgJFBhcnRuZXJMaW5rRGF0YUxpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lckxpbmtEYXRhTGlzdCgKICAgICAgICBDbGFzcyAgICA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgS2V5ICAgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICBUZW1wTW9kZSA9PiAxLAogICAgKTsKCiAgICAjIHJlZGlyZWN0IGlmIG5vIGxpbmtzIGV4aXN0cwogICAgaWYgKCAhQHskUGFydG5lckxpbmtEYXRhTGlzdH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRMaW5rT2JqZWN0MlRlbXBTZWFyY2gmU291cmNlQ2xhc3M9JFNvdXJjZUNsYXNzJlNvdXJjZUtleT0kU291cmNlS2V5IiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgYmxvY2sgbGlzdAogICAgbXkgJEJsb2NrTGlzdCA9IHt9OwogICAgZm9yIG15ICRJdGVtICggQHskUGFydG5lckxpbmtEYXRhTGlzdH0gKSB7CiAgICAgICAgJEJsb2NrTGlzdC0+eyAkSXRlbS0+e0Jsb2NrbmFtZTF9IH0tPnsgJEl0ZW0tPntCbG9ja25hbWUyfSB9LT57ICRJdGVtLT57TGlua0lEfSB9ID0gJEl0ZW07CiAgICB9CgogICAgIyBzdGFydCBwYXJ0bmVyIG91dHB1dAogICAgZm9yIG15ICRCbG9ja25hbWUxICggc29ydCBrZXlzICV7JEJsb2NrTGlzdH0gKSB7CiAgICAgICAgZm9yIG15ICRCbG9ja25hbWUyICggc29ydCBrZXlzICV7ICRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0gfSApIHsKICAgICAgICAgICAgbXkgJEl0ZW1MaXN0ID0gJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfTsKCiAgICAgICAgICAgICMgZ2V0IHBhcnRuZXIgdGFibGUgY29sdW1ucwogICAgICAgICAgICBteSBATGlua0lEcyAgICAgICAgICAgID0ga2V5cyAleyRJdGVtTGlzdH07CiAgICAgICAgICAgIG15ICRQYXJ0bmVyVGFibGVDb2x1bW4gPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lclRhYmxlQ29sdW1uR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJEl0ZW1MaXN0LT57ICRMaW5rSURzWzBdIH0tPntQYXJ0bmVyQ2xhc3N9LAogICAgICAgICAgICAgICAgTGlua1R5cGVDb2x1bW4gPT4gMSwKICAgICAgICAgICAgICAgIERlbGV0ZUNvbHVtbiAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvdW50IGNvbHVtbnMKICAgICAgICAgICAgbXkgJENvbHVtbkNvdW50ID0gQHskUGFydG5lclRhYmxlQ29sdW1ufTsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgQmxvY2tuYW1lMSAgPT4gJEJsb2NrbmFtZTEsCiAgICAgICAgICAgICAgICAgICAgQmxvY2tuYW1lMiAgPT4gJEJsb2NrbmFtZTIsCiAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiAgICAgPT4gJENvbHVtbkNvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGNvbHVtbiB3aWR0aCBibG9jawogICAgICAgICAgICBmb3IgbXkgJENvbHVtbiAoIEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0gKSB7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayBoZWFkZXIgY29sdW1uIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtDb2x1bW5XaWR0aCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFdpZHRoID0+ICRDb2x1bW4tPntIVE1MT3V0cHV0fS0+e1RhYmxlV2lkdGh9IHx8ICcqJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUgY29sdW1uIGJsb2NrCiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uICggQHskUGFydG5lclRhYmxlQ29sdW1ufSApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGhlYWRlciBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua0hlYWRlckNvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbHVtbi0+e0hlYWRsaW5lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkTGlua0RhdGEgKCBzb3J0IGtleXMgJXsgJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdMaW5rUm93JyApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQ29sdW1uRGF0YSAoIEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgbG9va3VwIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdDJDb250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfS0+eyRMaW5rRGF0YX0tPntQYXJ0bmVyQ2xhc3N9LAogICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5EYXRhID0+ICRDb2x1bW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rRGF0YSAgID0+ICRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0tPnskQmxvY2tuYW1lMn0tPnskTGlua0RhdGF9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgcm93IGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtSb3dDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgID0+ICRDb250ZW50U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdPdmVydmlldycgKTsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TGlua09iamVjdDJUZW1wJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFNvdXJjZUNsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgU291cmNlS2V5ICAgPT4gJFNvdXJjZUtleSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo= IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDJUZW1wQWRkLnBtIC0gdGhlIGxpbmsgb2JqZWN0IDIgdGVtcCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJUZW1wQWRkLnBtLHYgMS4xIDIwMDgvMDIvMjYgMTg6NTE6NTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50TGlua09iamVjdDJUZW1wQWRkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0MjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xpbmtPYmplY3QyfSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU291cmNlQ2xhc3MgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiU291cmNlQ2xhc3MiICk7CiAgICBteSAkU291cmNlS2V5ICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiU291cmNlS2V5IiApOwogICAgbXkgJFBhcnRuZXJDbGFzcyAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlBhcnRuZXJDbGFzcyIgKTsKICAgIG15ICRQYXJ0bmVyT2JqZWN0ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJQYXJ0bmVyT2JqZWN0IiApOwogICAgbXkgJFBhcnRuZXJMaW5rVHlwZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlBhcnRuZXJMaW5rVHlwZSIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNvdXJjZUNsYXNzIHx8ICEkU291cmNlS2V5IHx8ICEkUGFydG5lckNsYXNzIHx8ICEkUGFydG5lck9iamVjdCB8fCAhJFBhcnRuZXJMaW5rVHlwZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIk5vIFNvdXJjZUNsYXNzLCBTb3VyY2VLZXksIFBhcnRuZXJDbGFzcywgUGFydG5lck9iamVjdCBhbmQgUGFydG5lckxpbmtUeXBlIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsaW5rIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdMaW5rQWRkJyApIHsKCiAgICAgICAgIyBnZXQgdGFyZ2V0IGtleXMKICAgICAgICBteSBAVGFyZ2V0S2V5cyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gIlRhcmdldEtleSIgKTsKICAgICAgICBteSAkUmV2ZXJzZTsKICAgICAgICBteSAkTGlua1R5cGU7CgogICAgICAgIGlmICggJFBhcnRuZXJMaW5rVHlwZSA9fiAvXiguKz8pOjooLiopJC94bXMgKSB7CiAgICAgICAgICAgICRMaW5rVHlwZSA9ICQxOwogICAgICAgICAgICBpZiAoICQyIGVxICdSZXZlcnNlJyApIHsKICAgICAgICAgICAgICAgICRSZXZlcnNlID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbGlua3MKICAgICAgICBmb3IgbXkgJE9uZUtleSAoQFRhcmdldEtleXMpIHsKICAgICAgICAgICAgaWYgKCRSZXZlcnNlKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3QyfS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICA9PiAkT25lS2V5LAogICAgICAgICAgICAgICAgICAgIFRhcmdldENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgIFRlbXBNb2RlICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3QyfS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0Q2xhc3MgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICA9PiAkT25lS2V5LAogICAgICAgICAgICAgICAgICAgIFRlbXBNb2RlICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50TGlua09iamVjdDJUZW1wJlNvdXJjZUNsYXNzPSRTb3VyY2VDbGFzcyZTb3VyY2VLZXk9JFNvdXJjZUtleSIKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgcGFydG5lciBzZWFyY2ggZm9ybSBkYXRhCiAgICAgICAgbXkgJEZvcm1EYXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MlBhcnRuZXJTZWFyY2hGb3JtR2V0KAogICAgICAgICAgICBDbGFzcyAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgT2JqZWN0ID0+ICRQYXJ0bmVyT2JqZWN0LAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgcGFydG5lciBzZWFyY2gKICAgICAgICBteSAkUGFydG5lcklEcyA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyT2JqZWN0U2VhcmNoKAogICAgICAgICAgICBDbGFzcyAgICA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICBPYmplY3QgICA9PiAkUGFydG5lck9iamVjdCwKICAgICAgICAgICAgRm9ybURhdGEgPT4gJEZvcm1EYXRhLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgbmVlZGxlc3MgaWRzCiAgICAgICAgJFBhcnRuZXJJRHMgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lckxpbmtEYXRhTmVlZGxlc3NEZWxldGUoCiAgICAgICAgICAgIFNvdXJjZUNsYXNzICAgICA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgICAgIFNvdXJjZUtleSAgICAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICBQYXJ0bmVyQ2xhc3MgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgUGFydG5lcklEcyAgICAgID0+ICRQYXJ0bmVySURzLAogICAgICAgICAgICBQYXJ0bmVyTGlua1R5cGUgPT4gJFBhcnRuZXJMaW5rVHlwZSwKICAgICAgICApOwoKICAgICAgICBpZiAoIEB7JFBhcnRuZXJJRHN9ICkgewoKICAgICAgICAgICAgIyBnZXQgcGFydG5lciBkYXRhCiAgICAgICAgICAgIG15ICRQYXJ0bmVySW5mbyA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyQWRkRGF0YUxpc3QoCiAgICAgICAgICAgICAgICBTb3VyY2VDbGFzcyAgICAgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgU291cmNlS2V5ICAgICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICBQYXJ0bmVyQ2xhc3MgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgIFBhcnRuZXJJRHMgICAgICA9PiAkUGFydG5lcklEcywKICAgICAgICAgICAgICAgIFBhcnRuZXJMaW5rVHlwZSA9PiAkUGFydG5lckxpbmtUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcGFydG5lciB0YWJsZSBjb2x1bW5zCiAgICAgICAgICAgIG15ICRQYXJ0bmVyVGFibGVDb2x1bW4gPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lclRhYmxlQ29sdW1uR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgIEFkZENvbHVtbiAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBMaW5rVHlwZUNvbHVtbiA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgbGluayBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTb3VyY2VDbGFzcyAgICAgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgIFBhcnRuZXJDbGFzcyAgICA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICAgICAgICAgIFBhcnRuZXJPYmplY3QgICA9PiAkUGFydG5lck9iamVjdCwKICAgICAgICAgICAgICAgICAgICBQYXJ0bmVyTGlua1R5cGUgPT4gJFBhcnRuZXJMaW5rVHlwZSwKICAgICAgICAgICAgICAgICAgICBCbG9ja25hbWUxICAgICAgPT4gJFBhcnRuZXJJbmZvLT5bMF0tPntCbG9ja25hbWUxfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBCbG9ja25hbWUyICAgICAgPT4gJFBhcnRuZXJJbmZvLT5bMF0tPntCbG9ja25hbWUyfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuICAgICAgICAgPT4gc2NhbGFyIEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgY29sdW1uIHdpZHRoIGJsb2NrCiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uICggQHskUGFydG5lclRhYmxlQ29sdW1ufSApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGhlYWRlciBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua0NvbHVtbldpZHRoJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGggPT4gJENvbHVtbi0+e0hUTUxPdXRwdXR9LT57VGFibGVXaWR0aH0gfHwgJyonLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBoZWFkbGluZSBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKCBAeyRQYXJ0bmVyVGFibGVDb2x1bW59ICkgewoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgaGVhZGVyIGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rSGVhZGVyQ29sdW1uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29sdW1uLT57SGVhZGxpbmV9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJExpbmtEYXRhICggQHskUGFydG5lckluZm99ICkgewoKICAgICAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdMaW5rUm93JyApOwogICAgICAgICAgICAgICAgZm9yIG15ICRDb2x1bW5EYXRhICggQHskUGFydG5lclRhYmxlQ29sdW1ufSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBsb29rdXAgY29udGVudAogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRGF0YSA9PiAkQ29sdW1uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgTGlua0RhdGEgICA9PiAkTGlua0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayByb3cgY29sdW1uIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua1Jvd0NvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgPT4gJENvbnRlbnRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IG5vIHJlc3VsdCBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdOb1Jlc3VsdCcgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ0xpbmsnICk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudExpbmtPYmplY3QyVGVtcEFkZCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUb3RhbEhpdHMgPT4gc2NhbGFyIEB7JFBhcnRuZXJJRHN9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDJUZW1wU2VhcmNoLnBtIC0gdGhlIGxpbmsgb2JqZWN0IDIgdGVtcCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJUZW1wU2VhcmNoLnBtLHYgMS4zIDIwMDgvMDIvMjcgMTU6Mjk6MTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50TGlua09iamVjdDJUZW1wU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0MjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xpbmtPYmplY3QyfSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU291cmNlQ2xhc3MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJTb3VyY2VDbGFzcyIgKTsKICAgIG15ICRTb3VyY2VLZXkgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNvdXJjZUtleSIgKTsKCiAgICAjIGdldCBwYXJ0bmVyIGxpbmsgZGF0YSBsaXN0CiAgICBteSAkUGFydG5lckxpbmtEYXRhTGlzdCA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyTGlua0RhdGFMaXN0KAogICAgICAgIENsYXNzICAgID0+ICRTb3VyY2VDbGFzcywKICAgICAgICBLZXkgICAgICA9PiAkU291cmNlS2V5LAogICAgICAgIFRlbXBNb2RlID0+IDEsCiAgICApOwoKICAgICMgb3V0cHV0IGJhY2tsaW5rCiAgICBpZiAoIEB7JFBhcnRuZXJMaW5rRGF0YUxpc3R9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JhY2tsaW5rJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTb3VyY2VDbGFzcyA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFydG5lciBvYmplY3QKICAgIG15ICRQYXJ0bmVyT2JqZWN0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiUGFydG5lck9iamVjdCIgKSB8fCAnJzsKICAgIGlmICggJFBhcnRuZXJPYmplY3QgZXEgJy0nICkgewogICAgICAgICRQYXJ0bmVyT2JqZWN0ID0gJyc7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBwYXJ0bmVyIGNsYXNzCiAgICBteSAkUGFydG5lckNsYXNzID0gJFBhcnRuZXJPYmplY3Q7CiAgICBpZiAoICRQYXJ0bmVyQ2xhc3MgPX4gL14oLis/KTo6LiokL3htcyApIHsKICAgICAgICAkUGFydG5lckNsYXNzID0gJDE7CiAgICB9CgogICAgIyBnZXQgcGFydG5lciBsaW5rIHR5cGUKICAgIG15ICRQYXJ0bmVyTGlua1R5cGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJQYXJ0bmVyTGlua1R5cGUiICkgfHwgJyc7CiAgICBpZiAoICRQYXJ0bmVyTGlua1R5cGUgZXEgJy0nICkgewogICAgICAgICRQYXJ0bmVyTGlua1R5cGUgPSAnJzsKICAgIH0KCiAgICAjIGdldCBwYXJ0bmVyIG9iamVjdCBsaXN0CiAgICBteSAkUGFydG5lck9iamVjdExpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lck9iamVjdExpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgIFNlbGVjdGVkS2V5ID0+ICRQYXJ0bmVyT2JqZWN0LAogICAgKTsKCiAgICAjIGdlbmVyYXRlIFBhcnRuZXJPYmplY3RTdHJnCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KICAgIG15ICRQYXJ0bmVyT2JqZWN0U3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJ0bmVyT2JqZWN0TGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1BhcnRuZXJPYmplY3QnLAogICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgT25DaGFuZ2UgICAgID0+ICdkb2N1bWVudC50YXJnZXRvYmplY3Quc3VibWl0KCk7IHJldHVybiBmYWxzZTsnLAogICAgKTsKCiAgICAjIGdldCBwYXJ0bmVyIGxpbmsgdHlwZSBsaXN0CiAgICBteSAkUGFydG5lckxpbmtUeXBlTGlzdCA9IFtdOwogICAgaWYgKCRQYXJ0bmVyQ2xhc3MpIHsKICAgICAgICAkUGFydG5lckxpbmtUeXBlTGlzdCA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyTGlua1R5cGVMaXN0KAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICBQYXJ0bmVyQ2xhc3MgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgU2VsZWN0ZWRLZXkgID0+ICRQYXJ0bmVyTGlua1R5cGUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIFBhcnRuZXJMaW5rVHlwZVN0cmcKICAgIG15ICRQYXJ0bmVyTGlua1R5cGVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcnRuZXJMaW5rVHlwZUxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdQYXJ0bmVyTGlua1R5cGUnLAogICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIE9uQ2hhbmdlICAgICA9PiAnZG9jdW1lbnQudGFyZ2V0b2JqZWN0LnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7JywKICAgICk7CgogICAgIyBvdXRwdXQgcGFydG5lciBvYmplY3Qgc2VsZWN0IGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1BhcnRuZXJPYmplY3RTZWxlY3QnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBTb3VyY2VDbGFzcyAgICAgICAgID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgU291cmNlS2V5ICAgICAgICAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICBQYXJ0bmVyT2JqZWN0U3RyZyAgID0+ICRQYXJ0bmVyT2JqZWN0U3RyZywKICAgICAgICAgICAgUGFydG5lckxpbmtUeXBlU3RyZyA9PiAkUGFydG5lckxpbmtUeXBlU3RyZywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJ0bmVyQ2xhc3MgJiYgJFBhcnRuZXJMaW5rVHlwZSApIHsKCiAgICAgICAgIyBnZXQgc2VhcmNoIGF0dHJpYnV0ZSBsaXN0CiAgICAgICAgbXkgJFNlYXJjaEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+U2VhcmNoQXR0cmlidXRlTGlzdCgKICAgICAgICAgICAgQ2xhc3MgID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgIE9iamVjdCA9PiAkUGFydG5lck9iamVjdCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBwYXJ0bmVyIG9iamVjdCBzZWFyY2ggYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQYXJ0bmVyT2JqZWN0U2VhcmNoJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTb3VyY2VDbGFzcyAgICAgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgU291cmNlS2V5ICAgICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICBQYXJ0bmVyQ2xhc3MgICAgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgIFBhcnRuZXJPYmplY3QgICA9PiAkUGFydG5lck9iamVjdCwKICAgICAgICAgICAgICAgIFBhcnRuZXJMaW5rVHlwZSA9PiAkUGFydG5lckxpbmtUeXBlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgc2VhcmNoIGF0dHJpYnV0ZSBvdXRwdXQKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgcGFydG5lciBvYmplY3Qgc2VhcmNoIHRhYmxlIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1BhcnRuZXJPYmplY3RTZWFyY2hUYWJsZScgKTsKICAgICAgICAgICAgaWYgKCAkUm93LT57VHlwZX0gJiYgJFJvdy0+e1R5cGV9IGVxICdTZXBhcmF0b3InICkgewoKICAgICAgICAgICAgICAgICMgb3V0cHV0IHBhcnRuZXIgb2JqZWN0IHNlYXJjaCB0YWJsZSBzZXBhcmF0b3IgYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1BhcnRuZXJPYmplY3RTZWFyY2hUYWJsZVNlcGFyYXRvcicgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBzZWFyY2ggaW5wdXQgZWxlbWVudAogICAgICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgPT4gJFJvdywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgcGFydG5lciBvYmplY3Qgc2VhcmNoIHRhYmxlIHJvdyBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGVSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkUm93LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyaW5nID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1NlYXJjaCcgKTsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TGlua09iamVjdDJUZW1wU2VhcmNoJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFNvdXJjZUNsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgU291cmNlS2V5ICAgPT4gJFNvdXJjZUtleSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRMaW5rT2JqZWN0Mi5wbSAtIHByb3ZpZGVzIGdlbmVyaWMgSFRNTCBvdXRwdXQgZm9yIExpbmtPYmplY3QyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMYXlvdXRMaW5rT2JqZWN0Mi5wbSx2IDEuMTIgMjAwOC8wMS8zMCAxOToyMDowNCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRMaW5rT2JqZWN0MjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTIgJCkgWzFdOwoKPWl0ZW0gTGlua09iamVjdDJDb250ZW50U3RyaW5nQ3JlYXRlKCkKCnJldHVybnMgYSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkxpbmtPYmplY3QyQ29udGVudFN0cmluZ0NyZWF0ZSgKICAgICAgICBDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBDb2x1bW5EYXRhID0+ICRIYXNoUmVmLAogICAgICAgIExpbmtEYXRhID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rT2JqZWN0MkNvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MgQ29sdW1uRGF0YSBMaW5rRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRMaW5rT2JqZWN0MkxheW91dEJhY2tlbmQoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGdlbmVyYXRlIGNvbnRlbnQgc3RyaW5nCiAgICByZXR1cm4gJEJhY2tlbmRPYmplY3QtPkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgQ29sdW1uRGF0YSA9PiAkUGFyYW17Q29sdW1uRGF0YX0sCiAgICAgICAgTGlua0RhdGEgICA9PiAkUGFyYW17TGlua0RhdGF9LAogICAgKSB8fCAnJzsKfQoKPWl0ZW0gTGlua09iamVjdDJTZWFyY2hJbnB1dENyZWF0ZSgpCgpyZXR1cm5zIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5MaW5rT2JqZWN0MlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIENsYXNzID0+ICdUaWNrZXQnLAogICAgICAgIEl0ZW0gPT4gJFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua09iamVjdDJTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcyBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZExpbmtPYmplY3QyTGF5b3V0QmFja2VuZCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17Q2xhc3N9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2VuZXJhdGUgaW5wdXQgc3RyaW5nCiAgICByZXR1cm4gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0U3RyaW5nQ3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkUGFyYW17SXRlbX0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICkgfHwgJyc7Cn0KCj1pdGVtIExpbmtPYmplY3QyUGFydG5lclNlYXJjaEZvcm1HZXQoKQoKcmV0dXJuIHRoZSBzZWFyY2ggZGF0YSBmcm9tIGZvcm0KCiAgICBteSAkRm9ybURhdGEgPSAkTGF5b3V0T2JqZWN0LT5MaW5rT2JqZWN0MlBhcnRuZXJTZWFyY2hGb3JtR2V0KAogICAgICAgIENsYXNzID0+ICdUaWNrZXQnLAogICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywKICAgICk7Cgo9Y3V0CgpzdWIgTGlua09iamVjdDJQYXJ0bmVyU2VhcmNoRm9ybUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcyBPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkTGlua09iamVjdDJMYXlvdXRCYWNrZW5kKAogICAgICAgIENsYXNzID0+ICRQYXJhbXtDbGFzc30sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZW5lcmF0ZSBpbnB1dCBzdHJpbmcKICAgIHJldHVybiAkQmFja2VuZE9iamVjdC0+UGFydG5lclNlYXJjaEZvcm1HZXQoCiAgICAgICAgT2JqZWN0ID0+ICRQYXJhbXtPYmplY3R9LAogICAgKTsKfQoKPWl0ZW0gX0xvYWRMaW5rT2JqZWN0MkxheW91dEJhY2tlbmQoKQoKbG9hZCBhIGxpbmtvYmplY3QyIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0xvYWRMaW5rT2JqZWN0MkxheW91dEJhY2tlbmQoCiAgICAgICAgQ2xhc3MgPT4gJ1RpY2tldCcsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkTGlua09iamVjdDJMYXlvdXRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG9iamVjdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57TG9hZExpbmtPYmplY3QyTGF5b3V0QmFja2VuZH0tPnsgJFBhcmFte0NsYXNzfSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntMb2FkTGlua09iamVjdDJMYXlvdXRCYWNrZW5kfS0+eyAkUGFyYW17Q2xhc3N9IH07CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3QyTGF5b3V0JFBhcmFte0NsYXNzfSI7CgogICAgIyBsb2FkIHRoZSBiYWNrZW5kIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtDbGFzc30hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtDbGFzc30hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSBvYmplY3QKICAgICRTZWxmLT57Q2FjaGV9LT57TG9hZExpbmtPYmplY3QyTGF5b3V0QmFja2VuZH0tPnsgJFBhcmFte0NsYXNzfSB9ID0gJEJhY2tlbmRPYmplY3Q7CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwo= IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0Mk1lbnVHZW5lcmljLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMaW5rT2JqZWN0Mk1lbnVHZW5lcmljLnBtLHYgMS45IDIwMDgvMDEvMzAgMTk6MjA6MDQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDJNZW51R2VuZXJpYzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMaW5rT2JqZWN0MiBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTb3VyY2VDbGFzc30gfHwgISRQYXJhbXtTb3VyY2VLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fQogICAgICAgICAgICAtPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBTb3VyY2VDbGFzcyBhbmQgU291cmNlS2V5IScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgYWNjZXNzCiAgICBteSAkQWNjZXNzID0gMTsKCiAgICAjIGdldCBncm91cHMKICAgIG15ICRHcm91cHNSbwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfS0+e0dyb3VwUm99CiAgICAgICAgfHwgW107CiAgICBteSAkR3JvdXBzUncKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cH0KICAgICAgICB8fCBbXTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntBY3Rpb259ICYmICggQHskR3JvdXBzUm99IHx8IEB7JEdyb3Vwc1J3fSApICkgewoKICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAkQWNjZXNzID0gMDsKCiAgICAgICAgIyBmaW5kIHJlYWQgb25seSBncm91cHMKICAgICAgICBST0dST1VQOgogICAgICAgIGZvciBteSAkUm9Hcm91cCAoIEB7JEdyb3Vwc1JvfSApIHsKCiAgICAgICAgICAgIG5leHQgUk9HUk9VUCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwUm9bJFJvR3JvdXBdIn07CiAgICAgICAgICAgIG5leHQgUk9HUk9VUCBpZiAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBSb1skUm9Hcm91cF0ifSBuZSAnWWVzJzsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBST0dST1VQOwogICAgICAgIH0KCiAgICAgICAgIyBmaW5kIHJlYWQgd3JpdGUgZ3JvdXBzCiAgICAgICAgUldHUk9VUDoKICAgICAgICBmb3IgbXkgJFJ3R3JvdXAgKCBAeyRHcm91cHNSd30gKSB7CgogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskUndHcm91cF0ifSBuZSAnWWVzJzsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBSV0dST1VQOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yCiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFBhcmFte1NvdXJjZUNsYXNzfSwKICAgICAgICAgICAgU291cmNlS2V5ICAgPT4gJFBhcmFte1NvdXJjZUtleX0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo= IyAtLQojIEFnZW50TGlua09iamVjdDIuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudExpbmtPYmplY3QyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudExpbmtPYmplY3QyLmR0bCx2IDEuOSAyMDA4LzAxLzI4IDE1OjIwOjUzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiT3ZlcnZpZXcifSAkVGV4dHsiTGluayJ9ICRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgd2lkdGg9Ijc1JSIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgogICAgICAtCjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSIgJERhdGF7IkxpbmtQYXJhbSJ9IG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7Ik5hbWUifSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTwvYT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1JSIgY2xhc3M9Im1lbnUiPjwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjgwMCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTb3VyY2UgT2JqZWN0In0gKCRRRGF0YXsiQ2xhc3NOYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTI1IiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDb250ZW50In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNvdXJjZU9iamVjdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0IC0tPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkxpbmtEZWxldGUiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNvdXJjZUNsYXNzIiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VLZXkiIHZhbHVlPSIkUURhdGF7IlNvdXJjZUtleSJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjgwMCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgPGNvbGdyb3VwPgo8IS0tIGR0bDpibG9jazpMaW5rQ29sdW1uV2lkdGggLS0+CiAgICAgICAgICA8Y29sIHdpZHRoPSIkUURhdGF7IldpZHRoIn0iPgo8IS0tIGR0bDpibG9jazpMaW5rQ29sdW1uV2lkdGggLS0+CiAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iJFFEYXRheyJDb2xzcGFuIn0iPgogICAgICAgICAgICAgIDxiPjxpPiRUZXh0eyIkUURhdGF7IkJsb2NrbmFtZTEifSJ9ICRRRGF0YXsiQmxvY2tuYW1lMiJ9PC9pPjwvYj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtIZWFkZXJDb2x1bW4gLS0+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyIkUURhdGF7IkNvbnRlbnQifSJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6TGlua0hlYWRlckNvbHVtbiAtLT4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtSb3cgLS0+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6TGlua1Jvd0NvbHVtbiAtLT4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiREYXRheyJDb250ZW50In08L3RkPgo8IS0tIGR0bDpibG9jazpMaW5rUm93Q29sdW1uIC0tPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1JvdyAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCIgY29sc3Bhbj0iJFFEYXRheyJDb2xzcGFuIn0iIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6TGluayAtLT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo= IyAtLQojIEFnZW50TGlua09iamVjdDJBZGQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudExpbmtPYmplY3QyQWRkCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudExpbmtPYmplY3QyQWRkLmR0bCx2IDEuMTAgMjAwOC8wMS8yOCAxNToyMDo1MyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFkZCJ9ICRUZXh0eyJMaW5rIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aGlzdG9yeS5iYWNrKCkiPgogICAgICAkVGV4dHsiQ2hhbmdlIHNlYXJjaCBvcHRpb25zIn0KICAgICAgPC9hPgogICAgICAtICRUZXh0eyJUb3RhbCBoaXRzIn06IDxiPiREYXRheyJUb3RhbEhpdHMifTwvYj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjgwMCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTb3VyY2UgT2JqZWN0In0gKCRRRGF0YXsiQ2xhc3NOYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTI1IiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDb250ZW50In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNvdXJjZU9iamVjdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0IC0tPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkxpbmtBZGQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNvdXJjZUNsYXNzIiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VLZXkiIHZhbHVlPSIkUURhdGF7IlNvdXJjZUtleSJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyQ2xhc3MiIHZhbHVlPSIkUURhdGF7IlBhcnRuZXJDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyT2JqZWN0IiB2YWx1ZT0iJFFEYXRheyJQYXJ0bmVyT2JqZWN0In0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlBhcnRuZXJMaW5rVHlwZSIgdmFsdWU9IiRRRGF0YXsiUGFydG5lckxpbmtUeXBlIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8Y29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICAgIDxjb2wgd2lkdGg9IiRRRGF0YXsiV2lkdGgifSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+CiAgICAgICAgICAgICAgPGI+PGk+JFRleHR7IiRRRGF0YXsiQmxvY2tuYW1lMSJ9In0gJFFEYXRheyJCbG9ja25hbWUyIn08L2k+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6TGlua0hlYWRlckNvbHVtbiAtLT4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IiRRRGF0YXsiQ29udGVudCJ9In08L3RkPgo8IS0tIGR0bDpibG9jazpMaW5rSGVhZGVyQ29sdW1uIC0tPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1JvdyAtLT4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgo8IS0tIGR0bDpibG9jazpMaW5rUm93Q29sdW1uIC0tPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JERhdGF7IkNvbnRlbnQifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkxpbmtSb3dDb2x1bW4gLS0+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rUm93IC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkxpbmsifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6TGluayAtLT4KPCEtLSBkdGw6YmxvY2s6Tm9SZXN1bHQgLS0+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPjxmb250IGNvbG9yPSJyZWQiPiRUZXh0eyJObyBSZXN1bHRzIGZvdW5kIn0hPC9mb250PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6Tm9SZXN1bHQgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4= IyAtLQojIEFnZW50TGlua09iamVjdDJTZWFyY2guZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudExpbmtPYmplY3QyU2VhcmNoCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudExpbmtPYmplY3QyU2VhcmNoLmR0bCx2IDEuNCAyMDA4LzAxLzI4IDE1OjIwOjUzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU2VhcmNoIn0gJFRleHR7IkxpbmsifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudExpbmtPYmplY3QyJlNvdXJjZUNsYXNzPSRMUURhdGF7IlNvdXJjZUNsYXNzIn0mU291cmNlS2V5PSRMUURhdGF7IlNvdXJjZUtleSJ9Ij4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgo8IS0tIGR0bDpibG9jazpTb3VyY2VPYmplY3QgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlNvdXJjZSBPYmplY3QifSAoJFFEYXRheyJDbGFzc05hbWUifSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpTb3VyY2VPYmplY3RSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMjUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNvbnRlbnQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpTb3VyY2VPYmplY3QgLS0+CjwhLS0gZHRsOmJsb2NrOlBhcnRuZXJPYmplY3RTZWxlY3QgLS0+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiIG5hbWU9InRhcmdldG9iamVjdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNvdXJjZUNsYXNzIiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VLZXkiIHZhbHVlPSIkUURhdGF7IlNvdXJjZUtleSJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjgwMCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4mbmJzcDs8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTI1IiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRhcmdldCBPYmplY3QifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQYXJ0bmVyT2JqZWN0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTI1Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTGlua3R5cGUifTogPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudHZhbHVlIj4oJFRleHR7IlRhcmdldCBPYmplY3RzIGFyZS4uLiJ9KSA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQYXJ0bmVyTGlua1R5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNlbGVjdCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VsZWN0IC0tPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VhcmNoIC0tPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudExpbmtPYmplY3QyQWRkIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VDbGFzcyIgdmFsdWU9IiRRRGF0YXsiU291cmNlQ2xhc3MifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU291cmNlS2V5IiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VLZXkifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUGFydG5lckNsYXNzIiB2YWx1ZT0iJFFEYXRheyJQYXJ0bmVyQ2xhc3MifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUGFydG5lck9iamVjdCIgdmFsdWU9IiRRRGF0YXsiUGFydG5lck9iamVjdCJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyTGlua1R5cGUiIHZhbHVlPSIkUURhdGF7IlBhcnRuZXJMaW5rVHlwZSJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjgwMCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU2VhcmNoIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlBhcnRuZXJPYmplY3RTZWFyY2hUYWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaFRhYmxlU2VwYXJhdG9yIC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlBhcnRuZXJPYmplY3RTZWFyY2hUYWJsZVNlcGFyYXRvciAtLT4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaFRhYmxlUm93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IklucHV0U3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaFRhYmxlUm93IC0tPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGUgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWFyY2gifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaCAtLT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo= IyAtLQojIEFnZW50TGlua09iamVjdDJUZW1wLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRMaW5rT2JqZWN0MlRlbXAKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJUZW1wLmR0bCx2IDEuMSAyMDA4LzAyLzI2IDE4OjUxOjUxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRMaW5rT2JqZWN0MlRlbXBTZWFyY2gmU291cmNlQ2xhc3M9JExRRGF0YXsiU291cmNlQ2xhc3MifSZTb3VyY2VLZXk9JExRRGF0YXsiU291cmNlS2V5In0iPiRUZXh0eyJBZGQifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iTGlua0RlbGV0ZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU291cmNlQ2xhc3MiIHZhbHVlPSIkUURhdGF7IlNvdXJjZUNsYXNzIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNvdXJjZUtleSIgdmFsdWU9IiRRRGF0YXsiU291cmNlS2V5In0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8Y29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICAgIDxjb2wgd2lkdGg9IiRRRGF0YXsiV2lkdGgifSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+CiAgICAgICAgICAgICAgPGI+PGk+JFRleHR7IiRRRGF0YXsiQmxvY2tuYW1lMSJ9In0gJFFEYXRheyJCbG9ja25hbWUyIn08L2k+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6TGlua0hlYWRlckNvbHVtbiAtLT4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IiRRRGF0YXsiQ29udGVudCJ9In08L3RkPgo8IS0tIGR0bDpibG9jazpMaW5rSGVhZGVyQ29sdW1uIC0tPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1JvdyAtLT4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgo8IS0tIGR0bDpibG9jazpMaW5rUm93Q29sdW1uIC0tPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JERhdGF7IkNvbnRlbnQifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkxpbmtSb3dDb2x1bW4gLS0+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rUm93IC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg== IyAtLQojIEFnZW50TGlua09iamVjdDJUZW1wQWRkLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRMaW5rT2JqZWN0MlRlbXBBZGQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJUZW1wQWRkLmR0bCx2IDEuMSAyMDA4LzAyLzI2IDE4OjUxOjUxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aGlzdG9yeS5iYWNrKCkiPgogICAgICAkVGV4dHsiQ2hhbmdlIHNlYXJjaCBvcHRpb25zIn0KICAgICAgPC9hPgogICAgICAtICRUZXh0eyJUb3RhbCBoaXRzIn06IDxiPiREYXRheyJUb3RhbEhpdHMifTwvYj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkxpbmtBZGQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNvdXJjZUNsYXNzIiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VLZXkiIHZhbHVlPSIkUURhdGF7IlNvdXJjZUtleSJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyQ2xhc3MiIHZhbHVlPSIkUURhdGF7IlBhcnRuZXJDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyT2JqZWN0IiB2YWx1ZT0iJFFEYXRheyJQYXJ0bmVyT2JqZWN0In0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlBhcnRuZXJMaW5rVHlwZSIgdmFsdWU9IiRRRGF0YXsiUGFydG5lckxpbmtUeXBlIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8Y29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICAgIDxjb2wgd2lkdGg9IiRRRGF0YXsiV2lkdGgifSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+CiAgICAgICAgICAgICAgPGI+PGk+JFRleHR7IiRRRGF0YXsiQmxvY2tuYW1lMSJ9In0gJFFEYXRheyJCbG9ja25hbWUyIn08L2k+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6TGlua0hlYWRlckNvbHVtbiAtLT4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IiRRRGF0YXsiQ29udGVudCJ9In08L3RkPgo8IS0tIGR0bDpibG9jazpMaW5rSGVhZGVyQ29sdW1uIC0tPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1JvdyAtLT4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgo8IS0tIGR0bDpibG9jazpMaW5rUm93Q29sdW1uIC0tPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JERhdGF7IkNvbnRlbnQifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkxpbmtSb3dDb2x1bW4gLS0+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rUm93IC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkxpbmsifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6TGluayAtLT4KPCEtLSBkdGw6YmxvY2s6Tm9SZXN1bHQgLS0+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPjxmb250IGNvbG9yPSJyZWQiPiRUZXh0eyJObyBSZXN1bHRzIGZvdW5kIn0hPC9mb250PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6Tm9SZXN1bHQgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4= IyAtLQojIEFnZW50TGlua09iamVjdDJUZW1wU2VhcmNoLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRMaW5rT2JqZWN0MlRlbXBTZWFyY2gKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJUZW1wU2VhcmNoLmR0bCx2IDEuMiAyMDA4LzAyLzI3IDA4OjQ1OjIyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOkJhY2tsaW5rIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50TGlua09iamVjdDJUZW1wJlNvdXJjZUNsYXNzPSRMUURhdGF7IlNvdXJjZUNsYXNzIn0mU291cmNlS2V5PSRMUURhdGF7IlNvdXJjZUtleSJ9Ij4kVGV4dHsiQmFjayJ9PC9hPgo8IS0tIGR0bDpibG9jazpCYWNrbGluayAtLT4KICAgICAgJm5ic3A7CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VsZWN0IC0tPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0IiBuYW1lPSJ0YXJnZXRvYmplY3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VDbGFzcyIgdmFsdWU9IiRRRGF0YXsiU291cmNlQ2xhc3MifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU291cmNlS2V5IiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VLZXkifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+Jm5ic3A7PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEyNSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUYXJnZXQgT2JqZWN0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGFydG5lck9iamVjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEyNSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxpbmt0eXBlIn06IDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+KCRUZXh0eyJUYXJnZXQgT2JqZWN0cyBhcmUuLi4ifSkgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGFydG5lckxpbmtUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlbGVjdCAtLT4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaCAtLT4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRMaW5rT2JqZWN0MlRlbXBBZGQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNvdXJjZUNsYXNzIiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VLZXkiIHZhbHVlPSIkUURhdGF7IlNvdXJjZUtleSJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyQ2xhc3MiIHZhbHVlPSIkUURhdGF7IlBhcnRuZXJDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyT2JqZWN0IiB2YWx1ZT0iJFFEYXRheyJQYXJ0bmVyT2JqZWN0In0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlBhcnRuZXJMaW5rVHlwZSIgdmFsdWU9IiRRRGF0YXsiUGFydG5lckxpbmtUeXBlIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTZWFyY2gifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaFRhYmxlIC0tPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGVTZXBhcmF0b3IgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaFRhYmxlU2VwYXJhdG9yIC0tPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGVSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJpbmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGVSb3cgLS0+CjwhLS0gZHRsOmJsb2NrOlBhcnRuZXJPYmplY3RTZWFyY2hUYWJsZSAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNlYXJjaCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VhcmNoIC0tPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg== IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdDIucG0gLSB0byBsaW5rIG9iamVjdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExpbmtPYmplY3QyLnBtLHYgMS4zMCAyMDA4LzA0LzA0IDEwOjI1OjMzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zMCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyIC0gdG8gbGluayBvYmplY3RzIGxpa2UgdGlja2V0cywgZmFxcywgLi4uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMgdG8gbGluayBvYmplY3RzIGxpa2UgdGlja2V0cywgZmFxcywgLi4uCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkTGlua09iamVjdDIgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0xpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBsaW5rIGlkcyBhcyBhbiBhcnJheSByZWZlcmVuY2UKCiAgICAkQXJyYXlSZWYgPSAkTGlua09iamVjdDItPkxpbmtMaXN0KAogICAgICAgIFNvdXJjZUNsYXNzICA9PiAnU2VydmljZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDEsCiAgICAgICAgUGFydG5lckNsYXNzID0+ICdJVFNNQ29uZmlnSXRlbScsICAjIChvcHRpb25hbCkKICAgICAgICBMaW5rVHlwZSAgICAgPT4gJ0FsdGVybmF0aXZlVG8nLCAgICMgKG9wdGlvbmFsKQogICAgICAgIERpcmVjdGlvbiAgICA9PiAnUmV2ZXJzZScsICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgJ05vcm1hbCcgKE5vcm1hbHxSZXZlcnNlfEJvdGgpCiAgICAgICAgVGVtcE1vZGUgICAgID0+IDEsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICApOwoKPWN1dAoKc3ViIExpbmtMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNvdXJjZUNsYXNzIFNvdXJjZUtleSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJExpbmtUYWJsZSA9ICRQYXJhbXtUZW1wTW9kZX0gPyAnbGlua19vYmplY3QyX3RlbXAnIDogJ2xpbmtfb2JqZWN0Mic7CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU291cmNlQ2xhc3MgU291cmNlS2V5IFBhcnRuZXJDbGFzcykpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0gKTsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgc3FsIHN0cmluZwogICAgbXkgJFNRTDsKICAgIGlmICggJFBhcmFte0RpcmVjdGlvbn0gJiYgJFBhcmFte0RpcmVjdGlvbn0gZXEgJ1JldmVyc2UnICkgewogICAgICAgICRTUUwgPSAiU0VMRUNUIGlkIEZST00gJExpbmtUYWJsZSBXSEVSRSAiCiAgICAgICAgICAgIC4gInRhcmdldF9jbGFzcyA9ICckUGFyYW17U291cmNlQ2xhc3N9JyBBTkQgdGFyZ2V0X2tleSA9ICckUGFyYW17U291cmNlS2V5fScgIjsKCiAgICAgICAgaWYgKCAkUGFyYW17UGFydG5lckNsYXNzfSApIHsKICAgICAgICAgICAgJFNRTCAuPSAiIEFORCBzb3VyY2VfY2xhc3MgPSAnJFBhcmFte1BhcnRuZXJDbGFzc30nICI7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSAkTGlua1RhYmxlIFdIRVJFICIKICAgICAgICAgICAgLiAic291cmNlX2NsYXNzID0gJyRQYXJhbXtTb3VyY2VDbGFzc30nIEFORCBzb3VyY2Vfa2V5ID0gJyRQYXJhbXtTb3VyY2VLZXl9JyAiOwoKICAgICAgICBpZiAoICRQYXJhbXtQYXJ0bmVyQ2xhc3N9ICkgewogICAgICAgICAgICAkU1FMIC49ICIgQU5EIHRhcmdldF9jbGFzcyA9ICckUGFyYW17UGFydG5lckNsYXNzfScgIjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgbGlua3R5cGUKICAgIGlmICggJFBhcmFte0xpbmtUeXBlfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtMaW5rVHlwZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtMaW5rVHlwZX0gKTsKCiAgICAgICAgIyBleHRlbmQgdGhlIHNxbCBzdHJpbmcKICAgICAgICAkU1FMIC49ICIgQU5EIGxpbmtfdHlwZSA9ICckUGFyYW17TGlua1R5cGV9JyI7CiAgICB9CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBQYXJ0bmVyS2V5TGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAUGFydG5lcktleUxpc3QsICRSb3dbMF07CiAgICB9CgogICAgIyBhZGQgb3RoZXIgZGlyZWN0aW9uLCBpZiBCb3RoIGlzIHNldAogICAgaWYgKCAkUGFyYW17RGlyZWN0aW9ufSAmJiAkUGFyYW17RGlyZWN0aW9ufSBlcSAnQm90aCcgKSB7CiAgICAgICAgbXkgJFJldmVyc2VMaXN0ID0gJFNlbGYtPkxpbmtMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIERpcmVjdGlvbiA9PiAnUmV2ZXJzZScsCiAgICAgICAgICAgIFRlbXBNb2RlICA9PiAkUGFyYW17VGVtcE1vZGV9LAogICAgICAgICk7CgogICAgICAgIG15ICVUZW1wTGlzdDsKICAgICAgICBtYXAgeyAkVGVtcExpc3R7JF99ID0gMSB9IEBQYXJ0bmVyS2V5TGlzdDsKICAgICAgICBtYXAgeyAkVGVtcExpc3R7JF99ID0gMSB9IEB7JFJldmVyc2VMaXN0fTsKCiAgICAgICAgQFBhcnRuZXJLZXlMaXN0ID0gc29ydCBrZXlzICVUZW1wTGlzdDsKICAgIH0KCiAgICByZXR1cm4gXEBQYXJ0bmVyS2V5TGlzdDsKfQoKPWl0ZW0gTGlua0dldCgpCgpyZXR1cm4gZGF0YSBvZiBhIGxpbmsgYXMgaGFzaCByZWZlcmVuY2UKClJldHVybgogICAgJExpbmt7TGlua0lEfQogICAgJExpbmt7VHlwZX0KICAgICRMaW5re1NvdXJjZUNsYXNzfQogICAgJExpbmt7U291cmNlS2V5fQogICAgJExpbmt7VGFyZ2V0Q2xhc3N9CiAgICAkTGlua3tUYXJnZXRLZXl9CiAgICAkTGlua3tDcmVhdGVUaW1lfQogICAgJExpbmt7Q3JlYXRlQnl9CgogICAgJExpbmtEYXRhUmVmID0gJExpbmtPYmplY3QyLT5MaW5rR2V0KAogICAgICAgIExpbmtJRCAgID0+IDEyMywKICAgICAgICBUZW1wTW9kZSA9PiAxLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICApOwoKPWN1dAoKc3ViIExpbmtHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0xpbmtJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgTGlua0lEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0xpbmtHZXR9LT57ICRQYXJhbXtMaW5rSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0xpbmtHZXR9LT57ICRQYXJhbXtMaW5rSUR9IH0gJiYgISRQYXJhbXtUZW1wTW9kZX07CgogICAgbXkgJExpbmtUYWJsZSA9ICRQYXJhbXtUZW1wTW9kZX0gPyAnbGlua19vYmplY3QyX3RlbXAnIDogJ2xpbmtfb2JqZWN0Mic7CgogICAgIyBxdW90ZQogICAgJFBhcmFte0xpbmtJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtMaW5rSUR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIGxpbmtfdHlwZSwgc291cmNlX2NsYXNzLCBzb3VyY2Vfa2V5LCB0YXJnZXRfY2xhc3MsIHRhcmdldF9rZXksICIKICAgICAgICAgICAgLiAiY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAiCiAgICAgICAgICAgIC4gIkZST00gJExpbmtUYWJsZSBXSEVSRSBpZCA9ICRQYXJhbXtMaW5rSUR9IiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVMaW5rRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJExpbmtEYXRhe0xpbmtJRH0gICAgICA9ICRSb3dbMF07CiAgICAgICAgJExpbmtEYXRhe1R5cGV9ICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJExpbmtEYXRhe1NvdXJjZUNsYXNzfSA9ICRSb3dbMl07CiAgICAgICAgJExpbmtEYXRhe1NvdXJjZUtleX0gICA9ICRSb3dbM107CiAgICAgICAgJExpbmtEYXRhe1RhcmdldENsYXNzfSA9ICRSb3dbNF07CiAgICAgICAgJExpbmtEYXRhe1RhcmdldEtleX0gICA9ICRSb3dbNV07CiAgICAgICAgJExpbmtEYXRhe0NyZWF0ZVRpbWV9ICA9ICRSb3dbNl07CiAgICAgICAgJExpbmtEYXRhe0NyZWF0ZUJ5fSAgICA9ICRSb3dbN107CiAgICB9CgogICAgIyBjaGVjayBsaW5rCiAgICBpZiAoICEkTGlua0RhdGF7TGlua0lEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggTGlua0lEICgkUGFyYW17TGlua0lEfSkgZm91bmQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gXCVMaW5rRGF0YSBpZiAkUGFyYW17VGVtcE1vZGV9OwoKICAgICMgY2FjaGUgdXNlciByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57TGlua0dldH0tPnsgJFBhcmFte0xpbmtJRH0gfSA9IFwlTGlua0RhdGE7CgogICAgcmV0dXJuIFwlTGlua0RhdGE7Cn0KCj1pdGVtIExpbmtBZGQoKQoKYWRkIGEgbmV3IGxpbmsKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0Mi0+TGlua0FkZCgKICAgICAgICBUeXBlICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTb3VyY2VDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBTb3VyY2VLZXkgICA9PiAnMTIzJywKICAgICAgICBUYXJnZXRDbGFzcyA9PiAnRkFRJywKICAgICAgICBUYXJnZXRLZXkgICA9PiAnMTInLAogICAgICAgIFRlbXBNb2RlICAgID0+IDEsICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUeXBlIFNvdXJjZUNsYXNzIFNvdXJjZUtleSBUYXJnZXRDbGFzcyBUYXJnZXRLZXkgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkTGlua1RhYmxlID0gJFBhcmFte1RlbXBNb2RlfSA/ICdsaW5rX29iamVjdDJfdGVtcCcgOiAnbGlua19vYmplY3QyJzsKCiAgICAjIGNoZWNrIGlzIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIGlkZW50aWNhbAogICAgaWYgKCAkUGFyYW17U291cmNlQ2xhc3N9IGVxICRQYXJhbXtUYXJnZXRDbGFzc30gJiYgJFBhcmFte1NvdXJjZUtleX0gZXEgJFBhcmFte1RhcmdldEtleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMb29wIHByb3RlY3Rpb24uIG9iamVjdCAxIGFuZCBvYmplY3QgMiBhcmUgaWRlbnRpY2FsIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVHlwZSBTb3VyY2VDbGFzcyBTb3VyY2VLZXkgVGFyZ2V0Q2xhc3MgVGFyZ2V0S2V5KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSApOwogICAgfQogICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtVc2VySUR9LCAnSW50ZWdlcicgKTsKCiAgICAjIGZpbmQgZXhpc3RpbmcgbGluawogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSAkTGlua1RhYmxlIFdIRVJFICIKICAgICAgICAgICAgLiAibGlua190eXBlID0gJyRQYXJhbXtUeXBlfScgIgogICAgICAgI