GeneralCatalog
2.1.3
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 2.1.3.
Build for OTRS::ITSM 2.1.2.
Build for OTRS::ITSM 2.1.1.
Build for OTRS::ITSM 2.1.0 beta4.
Build for OTRS::ITSM 2.1.0 beta3.
Build for OTRS::ITSM 2.1.0 beta2.
Build for OTRS::ITSM 2.1.0 beta1.
Build for OTRS::ITSM 2.1.0 alpha1.
The general catalog package.
Das General Catalog Paket.
2.4.x
<br>
<b>ATTENTION</b>
<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>
<b>ACHTUNG</b>
<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>
# 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."
);
}
}
2011-04-07 22:45:53
opms.otrs.com
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NLR//etfT1VIw+FwPp9Xq9VisfjOaQEAAABel/VHf7FYLGazWdYQzf60WCwevXg+nz9VD9VqtbeMCQAAAPB+tro/Go/Hk8lkOp3O5/OsM3pqNVYcx6VSqfinbGJRPp9/58AAAAAA72+r+6Orq6vb29sHNxYKheI3VEUAAADA1trY/mg+n5+cnMzn8//zf/7PU9dUKpUoih5URUumYgMAAABsofXrjxaLxXw+z3aclcvlarX66GW5XG48HkdRlCRJLpd79JpOp/OGQQEAAAA2wor2R2ma3pVEDz5IkuTusna7vaQ/Oj4+LpVKT5VHAAAAADxH4P4oTdPspLMHJdF8Pl9yr3w+n00pKpfLSy5rNBqvnRcAAABg6wTuj0aj0efPnx/9UhzHWUlUKBQefGBEEQAAAMC7edv+6OzsrNfrHR0dNZvNx5++UMjn84+WRI48AwAAAFgFz+2PkiSZz+d3s6vvPk7T9Oeff15+38Vi8dSXSqXSP//5zxfkBQAAAHgv2RaoNE2f+fFz7vvSa1bBf/qjpxqi7IP7U6ufr9PpdDqdQmFFp3QDAAAALJGm6aNTdJ66/e7GBzXQ/eufc82qKURR9OnTp9Fo9N1Lc7lctt2s8Kfs4yV3KRaLr5YUAAAA4H3FcfyiBUFPXXz/cVZzhdFyheje/rKnGqLsg1wuFzQqAAAAwHt7tEL6gYVC362iVnbxURRFcZqm4/E4G2IdOgwAAAAAK+dlq7AAAAAA2Db/HxAa4LKakOaJAAAAAElFTkSuQmCC
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBHZW5lcmFsQ2F0YWxvZy54bWwsdiAxLjQgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkdlbmVyYWxDYXRhbG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluR2VuZXJhbENhdGFsb2cgS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+R2VuZXJhbCBDYXRhbG9nPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkdlbmVyYWwgQ2F0YWxvZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2szPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjQ29tbWVudDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5QYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBhcmFtZXRlciBm/HIgZGVuIEJlaXNwaWVsLUtvbW1lbnRhciAyIGRlciBHZW5lcmFsQ2F0YWxvZy1BdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyI+RGVmaW5lIHRoZSBxdWV1ZSBjb21tZW50IDIuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGV4dEFyZWE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHMiPjUwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSb3dzIj41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlBhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5QYXJhbWV0ZXIgZvxyIGRpZSB6dWdyaWZmc2JlcmVjaHRpZ3RlIEdydXBwZSBkZXIgR2VuZXJhbENhdGFsb2ctQXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkdlbmVyYWxDYXRhbG9nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCI+UGVybWlzc2lvbnM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiPkRlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5QZXJtaXNzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPlBlcm1pc3Npb25zPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgLS0KIyAkSWQ6IGJnX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xMSAyMDA5LzA1LzE4IDA5OjQwOjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfO8e3u4uXtIOrg8uDr7uMnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfT7/Dg4uvl7ejlIO3gIO7x7e7i7ej/IOrg8uDr7uMnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICfK6+Dx7uLlIOIg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfE7uHg4ugg7e7iIOrr4PEg4iDq4PLg6+7j4C4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICfE7uHg4ugg5evl7OXt8iDq+uwg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfE7uHg4ugg6uvg8SDiIOrg8uDr7uPgJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAn1PPt6vbo7u3g6+3u8fInOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjYXRhbGFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBTaXN0ZW1lcyBPVElDIChpYnNhbHV0KSAtIEFudG9uaW8gTGluZGUKIyAtLQojICRJZDogY3RfR2VuZXJhbENhdGFsb2cucG0sdiAxLjMgMjAwOS8wNS8xOCAwOTo0MDo0NiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdDYXTgbGVnIGdlbmVyYWwnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0afMgZGVsIGNhdOBsZWcgZ2VuZXJhbCc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0NsYXNzZSBkZSBjYXThbGVnJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnQWZlZ2lyIHVuYSBub3ZhIGNsYXNzZSBkZSBjYXTgbGVnJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnQWZlZ2lyIGFydGljbGUgZGUgY2F04GxlZyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ0FmZWdpciBjbGFzc2UgZGUgY2F04GxlZyc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmNpb25hbGl0YXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyBDb3B5cmlnaHQgKEMpIDIwMTAgTzJCUy5jb20sIHMgci5vLiBKYWt1YiBIYW51cwojIC0tCiMgJElkOiBjel9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMTEgMjAxMC8wMi8yMiAxMjowMTo1MiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnSGxhdm7tIEthdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdTcHLhdmEgSGxhdm7taG8gS2F0YWxvZ3UnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdU+O1keSBLYXRhbG9ndSc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ1D4aWRhdCBOb3ZvdSBU+O1kdSBLYXRhbG9ndS4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdQ+GlkYXQgUG9sb75rdSBLYXRhbG9ndSc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ1D4aWRhdCBU+O1kdSBLYXRhbG9ndSc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmtjaW9uYWxpdGEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHByb3ZpZGVzIGRhIChEYW5pc2gpIGxhbmd1YWdlIHRyYW5zbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkYV9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMSAyMDEwLzA2LzI1IDA4OjU0OjU1IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0dlbmVyYWwgS2F0YWxvZyc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlbmVyYWwgS2F0YWxvZyBNYW5hZ2VtZW50JzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnS2F0YWxvZyBLbGFzc2UnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdUaWxm+Gogbnkga2F0YWxvZyBrbGFzc2UuJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnVGlsZvhqIGthdGFsb2cgcG9zdCc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ1RpbGb4aiBLYXRhbG9nIGtsYXNzZSc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmt0aW9uYWxpdGV0JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xNCAyMDA5LzA1LzE4IDA5OjQwOjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0thdGFsb2cgS2xhc3NlJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnRWluZSBuZXVlIEthdGFsb2cgS2xhc3NlIGhpbnp1ZvxnZW4uJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnS2F0YWxvZyBFaW50cmFnIGhpbnp1ZvxnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdLYXRhbG9nIEtsYXNzZSBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua3Rpb25hbGl05HQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwZXJzaWFuIChmYXJzaSkgdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgQWZzaGFyIE1vaGViYmkgPGFmc2hhci5tb2hlYmJpIGF0IGdtYWlsLmNvbT4KIyAtLQojICRJZDogZmFfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEgMjAwOS8wNy8yMCAwOTo1OTozNyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfZhdiv24zYsduM2Kog2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAn2YHZh9ix2LPYqiDaqdmE2KfYs9uMJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDZgdmH2LHYs9iqINqp2YTYp9iz24wuJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDbjNqpINmC2YTZhSDZgdmH2LHYs9iqJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDaqdmE2KfYsyDZgdmH2LHYs9iq24wnOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICfaqdin2LHaqdix2K/bjCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBmcmVuY2ggdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPbGl2aWVyIFNhbGxvdSA8b2xpdmllci5zYWxsb3UgYXQgaXJpc2EuZnI+CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmcl9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMiAyMDA5LzA4LzA0IDEyOjI5OjAxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0NhdGFsb2d1ZSBH6W7pcmFsJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbiBkdSBDYXRhbG9ndWUgR+lu6XJhbCc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0NsYXNzZSBkZSBDYXRhbG9ndWUnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdBam91dGVyIHVuZSBub3V2ZWxsZSBjbGFzc2VzIGRlIENhdGFsb2d1ZS4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdBam91dGVyIHVuIEVsZW1lbnQgYXUgQ2F0YWxvZ3VlJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnQWpvdXRlciB1bmUgQ2xhc3NlIGRlIENhdGFsb2d1ZSc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0ZvbmN0aW9ubmFsaXTpJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBzcGFuaXNoIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBBcXVpbGVzIENvaGVuCiMgLS0KIyAkSWQ6IGVzX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnQ2F0YWxvZ28gR2VuZXJhbCc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rp824gZGVsIENhdGFsb2dvIEdlbmVyYWwnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdDbGFzZSBkZSBDYXRhbG9nbyc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ0HxYWRpciB1bmEgbnVldmEgQ2xhc2UgYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdB8WFkaXIgRWxlbWVudG8gYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdB8WFkaXIgQ2xhc2UgYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5jaW9uYWxpZGFkJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBpdGFsaWFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBpdF9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMSAyMDA5LzA1LzE4IDA5OjM3OjAwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0NhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbmUgZGVsIENhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2xhc3NlIGRpIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnQWdnaXVuZ2kgdW5hIG51b3ZhIENsYXNzZSBhbCBDYXRhbG9nbyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0FnZ2l1bmdpIEVsZW1lbnRvIGFsIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnQWdnaXVuZ2kgQ2xhc3NlIGFsIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVuemlvbmFsaXTgJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBEdXRjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwOSBNaWNoaWVsIEJlaWplbiA8bWljaGllbCAnYXQnIGJlZWZyZWVpdC5ubD4KIyAtLQojICRJZDogbmxfR2VuZXJhbENhdGFsb2cucG0sdiAxLjIgMjAwOS8wNy8yMCAxMzo0ODozMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgQmVoZWVyJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2F0YWxvZyBLbGFzc2UnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdFZW4gbmlldXdlIENhdGFsb2cgS2xhc3NlIHRvZXZvZWdlbic7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0NhdGFsb2cgSXRlbSB0b2V2b2VnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdDYXRhbG9nIEtsYXNzZSB0b2V2b2VnZW4nOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5jdGlvbmFsaXRlaXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwb2xpc2ggdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IE1hY2llaiBMb3N6YWpjCiMgLS0KIyAkSWQ6IHBsX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS40IDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnS2F0YWxvZyBns/N3bnknOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdaYXJ6sWR6YW5pZSBrYXRhbG9naWVtIGez83dueW0nOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICcnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdEb2RhaiBlbGVtZW50IGthdGFsb2d1JzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua2Nqb25hbG5vtuYnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwdF9CUiB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMTAgQ3Jpc3RpYW5vIEtvcm5k9nJmZXIsIGh0dHA6Ly93d3cuZG9yZmVyLmNvbS5ici8KIyAtLQojICRJZDogcHRfQlJfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEgMjAxMC8wMy8wMSAwOTo0MTo0MiBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdDYXThbG9nbyBHZXJhbCc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZG8gQ2F04WxvZ28gR2VyYWwnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdDbGFzc2UgZG8gQ2F04WxvZ28nOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdBZGljaW9uYSB1bWEgbm92YSBjbGFzc2UgYW8gY2F04WxvZ28uJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnQWRpY2lvbmFyIEl0ZW0gYW8gQ2F04WxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdBZGljaW9uYXIgQ2xhc3NlIGFvIENhdOFsb2dvJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVuY2lvbmFsaWRhZGUnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBydXNzaWFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBFZ29yIFRzaWxlbmtvIDxiZzhzIGF0IHN5bWxpbmsucnU+CiMgLS0KIyAkSWQ6IHJ1X0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4yIDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnzuH56Okg6uDy4Ovu4yc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9Pv8ODi6+Xt6OUg7uH56Owg6uDy4Ovu4+7sJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnyuvg8fEg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfE7uHg4ujy/CDt7uL76SDq6+Dx8SDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ8Tu4eDi6+Xt6OUg/evl7OXt8uAg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfE7uHg4uvl7ejlIOrr4PHx4CDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ9Tz7er26O7t4Ov87e7x8vwnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBDaGluZXNlIHNpbXBsZSB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogemhfQ05fR2VuZXJhbENhdGFsb2cucG0sdiAxLjIgMjAwOS8xMC8xNCAyMDo0MzoyMiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9DTl9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfX3MS/wrwnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfX3MS/wry53MDtJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnxL/CvLfWvLYnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfU9rzT0ru49tDCxL/CvLfWvLYnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICfU9rzTxL/CvM/uxL8nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfU9rzT0MLEv8K8t9a8tic7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ7mmxNzTw82+JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMjMgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0YWxvZyBpdGVtIGxpc3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJdGVtTGlzdCcgKSB7CiAgICAgICAgbXkgJENsYXNzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQ2xhc3MiICkgfHwgJyc7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGNsYXNzCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApIGlmICEkQ2xhc3M7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgICAgICAgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7CiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzcywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXZhaWxhYmlsaXR5IGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGl0ZW0gbGlzdAogICAgICAgIG15ICRJdGVtSURMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGxpc3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpCiAgICAgICAgICAgIGlmICEkSXRlbUlETGlzdCB8fCAhJXskSXRlbUlETGlzdH07CgogICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgIGZvciBteSAkSXRlbUlEICggc29ydCB7ICRJdGVtSURMaXN0LT57JGF9IGNtcCAkSXRlbUlETGlzdC0+eyRifSB9IGtleXMgJXskSXRlbUlETGlzdH0gKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGl0ZW0gbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtTGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRJdGVtRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgIFZhbGlkICAgID0+ICRWYWxpZExpc3R7ICRJdGVtRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBlZGl0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUVkaXQnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJJdGVtSUQiICk7CiAgICAgICAgaWYgKCAkSXRlbURhdGF7SXRlbUlEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgICAgICRJdGVtRGF0YXtDbGFzc30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJDbGFzcyIgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhe0NsYXNzfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhUmVmOwoKICAgICAgICAgICAgJUl0ZW1EYXRhID0gJXskSXRlbURhdGFSZWZ9OwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmcKICAgICAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgICAgICBteSAkVmFsaWRPcHRpb25TdHJnICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVmFsaWRPcHRpb25TdHJnID0+ICRWYWxpZE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVhY2ggcHJlZmVyZW5jZXMgc2V0dGluZwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSB9OwogICAgICAgIH0KCiAgICAgICAgSVRFTToKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewoKICAgICAgICAgICAgIyBza2lwIGl0ZW1zIHRoYXQgZG9uJ3QgYmVsb25nIHRvIHRoZSBjbGFzcwogICAgICAgICAgICBuZXh0IGlmICRQcmVmZXJlbmNlc3skSXRlbX0tPntDbGFzc30KICAgICAgICAgICAgICAgICAgICAmJiAkUHJlZmVyZW5jZXN7JEl0ZW19LT57Q2xhc3N9IG5lICRJdGVtRGF0YXtDbGFzc307CgogICAgICAgICAgICAjIGZpbmQgb3V0cHV0IG1vZHVsZQogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMnOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBvYmplY3QgZm9yIHRoaXMgcHJlZmVyZW5jZXMgaXRlbQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGFsbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSggR2VuZXJhbENhdGFsb2dEYXRhID0+IHsgJUl0ZW1EYXRhLCAlUGFyYW0gfSApOwogICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYoICRQYXJhbUl0ZW0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgIHx8IHJlZiggJFByZWZlcmVuY2VzeyRJdGVtfS0+e0RhdGF9ICkgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbUl0ZW0tPnsnT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57QmxvY2t9IHx8ICdPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NBZGQKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0Q2xhc3NBZGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXRDbGFzc0V4aXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzRXhpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbVNhdmUnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ2xhc3MgSXRlbUlEIE5hbWUgVmFsaWRJRCBDb21tZW50KSkgewogICAgICAgICAgICAkSXRlbURhdGF7JFBhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGNsYXNzCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgIGlmICEkSXRlbURhdGF7Q2xhc3N9IHx8ICRJdGVtRGF0YXtDbGFzc30gZXEgJ05FVyc7CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIG15ICRJdGVtSUQgPSAkSXRlbURhdGF7SXRlbUlEfTsKICAgICAgICBpZiAoICRJdGVtRGF0YXtJdGVtSUR9IGVxICdORVcnICkgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEl0ZW1JRCA9ICRTdWNjZXNzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgIG15ICRHQ0RhdGEgICAgICA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KCBJdGVtSUQgPT4gJEl0ZW1JRCApOwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgICAgIG15ICROb3RlICAgICAgICA9ICcnOwoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgfTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSXRlbSAoIGtleXMgJVByZWZlcmVuY2VzICkgewogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMnOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIEdlbmVyYWxDYXRhbG9nRGF0YSA9PiAkR0NEYXRhICk7CiAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1JdGVtLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQYXJhbUl0ZW0tPntOYW1lfSB9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICA9PiAkR0NEYXRhLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KCBJbmZvID0+ICRPYmplY3QtPkVycm9yKCkgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKSBpZiAhJFN1Y2Nlc3M7CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcgY2xhc3MgbGlzdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249SXRlbUxpc3QmQ2xhc3M9JEl0ZW1EYXRhe0NsYXNzfSIKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjYXRhbG9nIGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3MnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJENsYXNzICggQHskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3NMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMucG0sdiAxLjEgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklECiAgICAgICAgUGFyYW1PYmplY3QgQ29uZmlnSXRlbSBHZW5lcmFsQ2F0YWxvZ09iamVjdCBFbmNvZGVPYmplY3QgTWFpbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgZGllICJHb3Qgbm8gJE9iamVjdCEiIGlmICggISRTZWxmLT57JE9iamVjdH0gKTsKICAgIH0KCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFBhcmFtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtcyA9ICgpOwogICAgbXkgJEdldFBhcmFtID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57UHJlZktleX0gKTsKCiAgICBpZiAoICFkZWZpbmVkKCRHZXRQYXJhbSkgKSB7CiAgICAgICAgJEdldFBhcmFtCiAgICAgICAgICAgID0gZGVmaW5lZCggJFBhcmFte0dlbmVyYWxDYXRhbG9nRGF0YX0tPnsgJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9IH0gKQogICAgICAgICAgICA/ICRQYXJhbXtHZW5lcmFsQ2F0YWxvZ0RhdGF9LT57ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSB9CiAgICAgICAgICAgIDogJFNlbGYtPntDb25maWdJdGVtfS0+e0RhdGFTZWxlY3RlZH07CiAgICB9CgogICAgaWYgKCAhKCBkZWZpbmVkICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gJiYgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSApICkgewogICAgICAgICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gPSAnVGV4dCc7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57QmxvY2t9IGVxICdQZXJtaXNzaW9uJyApIHsKICAgICAgICAkUGFyYW17RGF0YX0gICAgICAgICA9IHsgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdCggVmFsaWQgPT4gMSApIH07CiAgICAgICAgJFBhcmFte1Bvc3NpYmxlTm9uZX0gPSAxOwogICAgICAgICRQYXJhbXtCbG9ja30gICAgICAgID0gJ09wdGlvbic7CiAgICB9CgogICAgcHVzaCgKICAgICAgICBAUGFyYW1zLAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBQYXJhbXM7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte0dldFBhcmFtfSB9ICkgewogICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXtHZXRQYXJhbX0tPnskS2V5fSB9OwogICAgICAgIGZvciBteSAkVmFsdWUgKEBBcnJheSkgewoKICAgICAgICAgICAgIyBwcmVmIHVwZGF0ZSBkYgogICAgICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRWYWx1ZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntNZXNzYWdlfSA9ICdQcmVmZXJlbmNlcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnOwogICAgcmV0dXJuIDE7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAkU2VsZi0+e0Vycm9yfSB8fCAnJzsKfQoKc3ViIE1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntNZXNzYWdlfSB8fCAnJzsKfQoKMTsK
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbkdlbmVyYWxDYXRhbG9nLmR0bCx2IDEuOCAyMDA5LzEwLzA3IDEzOjE4OjE4IHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtRWRpdCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJORVciPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBDYXRhbG9nIEl0ZW0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNsYXNzT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbUVkaXQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iTkVXIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iTkVXIj4KICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgQ2F0YWxvZyBDbGFzcyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI2MCUiPiRUZXh0eyJDYXRhbG9nIENsYXNzIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1JdGVtTGlzdCZDbGFzcz0kTFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDbGFzcyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In06PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjYwJSI+JFFEYXRheyJDbGFzcyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyJWYWxpZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1JdGVtRWRpdCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1TYXZlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IiRRRGF0YXsiSXRlbUlEIn0iPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikl0ZW0ifSAkVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0FkZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjEwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0FkZCAtLT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0V4aXN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzRXhpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjEwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkUURhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBzaXplPSIzMCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifTo8YnIvPjxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9pPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBzaXplPSIzMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgo8IS0tIGR0bDpibG9jazpUZXh0QXJlYSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiJERhdGF7IkRlc2MifSJ9KTwvaT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHJvd3M9IiRRRGF0YXsiUm93cyJ9IiBjb2xzPSIkUURhdGF7IkNvbHMifSI+JFFEYXRheyJTZWxlY3RlZElEIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkUURhdGF7IktleSJ9In06PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CjwhLS0gZHRsOmJsb2NrOlVwbG9hZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiRRRGF0YXsiS2V5In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdHlwZT0iZmlsZSIgc2l6ZT0iMzAiIGNsYXNzPSJmaXhlZCIvPjxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIiPiRRRGF0YXsiRmlsZW5hbWUifTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CjwhLS0gZHRsOmJsb2NrOlBhc3N3b3JkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iIiBzaXplPSIzMCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGFzc3dvcmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWYWxpZCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlZhbGlkT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ2FjaGVJbnRlcm5hbC5wbSAtIGFsbCBjYWNoZSBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENhY2hlSW50ZXJuYWwucG0sdiAxLjQuMi4xIDIwMTEvMDQvMDcgMjA6MTU6NTYgdWIgRXhwICQKIyAkT2xkSWQ6IENhY2hlSW50ZXJuYWwucG0sdiAxLjkgMjAxMC8xMS8zMCAxMzoxMToxMSBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWNoZTsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40LjIuMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWwgLSBjYWNoZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNhY2hlIGZ1bmN0aW9ucyBmb3IgaW50ZXJuYWwgY2FjaGUgbWFuYWdlbWVudC4KCk5vdGljZToKVGhpcyBtb2R1bGUgaXMgc3RvcmluZyB0aGUgY2FjaGUgaW5mb3JtYXRpb24gaW4gbWVtb3J5IGFuZCBhbHNvIHBlcm1hbmVudGx5IChlLiBnLiBpbiBmaWxlIHN5c3RlbSkuClNvIHlvdSBuZWVkIHRvIHRha2UgY2FyZSwgdGhhdCB5b3UgaGF2ZSBub3Qgc2V2ZXJhbCBpbnN0YW5jZXMgb2YgdGhlIENhY2hlSW50ZXJuYWxPYmplY3QgYXQgb25lCnJ1bnRpbWUsIGJlY2F1c2UgdGhlIGluIG1lbW9yeSBjYWNoZSB3aWxsIGZhaWwgdGhlbi4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWw7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJENhY2hlSW50ZXJuYWxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ09iamVjdE5hbWUnLCAjIG9ubHkgQS16IGNoYXJzIHVzYWJsZQogICAgICAgIFRUTCAgICAgICAgICA9PiA2MCAqIDYwICogMjQsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIDA9b2ZmOyAxPXNldCtnZXRfY2FjaGU7IDI9K2RlbGV0ZStnZXRfcmVxdWVzdDsKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoTWFpbk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICBmb3IgKHF3KFR5cGUgVFRMKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57VHlwZX0gPSAnQ2FjaGVJbnRlcm5hbCcgLiAkU2VsZi0+e1R5cGV9OwoKICAgIG15ICRDYWNoZVBlcm1hbmVudCA9IDE7CgogICAgIyAgICAkQ2FjaGVQZXJtYW5lbnQgPSAwOwoKICAgIGlmICgkQ2FjaGVQZXJtYW5lbnQpIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDYWNoZS0+bmV3KCVQYXJhbSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTZXQoKQoKc2V0IGEgbmV3IGNhY2hlCgogICAgJENhY2hlSW50ZXJuYWxPYmplY3QtPlNldCgKICAgICAgICBLZXkgICA9PiAnU29tZUtleScsCiAgICAgICAgVmFsdWUgPT4gJ1NvbWUgVmFsdWUnLAogICAgKTsKCj1jdXQKCnN1YiBTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhLZXkgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgcnVudGltZSBjYWNoZQogICAgJFNlbGYtPntDYWNoZX0tPnsgJFBhcmFte0tleX0gfSA9ICRQYXJhbXtWYWx1ZX07CgogICAgIyBzZXQgcGVybWFuZW50IGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57VHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e1RUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gR2V0KCkKCnJldHVybiBhIGNhY2hlCgogICAgbXkgJFZhbHVlID0gJENhY2hlSW50ZXJuYWxPYmplY3QtPkdldCgKICAgICAgICBLZXkgID0+ICdTb21lS2V5JywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoS2V5KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHJ1bnRpbWUgY2FjaGUKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+eyAkUGFyYW17S2V5fSB9IGlmIGV4aXN0cyAkU2VsZi0+e0NhY2hlfS0+eyAkUGFyYW17S2V5fSB9OwoKICAgICMgY2hlY2sgcGVybWFuZW50IGNhY2hlCiAgICBteSAkQ2FjaGU7CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRDYWNoZSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkUGFyYW17S2V5fSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIGlmICFkZWZpbmVkICRDYWNoZTsKCiAgICAjIHNldCBydW50aW1lIGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlfS0+eyAkUGFyYW17S2V5fSB9ID0gJENhY2hlOwoKICAgIHJldHVybiAkQ2FjaGU7Cn0KCj1pdGVtIERlbGV0ZSgpCgpkZWxldGUgYSBjYWNoZQoKICAgICRDYWNoZUludGVybmFsT2JqZWN0LT5EZWxldGUoCiAgICAgICAgS2V5ICA9PiAnU29tZUtleScsCiAgICApOwoKPWN1dAoKc3ViIERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEtleSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgcnVudGltZSBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57ICRQYXJhbXtLZXl9IH07CgogICAgIyBjaGVjayBwZXJtYW5lbnQgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e1R5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENsZWFuVXAoKQoKZGVsZXRlIGFsbCBjYWNoZXMKCiAgICAkQ2FjaGVJbnRlcm5hbE9iamVjdC0+Q2xlYW5VcCgpOwoKSWYgYW5vdGhlciBjYWNoZSB0eXBlIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAsIHlvdSBjYW4KdXNlIHRoZSBwYXJhbWV0ZXIgJ090aGVyVHlwZScuCgogICAgJENhY2hlSW50ZXJuYWxPYmplY3QtPkNsZWFuVXAoT3RoZXJUeXBlID0+ICdTb21lVHlwZScpOwoKVGhpcyBpcyB1c2VmdWwgZm9yIGNsZWFuaW5nIHVwIGRlcGVuZGVudCBjYWNoZSBlbnRyaWVzIGFmdGVyCnRoZSBtb2RpZmljYXRpb24gb2Ygb2JqZWN0cyAoZm9yIGV4YW1wbGUsIGNsZWFuaW5nIHVwIHRoZSBncm91cApjYWNoZSBhZnRlciBtb2RpZnlpbmcgYWdlbnRzKS4KCk5PVEU6IFRoaXMgJ090aGVyVHlwZSctY2xlYW51cCBvbmx5IGFmZmVjdHMgcGVybWFuZW50IGNhY2hlcy4KSW4tbWVtb3J5LWNhY2hlcyBpbiBvdGhlciBDYWNoZUludGVybmFsIG9iamVjdHMgY2Fubm90IGJlIGNsZWFuZWQKdXAgcHJlc2VudGx5LCB0aGVyZWZvcmUgYSByZWZhY3RvcmluZyBvZiB0aGUgZW50aXJlIGNhY2hpbmcgYXJjaGl0ZWN0dXJlCndpbGwgYmUgbmVjY2Vzc2FyeS4KCj1jdXQKCnN1YiBDbGVhblVwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgYWxsIHJ1bnRpbWUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGV9ID0gdW5kZWY7CgogICAgIyBkZWxldGUgcGVybWFuZW50IGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICBpZiAoICRQYXJhbXtPdGhlclR5cGV9ICkgewogICAgICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ2FjaGVJbnRlcm5hbCcgLiAkUGFyYW17T3RoZXJUeXBlfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntUeXBlfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNC4yLjEgJCAkRGF0ZTogMjAxMS8wNC8wNyAyMDoxNTo1NiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2cucG0sdiAxLjUyIDIwMTAvMDYvMTQgMTE6MDY6NDggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNTIgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZyAtIGdlbmVyYWwgY2F0YWxvZyBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGdlbmVyYWwgY2F0YWxvZyBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGxvYWQgZ2VuZXJhdG9yIHByZWZlcmVuY2VzIG1vZHVsZQogICAgbXkgJEdlbmVyYXRvck1vZHVsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNNb2R1bGUnKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREInOwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmF0b3JNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9ID0gJEdlbmVyYXRvck1vZHVsZS0+bmV3KCVQYXJhbSk7CiAgICB9CgogICAgIyBjcmVhdGUgQ2FjaGVJbnRlcm5hbCBvYmplY3QKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbC0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICBUVEwgID0+IDYwICogNjAgKiAzLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENsYXNzTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIG9mIGFsbCBnZW5lcmFsIGNhdGFsb2cgY2xhc3NlcwoKICAgIG15ICRBcnJheVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+Q2xhc3NMaXN0KCk7Cgo9Y3V0CgpzdWIgQ2xhc3NMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUKGdlbmVyYWxfY2F0YWxvZ19jbGFzcykgJwogICAgICAgICAgICAuICdGUk9NIGdlbmVyYWxfY2F0YWxvZyBPUkRFUiBCWSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDbGFzc0xpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENsYXNzTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgIG15ICRDYWNoZUtleSA9ICdDbGFzc0xpc3QnOwogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQENsYXNzTGlzdCwKICAgICk7CgogICAgcmV0dXJuIFxAQ2xhc3NMaXN0Owp9Cgo9aXRlbSBDbGFzc1JlbmFtZSgpCgpyZW5hbWUgYSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKCiAgICBteSAkVHJ1ZSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OlN0YXRlJywKICAgICAgICBDbGFzc05ldyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7Cgo9Y3V0CgpzdWIgQ2xhc3NSZW5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NPbGQgQ2xhc3NOZXcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtDbGFzc05ld30gZXEgJFBhcmFte0NsYXNzT2xkfTsKCiAgICAjIGNoZWNrIGlmIG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc05ld30gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRBbHJlYWR5RXhpc3RzID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFscmVhZHlFeGlzdHMgPSAxOwogICAgfQoKICAgIGlmICgkQWxyZWFkeUV4aXN0cykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgcmVuYW1lIGNsYXNzICRQYXJhbXtDbGFzc09sZH0hIE5ldyBjbGFzc25hbWUgYWxyZWFkeSBleGlzdHMuIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkNsZWFuVXAoKTsKCiAgICAjIHJlbmFtZSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgZ2VuZXJhbF9jYXRhbG9nIFNFVCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3NOZXd9LCBcJFBhcmFte0NsYXNzT2xkfSBdLAogICAgKTsKfQoKPWl0ZW0gSXRlbUxpc3QoKQoKcmV0dXJuIGEgbGlzdCBhcyBoYXNoIHJlZmVyZW5jZSBvZiBvbmUgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJEhhc2hSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIFZhbGlkICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgICAgIFByZWZlcmVuY2VzICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQge30KICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAyLCAgICAgICAgICAgICAgICAgICAgICMgb3Igd2hhdGV2ZXIgcHJlZmVyZW5jZXMgY2FuIGJlIHVzZWQKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBJdGVtTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzcyEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgIG15ICRQcmVmZXJlbmNlc0NhY2hlS2V5ID0gJyc7CiAgICBteSAkUHJlZmVyZW5jZXNUYWJsZSAgICA9ICcnOwogICAgbXkgJFByZWZlcmVuY2VzV2hlcmUgICAgPSAnJzsKICAgIG15IEBQcmVmZXJlbmNlc0JpbmQ7CgogICAgIyBoYW5kbGUgZ2l2ZW4gcHJlZmVyZW5jZXMKICAgIGlmICggZXhpc3RzICRQYXJhbXtQcmVmZXJlbmNlc30gJiYgcmVmICRQYXJhbXtQcmVmZXJlbmNlc30gZXEgJ0hBU0gnICkgewoKICAgICAgICAkUHJlZmVyZW5jZXNUYWJsZSA9ICcsIGdlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyc7CiAgICAgICAgbXkgQFdoZXJlczsKCiAgICAgICAgIyBhZGQgYWxsIHByZWZlcmVuY2VzIGdpdmVuIHRvIHdoZXJlLWNsYXVzZQogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW17UHJlZmVyZW5jZXN9IH0gKSB7CgogICAgICAgICAgICBpZiAoIHJlZiggJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9ICkgbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSA9IFsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFdoZXJlcywgJyhwcmVmX2tleSA9ID8gQU5EIHByZWZfdmFsdWUgSU4gKCcKICAgICAgICAgICAgICAgIC4gam9pbiggJywgJywgbWFwIHsnPyd9IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9ICkKICAgICAgICAgICAgICAgIC4gJykpJzsKCiAgICAgICAgICAgIHB1c2ggQFByZWZlcmVuY2VzQmluZCwgXCRLZXksIG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9OwoKICAgICAgICAgICAgIyBhZGQgZnVuY3Rpb25hbGl0eSBsaXN0IHRvIGNhY2hlIGtleQogICAgICAgICAgICAkUHJlZmVyZW5jZXNDYWNoZUtleSAuPSAnIyMjIycgaWYgJFByZWZlcmVuY2VzQ2FjaGVLZXk7CiAgICAgICAgICAgICRQcmVmZXJlbmNlc0NhY2hlS2V5IC49IGpvaW4gcXsjIyMjfSwgJEtleSwgbWFwIHskX30gQHsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IH07CiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXNXaGVyZSA9ICcgQU5EICcgLiBqb2luICcgQU5EICcsIEBXaGVyZXM7CiAgICB9CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJFByZWZlcmVuY2VzVGFibGUgIgogICAgICAgIC4gIldIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gJFByZWZlcmVuY2VzV2hlcmUgIjsKICAgIG15IEBCSU5EID0gKCBcJFBhcmFte0NsYXNzfSwgQFByZWZlcmVuY2VzQmluZCApOwoKICAgICMgYWRkIHZhbGlkIHN0cmluZyB0byBzcWwgc3RyaW5nCiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIHZhbGlkX2lkID0gMSAnOwogICAgfQoKICAgICMgY3JlYXRlIGNhY2hlIGtleQogICAgbXkgJENhY2hlS2V5CiAgICAgICAgPSAnSXRlbUxpc3Q6OicgLiAkUGFyYW17Q2xhc3N9IC4gJyMjIyMnIC4gJFBhcmFte1ZhbGlkfSAuICcjIyMjJyAuICRQcmVmZXJlbmNlc0NhY2hlS2V5OwoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICBteSAkQ2FjaGUgPSAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5HZXQoIEtleSA9PiAkQ2FjaGVLZXkgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgY2hlY2sgaXRlbQogICAgaWYgKCAhJURhdGEgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDbGFzcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVEYXRhLAogICAgKTsKCiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSBJdGVtR2V0KCkKCmdldCBhIGdlbmVyYWwgY2F0YWxvZyBpdGVtCgpSZXR1cm4KICAgICRJdGVtRGF0YXtJdGVtSUR9CiAgICAkSXRlbURhdGF7Q2xhc3N9CiAgICAkSXRlbURhdGF7TmFtZX0KICAgICRJdGVtRGF0YXtWYWxpZElEfQogICAgJEl0ZW1EYXRhe0NvbW1lbnR9CiAgICAkSXRlbURhdGF7Q3JlYXRlVGltZX0KICAgICRJdGVtRGF0YXtDcmVhdGVCeX0KICAgICRJdGVtRGF0YXtDaGFuZ2VUaW1lfQogICAgJEl0ZW1EYXRhe0NoYW5nZUJ5fQoKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICBJdGVtSUQgPT4gMywKICAgICk7CgogICAgb3IKCiAgICBteSAkSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgID0+ICdJdGVtIE5hbWUnLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtSUR9ICYmICggISRQYXJhbXtDbGFzc30gfHwgISRQYXJhbXtOYW1lfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtSUQgT1IgQ2xhc3MgYW5kIE5hbWUhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgJzsKICAgIG15IEBCSU5EOwoKICAgICMgYWRkIG9wdGlvbnMgdG8gc3FsIHN0cmluZwogICAgaWYgKCAkUGFyYW17Q2xhc3N9ICYmICRQYXJhbXtOYW1lfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnSXRlbUdldDo6Q2xhc3M6OicgLiAkUGFyYW17Q2xhc3N9IC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgPSAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5HZXQoIEtleSA9PiAkQ2FjaGVLZXkgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAgICAgIyBhZGQgY2xhc3MgYW5kIG5hbWUgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2dlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JzsKICAgICAgICBwdXNoIEBCSU5ELCAoIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9ICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnSXRlbUdldDo6SXRlbUlEOjonIC4gJFBhcmFte0l0ZW1JRH07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgYWRkIGl0ZW0gaWQgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2lkID0gPyc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtJdGVtSUR9OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQklORCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVJdGVtRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gICAgID0gJFJvd1swXTsKICAgICAgICAkSXRlbURhdGF7Q2xhc3N9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRJdGVtRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJEl0ZW1EYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1szXTsKICAgICAgICAkSXRlbURhdGF7Q29tbWVudH0gICAgPSAkUm93WzRdIHx8ICcnOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNV07CiAgICAgICAgJEl0ZW1EYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s2XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzddOwogICAgICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOF07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICEkSXRlbURhdGF7SXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0l0ZW0gbm90IGZvdW5kIGluIGRhdGFiYXNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCggSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9ICk7CgogICAgIyBtZXJnZSBoYXNoCiAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgJUl0ZW1EYXRhID0gKCAlSXRlbURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpDbGFzczo6JyAuICRJdGVtRGF0YXtDbGFzc30gLiAnOjonIC4gJEl0ZW1EYXRhe05hbWV9LAogICAgICAgIFZhbHVlID0+IFwlSXRlbURhdGEsCiAgICApOwogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpJdGVtSUQ6OicgLiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICBWYWx1ZSA9PiBcJUl0ZW1EYXRhLAogICAgKTsKCiAgICByZXR1cm4gXCVJdGVtRGF0YTsKfQoKPWl0ZW0gSXRlbUFkZCgpCgphZGQgYSBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkSXRlbUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb21tZW50KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSAnJzsKICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcykpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROb0FkZDsKICAgIHdoaWxlICggJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTm9BZGQgPSAxOwogICAgfQoKICAgICMgYWJvcnQgaW5zZXJ0IG9mIG5ldyBpdGVtLCBpZiBpdGVtIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkTm9BZGQpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkNsZWFuVXAoKTsKCiAgICAjIGluc2VydCBuZXcgaXRlbQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICcoZ2VuZXJhbF9jYXRhbG9nX2NsYXNzLCBuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NsYXNzfSwgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyBpdGVtCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRJdGVtSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRJdGVtSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkSXRlbUlEOwp9Cgo9aXRlbSBJdGVtVXBkYXRlKCkKCnVwZGF0ZSBhIGV4aXN0aW5nIGdlbmVyYWwgY2F0YWxvZyBpdGVtCgogICAgbXkgJFRydWUgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1VcGRhdGUoCiAgICAgICAgSXRlbUlEICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnSXRlbSBOYW1lJywKICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9ICcnOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzKSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIG9mIGl0ZW0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDbGFzczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENsYXNzID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICEkQ2xhc3MgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gbm90IGZvdW5kIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkQ2xhc3MsIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAxOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtJdGVtSUR9IG5lICRSb3dbMF0gKSB7CiAgICAgICAgICAgICRVcGRhdGUgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkVXBkYXRlICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUICcKICAgICAgICAgICAgLiAnbmFtZSA9ID8sIHZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoKQoKc2V0IEdlbmVyYWxDYXRhbG9nIHByZWZlcmVuY2VzCgogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICAgICAgS2V5ICAgID0+ICdVc2VyQ29tbWVudCcsCiAgICAgICAgVmFsdWUgID0+ICdzb21lIGNvbW1lbnQnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgI0RlbGV0ZSBDYWNoZS4uLgogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+Q2xlYW5VcCgpOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldChAXyk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoKQoKZ2V0IEdlbmVyYWxDYXRhbG9nIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJFF1ZXVlT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoQF8pOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUyICQgJERhdGU6IDIwMTAvMDYvMTQgMTE6MDY6NDggJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cvUHJlZmVyZW5jZXNEQi5wbSAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFByZWZlcmVuY2VzREIucG0sdiAxLjEgMjAwOS8xMC8wNyAxMzoxODowNSByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQiAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKCj1oZWFkMSBTWU5PUFNJUwoKc29tZSBwcmVmZXJlbmNlcyBmdW5jdGlvbnMgZm9yIGdlbmVyYWwgY2F0YWxvZwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgcHJlZmVyZW5jZXMgdGFibGUgZGF0YQogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSAgICAgID0gJ2dlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9ICAgPSAncHJlZl9rZXknOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ID0gJ3ByZWZfdmFsdWUnOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlR2NJRH0gID0gJ2dlbmVyYWxfY2F0YWxvZ19pZCc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KCkKClNldCBwcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gMTIzNCwKICAgICAgICBLZXkgICAgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgIFZhbHVlICA9PiAnb3BlcmF0aW9uYWwnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQgS2V5IFZhbHVlKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGRhdGEKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAiCiAgICAgICAgICAgIC4gIiRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyBBTkQgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSA9ID8iLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGluc2VydCBuZXcgZGF0YQogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gKCRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9LCAiCiAgICAgICAgICAgIC4gIiAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0pICIKICAgICAgICAgICAgLiAiIFZBTFVFUyAoPywgPywgPykiLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtWYWx1ZX0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoKQoKR2V0IGFsbCBQcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBxdWV1ZSBwcmVmZXJlbmNlcyBhcmUgYXZhaWxhYmxlCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0gIgogICAgICAgICAgICAuICIgRlJPTSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9IFdIRVJFICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICVEYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMTAvMDcgMTM6MTg6MDUgJAoKPWN1dAo=
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnQsdiAxLjIyIDIwMTAvMDUvMzEgMTU6Mzc6NTggY3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnR2VuZXJhbENhdGFsb2cnIC4gJENvdW50ZXIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1HZW5lcmFsQ2F0YWxvZy0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCiAgICApOwp9CgojIGNyZWF0ZSBuZWVkZWQgcmFuZG9tIGNsYXNzZXMKbXkgQENsYXNzUmFuZDsKCmZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICBwdXNoIEBDbGFzc1JhbmQsIGludCByYW5kIDFfMDAwXzAwMDsKfQoKIyBzdG9yZSBvcmlnaW5hbCBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nCm15ICRHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzUGVybWlzc2lvbnNPcmc7CmlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICRHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzUGVybWlzc2lvbnNPcmcKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJyktPntQZXJtaXNzaW9uc307Cn0KCiMgZW5hYmxlIGdlbmVyYWwgY2F0YWxvZyBwZXJtaXNzaW9uIHByZWZlcmVuY2VzIHNldHRpbmcgd2l0aCBhIGR1bW15IHRydWUgdmFsdWUKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI1Blcm1pc3Npb25zJywKICAgIFZhbHVlID0+IDEsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEl0ZW1EYXRhID0gWwoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICA9PiAnVGVzdEl0ZW0yJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0zJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBvbmUgdGVzdCBiZWZvcmUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTUnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTUnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnVGVzdEl0ZW01VVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMicsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMicsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTVVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICIgXHQgXG4gXHIgVW5pdCBUZXN0IDo6IFRlc3QgQ2xhc3MgXHQgXG4gXHIgIiAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0nLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgVGVzdCBJdGVtIFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdCBJdGVtIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc8KpJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJyDPkiDPoSBUZXN0IEl0ZW0gxqkgz54gJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcgz6Ag0K8gVGVzdCBDb21tZW50INGsINGgICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ8+SIM+hIFRlc3QgSXRlbSDGqSDPnicsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICfPoCDQryBUZXN0IENvbW1lbnQg0awg0aAnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3QgSXRlbSDGqSDJpCBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFRlc3QgQ29tbWVudCDRmSDRkiBVUERBVEUxICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCDRmSDRkiBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoYSBzZWNvbmQgaXRlbSB3aXRoIEZ1bmN0aW9uYWxpdHkgJ3Rlc3QxJykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNicsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNicsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHNldCBmdW5jdGlvbmFsaXR5IHRvICcnKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTZVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3NbdGVzdF0lKlxcJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3NbdGVzdF0lKlxcJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdbdGVzdF0lKlxcIFRlc3QgSXRlbSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICcgW3Rlc3RdJSpcXCBUZXN0IEl0ZW0gVVBEQVRFMSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyBbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdbdGVzdF0lKlxcIFRlc3QgSXRlbSBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtUHJlZmVyZW5jZXMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbVByZWZlcmVuY2VzJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgVGVzdCAgPT4gJ2hlbGxvIHdvcmxkJywKICAgICAgICAgICAgR3JvdXAgPT4gMzMsCiAgICAgICAgfSwKICAgICAgICBQcmVmZXJlbmNlc0dldCA9PiB7CiAgICAgICAgICAgIFRlc3QgID0+ICdoZWxsbyB3b3JsZCcsCiAgICAgICAgICAgIEdyb3VwID0+IDMzLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHByZWZlcmVuY2VzIG9mIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBzZXQKICAgIHsKICAgICAgICBQcmVmZXJlbmNlc1NldCA9PiB7CiAgICAgICAgICAgIFRlc3QgPT4gJ2hlbGxvJywKICAgICAgICAgICAgU2l6ZSA9PiAzOCwKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAnaGVsbG8nLAogICAgICAgICAgICBTaXplID0+IDM4LAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSAkTGFzdEFkZGVkSXRlbUlEOwpteSAlQWRkZWRJdGVtQ291bnRlcjsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IGl0ZW0KICAgICAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICV7ICRJdGVtLT57QWRkfSB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkSXRlbUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUFkZCgpIC0gSXRlbUtleTogJEl0ZW1JRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEl0ZW1JRCkgewoKICAgICAgICAgICAgICAgICMgc2V0IGxhc3QgaXRlbSBpZCB2YXJpYWJsZQogICAgICAgICAgICAgICAgJExhc3RBZGRlZEl0ZW1JRCA9ICRJdGVtSUQ7CgogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIGFkZGVkIGl0ZW0gY291bnRlcgogICAgICAgICAgICAgICAgJEFkZGVkSXRlbUNvdW50ZXJ7ICRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfSB9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRJdGVtSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtQWRkKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgY3JlYXRpb24gb2YgaXRlbSB1c2luZyBJdGVtSWQgYW5kIFVzZXJJRAogICAgICAgIG15ICRJdGVtR2V0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQtPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSBVc2luZyBJdGVtSUQgYW5kIFVzZXJJRCAtICRJdGVtQXR0cmlidXRlICIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiBpdGVtIHVzaW5nIENsYXNzIGFuZCBOYW1lCiAgICAgICAgbXkgJEl0ZW1HZXQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9LAogICAgICAgICAgICBOYW1lICA9PiAkSXRlbS0+e0FkZEdldH0tPntOYW1lfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQtPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSBVc2luZyBDbGFzcyBhbmQgTmFtZSAtICRJdGVtQXR0cmlidXRlICIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIGxhc3QgaXRlbSBpZCB2YXJhaWJsZQogICAgICAgIGlmICggISRMYXN0QWRkZWRJdGVtSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBOTyBMQVNUIElURU0gSUQgR0lWRU4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIGl0ZW0KICAgICAgICBteSAkVXBkYXRlU3VjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgICAgICV7ICRJdGVtLT57VXBkYXRlfSB9LAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGl0ZW0gd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtVXBkYXRlKCkgLSBJdGVtS2V5OiAkTGFzdEFkZGVkSXRlbUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtVXBkYXRlKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICRJdGVtR2V0MiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57VXBkYXRlfS0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGRhdGEgYWZ0ZXIgdXBkYXRlCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQyLT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gJEl0ZW1BdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9ICkgewoKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJEl0ZW0tPntQcmVmZXJlbmNlc1NldH0gfSApIHsKCiAgICAgICAgICAgICMgc2V0IHByZWZlcmVuY2VzCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkSXRlbS0+e1ByZWZlcmVuY2VzU2V0fS0+eyRLZXl9LAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNTZXQoKSAtICRLZXkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHByZWZlcmVuY2VzCiAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNHZXR9ICkgewogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0gfSApIHsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1ByZWZlcmVuY2VzR2V0fS0+eyRLZXl9IGVxICRQcmVmZXJlbmNlc3skS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNHZXQoKSAtICRLZXkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogUHJlZmVyZW5jZXNHZXQoKSAtICRLZXkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucyBmb3IgbGF0ZXIgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIGFycmF5cwpteSAlRXhpc3RpbmdDbGFzc2VzVG1wOwpJVEVNOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CiAgICBuZXh0IElURU0gaWYgISRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfTsKICAgICRFeGlzdGluZ0NsYXNzZXNUbXB7ICRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfSB9ID0gMTsKfQpteSBARXhpc3RpbmdDbGFzc2VzID0gc29ydCBrZXlzICVFeGlzdGluZ0NsYXNzZXNUbXA7CgpteSAlRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXA7CklURU06CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKICAgICRJdGVtLT57VXBkYXRlR2V0fS0+e0Z1bmN0aW9uYWxpdHl9IHx8PSAnJzsKICAgICRFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcHsgJEl0ZW0tPntVcGRhdGVHZXR9LT57RnVuY3Rpb25hbGl0eX0gfSA9IDE7Cn0KbXkgQEV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzID0gc29ydCBrZXlzICVFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcDsKCm15IEBOb25FeGlzdGluZ0NsYXNzZXMgPSAoICdVbml0VGVzdDo6Tm9FeGlzdGluZ0NsYXNzMScsICdVbml0VGVzdDo6Tm9FeGlzdGluZ0NsYXNzMicgKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc0xpc3QgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRDbGFzc0xpc3QxID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRDbGFzc0NvdW50ID0gMDsKICAgIGlmICggJENsYXNzTGlzdDEgJiYgcmVmICRDbGFzc0xpc3QxIGVxICdBUlJBWScgKSB7CiAgICAgICAgJENsYXNzQ291bnQgPSBncmVwIHsgJF8gZXEgJENsYXNzIH0gQHskQ2xhc3NMaXN0MX07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRDbGFzc0NvdW50LAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NMaXN0KCkgLSAkQ2xhc3MgbGlzdGVkIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBOb25FeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkSXRlbUxpc3QsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtICRDbGFzcyBub3QgZXhpc3RzIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRMaXN0Q291bnQgPSAnTlVMTCc7CiAgICBpZiAoIGRlZmluZWQgJEl0ZW1MaXN0ICYmIHJlZiAkSXRlbUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICRMaXN0Q291bnQgPSBrZXlzICV7JEl0ZW1MaXN0fTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpc3RDb3VudCwKICAgICAgICAkQWRkZWRJdGVtQ291bnRlcnskQ2xhc3N9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSAkQ2xhc3MgY29ycmVjdCBudW1iZXIgb2YgaXRlbXMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBQcmVmZXJlbmNlcyB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1JRCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgPT4gJENsYXNzLAogICAgICAgIE5hbWUgICAgPT4gJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgIEtleSAgICA9PiAnVW5pdFRlc3RQcmVmJywKICAgICAgICBWYWx1ZSAgPT4gJzEnLAogICAgKTsKCiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgVW5pdFRlc3RQcmVmID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRJdGVtTGlzdC0+eyRJdGVtSUR9LAogICAgICAgICdJdGVtIFByZWZlcmVuY2VzJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gQ2xhc3MgJENsYXNzIFByZWZlcmVuY2VzIG1hdGNoIiwKICAgICk7CgogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgS2V5ICAgID0+ICdVbml0VGVzdFByZWYnLAogICAgICAgIFZhbHVlICA9PiAnMicsCiAgICApOwoKICAgICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBVbml0VGVzdFByZWYgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJEl0ZW1MaXN0LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSBDbGFzcyAkQ2xhc3MgUHJlZmVyZW5jZXMgbm90IG1hdGNoIGFmdGVyIFByZWZlcmVuY2VzU2V0IENoYW5nZSIKICAgICk7CgogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1VcGRhdGUoCiAgICAgICAgSXRlbUlEICA9PiAkSXRlbUlELAogICAgICAgIE5hbWUgICAgPT4gJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFByZWZlcmVuY2VzIHRlc3QgMgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgo9cG9kCgpteSAlRnVuY3Rpb25hbGl0eUxpc3QxOwptYXAgeyAkRnVuY3Rpb25hbGl0eUxpc3QxeyRffSA9IDEgfSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXM7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEZ1bmN0aW9uYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkZ1bmN0aW9uYWxpdHlMaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEZ1bmN0aW9uYWxpdHlMaXN0ICYmIHJlZiAkRnVuY3Rpb25hbGl0eUxpc3QgZXEgJ0FSUkFZJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBGdW5jdGlvbmFsaXR5TGlzdCgpIC0gcmV0dXJuIGEgYXJyYXkgcmVmZXJlbmNlIiwKICAgICk7CgogICAgZm9yIG15ICRGdW5jdGlvbmFsaXR5ICggQHskRnVuY3Rpb25hbGl0eUxpc3R9ICkgewogICAgICAgIGRlbGV0ZSAkRnVuY3Rpb25hbGl0eUxpc3QxeyRGdW5jdGlvbmFsaXR5fTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiRTZWxmLT5UcnVlKAogICAgIWtleXMgJUZ1bmN0aW9uYWxpdHlMaXN0MSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkiLAopOwoKJFRlc3RDb3VudCsrOwoKPWN1dAoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMSAoY2hlY2sgbm9ybWFsIHJlbmFtZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcywKICAgICAgICBDbGFzc05ldyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpDTEFTUzoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRPbGRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIENsYXNzTmV3ID0+ICcgJyAuICRDbGFzcyAuICJSRSBOQSBNRSAyIFxuIFxyIFx0ICIsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGlkZW50aWNhbCBuYW1lIHRlc3QpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgQ2xhc3NOZXcgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gb2xkbmFtZSBhbmQgbmV3bmFtZSBpZGVudGljYWwiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDMgKG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgIE5hbWUgICAgICAgICAgPT4gJ0R1bW15JywKICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIENsYXNzTmV3ID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMl0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbnVwCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgcmVzdG9yZSBvcmlnaW5hbCBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnLAopOwoKMTsK
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnBtLHYgMS4xIDIwMDkvMTAvMDcgMTM6MTY6MjMgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpHZW5lcmFsQ2F0YWxvZy5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CiAgICB1c2UgdmFyOjpwYWNrYWdlc2V0dXA6OkdlbmVyYWxDYXRhbG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFhNTE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29kZU9iamVjdCA9IHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1pZ3JhdGUgJ2Z1bmN0aW9uYWxpdHknIHRvIGV4dGVybmFsIHRhYmxlCiAgICAkU2VsZi0+X01pZ3JhdGVGdW5jdGlvbmFsaXR5KCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTWlncmF0ZUZ1bmN0aW9uYWxpdHkoKQoKPWN1dAoKc3ViIF9NaWdyYXRlRnVuY3Rpb25hbGl0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgU0VMRUNUIGFsbCBmdW5jdGlvbmFsaXR5IHZhbHVlcwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGZ1bmN0aW9uYWxpdHkgRlJPTSBnZW5lcmFsX2NhdGFsb2cnLAogICAgKTsKCiAgICBteSBATGlzdDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbmV4dCBST1cgaWYgISRSb3dbMV07CgogICAgICAgIHB1c2ggQExpc3QsIFxAUm93OwogICAgfQoKICAgICMgc2F2ZSBlbnRyaWVzIGluIG5ldyB0YWJsZQogICAgZm9yIG15ICRFbnRyeSAoQExpc3QpIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PgogICAgICAgICAgICAgICAgJ0lOU0VSVCBJTlRPIGdlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyggZ2VuZXJhbF9jYXRhbG9nX2lkLCBwcmVmX2tleSwgcHJlZl92YWx1ZSApJwogICAgICAgICAgICAgICAgLiAnIFZBTFVFUyggPywgXCdGdW5jdGlvbmFsaXR5XCcsID8gKScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEVudHJ5LT5bMF0sIFwkRW50cnktPlsxXSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBkcm9wIGNvbHVtbiBpbgogICAgbXkgKCREcm9wKSA9ICRTZWxmLT57REJPYmplY3R9LT5TUUxQcm9jZXNzb3IoCiAgICAgICAgRGF0YWJhc2UgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2dlbmVyYWxfY2F0YWxvZycsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ0NvbHVtbkRyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnZnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlQWx0ZXInLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnRW5kJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICREcm9wLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMTAvMDcgMTM6MTY6MjMgJAoKPWN1dAo=