SystemMonitoring
2.1.1
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Init release for OTRS 2.4.
Basic mail interface to System Monitoring Suites. Also provides deeper integration to Nagios (Acknowledge on lock and Checkscript).
Einfache Email Schnittstelle zu System Monitoring Suites. Weitergehende Integration mit Nagios (Acknowledge on lock and Checkscript).
2.4.x
For configuration instructions please refer to the information in doc/SystemMonitoring.txt.
Eine Anleitung zur Konfiguration des SystemMonitoring Moduls findet sich in der Datei doc/SystemMonitoring.txt.
# check if config option exists
my $Config = $Self->{ConfigObject}->Get( 'PostMaster::PreFilterModule' );
# update/rename config option
if ($Config && $Config->{'0001-SystemMonitoring'} ) {
$Self->{SysConfigObject} = Kernel::System::Config->new( %{$Self} );
$Self->{SysConfigObject}->ConfigItemUpdate(
Valid => 1,
Key => 'PostMaster::PreFilterModule###00-SystemMonitoring',
Value => $Config->{'0001-SystemMonitoring'},
);
}
2009-07-22 05:21:54
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBvdHJzLk5hZ2lvc0NoZWNrLnBsIC0gT1RSUyBOYWdpb3MgY2hlY2tlcgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogb3Rycy5OYWdpb3NDaGVjay5wbCx2IDEuNyAyMDA5LzA3LzIxIDIwOjU3OjM0IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBRkZFUk8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgojIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojIG9yIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBGaW5kQmluIHF3KCRSZWFsQmluKTsKdXNlIGxpYiBkaXJuYW1lKCRSZWFsQmluKTsKdXNlIGxpYiBkaXJuYW1lKCRSZWFsQmluKSAuICcvS2VybmVsL2NwYW4tbGliJzsKCnVzZSBHZXRvcHQ6OlN0ZDsKbXkgJW9wdHM7CmdldG9wdCggJ2MnLCBcJW9wdHMgKTsKaWYgKCAkb3B0c3tofSApIHsKICAgIHByaW50ICJVc2FnZTogJEZpbmRCaW46OlNjcmlwdCBbLU4gKHJ1bnMgYXMgTmFnaW9zY2hlY2tlcildIFstdiAodmVyYm9zZSldIFstYyAvcGF0aC90by9jb25maWdfZmlsZV1cbiI7CiAgICBwcmludCAiXG4iOwogICAgZXhpdDsKfQoKaWYgKCAhJG9wdHN7Y30gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBOZWVkIC1jIENPTkZJR0ZJTEVcbiI7CiAgICBleGl0IDE7Cn0KZWxzaWYgKCAhLWUgJG9wdHN7Y30gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBObyBzdWNoIGZpbGUgJG9wdHN7Y31cbiI7CiAgICBleGl0IDE7Cn0KCiMgcmVhZCBjb25maWcgZmlsZQpteSAlQ29uZmlnOwpvcGVuIChteSAkSU4sICc8JywgJG9wdHN7Y30gKSB8fCBkaWUgIkVSUk9SOiBDYW4ndCBvcGVuICRvcHRze2N9OiAkIVxuIjsKbXkgJENvbnRlbnQgPSAnJzsKd2hpbGUgKDwkSU4+KSB7CiAgICAkQ29udGVudCAuPSAkXzsKfQppZiAoICFldmFsICRDb250ZW50ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogSW52YWxpZCBjb25maWcgZmlsZSAkb3B0c3tjfTogJEBcbiI7CiAgICBleGl0IDE7Cn0KCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwpteSAlQ29tbW9uT2JqZWN0ID0gKCk7CiRDb21tb25PYmplY3R7Q29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7RW5jb2RlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyglQ29tbW9uT2JqZWN0KTsKJENvbW1vbk9iamVjdHtMb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KCAlQ29tbW9uT2JqZWN0LCBMb2dQcmVmaXggPT4gJ290cnMuTmFnaW9zQ2hlY2snICk7CiRDb21tb25PYmplY3R7VGltZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TWFpbk9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7REJPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoJUNvbW1vbk9iamVjdCk7CgojIHNlYXJjaCB0aWNrZXRzCm15IEBUaWNrZXRJRHMgPSAkQ29tbW9uT2JqZWN0e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICV7ICRDb25maWd7U2VhcmNofSB9LAogICAgTGltaXQgID0+IDEwMF8wMDAsCiAgICBSZXN1bHQgPT4gJ0FSUkFZJywKICAgIFVzZXJJRCA9PiAxLAopOwpteSAkVGlja2V0Q291bnQgPSBzY2FsYXIgQFRpY2tldElEczsKCiMgdmVyYm9zZSBtb2RlCmlmICggJG9wdHN7dn0gKSB7CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CiAgICAgICAgbXkgJVRpY2tldCA9ICRDb21tb25PYmplY3R7VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKICAgICAgICBwcmludCBTVERFUlIgIiRUaWNrZXR7VGlja2V0SUR9OiRUaWNrZXR7VGlja2V0TnVtYmVyfVxuIjsKICAgIH0KfQoKIyBubyBjaGVja2VyIG1vZGUKaWYgKCAhJG9wdHN7Tn0gKSB7CiAgICBwcmludCAiJFRpY2tldENvdW50XG4iOwogICAgZXhpdCAwOwp9CgojIGNsZWFudXAgY29uZmlnIGZpbGUKbXkgJU1hcCA9ICgKICAgIG1heF9jcml0X3RyZXNoaG9sZCA9PiAnbWF4X2NyaXRfdHJlc2hvbGQnLAogICAgbWF4X3dhcm5fdHJlc2hob2xkID0+ICdtYXhfd2Fybl90cmVzaG9sZCcsCiAgICBtaW5fY3JpdF90cmVzaGhvbGQgPT4gJ21pbl9jcml0X3RyZXNob2xkJywKICAgIG1pbl93YXJuX3RyZXNoaG9sZCA9PiAnbWluX3dhcm5fdHJlc2hvbGQnLAopOwpmb3IgbXkgJFR5cGUgKCBrZXlzICVNYXAgKSB7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ3skVHlwZX0gKSB7CiAgICAgICAgcHJpbnQgU1RERVJSICJOT1RJQ0U6IFR5cG8gaW4gY29uZmlnIG5hbWUsIHVzZSAkTWFweyRUeXBlfSBpbnN0ZWFkIG9mICRUeXBlXG4iOwogICAgICAgICRDb25maWd7JE1hcHskVHlwZX19ID0gJENvbmZpZ3skVHlwZX07CiAgICAgICAgZGVsZXRlICRDb25maWd7JFR5cGV9OwogICAgfQp9CgojIGRvIGNyaXRpY2FsIGFuZCB3YXJuaW5nIGNoZWNrCmZvciBteSAkVHlwZSAocXcoY3JpdF90cmVzaG9sZCB3YXJuX3RyZXNob2xkKSkgewogICAgaWYgKCBkZWZpbmVkICRDb25maWd7ICdtaW5fJyAuICRUeXBlIH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlneyAnbWluXycgLiAkVHlwZSB9ID49ICRUaWNrZXRDb3VudCApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgIHByaW50ICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFR5cGUgPX4gL153YXJuXy8gKSB7CiAgICAgICAgICAgICAgICBwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IFdBUk5JTkcgJENvbmZpZ3tXQVJOX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCBkZWZpbmVkICRDb25maWd7ICdtYXhfJyAuICRUeXBlIH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlneyAnbWF4XycgLiAkVHlwZSB9IDw9ICRUaWNrZXRDb3VudCApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgIHByaW50ICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFR5cGUgPX4gL153YXJuXy8gKSB7CiAgICAgICAgICAgICAgICBwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IFdBUk5JTkcgJENvbmZpZ3tXQVJOX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojIHJldHVybiBvawpwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IE9LICRDb25maWd7T0tfVFhUfSAkVGlja2V0Q291bnR8dGlja2V0cz0kVGlja2V0Q291bnQ7JENvbmZpZ3ttaW5fd2Fybl90cmVzaG9sZH06JENvbmZpZ3ttYXhfd2Fybl90cmVzaG9sZH07JENvbmZpZ3ttaW5fY3JpdF90cmVzaG9sZH06JENvbmZpZ3ttYXhfY3JpdF90cmVzaG9sZH1cbiI7CmV4aXQgMDsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vUG9zdE1hc3Rlci9GaWx0ZXIvU3lzdGVtTW9uaXRvcmluZy5wbSAtIEJhc2ljIFN5c3RlbSBNb25pdG9yaW5nIEludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU3lzdGVtTW9uaXRvcmluZy5wbSx2IDEuNiAyMDA5LzA3LzIxIDIwOjQ0OjA2IGpiIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZzsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdmFycyBxdygkVkVSU0lPTik7CgokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBUaWNrZXRPYmplY3QgVGltZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIERlZmF1bHQgU2V0dGluZ3MKICAgICRTZWxmLT57Q29uZmlnfSA9IHsKICAgICAgICBTdGF0ZVJlZ0V4cCAgICAgICA9PiAnXHMqU3RhdGU6XHMrKFxTKyknLAogICAgICAgIEZyb21BZGRyZXNzUmVnRXhwID0+ICdzeXNtb25AZXhhbXBsZS5jb20nLAogICAgICAgIE5ld1RpY2tldFJlZ0V4cCAgID0+ICdDUklUSUNBTHxET1dOJywKICAgICAgICBDbG9zZVRpY2tldFJlZ0V4cCA9PiAnT0t8VVAnLAogICAgICAgIENsb3NlQWN0aW9uU3RhdGUgID0+ICdjbG9zZWQgc3VjY2Vzc2Z1bCcsCiAgICAgICAgQ2xvc2VQZW5kaW5nVGltZSAgPT4gNjAgKiA2MCAqIDI0ICogMiwgICAgICAgICAgICAgICAgICAgICAgICAjIDIgZGF5cwogICAgICAgIEhvc3RSZWdFeHAgICAgICAgID0+ICdccypBZGRyZXNzOlxzKyhcZCtcLlxkK1wuXGQrXC5cZCspXHMqJywKICAgICAgICBGcmVlVGV4dEhvc3QgICAgICA9PiAnMScsCiAgICAgICAgU2VydmljZVJlZ0V4cCAgICAgPT4gJ1xzKlNlcnZpY2U6XHMrKC4qKVxzKicsCiAgICAgICAgRGVmYXVsdFNlcnZpY2UgICAgPT4gJ0hvc3QnLAogICAgICAgIEZyZWVUZXh0U2VydmljZSAgID0+ICcyJywKICAgICAgICBTZW5kZXJUeXBlICAgICAgICA9PiAnc3lzdGVtJywKICAgICAgICBBcnRpY2xlVHlwZSAgICAgICA9PiAnbm90ZS1yZXBvcnQnLAogICAgICAgIEZyZWVUZXh0U3RhdGUgICAgID0+ICcxJywKICAgIH07CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgID0gQF87CiAgICBteSAkTG9nTWVzc2FnZSA9IHVuZGVmOwoKICAgICMgZ2V0IGNvbmZpZyBvcHRpb25zLCB1c2UgZGVmYXVsdHMgdW5sZXNzIHZhbHVlIHNwZWNpZmllZAogICAgaWYgKCAkUGFyYW17Sm9iQ29uZmlnfSAmJiByZWYoICRQYXJhbXtKb2JDb25maWd9ICkgZXEgJ0hBU0gnICkgewogICAgICAgIGZvcmVhY2ggKCBrZXlzKCAleyAkUGFyYW17Sm9iQ29uZmlnfSB9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfXskX30KICAgICAgICAgICAgICAgICYmICggJFNlbGYtPntDb25maWd9eyRffSA9ICRQYXJhbXtKb2JDb25maWd9LT57JF99ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgc2VuZGVyIGlzIG9mIGludGVyZXN0CiAgICBpZiAoICAgJFBhcmFte0dldFBhcmFtfS0+e0Zyb219CiAgICAgICAgJiYgJFBhcmFte0dldFBhcmFtfS0+e0Zyb219ID1+IC8kU2VsZi0+e0NvbmZpZ317RnJvbUFkZHJlc3NSZWdFeHB9L2kgKQogICAgewoKICAgICAgICAjIFRyeSB0byBnZXQgU3RhdGUsIEhvc3QgYW5kIFNlcnZpY2UKICAgICAgICBmb3IgbXkgJGxpbmUgKCBzcGxpdCAvXG4vLCAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgIGZvciAocXcgKCBTdGF0ZSBIb3N0IFNlcnZpY2UgKSkgewogICAgICAgICAgICAgICAgJGxpbmUgPX4gLyRTZWxmLT57Q29uZmlnfXskXy4nUmVnRXhwJ30vCiAgICAgICAgICAgICAgICAgICAgJiYgKCAkU2VsZi0+eyRffSA9ICQxICk7CiAgICAgICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkbGluZSAoIHNwbGl0IC9cbi8sICRQYXJhbXtHZXRQYXJhbX0tPntCb2R5fSApIHsKICAgICAgICAgICAgZm9yIChxdyAoIFN0YXRlIEhvc3QgU2VydmljZSApKSB7CiAgICAgICAgICAgICAgICAkbGluZSA9fiAvJFNlbGYtPntDb25maWd9eyRfLidSZWdFeHAnfS8KICAgICAgICAgICAgICAgICAgICAmJiAoICRTZWxmLT57JF99ID0gJDEgKTsKICAgICAgICAgICAgfQogICAgfQoKICAgICAgICAjIFdlIG5lZWQgU3RhdGUgYW5kIEhvc3QgdG8gcHJvY2VlZAogICAgICAgIGlmICggJFNlbGYtPntTdGF0ZX0gJiYgJFNlbGYtPntIb3N0fSApIHsKCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIFNlcnZpY2UKICAgICAgICAgICAgJFNlbGYtPntTZXJ2aWNlfQogICAgICAgICAgICAgICAgfHwgKCAkU2VsZi0+e1NlcnZpY2V9ID0gJFNlbGYtPntDb25maWd9e0RlZmF1bHRTZXJ2aWNlfSApOwogICAgICAgICAgICAkTG9nTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiIC0gSG9zdDogJFNlbGYtPntIb3N0fSwgU3RhdGU6ICRTZWxmLT57U3RhdGV9LCBTZXJ2aWNlOiAkU2VsZi0+e1NlcnZpY2V9IjsKCiAgICAgICAgICAgICMgSXMgdGhlcmUgYSB0aWNrZXQgZm9yIHRoaXMgSG9zdC9TZXJ2aWNlIHBhaXI/CiAgICAgICAgICAgIG15ICVxdWVyeSA9ICgKICAgICAgICAgICAgICAgIFJlc3VsdCAgICA9PiAnQVJSQVknLAogICAgICAgICAgICAgICAgTGltaXQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgIFN0YXRlVHlwZSA9PiAnT3BlbicKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIChxdyAoIEhvc3QgU2VydmljZSApKSB7CiAgICAgICAgICAgICAgICAkcXVlcnl7ICdUaWNrZXRGcmVlS2V5JyAuICRTZWxmLT57Q29uZmlnfXsgJ0ZyZWVUZXh0JyAuICRfIH0gfQogICAgICAgICAgICAgICAgICAgID0gJF87CiAgICAgICAgICAgICAgICAkcXVlcnl7ICdUaWNrZXRGcmVlVGV4dCcKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ317ICdGcmVlVGV4dCcgLiAkXyB9IH0gPSAkU2VsZi0+eyRffTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBteSAkVGlja2V0SUQKICAgICAgICAgICAgICAgID0gKCAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCglcXVlcnkpIClbMF0gKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBBbHdheXMgdXNlIGZpcnN0IHJlc3VsdCwgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLi4uCiAgICAgICAgICAgICAgICAjIE9LLCBmb3VuZCB0aWNrZXQgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE51bWJlckxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtRm9sbG93VXAtU2VuZGVyVHlwZSd9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ317U2VuZGVyVHlwZX07CiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1Gb2xsb3dVcC1BcnRpY2xlVHlwZSd9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ317QXJ0aWNsZVR5cGV9OwoKICAgICAgICAgICAgICAgICMgU2V0IEFydGljbGUgRnJlZSBGaWVsZCBmb3IgU3RhdGUKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUZvbGxvd1VwLUFydGljbGVLZXknCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWd9eyAnRnJlZVRleHRTdGF0ZScgfSB9ID0gJ1N0YXRlJzsKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUZvbGxvd1VwLUFydGljbGVWYWx1ZScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ317ICdGcmVlVGV4dFN0YXRlJyB9IH0gPSAkU2VsZi0+e1N0YXRlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57U3RhdGV9ID1+IC8kU2VsZi0+e0NvbmZpZ317Q2xvc2VUaWNrZXRSZWdFeHB9LyApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgQ2xvc2UgVGlja2V0IENvbmRpdGlvbiAtPiBUYWtlIENsb3NlIEFjdGlvbgogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9e0Nsb3NlQWN0aW9uU3RhdGV9IG5lICdPTEQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1Gb2xsb3dVcC1TdGF0ZSd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnfXtDbG9zZUFjdGlvblN0YXRlfTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtU3RhdGUtUGVuZGluZ1RpbWUnfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAkU2VsZi0+e0NvbmZpZ317Q2xvc2VQZW5kaW5nVGltZX0gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJExvZ01lc3NhZ2UgPSAnUmVjb3ZlcmVkJyAuICRMb2dNZXNzYWdlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgQXR0YWNoIG5vdGUgdG8gZXhpc3RpbmcgdGlja2V0CiAgICAgICAgICAgICAgICAgICAgJExvZ01lc3NhZ2UgPSAnTmV3IE5vdGljZScgLiAkTG9nTWVzc2FnZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRTZWxmLT57U3RhdGV9ID1+IC8kU2VsZi0+e0NvbmZpZ317TmV3VGlja2V0UmVnRXhwfS8gKSB7CgogICAgICAgICAgICAgICAgIyBDcmVhdGUgVGlja2V0IENvbmRpdGlvbiAtPiBDcmVhdGUgbmV3IFRpY2tldCBhbmQgcmVjb3JkIEhvc3QgYW5kIFNlcnZpY2UKICAgICAgICAgICAgICAgIGZvciAocXcgKCBIb3N0IFNlcnZpY2UgKSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsgJ1gtT1RSUy1UaWNrZXRLZXknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnfXsgJ0ZyZWVUZXh0JyAuICRfIH0gfSA9ICRfOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsgJ1gtT1RSUy1UaWNrZXRWYWx1ZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWd9eyAnRnJlZVRleHQnIC4gJF8gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPnskX307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTZXQgQXJ0aWNsZSBGcmVlIEZpZWxkIGZvciBTdGF0ZQogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtQXJ0aWNsZUtleScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ317ICdGcmVlVGV4dFN0YXRlJyB9IH0gPSAnU3RhdGUnOwogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtQXJ0aWNsZVZhbHVlJwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnfXsgJ0ZyZWVUZXh0U3RhdGUnIH0gfSA9ICRTZWxmLT57U3RhdGV9OwoKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLVNlbmRlclR5cGUnfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntDb25maWd9e1NlbmRlclR5cGV9OwogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtQXJ0aWNsZVR5cGUnfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntDb25maWd9e0FydGljbGVUeXBlfTsKICAgICAgICAgICAgICAgICRMb2dNZXNzYWdlID0gJ05ldyBUaWNrZXQnIC4gJExvZ01lc3NhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBObyBleGlzdGluZyB0aWNrZXQgYW5kIG5vIG9wZW4gY29uZGl0aW9uIC0+IGRyb3Agc2lsZW50bHkKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUlnbm9yZSd9ID0gJ3llcyc7CiAgICAgICAgICAgICAgICAkTG9nTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gJ01haWwgRHJvcHBlZCwgbm8gbWF0Y2hpbmcgdGlja2V0IGZvdW5kLCBubyBvcGVuIG9uIHRoaXMgc3RhdGUnCiAgICAgICAgICAgICAgICAgICAgLiAkTG9nTWVzc2FnZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExvZ01lc3NhZ2UKICAgICAgICAgICAgICAgID0gJ1N5c3RlbU1vbml0b3Jpbmc6IENvdWxkIG5vdCBmaW5kIGhvc3QgYWRkcmVzcyBhbmQvb3Igc3RhdGUgaW4gbWFpbCA9PiBJZ25vcmluZyc7CiAgICAgICAgfQogICAgICAgIGlmICgkTG9nTWVzc2FnZSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1N5c3RlbU1vbml0b3JpbmcgTWFpbDogJyAuICRMb2dNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L05hZ2lvc0Fja25vd2xlZGdlLnBtIC0gYWNrbm93bGVnZSBuYWdpb3MgdGlja2V0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTmFnaW9zQWNrbm93bGVkZ2UucG0sdiAxLjggMjAwOC8xMC8wOSAyMTo1ODozMCBqYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpOYWdpb3NBY2tub3dsZWRnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIExXUDo6VXNlckFnZW50OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IFRpY2tldE9iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBDdXN0b21lclVzZXJPYmplY3QgU2VuZG1haWxPYmplY3QgVGltZU9iamVjdCBFbmNvZGVPYmplY3QgVXNlck9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBnZXQgY29ycmVjdCBGcmVlRmllbGRzCiAgICAkU2VsZi0+e0Zob3N0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnTmFnaW9zOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpIb3N0JyApOwogICAgJFNlbGYtPntGc2VydmljZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ05hZ2lvczo6QWNrbm93bGVkZ2U6OkZyZWVGaWVsZDo6U2VydmljZScgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUaWNrZXRJRCBFdmVudCBDb25maWcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYWNrbm93bGVkZ2UgaXMgYWN0aXZlCiAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpUeXBlJyk7CiAgICByZXR1cm4gMSBpZiAhJFR5cGU7CgogICAgIyBjaGVjayBpZiBpdCdzIGEgTmFnaW9zIHJlbGF0ZWQgdGlja2V0CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0gKTsKICAgIGlmICggISRUaWNrZXR7JFNlbGYtPntGaG9zdH19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZGVidWcnLCBNZXNzYWdlID0+ICJObyBOYWdpb3MgVGlja2V0ISIgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0J3MgYW4gYWNrbm93bGVkZ2UKICAgIHJldHVybiAxIGlmICRUaWNrZXR7TG9ja30gbmUgJ2xvY2snOwoKICAgICMgYWdlbnQgbG9va3VwCiAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLCAjIG5vdCByZXF1aXJlZCAtPiAwfDEgKGRlZmF1bHQgMCkKICAgICk7CgogICAgbXkgJFJldHVybjsKICAgIGlmICggJFR5cGUgZXEgJ3BpcGUnICkgewogICAgICAgICRSZXR1cm4gPSAkU2VsZi0+X1BpcGUoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlciAgID0+IFwlVXNlciwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkVHlwZSBlcSAnaHR0cCcgKSB7CiAgICAgICAgJFJldHVybiA9ICRTZWxmLT5fSFRUUCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBVc2VyICAgPT4gXCVVc2VyLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVua25vd24gTmFnaW9zIGFja25vd2xlZGdlIHR5cGUgKCRUeXBlKSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKCAkUmV0dXJuICkgewogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiU2VudCBBY2tub3dsZWRnZSB0byBOYWdpb3MgKCRUeXBlKS4iLAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiV2FzIG5vdCBhYmxlIHRvIHNlbmQgQWNrbm93bGVkZ2UgdG8gTmFnaW9zICgkVHlwZSkhIiwKICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CgpzdWIgX1BpcGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUaWNrZXQgVXNlcikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVVc2VyICAgPSAleyAkUGFyYW17VXNlcn0gfTsKCiAgICAjIHNlbmQgYWNrbm93bGVkZ2UgdG8gbmFnaW9zCiAgICBteSAkQ01EID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OkNNRCcgKTsKICAgIG15ICREYXRhOwogICAgaWYgKCAkVGlja2V0eyRTZWxmLT57RnNlcnZpY2V9fSAhfiAvXmhvc3QkL2kpIHsKICAgICAgICAkRGF0YSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnTmFnaW9zOjpBY2tub3dsZWRnZTo6TmFtZWRQaXBlOjpTZXJ2aWNlJyApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ05hZ2lvczo6QWNrbm93bGVkZ2U6Ok5hbWVkUGlwZTo6SG9zdCcgKTsKICAgIH0KCiAgICAjIHJlcGxhY2UgdGlja2V0IHRhZ3MKICAgIGZvciBteSAkS2V5ICgga2V5cyAlVGlja2V0ICkgewogICAgICAgIG5leHQgaWYgIWRlZmluZWQgJFRpY2tldHskS2V5fTsKCiAgICAgICAgIyBzdHJpcCBub3QgYWxsb3dkIGNoYXJzCiAgICAgICAgJFRpY2tldHskS2V5fSA9fiBzLycvL2c7CiAgICAgICAgJFRpY2tldHskS2V5fSA9fiBzLzsvL2c7CiAgICAgICAgJERhdGEgPX4gcy88JEtleT4vJFRpY2tldHskS2V5fS9nOwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgdGFncwogICAgJERhdGEgPX4gc3s8Q09ORklHXyguKz8pPn17JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJDEpfWVneDsKCiAgICAjIHJlcGxhY2UgbG9naW4KICAgICREYXRhID1+IHMvPExPR0lOPi8kVXNlcntVc2VyTG9naW59L2c7CgogICAgIyByZXBsYWNlIGhvc3QKICAgICREYXRhID1+IHMvPEhPU1RfTkFNRT4vJFRpY2tldHskU2VsZi0+e0Zob3N0fX0vZzsKCiAgICAjIHJlcGxhY2UgdGltZSBzdGFtcAogICAgJERhdGEgPX4gcy88U0VSVklDRV9OQU1FPi8kVGlja2V0eyRTZWxmLT57RnNlcnZpY2V9fS9nOwoKICAgICMgcmVwbGFjZSB0aW1lIHN0YW1wCiAgICBteSAkVGltZSA9IHRpbWUoKTsKICAgICREYXRhID1+IHMvPFVOSVhUSU1FPi8kVGltZS9nOwoKICAgICMgcmVwbGFjZSBPVVRQVVRTVFJJTkcKICAgICRDTUQgPX4gcy88T1VUUFVUU1RSSU5HPi8kRGF0YS9nOwoKI3ByaW50IFNURE9VVCAiJENNRFxuIjsKICAgIHN5c3RlbSAoICRDTUQgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9IVFRQIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0IFVzZXIpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlVXNlciAgID0gJXsgJFBhcmFte1VzZXJ9IH07CgogICAgbXkgJFVSTCAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTmFnaW9zOjpBY2tub3dsZWRnZTo6SFRUUDo6VVJMJyk7CiAgICBteSAkVXNlciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpVc2VyJyk7CiAgICBteSAkUHcgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpQYXNzd29yZCcpOwoKICAgIGlmICggJFRpY2tldHskU2VsZi0+e0ZzZXJ2aWNlfX0gIX4gL15ob3N0JC9pKSB7CiAgICAgICAgJFVSTCA9fiBzLzxDTURfVFlQPi8zNC9nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFVSTCA9fiBzLzxDTURfVFlQPi8zMy9nOwogICAgfQoKICAgICMgcmVwbGFjZSBob3N0CiAgICAkVVJMID1+IHMvPEhPU1RfTkFNRT4vJFRpY2tldHskU2VsZi0+e0Zob3N0fX0vZzsKCiAgICAjIHJlcGxhY2UgdGltZSBzdGFtcAogICAgJFVSTCA9fiBzLzxTRVJWSUNFX05BTUU+LyRUaWNrZXR7JFNlbGYtPntGc2VydmljZX19L2c7CiAgICAjIHJlcGxhY2UgdGlja2V0IHRhZ3MKCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVRpY2tldCApIHsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRUaWNrZXR7JEtleX07CgogICAgICAgICMgc3RyaXAgbm90IGFsbG93ZCBjaGFycwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy8nLy9nOwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy87Ly9nOwogICAgICAgICRVUkwgPX4gcy88JEtleT4vJFRpY2tldHskS2V5fS9nOwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgdGFncwogICAgJFVSTCA9fiBzezxDT05GSUdfKC4rPyk+fXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkMSl9ZWd4OwoKICAgIG15ICRVc2VyQWdlbnQgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCk7CiAgICAkVXNlckFnZW50LT50aW1lb3V0KCAxNSApOwoKICAgIG15ICRSZXF1ZXN0ID0gSFRUUDo6UmVxdWVzdC0+bmV3KCBHRVQgPT4gJFVSTCApOwogICAgJFJlcXVlc3QtPmF1dGhvcml6YXRpb25fYmFzaWMoICRVc2VyLCAkUHcgKTsKICAgIG15ICRSZXNwb25zZSA9ICRVc2VyQWdlbnQtPnJlcXVlc3QoJFJlcXVlc3QpOwogICAgaWYgKCAhJFJlc3BvbnNlLT5pc19zdWNjZXNzKCkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZXF1ZXN0ICRVUkw6ICIgLiAkUmVzcG9uc2UtPnN0YXR1c19saW5lKCksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiMgICAgcmV0dXJuICRSZXNwb25zZS0+Y29udGVudCgpOwoKICAgIHJldHVybiAxOwp9CjE7Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFN5c3RlbU1vbml0b3JpbmcueG1sLHYgMS4xNSAyMDA5LzA0LzA4IDE4OjQ3OjUxIGpiIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUjIyMxLVN5c3RlbU1vbml0b3JpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5CYXNpYyBtYWlsIGludGVyZmFjZSB0byBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZXMuIFVzZSB0aGlzIGJsb2NrIGlmIHRoZSBmaWx0ZXIgc2hvdWxkIHJ1biBBRlRFUiBQb3N0TWFzdGVyRmlsdGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5mYWNoZSBFbWFpbCBTY2huaXR0c3RlbGxlIHp1IFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlcy4gRGllc2VuIEJsb2NrIG51dHplbiwgd2VubiBkaWVzZXIgRmlsdGVyIE5BQ0ggZGVuIFBvc3RNYXN0ZXJGaWx0ZXJuIGdlbnV0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlBvc3RNYXN0ZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcm9tQWRkcmVzc1JlZ0V4cCI+bmFnaW9zQGV4YW1wbGUuY29tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGF0ZVJlZ0V4cCI+XHMqU3RhdGU6XHMrKFxTKyk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikhvc3RSZWdFeHAiPlxzKkhvc3Q6XHMrKC4qKVxzKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZVJlZ0V4cCI+XHMqU2VydmljZTpccysoLiopXHMqPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOZXdUaWNrZXRSZWdFeHAiPkNSSVRJQ0FMfERPV048L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlVGlja2V0UmVnRXhwIj5PS3xVUDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VBY3Rpb25TdGF0ZSI+Y2xvc2VkIHN1Y2Nlc3NmdWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlUGVuZGluZ1RpbWUiPjE3MjgwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFNlcnZpY2UiPkhvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0SG9zdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTZXJ2aWNlIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZW5kZXJUeXBlIj5zeXN0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVUeXBlIj5ub3RlLXJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlBvc3RNYXN0ZXI6OlByZUZpbHRlck1vZHVsZSMjIzAwLVN5c3RlbU1vbml0b3JpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5CYXNpYyBtYWlsIGludGVyZmFjZSB0byBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZXMuIFVzZSB0aGlzIGJsb2NrIGlmIHRoZSBmaWx0ZXIgc2hvdWxkIHJ1biBCRUZPUkUgUG9zdE1hc3RlckZpbHRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RWluZmFjaGUgRW1haWwgU2Nobml0dHN0ZWxsZSB6dSBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZXMuIERpZXNlbiBCbG9jayBudXR6ZW4sIHdlbm4gZGllc2VyIEZpbHRlciBWT1IgZGVuIFBvc3RNYXN0ZXJGaWx0ZXJuIGdlbnV0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlBvc3RNYXN0ZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcm9tQWRkcmVzc1JlZ0V4cCI+bmFnaW9zQGV4YW1wbGUuY29tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGF0ZVJlZ0V4cCI+XHMqU3RhdGU6XHMrKFxTKyk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikhvc3RSZWdFeHAiPlxzKkhvc3Q6XHMrKC4qKVxzKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZVJlZ0V4cCI+XHMqU2VydmljZTpccysoLiopXHMqPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOZXdUaWNrZXRSZWdFeHAiPkNSSVRJQ0FMfERPV048L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlVGlja2V0UmVnRXhwIj5PS3xVUDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VBY3Rpb25TdGF0ZSI+Y2xvc2VkIHN1Y2Nlc3NmdWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlUGVuZGluZ1RpbWUiPjE3MjgwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFNlcnZpY2UiPkhvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0SG9zdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTZXJ2aWNlIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZW5kZXJUeXBlIj5zeXN0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVUeXBlIj5ub3RlLXJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6OkZyZWVGaWVsZDo6SG9zdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk5hbWUgb2YgVGlja2V0RnJlZUZpZWxkIGZvciBIb3N0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYW1lIGRlcyBUaWNrZXQgRnJlaSBGZWxkZXM6IEhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlRpY2tldEZyZWVUZXh0MTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6OkZyZWVGaWVsZDo6U2VydmljZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk5hbWUgb2YgVGlja2V0RnJlZUZpZWxkIGZvciBTZXJ2aWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYW1lIGRlcyBUaWNrZXQgRnJlaSBGZWxkZXM6IFNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlRpY2tldEZyZWVUZXh0MjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6OlR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgTmFnaW9zIGFja25vd2xlZGdlIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJwaXBlIj5waXBlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJodHRwIj5odHRwPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OkNNRCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk5hbWVkIHBpcGUgYWNrbm93bGVkZ2UgY29tbWFuZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFtZWQgcGlwZSBBY2tub3dsZWRnZSBCZWZlaGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmVjaG8gJyZsdDtPVVRQVVRTVFJJTkcmZ3Q7JyA+IC91c3IvbG9jYWwvbmFnaW9zL3Zhci9ydy9uYWdpb3MuY21kPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6TmFtZWRQaXBlOjpIb3N0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZWQgcGlwZSBhY2tub3dsZWRnZSBmb3JtYXQgZm9yIGhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hbWVkIHBpcGUgQWNrbm93bGVkZ2UgRm9ybWF0IGb8ciBIb3N0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5OYWdpb3M6OkFja25vd2xlZGdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5bJmx0O1VOSVhUSU1FJmd0O10gQUNLTk9XTEVER0VfSE9TVF9QUk9CTEVNOyZsdDtIT1NUX05BTUUmZ3Q7OzE7MTsxOyZsdDtMT0dJTiZndDs7Jmx0O2EgaHJlZj0iJmx0O0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7Q09ORklHX0ZRRE4mZ3Q7LyZsdDtDT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbSZhbXA7VGlja2V0SUQ9Jmx0O1RpY2tldElEJmd0OyImZ3Q7Jmx0O0NPTkZJR19UaWNrZXQ6Okhvb2smZ3Q7Jmx0O1RpY2tldE51bWJlciZndDsmbHQ7L2EmZ3Q7PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6TmFtZWRQaXBlOjpTZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZWQgcGlwZSBhY2tub3dsZWRnZSBmb3JtYXQgZm9yIHNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hbWVkIHBpcGUgQWNrbm93bGVkZ2UgRm9ybWF0IGb8ciBTZXJ2aWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5OYWdpb3M6OkFja25vd2xlZGdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5bJmx0O1VOSVhUSU1FJmd0O10gQUNLTk9XTEVER0VfU1ZDX1BST0JMRU07Jmx0O0hPU1RfTkFNRSZndDs7Jmx0O1NFUlZJQ0VfTkFNRSZndDs7MTsxOzE7Jmx0O0xPR0lOJmd0OzsmbHQ7YSBocmVmPSImbHQ7Q09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtDT05GSUdfRlFETiZndDsvJmx0O0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tJmFtcDtUaWNrZXRJRD0mbHQ7VGlja2V0SUQmZ3Q7IiZndDsmbHQ7Q09ORklHX1RpY2tldDo6SG9vayZndDsmbHQ7VGlja2V0TnVtYmVyJmd0OyZsdDsvYSZndDs8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzktTmFnaW9zQWNrbm93bGVkZ2UiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaWNrZXQgZXZlbnQgbW9kdWxlIHRvIHNlbmQgYW4gYWNrbm93bGFnZSB0byBOYWdpb3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlRpY2tldCBFdmVudCBNb2R1bCBm/HIgYXV0b21hdGlzY2hlcyBzZW5kZW4gZWluZXMgQWNrbm93bGVkZ2UgYW4gTmFnaW9zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5OYWdpb3M6OkFja25vd2xlZGdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6Ok5hZ2lvc0Fja25vd2xlZGdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0TG9ja1VwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6OkhUVFA6OlVSTCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBodHRwIGFja25vd2xlZGdlIHVybC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIGh0dHAgQWNrbm93bGVkZ2UgVVJMLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5OYWdpb3M6OkFja25vd2xlZGdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vbmFnaW9zLmV4YW1wbGUuY29tL25hZ2lvcy9jZ2ktYmluL2NtZC5jZ2k/Y21kX3R5cD0mbHQ7Q01EX1RZUCZndDsmYW1wO2NtZF9tb2Q9MiZhbXA7aG9zdD0mbHQ7SE9TVF9OQU1FJmd0OyZhbXA7c2VydmljZT0mbHQ7U0VSVklDRV9OQU1FJmd0OyZhbXA7c3RpY2t5X2Fjaz1vbiZhbXA7c2VuZF9ub3RpZmljYXRpb249b24mYW1wO3BlcnNpc3RlbnQ9b24mYW1wO2NvbV9kYXRhPSZsdDtUaWNrZXROdW1iZXImZ3Q7JmFtcDtidG5TdWJtaXQ9Q29tbWl0PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6SFRUUDo6VXNlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBodHRwIGFja25vd2xlZGdlIHVzZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBodHRwIEFja25vd2xlZGdlIEJlbnV0emVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5OYWdpb3M6OkFja25vd2xlZGdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Kb2huPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6SFRUUDo6UGFzc3dvcmQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgaHR0cCBhY2tub3dsZWRnZSBwYXNzd29yZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIGh0dHAgQWNrbm93bGVkZ2UgUGFzc3dvcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnNvbWVfcGFzczwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEV4YW1wbGUgQ29uZmlnZmlsZSBmb3Igb3Rycy5OYWdpb3NDaGVjayAtIE9UUlMgTmFnaW9zIGNoZWNrZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE5hZ2lvc0NoZWNrLnBtLmV4YW1wbGUsdiAxLjIgMjAwOC8xMC8xNiAyMzowNzoyOSBqYiBFeHAgJAojIC0tCiMgRm9yIHBvc3NpYmxlIHNlYXJjaCBvcHRpb25zIHNlZToKIyBodHRwOi8vZGV2Lm90cnMub3JnL2N2cy9LZXJuZWwvU3lzdGVtL1RpY2tldC5odG1sIC0+IFRpY2tldFNlYXJjaCgpCiMgRXhhbXBsZXMgc2VlIGJlbG93CiMgLS0KCiVDb25maWcgPSAoCiAgIFNlYXJjaCA9PiB7CgogICAgICAgIyB0aWNrZXRzIGNyZWF0ZWQgaW4gdGhlIGxhc3QgMTIwIG1pbnV0ZXMKICAgICAgIFRpY2tldENyZWF0ZVRpbWVOZXdlck1pbnV0ZXMgPT4gMTIwLAoKICAgICAgICMgdGlja2V0IG51bWJlciBhcyBTVFJJTkcgb3IgYXMgQVJSQVlSRUYKIyAgICAgICAgVGlja2V0TnVtYmVyID0+ICclMTIzNTQ2JScsCiMgICAgICAgIFRpY2tldE51bWJlciA9PiBbJyUxMjM1NDYlJywgJyUxMjM2NjYlJ10sCgogICAgICAgIyB0aWNrZXQgcXVldWVzCiMgICAgICAgIFF1ZXVlcyAgID0+IFsnc3lzdGVtIHF1ZXVlJywgJ290aGVyIHF1ZXVlJ10sCgogICAgICAgIyB0aWNrZXQgdHlwZXMKIyAgICAgICAgVHlwZXMgICA9PiBbJ25vcm1hbCcsICdjaGFuZ2UnLCAnaW5jaWRlbnQnXSwKCiAgICAgICAjIHRpY2tldCBwcmlvcml0aWVzCiMgICAgICAgIFByaW9yaXRpZXMgID0+IFsnMSB2ZXJ5IGxvdycsICcyIGxvdycsICczIG5vcm1hbCddLAoKICAgICAgICMgdGlja2V0IHNlcnZpY2VzCiMgICAgICAgIFNlcnZpY2VzICAgPT4gWydTZXJ2aWNlIEEnLCAnU2VydmljZSBCJ10sCgogICAgICAgIyB0aWNrZXQgbG9ja3MKIyAgICAgICAgTG9ja3MgICA9PiBbJ3VubG9jayddLAoKICAgICAgICMgdGlja2V0IGN1c3RvbWVycwojICAgICAgICBDdXN0b21lcklEID0+ICcxMjMnLAojICAgICAgICBDdXN0b21lcklEID0+IFsnMTIzJywgJ0FCQyddLAoKICAgICAgICMgMS4uMTYgZnJlZSB0ZXh0IGZpZWxkcwojICAgICAgICBUaWNrZXRGcmVlS2V5MSAgPT4gJ1Byb2R1Y3QnLAojICAgICAgICBUaWNrZXRGcmVlVGV4dDEgPT4gJ2FkYXNkJywKCiAgICAgICAjIG9yIHdpdGggbXVsdGkgb3B0aW9ucyBhcyBhcnJheSByZWYgb3Igc3RyaW5nIHBvc3NpYmxlCiMgICAgICAgIFRpY2tldEZyZWVLZXkyICA9PiBbJ1Byb2R1Y3QnLCAnUHJvZHVjdDInXSwKIyAgICAgICAgVGlja2V0RnJlZVRleHQyID0+IFsnQnJvd3NlcicsICdTb3VuZCcsICdNb3VzZSddLAogICB9LAoKIyBEZWNsYXJhdGlvbiBvZiB0cmVzaG9sZHMKIyBtaW5fd2Fybl90cmVzaG9sZCA+IE51bWJlciBvZiB0aWNrZXRzIC0+IFdBUk5JTkcKIyBtYXhfd2Fybl90cmVzaG9sZCA8IE51bWJlciBvZiB0aWNrZXRzIC0+IFdBUk5JTkcKIyBtaW5fY3JpdF90cmVzaG9sZCA+IE51bWJlciBvZiB0aWNrZXRzIC0+IEFMQVJNCiMgbWF4X3dhcm5fdHJlc2hvbGQgPCBOdW1iZXIgb2YgdGlja2V0cyAtPiBBTEFSTQoKICAgbWluX3dhcm5fdHJlc2hvbGQgPT4gNSwKICAgbWF4X3dhcm5fdHJlc2hvbGQgPT4gMTAsCiAgIG1pbl9jcml0X3RyZXNob2xkID0+IDIsCiAgIG1heF9jcml0X3RyZXNob2xkID0+IDIwLAoKIyBJbmZvcm1hdGlvbiB1c2VkIGJ5IE5hZ2lvcwojIE5hbWUgb2YgY2hlY2sgc2hvd24gaW4gTmFnaW9zIFN0YXR1cyBJbmZvcm1hdGlvbgogICBjaGVja25hbWUgPT4gJ09UUlMgQ2hlY2tlcicsCgojIFRleHQgc2hvd24gaW4gU3RhdHVzIEluZm9ybWF0aW9uIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKICAgT0tfVFhUICAgID0+ICdlbmpveSAgIHRpY2tldHM6JywKCiMgVGV4dCBzaG93biBpbiBTdGF0dXMgSW5mb3JtYXRpb24gaWYgd2FybmluZyB0aHJlc2hob2xkIHJlYWNoZWQKICAgV0FSTl9UWFQgID0+ICdudW1iZXIgb2YgdGlja2V0czonLAoKIyBUZXh0IHNob3duIGluIFN0YXR1cyBJbmZvcm1hdGlvbiBpZiBjcml0aWNhbCB0aHJlc2hob2xkIHJlYWNoZWQKICAgQ1JJVF9UWFQgID0+ICdjcml0aWNhbCBudW1iZXIgb2YgdGlja2V0czonLAoKKTsKCg==
TkFNRQogICAgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZyAtIEJhc2ljIFN5c3RlbQogICAgTW9uaXRvcmluZyBJbnRlcmZhY2UKClNZTk9QU0lTCiAgICBUaGlzIG1vZHVsZSBpbXBsZW1ldHMgYSBiYXNpYyBpbnRlcmZhY2UgdG8gU3lzdGVtIE1vbml0b3JpbmcgU3VpdGVzLiBJdAogICAgd29ya3MgYnkgcmVjZWl2aW5nIGVtYWlsIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIE1vbml0b3JpbmcgU3VpdGUuIE5ldwogICAgdGlja2V0cyBhcmUgY3JlYXRlZCBpbiBjYXNlIG9mIGNvbXBvbmVudCBmYWlsdXJlcy4gT25jZSBhIHRpY2tldCBoYXMKICAgIGJlZW4gb3BlbmVkIG1lc3NhZ2VzIHJlZ2FyZGluZyB0aGUgZWZmZWN0ZWQgY29tcG9uZW50IGFyZSBhdHRhY2hlZCB0bwogICAgdGhpcyB0aWNrZXQuIFdoZW4gdGhlIGNvbXBvbmVudCByZWNvdmVycywgdGhlIHRpY2tldCBzdGF0ZSBjYW4gYmUKICAgIGNoYW5nZWQgb3IgdGhlIHRpY2tldCBjYW4gYmUgY2xvc2VkLgoKICAgIE9uY2UgYSBvcGVuIHRpY2tldCBmb3IgYSBnaXZlbiBIb3N0L1NlcnZpY2UgY29tYmluYXRpb24gZXhpc3RzLCBhbGwKICAgIG1haWxzIGNvbmNlcm5pbmcgdGhpcyBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlCiAgICB0aWNrZXQgdW50aWwgaXQncyBjbG9zZWQuCgpDT05GSUdVUkFUSU9OIE9QVElPTlMKICAgIFRvIGFsbG93IGZsZXhpYmxlIGludGVncmF0aW9uIGJldHdlZW4gT1RSUyBhbmQgYSBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZQogICAgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gVGhlIGRlZmF1bHQgdmFsdWVzCiAgICAoYXMgc2hvd24gYmVsb3cpIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgYSBzdGFuZGFyZCBOYWdpb3MgaW5zdGFsbGF0aW9uLgoKICAgICogIkZyb21BZGRyZXNzUmVnRXhwIgogICAgICAgIE9ubHkgbWFpbHMgbWF0Y2hpbmcgdGhpcyAiRnJvbToiIGFkZHJlc3Mgd2lsbCBiZSBjb25zaWRlcmVkIGZvciB0aGlzCiAgICAgICAgZmlsdGVyLiBZb3UgbmVlZCB0byBhZGp1c3QgdGhpcyBzZXR0aW5nIHRvIHRoZSBmcm9tIGFkZHJlc3MgeW91cgogICAgICAgIFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlIHVzZXMgZm9yIG91dGdvaW5nIG1haWxzLgoKICAgICAgICBEZWZhdWx0OiAnc3lzbW9uQG15c3lzdGVtLmNvbScKCiAgICAqICJTdGF0ZVJlZ0V4cCIKICAgICAgICBSZWd1bGFyIEV4cHJlc3Npb24gdG8gZXh0cmFjdCAiU3RhdGUiCgogICAgICAgIERlZmF1bHQ6ICdccypTdGF0ZTpccysoXFMrKScKCiAgICAqICJOZXdUaWNrZXRSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0ZWQgIlN0YXRlIiB0byB0cmlnZ2VyIG5ldyB0aWNrZXQKCiAgICAgICAgRGVmYXVsdDogJ0NSSVRJQ0FMfERPV04nCgogICAgKiAiQ2xvc2VUaWNrZXRSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0ZWQgIlN0YXRlIiB0byB0cmlnZ2VyIHRpY2tldAogICAgICAgIHRyYW5zaXRpb24gdG8gIkNsb3NlQWN0aW9uU3RhdGUiCgogICAgICAgIERlZmF1bHQ6ICdPS3xVUCcKCiAgICAqICJDbG9zZUFjdGlvblN0YXRlIgogICAgICAgIE5ldyBzdGF0dXMgZm9yIHRpY2tldCB3aGVuIHNlcnZpY2UgcmVjb3ZlcmVzLiBUaGlzIGNhbiBiZSBlaXRoZXIKICAgICAgICAiT0xEIiBpbiB3aGljaCBjYXNlIHRoZSBvbGQgc3RhdHVzIHN0YXlzLCBvciB0aGUgbmFtZSBvZiB0aGUgbmV3CiAgICAgICAgc3RhdHVzLiBQbGVhc2Ugbm90ZSwgdGhhdCB0aGlzIHN0YXRlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgaW4geW91cgogICAgICAgIE9UUlMgaW5zdGFsbGF0aW9uIGFzIHZhbGlkIHN0YXRlLiBJZiB0aGUgc3RhdGUgeW91IHNldCBoZXJlIGRvZXMgbm90CiAgICAgICAgZXhpc3QsIHRoZSB0aWNrZXQgc3RhdGUgd2lsbCBub3QgYmUgYWx0ZXJlZC4KCiAgICAgICAgRGVmYXVsdDogJ2Nsb3NlZCBzdWNjZXNzZnVsJwoKICAgICogIkNsb3NlUGVuZGluZ1RpbWUiCiAgICAgICAgUGVuZGluZyB0aW1lIGluIHNlY29uZHMgZm9yICdQZW5kaW5nLi4uJyBzdGF0dXMgdGltZS4gKElnbm9yZWQgZm9yCiAgICAgICAgb3RoZXIgc3RhdHVzIHR5cGVzKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHNldHRpbmcgd2lsbCBiZSBpZ25vcmVkCiAgICAgICAgYnkgT1RSUyB2ZXJzaW9ucyBvbGRlciB0aGFuIDIuMi4gT24gdGhlc2Ugc3lzdGVtcyB0aGUgcGVuZGluZyB0aW1lCiAgICAgICAgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRpY2tldCB3aWxsIGJlIHVzZWQsIHdoaWNoIG1heSBoYXZlIGluCiAgICAgICAgc3VycHJpc2luZyBlZmZlY3RzLiBJdCdzIHJlY29tbWVuZGVkIG5vdCB0byB1c2UgJ1BlbmRpbmcuLi4nIHN0YXRlcwogICAgICAgIHdpdGggT1RSUyBwcmlvciB0byAyLjIuCgogICAgICAgIERlZmF1bHQ6ICI2MCo2MCoyNCoyIiAoMiBkYXlzKQoKICAgICogIkhvc3RSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIHRvIGV4dHJhY3QgIkhvc3QiCgogICAgICAgIERlZmF1bHQ6ICdccypBZGRyZXNzOlxzKyhcZCtcLlxkK1wuXGQrXC5cZCspXHMqJwoKICAgICogIkZyZWVUZXh0SG9zdCIKICAgICAgICBGcmVlIHRleHQgZmllbGQgaW5kZXggdG8gc3RvcmUgIkhvc3QiCgogICAgICAgIERlZmF1bHQ6ICcxJwoKICAgICogIlNlcnZpY2VSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIHRvIGV4dHJhY3QgIlNlcnZpY2UiCgogICAgICAgIERlZmF1bHQ6ICdccypTZXJ2aWNlOlxzKyguKilccyonCgogICAgKiAiRGVmYXVsdFNlcnZpY2UiCiAgICAgICAgRGVmYXVsdCBmb3IgIlNlcnZpY2UiOyB1c2VkIGlmIG5vIHNlcnZpY2UgY2FuIGJlIGV4dHJhY3RlZCwgaS5lLiBpZgogICAgICAgIGhvc3QgZ29lcyBET1dOL1VQCgogICAgICAgIERlZmF1bHQ6ICdIb3N0JwoKICAgICogIkZyZWVUZXh5U2VydmljZSIKICAgICAgICBGcmVlIHRleHQgZmllbGQgaW5kZXggdG8gc3RvcmUgc2VydmljZQoKICAgICAgICBEZWZhdWx0OiAnMicKCiAgICAqICJTZW5kZXJUeXBlIgogICAgICAgIFNlbmRlciB0eXBlIHVzZWQgZm9yIGNyZWF0aW5nIHRpY2tldHMgYW5kIGF0dGFjaGluZyBub3RlcwoKICAgICAgICBEZWZhdWx0OiAic3lzdGVtIgoKICAgICogIkFydGljbGVUeXBlIgogICAgICAgIEFydGljbGUgdHlwZSB1c2VkIHRvIGF0dGFjaCBmb2xsb3cgdXAgZW1haWxzIHRvIGV4aXN0aW5nIHRpY2tldHMKCiAgICAgICAgRGVmYXVsdDogIm5vdGUtcmVwb3J0IgoKQ09OVFJPTCBGTE9XCiAgICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gaWxsdXN0cmF0ZXMgaG93IG1haWxzIGFyZSBoYW5kbGVkIGJ5IHRoaXMgbW9kdWxlCiAgICBhbmQgaW4gd2hpY2ggY2FzZXMgdGhleSB0cmlnZ2VyIHdoaWNoIGFjdGlvbi4gUHJldHR5IG11Y2ggYWxsIGNoZWNrcyBhcmUKICAgIGNvbmZpZ2FibGUgdXNpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlcnMgbGlzdGVkCiAgICBhYm92ZS4KCiAgICAgTWFpbCBtYXRjaGVzICdGcm9tQWRkcmVzcyc/CiAgICAgfAogICAgICstPiBOTyAgLT4gQ29udGludWUgd2l0aCByZWd1bGFyIG1haWwgcHJvY2Vzc2luZwogICAgIHwKICAgICArLT4gWUVTIC0+IERvZXMgYSB0aWNrZXQgd2l0aCBtYXRjaGluZyBIb3N0L1NlcnZpY2UgY29tYmluYXRpb24KICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3QgaW4gT1RSUz8KICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICstPiBOTyAgLT4gRG9lcyAnU3RhdGU6JyBtYXRjaCAnTmV3VGlja2V0UmVnRXhwJz8KICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAogICAgICAgICAgICAgICAgfCAgICAgICAgICArLT4gTk8gIC0+IFN0b3AgcHJvY2Vzc2luZyB0aGlzIG1haWwKICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAoc2lsZW50IGRyb3ApCiAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKICAgICAgICAgICAgICAgIHwgICAgICAgICAgKy0+IFlFUyAtPiBDcmVhdGUgbmV3IHRpY2tldCwgcmVjb3JkIEhvc3QKICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICBhbmQgU2VydmljZSwgYXR0YWNoIG1haWwKICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICstPiBZRVMgLT4gQXR0YWNoIG1haWwgdG8gdGlja2V0CiAgICAgICAgICAgICAgICAgICAgICAgIC0+IERvZXMgJ1N0YXRlOicgbWF0Y2ggJ0Nsb3NlVGlja2V0UmVnRXhwJz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICArLT4gTk8gIC0+IENvbnRpbnVlIHdpdGggcmVndWxhciBtYWlsIHByb2Nlc3NpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICArLT4gWUVTIC0+IENoYW5nZSB0aWNrZXQgdHlwZSBhcyBjb25maWd1cmVkIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nsb3NlQWN0aW9uU3RhdGUnCgogICAgQmVzaWRlcyBvZiBhIGZldyBhZGRpdGlvbmFsIHNhbml0eSBjaGVja3MgdGhpcyBpcyBob3cgdGhlCiAgICBTeXN0ZW1Nb25pdG9yaW5nIG1vZHVsIHRyZWF0cyBpbmNvbWluZyBtYWlscy4gQnkgY2hhbmdpbmcgdGhlIHJlZ3VsYXIKICAgIGV4cHJlc3Npb25zIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhZG9wdCBpdCB0byBkaWZmZXJlbnQgbW9uaXRvcmluZwogICAgc3lzdGVtcy4KCg==
IyAtLQojIFN5c3RlbU1vbml0b3JpbmcudCAtIFN5c3RlbU1vbml0b3JpbmcgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN5c3RlbU1vbml0b3JpbmcudCx2IDEuMSAyMDA4LzA5LzA4IDIyOjQ3OjE2IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgp1c2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOwoKbXkgJEZpbGVBcnJheSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVSZWFkKAogICAgTG9jYXRpb24gID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvU3lzdGVtTW9uaXRvcmluZzEuYm94JywKICAgIFJlc3VsdCAgICA9PiAnQVJSQVknLCAjIG9wdGlvbmFsIC0gU0NBTEFSfEFSUkFZCik7CgpteSAkUG9zdE1hc3Rlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyLT5uZXcoCiAgICAleyRTZWxmfSwKICAgIEVtYWlsID0+ICRGaWxlQXJyYXksCik7CgpteSBAUmV0dXJuID0gJFBvc3RNYXN0ZXJPYmplY3QtPlJ1bigpOwokU2VsZi0+SXMoCiAgICAkUmV0dXJuWzBdIHx8IDAsCiAgICAxLAogICAgIlJ1bigpIC0gTmV3VGlja2V0IiwKKTsKJFNlbGYtPlRydWUoCiAgICAkUmV0dXJuWzFdIHx8IDAsCiAgICAiUnVuKCkgLSBOZXdUaWNrZXQvVGlja2V0SUQiLAopOwoKbXkgJFRpY2tldE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldyggJXskU2VsZn0gKTsKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRSZXR1cm5bMV0sCik7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0e1RpY2tldEZyZWVUZXh0MX0sCiAgICAnZGVscGhpbicsCiAgICAiSG9zdCBjaGVjayIsCik7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0e1RpY2tldEZyZWVUZXh0Mn0sCiAgICAnSG9zdCcsCiAgICAiU2VydmljZSBjaGVjayIsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXR7U3RhdGV9LAogICAgJ25ldycsCiAgICAiUnVuKCkgLSBUaWNrZXQgU3RhdGUiLAopOwoKJEZpbGVBcnJheSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVSZWFkKAogICAgTG9jYXRpb24gID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvU3lzdGVtTW9uaXRvcmluZzIuYm94JywKICAgIFJlc3VsdCAgICA9PiAnQVJSQVknLCAjIG9wdGlvbmFsIC0gU0NBTEFSfEFSUkFZCik7CgokUG9zdE1hc3Rlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyLT5uZXcoCiAgICAleyRTZWxmfSwKICAgIEVtYWlsID0+ICRGaWxlQXJyYXksCik7CgpAUmV0dXJuID0gJFBvc3RNYXN0ZXJPYmplY3QtPlJ1bigpOwokU2VsZi0+SXMoCiAgICAkUmV0dXJuWzBdIHx8IDAsCiAgICAyLAogICAgIlJ1bigpIC0gTmV3VGlja2V0IiwKKTsKJFNlbGYtPlRydWUoCiAgICAkUmV0dXJuWzFdID09ICRUaWNrZXR7VGlja2V0SUR9LAogICAgIlJ1bigpIC0gTmV3VGlja2V0L1RpY2tldElEIiwKKTsKCiRUaWNrZXRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7CiVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkUmV0dXJuWzFdLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0e1N0YXRlfSwKICAgICdjbG9zZWQgc3VjY2Vzc2Z1bCcsCiAgICAiUnVuKCkgLSBUaWNrZXQgU3RhdGUiLAopOwoKIyBkZWxldGUgdGlja2V0Cm15ICREZWxldGUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICBUaWNrZXRJRCA9PiAkUmV0dXJuWzFdLAogICAgVXNlcklEICAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkRGVsZXRlIHx8IDAsCiAgICAiVGlja2V0RGVsZXRlKCkiLAopOwoKMTsK
UmV0dXJuLVBhdGg6IDxuYWdpb3NAZXhhbXBsZS5jb20+ClRvOiBvdHJzQGV4YW1wbGUuY29tClN1YmplY3Q6ICoqIFBST0JMRU0gYWxlcnQgMSAtIGRlbHBoaW4gaG9zdCBpcyBET1dOICoqCk1lc3NhZ2UtSWQ6IDwyMDA3MDMxNzIzMTU0Ni4wREZENTVEQzAwRkBoNTM3OTUuZXhhbXBsZS5jb20+CkRhdGU6IFN1biwgMTggTWFyIDIwMDcgMDA6MTU6NDYgKzAxMDAgKENFVCkKRnJvbTogbmFnaW9zQGV4YW1wbGUuY29tCk1pbWUtVmVyc2lvbjogMS4wCgoqKioqKiBOYWdpb3MgICoqKioqCgpOb3RpZmljYXRpb24gVHlwZTogUFJPQkxFTQpIb3N0OiBkZWxwaGluClN0YXRlOiBET1dOIGZvciAwZCAwaCAwbSAwcwpBZGRyZXNzOiAxMjcuMS4xLjEKSW5mbzoKCkNSSVRJQ0FMIC0gVGltZSB0byBsaXZlIGV4Y2VlZGVkICgxMjcuMS4xLjEpCgpEYXRlL1RpbWU6IFN1biBNYXIgMTggMDA6MTg6MzAgQ0VUIDIwMDcKCkFDSyBieTogCkNvbW1lbnQ6CiAKCgo=
UmV0dXJuLVBhdGg6IDxuYWdpb3NAZXhhbXBsZS5jb20+ClRvOiBvdHJzQGV4YW1wbGUuY29tClN1YmplY3Q6ICoqIFJFQ09WRVJZIGFsZXJ0IDIgLSBkZWxwaGluIGhvc3QgaXMgVVAgKioKTWVzc2FnZS1JZDogPDIwMDcwMzE3MjMxOTQ2LjBERkQ1NURDMDBGQGg1Mzc5NS5leGFtcGxlLmNvbT4KRGF0ZTogU3VuLCAxOCBNYXIgMjAwNyAwMDoxOTo0NiArMDEwMCAoQ0VUKQpGcm9tOiBuYWdpb3NAZXhhbXBsZS5jb20KTWltZS1WZXJzaW9uOiAxLjAKCioqKioqIE5hZ2lvcyAgKioqKioKCk5vdGlmaWNhdGlvbiBUeXBlOiBSRUNPVkVSWQpIb3N0OiBkZWxwaGluClN0YXRlOiBVUCBmb3IgMGQgMGggMG0gMHMKQWRkcmVzczogMTcyLjEuMS4xCkluZm86CgpQSU5HIE9LIC0gUGFja2V0IGxvc3MgPSAwJSwgUlRBID0gMTUuMDkgbXMKCkRhdGUvVGltZTogU3VuIE1hciAxOCAwMDoxOTo0NiBDRVQgMjAwNwoKQUNLIGJ5OiAKQ29tbWVudDogCg==