GeneralCatalog
3.2.93
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 3.3.0 beta3.
Build for OTRS::ITSM 3.3.0 beta2.
Build for OTRS::ITSM 3.3.0 beta1.
The General Catalog package.
Das General Catalog Paket.
El paquete General Catalog.
3.3.x
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from this table will be irrevocably lost.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos creadas durante la instalación serán borradas.
¡Todos los datos de esas tablas serán irrevocablemente perdidos!.
<br/>
<br/>
((enjoy))<br/>
<br/>
# define function name
my $FunctionName = 'CodeUpgrade';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2013-09-19 11:04:44
opms.otrs.com
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FD58+PBm6QAAAABejflH35em6d2UouyN7DS0f/3rX09VSMPhcD6fV6vVYrH4zmkBAAAAXpf1R3+xWCxms1nWEM3+tFgsHr14Pp8/VQ/VarW3jAkAAADwfra6PxqPx5PJZDqdzufzrDN6ajVWHMelUqn4p2xiUT6ff+fAAAAAAO9vq/ujq6ur29vbBzcWCoXiN1RFAAAAwNba2P5oPp+fnJzM5/P/83/+z1PXVCqVKIoeVEVLpmIDAAAAbKH1648Wi8V8Ps92nJXL5Wq1+uhluVxuPB5HUZQkSS6Xe/SaTqfzhkEBAAAANsKK9kdpmt6VRA/eSJLk7rJ2u72kPzo+Pi6VSk+VRwAAAAA8R+D+KE3T7KSzByXRfD5f8ln5fD6bUlQul5dc1mg0XjsvAAAAwNYJ3B+NRqPPnz8/+qE4jrOSqFAoPHjDiCIAAACAd/O2/dHZ2Vmv1zs6Omo2m48/fKGQz+cfLYkceQYAAACwCp7bHyVJMp/P72ZX372dpunPP/+8/HMXi8VTHyqVSv/85z9fkBcAAADgvWRboNI0febbz/ncl16zCv7THz3VEGVv3J9a/XydTqfT6RQKKzqlGwAAAGCJNE0fnaJz//b7b9+/8anr71/z1P2smkIURZ8+fRqNRt+9NJfLZdvNCn/K3l7yKcVi8dWSAgAAALyvOI5ftCDoORc/dc1LH+s9FaJ7+8ueaoiyN3K5XNCoAAAAAO/t0Vrn/kKh5ywaeuqaB7evbIUUp2k6Ho+zIdahwwAAAACwcla01gIAAABgRfx/Ps/9PsuGE+QAAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkZyYW1ld29yayI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5HZW5lcmFsQ2F0YWxvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+R2VuZXJhbCBDYXRhbG9nPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+R2VuZXJhbCBDYXRhbG9nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+VGlja2V0PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjQ29tbWVudDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5HZW5lcmFsQ2F0YWxvZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiPkNvbW1lbnQyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5EZWZpbmUgdGhlIGdlbmVyYWwgY2F0YWxvZyBjb21tZW50IDIuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGV4dEFyZWE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHMiPjUwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSb3dzIj41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5QZXJtaXNzaW9uczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyI+RGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPlBlcm1pc3Npb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsYXNzIj5JVFNNOjpDb25maWdJdGVtOjpDbGFzczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+UGVybWlzc2lvbnM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9Ck0YPQvdC60YbQuNC+0L3QsNC70L3QvtGB0YInOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstC70LXQvdC40LUg0L3QsCDQvtGB0L3QvtCy0L3QuNGPINC60LDRgtCw0LvQvtCzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfQlNC+0LHQsNCy0Lgg0LXQu9C10LzQtdC90YIg0LrRitC8INC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfQlNC+0LHQsNCy0Lgg0LrQu9Cw0YEg0LIg0LrQsNGC0LDQu9C+0LPQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn0JrQu9Cw0YHQvtCy0LUg0LIg0LrQsNGC0LDQu9C+0LPQsCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn0J7RgdC90L7QstC10L0g0LrQsNGC0LDQu9C+0LMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmNzX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjaW9uYWxpdGEnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnU3Byw6F2YSBIbGF2bsOtaG8gS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ1DDuGlkYXQgUG9sb8W4a3UgS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdQw7hpZGF0IFTDuMOtZHUgS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ1TDuMOtZHkgS2F0YWxvZ3UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0hsYXZuw60gS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGl0YXQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGnDsyBkZWwgY2F0w6BsZWcgZ2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnQWZlZ2lyIGFydGljbGUgZGUgY2F0w6BsZWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZmVnaXIgY2xhc3NlIGRlIGNhdMOgbGVnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzc2UgZGUgY2F0w6FsZWcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXTDoGxlZyBnZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlbmVyYWwgS2F0YWxvZyBNYW5hZ2VtZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdUaWxmw7hqIGthdGFsb2cgcG9zdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ1RpbGbDuGogS2F0YWxvZyBrbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2cgS2xhc3NlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdHZW5lcmFsIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdMOkdCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsLUthdGFsb2ctVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnS2F0YWxvZy1FaW50cmFnIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnS2F0YWxvZy1LbGFzc2UgaGluenVmw7xnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2ctS2xhc3NlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdHZW5lcmFsLUthdGFsb2cgZXJzdGVsbGVuIHVuZCB2ZXJ3YWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdGcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5HZW5lcmFsQ2F0YWxvZyBLb25maWd1cmF0aW9uIGltIEFkbWluLUJlcmVpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0dlbmVyYWwtS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldGVyIGbDvHIgZGVuIEJlaXNwaWVsLUtvbW1lbnRhciAyIGRlciBHZW5lcmFsLUthdGFsb2ctQXR0cmlidXRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0ZXIgZsO8ciBkaWUgenVncmlmZnNiZXJlY2h0aWd0ZSBHcnVwcGUgZGVyIEdlbmVyYWwtS2F0YWxvZy1BdHRyaWJ1dGUuJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIE5hbWUhJ30gPSAnRWluZSBLYXRhbG9nLUtsYXNzZSBiZW7DtnRpZ3QgZWluZW4gTmFtZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIGRlc2NyaXB0aW9uISd9ID0gJ0VpbmUgR2VuZXJhbC1LYXRhbG9nLUtsYXNzZSBiZW7DtnRpZ3QgZWluZSBCZXNjaGVyZWlidW5nISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0thdGFsb2ctS2xhc3NlIGlzdCBlcmZvcmRlcmxpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnRGVyIE5hbWUgaXN0IGVyZm9yZGVybGljaC4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGlkYWQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGVsIENhdMOhbG9nbyBHZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBw7FhZGlyIEVsZW1lbnRvIGFsIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0HDsWFkaXIgQ2xhc2UgYWwgQ2F0w6Fsb2dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzZSBkZSBDYXTDoWxvZ28nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0NhdMOhbG9nbyBHZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDoW1ldHJvcyBwYXJhIGVsIGVqZW1wbG8gY29tZW50YXJpbyAyIGRlIGxvcyBhdHJpYnV0b3MgZGVsIGNhdMOhbG9nbyBnZW5lcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDoW1ldHJvcyBwYXJhIGxvcyBwZXJtaXNvcyBkZSBlamVtcGxvIGRlIGxvcyBhdHJpYnV0b3MgZGVsIGNhdMOhbG9nbyBnZW5lcmFsLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZhX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9qp2KfYsdqp2LHYr9uMJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9mF2K/bjNix24zYqiDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ9in2LbYp9mB2Ycg2qnYsdiv2YYg24zaqSDZgtmE2YUg2YHZh9ix2LPYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ9in2LbYp9mB2Ycg2qnYsdiv2YYg2qnZhNin2LMg2YHZh9ix2LPYqtuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICfZgdmH2LHYs9iqINqp2YTYp9iz24wnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ9iz2KfYrtiqINmIINmF2K/bjNix24zYqiDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJ9ir2KjYqiDZhdin2pjZiNmEINio2LHYp9uMINm+24zaqdix2KjZhtiv24wg2YHZh9ix2LPYqiDYudmF2YjZhduMINiv2LEg2KjYrti0INmF2K/bjNix24zYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICfZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ9m+2KfYsdin2YXYqtix2YfYp9uM24wg2KjYsdin24wg2KrZiNi224zYrSDZhtmF2YjZhtmHINuyINmF2LHYqNmI2Lcg2KjZhyDZiNuM2pjar9uM4oCM2YfYp9uMINmB2YfYsdiz2Kog2LnZhdmI2YXbjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfZvtin2LHYp9mF2KrYsdmH2KfbjNuMINio2LHYp9uMINqv2LHZiNmH4oCM2YfYp9uMINiv2LPYqtix2LPbjCDZhtmF2YjZhtmHINmF2LHYqNmI2Lcg2KjZhyDZiNuM2pjar9uM4oCM2YfYp9uMINmB2YfYsdiz2Kog2LnZhdmI2YXbjCc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0ZvbmN0aW9ubmFsaXTDqSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uIGR1IENhdGFsb2d1ZSBHw6luw6lyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0Fqb3V0ZXIgdW4gRWxlbWVudCBhdSBDYXRhbG9ndWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBam91dGVyIHVuZSBDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXRhbG9ndWUgR8OpbsOpcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bnppb25hbGl0w6AnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbmUgZGVsIENhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZ2dpdW5naSBFbGVtZW50byBhbCBDYXRhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0FnZ2l1bmdpIENsYXNzZSBhbCBDYXRhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRpIENhdGFsb2dvJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXRhbG9nbyBHZW5lcmFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9qYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfkuIDoiKzjgqvjgr/jg63jgrDnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ+OCq+OCv+ODreOCsOmgheebruOCkui/veWKoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ+OCq+OCv+ODreOCsOOCr+ODqeOCueOCkui/veWKoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9tc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om1zX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmdzaSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdLYXRhbG9nIFBlbmd1cnVzYW4gR2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnVGFtYmFoYW4gSXRlbSBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnVGFtYmFoIEtlbGFzIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0tlbGFzIEthdGFsb2cnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ0NpcHRhIGRhbiB1cnVzIEthdGFsb2cgR2VuZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdLYXRhbG9nIEdlbmVyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdLZWxhcyBrYXRhbG9nIHBlcmx1IG1lbXB1bnlhaSBuYW1hISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdLZWxhcyBrYXRhbG9nIHBlcmx1IG1lbXB1bnlhaSBwZW5qZWxhc2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0tlbGFzIGthdGFsb2cgYWRhbGFoIGRpcGVybHVrYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnTmFtYSBkaXBlcmx1a2FuLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtzam9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0FkbWluaXN0cmFzam9uIGF2IEdlbmVyZWxsIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0xlZ2cgdGlsIGthdGFsb2dvYmpla3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdMZWdnIHRpbCBrYXRhbG9nLWtsYXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnS2F0YWxvZy1rbGFzc2UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ09wcHJldHQgb2cgYWRtaW5pc3Ryw6lyIGRlbiBnZW5lcmVsbGUga2F0YWxvZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdGb3JzaWRlbW9kdWwtcmVnaXN0cmVyaW5nIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nLW9wcHNldHQgaSBhZG1pbi1kZWxlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnR2VuZXJlbGwgS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJlIGZvciBla3NlbXBlbGtvbW1lbnRhciAyIGkgYXR0cmlidXR0ZW5lIGZvciBnZW5lcmVsbCBrYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlcmUgZm9yIHRpbGdhbmdzZ3J1cHBlLWVrc2VtcGVsIGkgYXR0cmlidXR0ZW5lIGZvciBnZW5lcmVsbCBrYXRhbG9nLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBOYW1lISd9ID0gJ0VuIGthdGFsb2drbGFzc2UgbcOlIGhhIGV0IG5hdm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgZGVzY3JpcHRpb24hJ30gPSAnRW4ga2F0YWxvZy1rbGFzc2UgbcOlIGhhIGVuIGJlc2tyaXZlbHNlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0thdGFsb2drbGFzc2UgZXIgcMOla3JldmQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnTmF2biBlciBww6VrcmV2ZC4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5sX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmN0aW9uYWxpdGVpdCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdDYXRhbG9ndXMgQmVoZWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdDYXRhbG9ndXMtaXRlbSB0b2V2b2VnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdDYXRhbG9ndXMta2xhc3NlIHRvZXZvZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2F0YWxvZ3VzIGtsYXNzZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnQWFubWFrZW4gZW4gYmVoZXJlbiB2YW4gaXRlbXMgaW4gZGUgY2F0YWxvZ3VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0NhdGFsb2d1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjam9uYWxub8WbxIcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnWmFyesSFZHphbmllIGthdGFsb2dpZW0gZ8WCw7N3bnltJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdEb2RhaiBlbGVtZW50IGthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnRG9kYWoga2xhc8SZIGthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLbGFzYSBrYXRhbG9ndSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnVXR3w7NyeiBpIHphcnrEhWR6YWoga2F0YWxvZ2llbSBnxYLDs3dueW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdSZWplc3RyYWNqYSBtb2R1xYJ1IGZyb250ZW5kIGRvIGtvbmZpZ3VyYWNqaSBtb2R1xYJ1IEFkbWluR2VuZXJhbENhdGFsb2cgdyBwYW5lbHUgYWRtaW5pc3RyYXRvcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0thdGFsb2cgZ8WCw7N3bnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyeSBkbyBwcnp5a8WCYWRvd2VnbyBrb21lbnRhcnphIDIgYXRyeWJ1dMOzdyBrYXRhbG9ndSBnZW5lcmFsbmVnby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJ5IGRsYSBwcnp5a8WCYWRvd3ljaCBncnVwIHVwcmF3bmllxYQgYXRyeWJ1dMOzdyBrYXRhbG9ndSBnxYLDs3duZWdvLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBOYW1lISd9ID0gJ0tsYXNhIGthdGFsb2d1IHBvd2lubmEgbWllxIcgbmF6d8SZISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdLbGFzYSBrYXRhbG9ndSBwb3dpbm5hIG1pZcSHIG9waXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MgaXMgcmVxdWlyZWQuJ30gPSAnS2xhc2Ega2F0YWxvZ3UgamVzdCB3eW1hZ2FuYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZC4nfSA9ICdOYXp3YSBqZXN0IHd5bWFnYW5hLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGlkYWRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZG8gQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZGljaW9uYXIgSXRlbSBhbyBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZGljaW9uYXIgQ2xhc3NlIGFvIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRvIENhdMOhbG9nbyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgbyBDYXTDoWxvZ28gR2VyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIHJlZ2lzdG8gZGEgaW50ZXJmYWNlIHBhcmEgYSBjb25maWd1cmHDp8OjbyBBZG1pbkdlbmVyYWxDYXRhbG9nIG5hIMOhcmVhIGFkbWluaXN0cmF0aXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXTDoWxvZ28gR2VyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcsOibWV0cm9zIHBhcmEgbyBjb21lbnTDoXJpbyBkZSBleGVtcGxvIDIgZG9zIGF0cmlidXRvcyBkbyBjYXTDoWxvZ28gZ2VyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcsOibWV0cm9zIHBhcmEgb3MgZ3J1cG9zIGRlIHBlcm1pc3PDo28gZGUgZXhlbXBsbyBkb3MgYXRyaWJ1dG9zIGRvIGNhdMOhbG9nbyBnZXJhbC4nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdVbWEgQ2xhc3NlIGRlIENhdMOhbG9nbyBkZXZlIHRlciB1bSBub21lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdVbWEgQ2xhc3NlIGRlIENhdMOhbG9nbyBkZXZlIHRlciB1bWEgZGVzY3Jpw6fDo28hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MgaXMgcmVxdWlyZWQuJ30gPSAnQSBDbGFzc2UgZGUgQ2F0w6Fsb2dvIMOpIG9icmlnYXTDs3JpYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZC4nfSA9ICdPIG5vbWUgw6kgb2JyaWdhdMOzcmlvLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9QVF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDEyIEZDQ04gLSBSdWkgRnJhbmNpc2NvIDxydWkuZnJhbmNpc2NvQGZjY24ucHQ+CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X1BUX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbEFudGlndWlkYWRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3TDo28gZG8gQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZGljaW9uYXIgSXRlbSBhbyBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZGljaW9uYXIgQ2xhc3NlIGFvIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRvIENhdMOhbG9nbyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnQ3JpYXIgZSBnZXJpciBvIENhdMOhbG9nbyBHZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9ICdNw7NkdWxvIGRlIHJlZ2lzdG8gZGEgaW50ZXJmYWNlIHBhcmEgYSBjb25maWd1cmHDp8OjbyBBZG1pbkdlbmVyYWxDYXRhbG9nIG5hIMOhcmVhIGFkbWluaXN0cmF0aXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXTDoWxvZ28gR2VyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICdQYXLDom1ldHJvcyBwYXJhIG8gY29tZW50w6FyaW8gZGUgZXhlbXBsbyAyIGRvcyBhdHJpYnV0b3MgZG8gY2F0w6Fsb2dvIGdlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnUGFyw6JtZXRyb3MgcGFyYSBvcyBncnVwb3MgZGUgcGVybWlzc8OjbyBkZSBleGVtcGxvIGRvcyBhdHJpYnV0b3MgZG8gY2F0w6Fsb2dvIGdlcmFsLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBOYW1lISd9ID0gJ1VtYSBDbGFzc2UgZGUgQ2F0w6Fsb2dvIGRldmUgdGVyIHVtIG5vbWUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIGRlc2NyaXB0aW9uISd9ID0gJ1VtYSBDbGFzc2UgZGUgQ2F0w6Fsb2dvIGRldmUgdGVyIHVtYSBkZXNjcmnDp8OjbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyBpcyByZXF1aXJlZC4nfSA9ICdBIENsYXNzZSBkZSBDYXTDoWxvZ28gw6kgb2JyaWdhdMOzcmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkLid9ID0gJ08gbm9tZSDDqSBvYnJpZ2F0w7NyaW8uJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9Ck0YPQvdC60YbQuNC+0L3QsNC70YzQvdC+0YHRgtGMJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INC+0LHRidC40Lwg0LrQsNGC0LDQu9C+0LPQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfQlNC+0LHQsNCy0LvQtdC90LjQtSDRjdC70LXQvNC10L3RgtCwINC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfQlNC+0LHQsNCy0LvQtdC90LjQtSDQutC70LDRgdGB0LAg0LrQsNGC0LDQu9C+0LPQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn0JrQu9Cw0YHRgSDQutCw0YLQsNC70L7Qs9CwJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICfQntCx0YnQuNC5INC60LDRgtCw0LvQvtCzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ+WKn+iDveeUqOmAlCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfmgLvnm67lvZXnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ+WinuWKoOebruW9lemhueebric7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ+WinuWKoOaWsOebruW9leWIhue6pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn55uu5b2V5YiG57qnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBsaXN0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUxpc3QnICkgewogICAgICAgIG15ICRDbGFzcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzIiApIHx8ICcnOwoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBjbGFzcwogICAgICAgIGlmICggISRDbGFzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXZhaWxhYmlsaXR5IGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGl0ZW0gbGlzdAogICAgICAgIG15ICRJdGVtSURMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGxpc3QKICAgICAgICBpZiAoICEkSXRlbUlETGlzdCB8fCAhJXskSXRlbUlETGlzdH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQgeyAkSXRlbUlETGlzdC0+eyRhfSBjbXAgJEl0ZW1JRExpc3QtPnskYn0gfSBrZXlzICV7JEl0ZW1JRExpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgaXRlbSBkYXRhCiAgICAgICAgICAgIG15ICRJdGVtRGF0YSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBpdGVtIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SXRlbUxpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskSXRlbURhdGF9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICRJdGVtRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZEl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEFjdGlvbk92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1FZGl0JyApIHsKICAgICAgICBteSAlSXRlbURhdGE7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiSXRlbUlEIiApOwoKICAgICAgICAjIGFkZCBhIG5ldyBjYXRhbG9nIGl0ZW0KICAgICAgICBpZiAoICRJdGVtRGF0YXtJdGVtSUR9IGVxICdORVcnICkgewoKICAgICAgICAgICAgIyBnZXQgY2xhc3MKICAgICAgICAgICAgJEl0ZW1EYXRhe0NsYXNzfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzIiApOwoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldwogICAgICAgICAgICBpZiAoICEkSXRlbURhdGF7Q2xhc3N9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYW4gZXhpc3RpbmcgY2F0YWxvZyBpdGVtCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YQogICAgICAgICAgICBpZiAoICEkSXRlbURhdGFSZWYgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAlSXRlbURhdGEgPSAleyRJdGVtRGF0YVJlZn07CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICAgICAgbXkgJFZhbGlkT3B0aW9uU3RyZyAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkSXRlbURhdGF7VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlYWNoIHByZWZlcmVuY2VzIHNldHRpbmcKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAoKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgfTsKICAgICAgICB9CgogICAgICAgIElURU06CiAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKCiAgICAgICAgICAgICMgc2tpcCBpdGVtcyB0aGF0IGRvbid0IGJlbG9uZyB0byB0aGUgY2xhc3MKICAgICAgICAgICAgaWYgKCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57Q2xhc3N9ICYmICRQcmVmZXJlbmNlc3skSXRlbX0tPntDbGFzc30gbmUgJEl0ZW1EYXRhe0NsYXNzfSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgSVRFTTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaW5kIG91dHB1dCBtb2R1bGUKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljJzsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgb2JqZWN0IGZvciB0aGlzIHByZWZlcmVuY2VzIGl0ZW0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBhbGwgcGFyYW1ldGVycwogICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIEdlbmVyYWxDYXRhbG9nRGF0YSA9PiB7ICVJdGVtRGF0YSwgJVBhcmFtIH0gKTsKICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgcmVmKCAkUGFyYW1JdGVtLT57RGF0YX0gKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICB8fCByZWYoICRQcmVmZXJlbmNlc3skSXRlbX0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1JdGVtLT57J09wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbUl0ZW0tPntCbG9ja30gfHwgJFByZWZlcmVuY2VzeyRJdGVtfS0+e0Jsb2NrfSB8fCAnT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRJdGVtRGF0YXtDbGFzc30gZXEgJ05FVycgKSB7CgogICAgICAgICAgICAjIG91dHB1dCBJdGVtRWRpdENsYXNzQWRkCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzQWRkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NFeGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXRDbGFzc0V4aXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbVNhdmUnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ2xhc3MgSXRlbUlEIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmFtZSBwYXJhbSwgbmFtZSBtdXN0IGJlIG5vdCBlbXB0eSwgYnV0IG51bWJlciB6ZXJvICgwKSBpcyBhbGxvd2VkCiAgICAgICAgJEl0ZW1EYXRhe05hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmFtZScgKTsKCiAgICAgICAgIyBjaGVjayBjbGFzcwogICAgICAgIGlmICggJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJFN1Y2Nlc3M7CiAgICAgICAgbXkgJEl0ZW1JRCA9ICRJdGVtRGF0YXtJdGVtSUR9OwogICAgICAgIGlmICggJEl0ZW1EYXRhe0l0ZW1JRH0gZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkSXRlbUlEID0gJFN1Y2Nlc3M7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJEdDRGF0YSAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoIEl0ZW1JRCA9PiAkSXRlbUlEICk7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICAgICAgbXkgJE5vdGUgICAgICAgID0gJyc7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSB9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljJzsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKCBHZW5lcmFsQ2F0YWxvZ0RhdGEgPT4gJEdDRGF0YSApOwogICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgISRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgPT4gJEdDRGF0YS0+e0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldyBjbGFzcyBsaXN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1JdGVtTGlzdDtDbGFzcz0kSXRlbURhdGF7Q2xhc3N9IgogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3MnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwoKICAgICAgICBmb3IgbXkgJENsYXNzICggQHskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3NMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEFjdGlvbkFkZENsYXNzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uQWRkQ2xhc3MnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBVc2VySUQKICAgICAgICBQYXJhbU9iamVjdCBDb25maWdJdGVtIEdlbmVyYWxDYXRhbG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBkaWUgIkdvdCBubyAkT2JqZWN0ISIgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApOwogICAgfQoKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUGFyYW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAUGFyYW1zID0gKCk7CiAgICBteSAkR2V0UGFyYW0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSApOwoKICAgIGlmICggIWRlZmluZWQoJEdldFBhcmFtKSApIHsKICAgICAgICAkR2V0UGFyYW0KICAgICAgICAgICAgPSBkZWZpbmVkKCAkUGFyYW17R2VuZXJhbENhdGFsb2dEYXRhfS0+eyAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57UHJlZktleX0gfSApCiAgICAgICAgICAgID8gJFBhcmFte0dlbmVyYWxDYXRhbG9nRGF0YX0tPnsgJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9IH0KICAgICAgICAgICAgOiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57RGF0YVNlbGVjdGVkfTsKICAgIH0KCiAgICBpZiAoICEoIGRlZmluZWQgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSAmJiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57QmxvY2t9ICkgKSB7CiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSA9ICdUZXh0JzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gZXEgJ1Blcm1pc3Npb24nICkgewogICAgICAgICRQYXJhbXtEYXRhfSAgICAgICAgID0geyAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICkgfTsKICAgICAgICAkUGFyYW17UG9zc2libGVOb25lfSA9IDE7CiAgICAgICAgJFBhcmFte0Jsb2NrfSAgICAgICAgPSAnT3B0aW9uJzsKICAgIH0KCiAgICBwdXNoKAogICAgICAgIEBQYXJhbXMsCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQFBhcmFtczsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtHZXRQYXJhbX0gfSApIHsKICAgICAgICBteSBAQXJyYXkgPSBAeyAkUGFyYW17R2V0UGFyYW19LT57JEtleX0gfTsKICAgICAgICBmb3IgbXkgJFZhbHVlIChAQXJyYXkpIHsKCiAgICAgICAgICAgICMgcHJlZiB1cGRhdGUgZGIKICAgICAgICAgICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkVmFsdWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TWVzc2FnZX0gPSAnUHJlZmVyZW5jZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJzsKICAgIHJldHVybiAxOwp9CgpzdWIgRXJyb3IgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntFcnJvcn0gfHwgJyc7Cn0KCnN1YiBNZXNzYWdlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57TWVzc2FnZX0gfHwgJyc7Cn0KCjE7Cg==
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCJ9PC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJBY3Rpb25zIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0nQ29udGVudCc+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgo8IS0tZHRsOmJsb2NrOkFjdGlvbkFkZEl0ZW0tLT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtRWRpdCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSIkUURhdGF7IkNsYXNzIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9Ik5FVyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQbHVzIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRUZXh0eyJBZGQgQ2F0YWxvZyBJdGVtIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS1kdGw6YmxvY2s6QWN0aW9uQWRkSXRlbS0tPgo8IS0tZHRsOmJsb2NrOkFjdGlvbkFkZENsYXNzLS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbUVkaXQiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9Ik5FVyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSJORVciLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUGx1cyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4kVGV4dHsiQWRkIENhdGFsb2cgQ2xhc3MifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KPCEtLWR0bDpibG9jazpBY3Rpb25BZGRDbGFzcy0tPgo8IS0tZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3LS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IkdvIHRvIG92ZXJ2aWV3In08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS1kdGw6YmxvY2s6QWN0aW9uT3ZlcnZpZXctLT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzcyAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiTGlzdCJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJDYXRhbG9nIENsYXNzIn08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzTGlzdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIiAgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249SXRlbUxpc3Q7Q2xhc3M9JExRRGF0YXsiQ2xhc3MifSI+JFFEYXRheyJDbGFzcyJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzIC0tPgoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdJdGVtIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJMaXN0In08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXNjBwYyI+JFFEYXRheyJDbGFzcyJ9PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj4kVGV4dHsiVmFsaWQifTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1JdGVtRWRpdDtJdGVtSUQ9JExRRGF0YXsiSXRlbUlEIn0iPiRRRGF0YXsiTmFtZSJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4kVGV4dHsiJERhdGF7IlZhbGlkIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0l0ZW0gLS0+Cgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiSXRlbSJ9ICRUZXh0eyJFZGl0In06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0IiBjbGFzcz0iVmFsaWRhdGUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbVNhdmUiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSIkUURhdGF7Ikl0ZW1JRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzQWRkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJDbGFzc0RzYyI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDbGFzcyIgaWQ9IkNsYXNzRHNjIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgbWF4bGVuZ3RoPSIxMDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDbGFzc0RzY0Vycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2xhc3NEc2NTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzQWRkIC0tPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzRXhpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0V4aXN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiRUZXh0eyJOYW1lIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiBpZD0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQiIG1heGxlbmd0aD0iMTAwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgaWQ9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJTZWxlY3RlZElEIn0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIxMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIGlkPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBjbGFzcz0iVzUwcGMiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXQgLS0+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iJFFEYXRheyJOYW1lIn0iIGlkPSIkUURhdGF7Ik5hbWUifSIgcm93cz0iJFFEYXRheyJSb3dzIn0iIGNvbHM9IiRRRGF0YXsiQ29scyJ9Ij4kUURhdGF7IlNlbGVjdGVkSUQifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiT3B0aW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3B0aW9uIC0tPgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSIkUURhdGF7Ik5hbWUifSIgaWQ9IiRRRGF0YXsiTmFtZSJ9IiB0eXBlPSJmaWxlIiBzaXplPSIzMCIgY2xhc3M9ImZpeGVkIi8+PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CjwhLS0gZHRsOmJsb2NrOlBhc3N3b3JkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiREYXRheyJLZXkifSJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiBpZD0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIiIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpQYXNzd29yZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+JFRleHR7IlZhbGlkIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJWYWxpZE9wdGlvblN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ29tbWVudCI+JFRleHR7IkNvbW1lbnQifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIGlkPSJDb21tZW50IiB2YWx1ZT0iJFFEYXRheyJDb21tZW50In0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBpZD0iU3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4kVGV4dHsiU3VibWl0In08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJvciJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9Ij4kVGV4dHsiQ2FuY2VsIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdCAtLT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbDsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cgLSBnZW5lcmFsIGNhdGFsb2cgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBnZW5lcmFsIGNhdGFsb2cgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBsb2FkIGdlbmVyYXRvciBwcmVmZXJlbmNlcyBtb2R1bGUKICAgIG15ICRHZW5lcmF0b3JNb2R1bGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzTW9kdWxlJykKICAgICAgICB8fCAnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCJzsKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJhdG9yTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fSA9ICRHZW5lcmF0b3JNb2R1bGUtPm5ldyglUGFyYW0pOwogICAgfQoKICAgICMgY3JlYXRlIENhY2hlSW50ZXJuYWwgb2JqZWN0CiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWwtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgVFRMICA9PiA2MCAqIDYwICogMywKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDbGFzc0xpc3QoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSBvZiBhbGwgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzZXMKCiAgICBteSAkQXJyYXlSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzTGlzdCgpOwoKPWN1dAoKc3ViIENsYXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVChnZW5lcmFsX2NhdGFsb2dfY2xhc3MpICcKICAgICAgICAgICAgLiAnRlJPTSBnZW5lcmFsX2NhdGFsb2cgT1JERVIgQlkgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ2xhc3NMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDbGFzc0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICBteSAkQ2FjaGVLZXkgPSAnQ2xhc3NMaXN0JzsKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBDbGFzc0xpc3QsCiAgICApOwoKICAgIHJldHVybiBcQENsYXNzTGlzdDsKfQoKPWl0ZW0gQ2xhc3NSZW5hbWUoKQoKcmVuYW1lIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJFRydWUgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICdJVFNNOjpDb25maWdJdGVtOjpTdGF0ZScsCiAgICAgICAgQ2xhc3NOZXcgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKPWN1dAoKc3ViIENsYXNzUmVuYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc09sZCBDbGFzc05ldykpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17Q2xhc3NOZXd9IGVxICRQYXJhbXtDbGFzc09sZH07CgogICAgIyBjaGVjayBpZiBuZXcgY2xhc3MgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2xhc3NOZXd9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQWxyZWFkeUV4aXN0cyA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBbHJlYWR5RXhpc3RzID0gMTsKICAgIH0KCiAgICBpZiAoJEFscmVhZHlFeGlzdHMpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHJlbmFtZSBjbGFzcyAkUGFyYW17Q2xhc3NPbGR9ISBOZXcgY2xhc3NuYW1lIGFscmVhZHkgZXhpc3RzLiIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgIyByZW5hbWUgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGdlbmVyYWxfY2F0YWxvZyBTRVQgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzTmV3fSwgXCRQYXJhbXtDbGFzc09sZH0gXSwKICAgICk7Cn0KCj1pdGVtIEl0ZW1MaXN0KCkKCnJldHVybnMgYSBsaXN0IGFzIGEgaGFzaCByZWZlcmVuY2Ugb2Ygb25lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwoKICAgIG15ICRIYXNoUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBWYWxpZCAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICAgICBQcmVmZXJlbmNlcyAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IHt9CiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gMiwgICAgICAgICAgICAgICAgICAgICAjIG9yIHdoYXRldmVyIHByZWZlcmVuY2VzIGNhbiBiZSB1c2VkCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkUGFyYW17VmFsaWR9ID0gMTsKICAgIH0KCiAgICBteSAkUHJlZmVyZW5jZXNDYWNoZUtleSA9ICcnOwogICAgbXkgJFByZWZlcmVuY2VzVGFibGUgICAgPSAnJzsKICAgIG15ICRQcmVmZXJlbmNlc1doZXJlICAgID0gJyc7CiAgICBteSBAUHJlZmVyZW5jZXNCaW5kOwoKICAgICMgaGFuZGxlIGdpdmVuIHByZWZlcmVuY2VzCiAgICBpZiAoIGV4aXN0cyAkUGFyYW17UHJlZmVyZW5jZXN9ICYmIHJlZiAkUGFyYW17UHJlZmVyZW5jZXN9IGVxICdIQVNIJyApIHsKCiAgICAgICAgJFByZWZlcmVuY2VzVGFibGUgPSAnLCBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMnOwogICAgICAgIG15IEBXaGVyZXM7CgogICAgICAgICMgYWRkIGFsbCBwcmVmZXJlbmNlcyBnaXZlbiB0byB3aGVyZS1jbGF1c2UKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17UHJlZmVyZW5jZXN9IH0gKSB7CgogICAgICAgICAgICBpZiAoIHJlZiggJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9ICkgbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSA9IFsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFdoZXJlcywgJyhwcmVmX2tleSA9ID8gQU5EIHByZWZfdmFsdWUgSU4gKCcKICAgICAgICAgICAgICAgIC4gam9pbiggJywgJywgbWFwIHsnPyd9IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9ICkKICAgICAgICAgICAgICAgIC4gJykpJzsKCiAgICAgICAgICAgIHB1c2ggQFByZWZlcmVuY2VzQmluZCwgXCRLZXksIG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9OwoKICAgICAgICAgICAgIyBhZGQgZnVuY3Rpb25hbGl0eSBsaXN0IHRvIGNhY2hlIGtleQogICAgICAgICAgICAkUHJlZmVyZW5jZXNDYWNoZUtleSAuPSAnIyMjIycgaWYgJFByZWZlcmVuY2VzQ2FjaGVLZXk7CiAgICAgICAgICAgICRQcmVmZXJlbmNlc0NhY2hlS2V5IC49IGpvaW4gcXsjIyMjfSwgJEtleSwgbWFwIHskX30gQHsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IH07CiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXNXaGVyZQogICAgICAgICAgICA9ICdBTkQgZ2VuZXJhbF9jYXRhbG9nLmlkID0gZ2VuZXJhbF9jYXRhbG9nX3ByZWZlcmVuY2VzLmdlbmVyYWxfY2F0YWxvZ19pZCc7CiAgICAgICAgJFByZWZlcmVuY2VzV2hlcmUgLj0gJyBBTkQgJyAuIGpvaW4gJyBBTkQgJywgQFdoZXJlczsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIGdlbmVyYWxfY2F0YWxvZyAkUHJlZmVyZW5jZXNUYWJsZSAiCiAgICAgICAgLiAiV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyAkUHJlZmVyZW5jZXNXaGVyZSAiOwogICAgbXkgQEJJTkQgPSAoIFwkUGFyYW17Q2xhc3N9LCBAUHJlZmVyZW5jZXNCaW5kICk7CgogICAgIyBhZGQgdmFsaWQgc3RyaW5nIHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgdmFsaWRfaWQgPSAxICc7CiAgICB9CgogICAgIyBjcmVhdGUgY2FjaGUga2V5CiAgICBteSAkQ2FjaGVLZXkKICAgICAgICA9ICdJdGVtTGlzdDo6JyAuICRQYXJhbXtDbGFzc30gLiAnIyMjIycgLiAkUGFyYW17VmFsaWR9IC4gJyMjIyMnIC4gJFByZWZlcmVuY2VzQ2FjaGVLZXk7CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIG15ICRDYWNoZSA9ICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkdldCggS2V5ID0+ICRDYWNoZUtleSApOwogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICElRGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNsYXNzICRQYXJhbXtDbGFzc30gbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICk7CgogICAgcmV0dXJuIFwlRGF0YTsKfQoKPWl0ZW0gSXRlbUdldCgpCgpnZXQgaXRlbSBhdHRyaWJ1dGVzCgogICAgbXkgJEl0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgTmFtZSAgPT4gJ1VuZGVycGlubmluZyBDb250cmFjdCcsCiAgICApOwoKcmV0dXJucwoKICAgIG15ICRJdGVtID0gewogICAgICAgICdJdGVtSUQnICAgICA9PiAnMjMnLAogICAgICAgICdDbGFzcycgICAgICA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgJ05hbWUnICAgICAgID0+ICdVbmRlcnBpbm5pbmcgQ29udHJhY3QnCiAgICAgICAgJ0NvbW1lbnQnICAgID0+ICdTb21lIENvbW1lbnQnLAogICAgICAgICdWYWxpZElEJyAgICA9PiAnMScsCiAgICAgICAgJ0NyZWF0ZVRpbWUnID0+ICcyMDEyLTAxLTEyIDA5OjM2OjI0JywKICAgICAgICAnQ3JlYXRlQnknICAgPT4gJzEnLAogICAgICAgICdDaGFuZ2VUaW1lJyA9PiAnMjAxMi0wMS0xMiAwOTozNjoyNCcsCiAgICAgICAgJ0NoYW5nZUJ5JyAgID0+ICcxJywKICAgIH07Cgo9Y3V0CgpzdWIgSXRlbUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbUlEfSAmJiAoICEkUGFyYW17Q2xhc3N9IHx8ICRQYXJhbXtOYW1lfSBlcSAnJyApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtSUQgT1IgQ2xhc3MgYW5kIE5hbWUhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgJzsKICAgIG15IEBCSU5EOwoKICAgICMgYWRkIG9wdGlvbnMgdG8gc3FsIHN0cmluZwogICAgaWYgKCAkUGFyYW17Q2xhc3N9ICYmICRQYXJhbXtOYW1lfSBuZSAnJyApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnSXRlbUdldDo6Q2xhc3M6OicgLiAkUGFyYW17Q2xhc3N9IC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgPSAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5HZXQoIEtleSA9PiAkQ2FjaGVLZXkgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAgICAgIyBhZGQgY2xhc3MgYW5kIG5hbWUgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2dlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JzsKICAgICAgICBwdXNoIEBCSU5ELCAoIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9ICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnSXRlbUdldDo6SXRlbUlEOjonIC4gJFBhcmFte0l0ZW1JRH07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgYWRkIGl0ZW0gaWQgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2lkID0gPyc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtJdGVtSUR9OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQklORCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVJdGVtRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gICAgID0gJFJvd1swXTsKICAgICAgICAkSXRlbURhdGF7Q2xhc3N9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRJdGVtRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJEl0ZW1EYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1szXTsKICAgICAgICAkSXRlbURhdGF7Q29tbWVudH0gICAgPSAkUm93WzRdIHx8ICcnOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNV07CiAgICAgICAgJEl0ZW1EYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s2XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzddOwogICAgICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOF07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICEkSXRlbURhdGF7SXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0l0ZW0gbm90IGZvdW5kIGluIGRhdGFiYXNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCggSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9ICk7CgogICAgIyBtZXJnZSBoYXNoCiAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgJUl0ZW1EYXRhID0gKCAlSXRlbURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpDbGFzczo6JyAuICRJdGVtRGF0YXtDbGFzc30gLiAnOjonIC4gJEl0ZW1EYXRhe05hbWV9LAogICAgICAgIFZhbHVlID0+IFwlSXRlbURhdGEsCiAgICApOwogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpJdGVtSUQ6OicgLiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICBWYWx1ZSA9PiBcJUl0ZW1EYXRhLAogICAgKTsKCiAgICByZXR1cm4gXCVJdGVtRGF0YTsKfQoKPWl0ZW0gSXRlbUFkZCgpCgphZGQgYSBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkSXRlbUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5hbWUgbXVzdCBiZSBub3QgZW1wdHksIGJ1dCBudW1iZXIgemVybyAoMCkgaXMgYWxsb3dlZAogICAgaWYgKCAkUGFyYW17TmFtZX0gZXEgJycgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE5hbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gJyc7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTm9BZGQ7CiAgICB3aGlsZSAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgaXRlbSwgaWYgaXRlbSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgIyBpbnNlcnQgbmV3IGl0ZW0KICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gZ2VuZXJhbF9jYXRhbG9nICcKICAgICAgICAgICAgLiAnKGdlbmVyYWxfY2F0YWxvZ19jbGFzcywgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgaXRlbQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJEl0ZW1JRDsKfQoKPWl0ZW0gSXRlbVVwZGF0ZSgpCgp1cGRhdGUgYW4gZXhpc3RpbmcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkVHJ1ZSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgICAgICAgID0+IDEyMywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdJdGVtIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgID0+ICdDb21tZW50JywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuYW1lIG11c3QgYmUgbm90IGVtcHR5LCBidXQgbnVtYmVyIHplcm8gKDApIGlzIGFsbG93ZWQKICAgIGlmICggJFBhcmFte05hbWV9IGVxICcnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBOYW1lISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9ICcnOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzKSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIG9mIGl0ZW0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDbGFzczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENsYXNzID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICEkQ2xhc3MgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gbm90IGZvdW5kIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkQ2xhc3MsIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAxOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtJdGVtSUR9IG5lICRSb3dbMF0gKSB7CiAgICAgICAgICAgICRVcGRhdGUgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkVXBkYXRlICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUICcKICAgICAgICAgICAgLiAnbmFtZSA9ID8sIHZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoKQoKc2V0IEdlbmVyYWxDYXRhbG9nIHByZWZlcmVuY2VzCgogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICAgICAgS2V5ICAgID0+ICdVc2VyQ29tbWVudCcsCiAgICAgICAgVmFsdWUgID0+ICdzb21lIGNvbW1lbnQnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkNsZWFuVXAoKTsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoQF8pOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KCkKCmdldCBHZW5lcmFsQ2F0YWxvZyBwcmVmZXJlbmNlcwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRRdWV1ZU9iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KEBfKTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cvUHJlZmVyZW5jZXNEQi5wbSAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREIgLSBzb21lIHByZWZlcmVuY2VzIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhbCBjYXRhbG9nCgo9aGVhZDEgU1lOT1BTSVMKCnNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEdyb3VwT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIHByZWZlcmVuY2VzIHRhYmxlIGRhdGEKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gICAgICA9ICdnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMnOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSAgID0gJ3ByZWZfa2V5JzsKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZVZhbHVlfSA9ICdwcmVmX3ZhbHVlJzsKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ICA9ICdnZW5lcmFsX2NhdGFsb2dfaWQnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgpCgpTZXQgcHJlZmVyZW5jZXMgZm9yIGFuIGl0ZW0KCiAgICAkUHJlZmVyZW5jZXNPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMzQsCiAgICAgICAgS2V5ICAgID0+ICdGdW5jdGlvbmFsaXR5JywKICAgICAgICBWYWx1ZSAgPT4gJ29wZXJhdGlvbmFsJywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSXRlbUlEIEtleSBWYWx1ZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIG9sZCBkYXRhCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gV0hFUkUgIgogICAgICAgICAgICAuICIkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVHY0lEfSA9ID8gQU5EICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUtleX0gPSA/IiwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBcJFBhcmFte0tleX0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBpbnNlcnQgbmV3IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9ICgkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVHY0lEfSwgIgogICAgICAgICAgICAuICIgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSwgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9KSAiCiAgICAgICAgICAgIC4gIiBWQUxVRVMgKD8sID8sID8pIiwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBcJFBhcmFte0tleX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsdWV9LAogICAgICAgIF0sCiAgICApOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KCkKCkdldCBhbGwgUHJlZmVyZW5jZXMgZm9yIGFuIGl0ZW0KCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkUHJlZmVyZW5jZXNPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcXVldWUgcHJlZmVyZW5jZXMgYXJlIGF2YWlsYWJsZQogICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgcHJlZmVyZW5jZXMKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSwgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ICIKICAgICAgICAgICAgLiAiIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVHY0lEfSA9ID8iLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICk7CgogICAgbXkgJURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgcmV0dXJuIGRhdGEKICAgIHJldHVybiAlRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0dlbmVyYWxDYXRhbG9nJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUdlbmVyYWxDYXRhbG9nLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBjbGFzc2VzCm15IEBDbGFzc1JhbmQ7Cgpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgcHVzaCBAQ2xhc3NSYW5kLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgc3RvcmUgb3JpZ2luYWwgZ2VuZXJhbCBjYXRhbG9nIHBlcm1pc3Npb24gcHJlZmVyZW5jZXMgc2V0dGluZwpteSAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnOwppZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpLT57UGVybWlzc2lvbnN9Owp9CgojIGVuYWJsZSBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nIHdpdGggYSBkdW1teSB0cnVlIHZhbHVlCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0xJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgPT4gJ1Rlc3RJdGVtMicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBIZWxsbyA9PiAnV29ybGQnLAogICAgICAgICAgICBDb2xvciA9PiAnUmVkJywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ1JlZCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHByZWZlcmVuY2VzIG9mIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBzZXQKICAgIHsKICAgICAgICBQcmVmZXJlbmNlc1NldCA9PiB7CiAgICAgICAgICAgIEhlbGxvID0+ICdOZXdXb3JsZCcsCiAgICAgICAgICAgIENvbG9yID0+ICdCbHVlJywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ05ld1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ0JsdWUnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdUZXN0SXRlbTVVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gIiBcdCBcbiBcciBVbml0IFRlc3QgOjogVGVzdCBDbGFzcyBcdCBcbiBcciAiIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyIFRlc3QgSXRlbSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3QgSXRlbScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50IFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIM+SIM+hIFRlc3QgSXRlbSDGqSDPniAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDPoCDQryBUZXN0IENvbW1lbnQg0awg0aAgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3PCqScgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnz5Igz6EgVGVzdCBJdGVtIMapIM+eJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ8+gINCvIFRlc3QgQ29tbWVudCDRrCDRoCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ID0+ICcgVGVzdCBDb21tZW50INGZINGSIFVQREFURTEgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gxqkgyaQgVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50INGZINGSIFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChhIHNlY29uZCBpdGVtIHdpdGggRnVuY3Rpb25hbGl0eSAndGVzdDEnKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2V0IGZ1bmN0aW9uYWxpdHkgdG8gJycpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02VVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW1QcmVmZXJlbmNlcycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtUHJlZmVyZW5jZXMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBUZXN0ICA9PiAnaGVsbG8gd29ybGQnLAogICAgICAgICAgICBHcm91cCA9PiAzMywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgVGVzdCAgPT4gJ2hlbGxvIHdvcmxkJywKICAgICAgICAgICAgR3JvdXAgPT4gMzMsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAnaGVsbG8nLAogICAgICAgICAgICBTaXplID0+IDM4LAogICAgICAgIH0sCiAgICAgICAgUHJlZmVyZW5jZXNHZXQgPT4gewogICAgICAgICAgICBUZXN0ID0+ICdoZWxsbycsCiAgICAgICAgICAgIFNpemUgPT4gMzgsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaGFzIGFuIGVtcHR5IG5hbWUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICcnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGFkZGVkLCB0aGUgbnVtYmVyIHplcm8gKDApIGlzIGFsbG93ZWQgYXMgbmFtZQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnMCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJzAnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5ICh1cGRhdGluZyBuYW1lIHRvIG51bWJlciB6ZXJvICgwKSApCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnMCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJzAnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBub3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseQogICAgIyAoZW1wdHkgc3RyaW5nIGFzIG5hbWUgaXMgbm90IGFsbG93ZWQgKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSAkTGFzdEFkZGVkSXRlbUlEOwpteSAlQWRkZWRJdGVtQ291bnRlcjsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IGl0ZW0KICAgICAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICV7ICRJdGVtLT57QWRkfSB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkSXRlbUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUFkZCgpIC0gSXRlbUtleTogJEl0ZW1JRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEl0ZW1JRCkgewoKICAgICAgICAgICAgICAgICMgc2V0IGxhc3QgaXRlbSBpZCB2YXJpYWJsZQogICAgICAgICAgICAgICAgJExhc3RBZGRlZEl0ZW1JRCA9ICRJdGVtSUQ7CgogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIGFkZGVkIGl0ZW0gY291bnRlcgogICAgICAgICAgICAgICAgJEFkZGVkSXRlbUNvdW50ZXJ7ICRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfSB9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRJdGVtSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtQWRkKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgY3JlYXRpb24gb2YgaXRlbSB1c2luZyBJdGVtSWQgYW5kIFVzZXJJRAogICAgICAgIG15ICRJdGVtR2V0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldC0+eyRJdGVtQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRJdGVtQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1HZXQoKSAtIFVzaW5nIEl0ZW1JRCBhbmQgVXNlcklEIC0gJEl0ZW1BdHRyaWJ1dGUgIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGl0ZW0gZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0gdXNpbmcgQ2xhc3MgYW5kIE5hbWUKICAgICAgICAkSXRlbUdldCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30sCiAgICAgICAgICAgIE5hbWUgID0+ICRJdGVtLT57QWRkR2V0fS0+e05hbWV9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRJdGVtR2V0LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gVXNpbmcgQ2xhc3MgYW5kIE5hbWUgLSAkSXRlbUF0dHJpYnV0ZSAiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IGl0ZW0gaWQgdmFyYWlibGUKICAgICAgICBpZiAoICEkTGFzdEFkZGVkSXRlbUlEICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBJVEVNIElEIEdJVkVOIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBpdGVtCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBpdGVtIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57VXBkYXRlR2V0fSApIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbVVwZGF0ZSgpIC0gSXRlbUtleTogJExhc3RBZGRlZEl0ZW1JRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGl0ZW0gZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGUKICAgICAgICBteSAkSXRlbUdldDIgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e1VwZGF0ZX0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIHVwZGF0ZQogICAgICAgIGZvciBteSAkSXRlbUF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQyLT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gJEl0ZW1BdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9ICkgewoKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e1ByZWZlcmVuY2VzU2V0fSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9LT57JEtleX0sCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc1NldCgpIC0gJEtleSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgcHJlZmVyZW5jZXMKICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0gKSB7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRJdGVtLT57UHJlZmVyZW5jZXNHZXR9IH0gKSB7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0tPnskS2V5fSBlcSAkUHJlZmVyZW5jZXN7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFByZWZlcmVuY2VzR2V0KCkgLSAkS2V5IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFByZWZlcmVuY2VzR2V0KCkgLSAkS2V5IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMgZm9yIGxhdGVyIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCBhcnJheXMKbXkgJUV4aXN0aW5nQ2xhc3Nlc1RtcDsKSVRFTToKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewogICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e0FkZEdldH0tPntDbGFzc307CiAgICAkRXhpc3RpbmdDbGFzc2VzVG1weyAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30gfSA9IDE7Cn0KbXkgQEV4aXN0aW5nQ2xhc3NlcyA9IHNvcnQga2V5cyAlRXhpc3RpbmdDbGFzc2VzVG1wOwoKbXkgJUV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1wOwpJVEVNOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CiAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPntGdW5jdGlvbmFsaXR5fSB8fD0gJyc7CiAgICAkRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXB7ICRJdGVtLT57VXBkYXRlR2V0fS0+e0Z1bmN0aW9uYWxpdHl9IH0gPSAxOwp9Cm15IEBFeGlzdGluZ0Z1bmN0aW9uYWxpdGllcyA9IHNvcnQga2V5cyAlRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXA7CgpteSBATm9uRXhpc3RpbmdDbGFzc2VzID0gKCAnVW5pdFRlc3Q6Ok5vRXhpc3RpbmdDbGFzczEnLCAnVW5pdFRlc3Q6Ok5vRXhpc3RpbmdDbGFzczInICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NMaXN0IHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkQ2xhc3NMaXN0MSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkQ2xhc3NDb3VudCA9IDA7CiAgICBpZiAoICRDbGFzc0xpc3QxICYmIHJlZiAkQ2xhc3NMaXN0MSBlcSAnQVJSQVknICkgewogICAgICAgICRDbGFzc0NvdW50ID0gZ3JlcCB7ICRfIGVxICRDbGFzcyB9IEB7JENsYXNzTGlzdDF9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkQ2xhc3NDb3VudCwKICAgICAgICAxLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzTGlzdCgpIC0gJENsYXNzIGxpc3RlZCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChATm9uRXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJEl0ZW1MaXN0LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSAkQ2xhc3Mgbm90IGV4aXN0cyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBteSAkTGlzdENvdW50ID0gJ05VTEwnOwogICAgaWYgKCBkZWZpbmVkICRJdGVtTGlzdCAmJiByZWYgJEl0ZW1MaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAkTGlzdENvdW50ID0ga2V5cyAleyRJdGVtTGlzdH07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRMaXN0Q291bnQsCiAgICAgICAgJEFkZGVkSXRlbUNvdW50ZXJ7JENsYXNzfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gJENsYXNzIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAzIC0gSXRlbSBMaXN0IHdpdGggcHJlZmVyZW5jZXMgKHNpbmdsZSBoYXNoIGVudHJ5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgbXkgJENsYXNzICAgID0gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXTsKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEhlbGxvID0+ICdXb3JsZCcsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJExpc3RDb3VudCA9ICdOVUxMJzsKICAgIGlmICggZGVmaW5lZCAkSXRlbUxpc3QgJiYgcmVmICRJdGVtTGlzdCBlcSAnSEFTSCcgKSB7CiAgICAgICAgJExpc3RDb3VudCA9IGtleXMgJXskSXRlbUxpc3R9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkTGlzdENvdW50LAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSBwcmVmZXJlbmNlcyAoc2luZ2xlIGhhc2ggZW50cnkpIC0gJENsYXNzIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCA0IC0gSXRlbSBMaXN0IHdpdGggcHJlZmVyZW5jZXMgKGFycmF5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgbXkgJENsYXNzICAgID0gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXTsKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbG9yID0+IFsgJ1JlZCcsICdCbHVlJyBdLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRMaXN0Q291bnQgPSAnTlVMTCc7CiAgICBpZiAoIGRlZmluZWQgJEl0ZW1MaXN0ICYmIHJlZiAkSXRlbUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICRMaXN0Q291bnQgPSBrZXlzICV7JEl0ZW1MaXN0fTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpc3RDb3VudCwKICAgICAgICAyLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgcHJlZmVyZW5jZXMgKGFycmF5KSAtICRDbGFzcyBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFByZWZlcmVuY2VzIHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAkQ2xhc3MsCiAgICAgICAgTmFtZSAgICA9PiAnSXRlbSBQcmVmZXJlbmNlcycsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgS2V5ICAgID0+ICdVbml0VGVzdFByZWYnLAogICAgICAgIFZhbHVlICA9PiAnMScsCiAgICApOwoKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBVbml0VGVzdFByZWYgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEl0ZW1MaXN0LT57JEl0ZW1JRH0sCiAgICAgICAgJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSBDbGFzcyAkQ2xhc3MgUHJlZmVyZW5jZXMgbWF0Y2giLAogICAgKTsKCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICBLZXkgICAgPT4gJ1VuaXRUZXN0UHJlZicsCiAgICAgICAgVmFsdWUgID0+ICcyJywKICAgICk7CgogICAgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIFVuaXRUZXN0UHJlZiA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkSXRlbUxpc3QsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtIENsYXNzICRDbGFzcyBQcmVmZXJlbmNlcyBub3QgbWF0Y2ggYWZ0ZXIgUHJlZmVyZW5jZXNTZXQgQ2hhbmdlIgogICAgKTsKCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgID0+ICRJdGVtSUQsCiAgICAgICAgTmFtZSAgICA9PiAnSXRlbSBQcmVmZXJlbmNlcycsCiAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgUHJlZmVyZW5jZXMgdGVzdCAyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCj1wb2QKCm15ICVGdW5jdGlvbmFsaXR5TGlzdDE7Cm1hcCB7ICRGdW5jdGlvbmFsaXR5TGlzdDF7JF99ID0gMSB9IEBFeGlzdGluZ0Z1bmN0aW9uYWxpdGllczsKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkRnVuY3Rpb25hbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+RnVuY3Rpb25hbGl0eUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRnVuY3Rpb25hbGl0eUxpc3QgJiYgcmVmICRGdW5jdGlvbmFsaXR5TGlzdCBlcSAnQVJSQVknLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkgLSByZXR1cm4gYSBhcnJheSByZWZlcmVuY2UiLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uYWxpdHkgKCBAeyRGdW5jdGlvbmFsaXR5TGlzdH0gKSB7CiAgICAgICAgZGVsZXRlICRGdW5jdGlvbmFsaXR5TGlzdDF7JEZ1bmN0aW9uYWxpdHl9OwogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKJFNlbGYtPlRydWUoCiAgICAha2V5cyAlRnVuY3Rpb25hbGl0eUxpc3QxLAogICAgIlRlc3QgJFRlc3RDb3VudDogRnVuY3Rpb25hbGl0eUxpc3QoKSIsCik7CgokVGVzdENvdW50Kys7Cgo9Y3V0CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAxIChjaGVjayBub3JtYWwgcmVuYW1lKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpDTEFTUzoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRPbGRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzLAogICAgICAgIENsYXNzTmV3ID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gUmVuYW1lIGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIG15ICROZXdJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgaWYgKAogICAgICAgICEkT2xkSXRlbUxpc3QKICAgICAgICB8fCAhJE5ld0l0ZW1MaXN0CiAgICAgICAgfHwgcmVmICRPbGRJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICB8fCByZWYgJE5ld0l0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBJdGVtTGlzdCBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBPTERLRVk6CiAgICBmb3IgbXkgJE9sZEtleSAoIHNvcnQga2V5cyAleyRPbGRJdGVtTGlzdH0gKSB7CgogICAgICAgIGlmICggIWV4aXN0cyAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fSApIHsKICAgICAgICAgICAgJE5ld0l0ZW1MaXN0LT57RmFpbGVkRHVtbXl9ID0gMTsKICAgICAgICAgICAgbmV4dCBPTERLRVk7CiAgICAgICAgfQoKICAgICAgICBuZXh0IE9MREtFWSBpZiAkT2xkSXRlbUxpc3QtPnskT2xkS2V5fSBuZSAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fTsKCiAgICAgICAgZGVsZXRlICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICFrZXlzICV7JE5ld0l0ZW1MaXN0fSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAyIChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICAgICBDbGFzc05ldyA9PiAnICcgLiAkQ2xhc3MgLiAiUkUgTkEgTUUgMiBcbiBcciBcdCAiLAogICAgKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBSZW5hbWUgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgbXkgJE5ld0l0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcyAuICdSRU5BTUUyJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgISRPbGRJdGVtTGlzdAogICAgICAgIHx8ICEkTmV3SXRlbUxpc3QKICAgICAgICB8fCByZWYgJE9sZEl0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgIHx8IHJlZiAkTmV3SXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIEl0ZW1MaXN0IGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIE9MREtFWToKICAgIGZvciBteSAkT2xkS2V5ICggc29ydCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGlkZW50aWNhbCBuYW1lIHRlc3QpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgQ2xhc3NOZXcgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gb2xkbmFtZSBhbmQgbmV3bmFtZSBpZGVudGljYWwiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDMgKG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgIE5hbWUgICAgICAgICAgPT4gJ0R1bW15JywKICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIENsYXNzTmV3ID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMl0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbnVwCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgcmVzdG9yZSBvcmlnaW5hbCBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnLAopOwoKMTsK
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZzsgICAgIyMgbm8gY3JpdGljCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgo9aGVhZDEgTkFNRQoKR2VuZXJhbENhdGFsb2cucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwogICAgdXNlIHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6R2VuZXJhbENhdGFsb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgWE1MT2JqZWN0ICAgID0+ICRYTUxPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBFbmNvZGVPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IFhNTE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBtaWdyYXRlICdmdW5jdGlvbmFsaXR5JyB0byBleHRlcm5hbCB0YWJsZQogICAgIyB0aGlzIGlzIG9ubHkgbmVjY2VzYXJ5IGluIENvZGVVcGdyYWRlLCBmb3IgbmV3IGluc3RhbGxhdGlvbnMgdGhpcyBpcyBkb25lCiAgICAjIGluIHRoZSBwYWNrYWdlIElUU01Db3JlIGR1cmluZyBDb2RlSW5zdGFsbAogICAgJFNlbGYtPl9NaWdyYXRlRnVuY3Rpb25hbGl0eSgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX01pZ3JhdGVGdW5jdGlvbmFsaXR5KCkKCj1jdXQKCnN1YiBfTWlncmF0ZUZ1bmN0aW9uYWxpdHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFNFTEVDVCBhbGwgZnVuY3Rpb25hbGl0eSB2YWx1ZXMKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBmdW5jdGlvbmFsaXR5IEZST00gZ2VuZXJhbF9jYXRhbG9nJywKICAgICk7CgogICAgbXkgQExpc3Q7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG5leHQgUk9XIGlmICEkUm93WzFdOwoKICAgICAgICBwdXNoIEBMaXN0LCBcQFJvdzsKICAgIH0KCiAgICAjIHNhdmUgZW50cmllcyBpbiBuZXcgdGFibGUKICAgIGZvciBteSAkRW50cnkgKEBMaXN0KSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4KICAgICAgICAgICAgICAgICdJTlNFUlQgSU5UTyBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMoIGdlbmVyYWxfY2F0YWxvZ19pZCwgcHJlZl9rZXksIHByZWZfdmFsdWUgKScKICAgICAgICAgICAgICAgIC4gJyBWQUxVRVMoID8sIFwnRnVuY3Rpb25hbGl0eVwnLCA/ICknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRFbnRyeS0+WzBdLCBcJEVudHJ5LT5bMV0gXSwKICAgICAgICApOwogICAgfQoKICAgICMgZHJvcCBjb2x1bW4gZnVuY3Rpb25hbGl0eQogICAgbXkgKCREcm9wKSA9ICRTZWxmLT57REJPYmplY3R9LT5TUUxQcm9jZXNzb3IoCiAgICAgICAgRGF0YWJhc2UgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2dlbmVyYWxfY2F0YWxvZycsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ0NvbHVtbkRyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnZnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlQWx0ZXInLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnRW5kJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICREcm9wLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQK