SystemMonitoring
2.0.1
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
New version with Nagios an acknowledge feature and Nagios checker script.
Basic mail interface to System Monitoring Suites.
Einfache Email Schnittstelle zur System Monitoring Suites.
2.3.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.
2008-09-11 21:05:52
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBvdHJzLk5hZ2lvc0NoZWNrLnBsIC0gT1RSUyBOYWdpb3MgY2hlY2tlcgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogb3Rycy5OYWdpb3NDaGVjay5wbCx2IDEuMiAyMDA4LzA5LzExIDE4OjM0OjE1IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgRmluZEJpbiBxdygkUmVhbEJpbik7CnVzZSBsaWIgZGlybmFtZSgkUmVhbEJpbik7CnVzZSBsaWIgZGlybmFtZSgkUmVhbEJpbikgLiAnL0tlcm5lbC9jcGFuLWxpYic7Cgp1c2UgR2V0b3B0OjpTdGQ7Cm15ICVvcHRzOwpnZXRvcHQoICdjJywgXCVvcHRzICk7CmlmICggJG9wdHN7aH0gKSB7CiAgICBwcmludCAiVXNhZ2U6ICRGaW5kQmluOjpTY3JpcHQgWy1OIChydW5zIGFzIE5hZ2lvc2NoZWNrZXIpXSBbLXYgKHZlcmJvc2UpXSBbLWMgL3BhdGgvdG8vY29uZmlnX2ZpbGVdXG4iOwogICAgcHJpbnQgIlxuIjsKICAgIGV4aXQ7Cn0KCmlmICggISRvcHRze2N9ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogTmVlZCAtYyBDT05GSUdGSUxFXG4iOwogICAgZXhpdCAxOwp9CmVsc2lmICggIS1lICRvcHRze2N9ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogTm8gc3VjaCBmaWxlICRvcHRze2N9XG4iOwogICAgZXhpdCAxOwp9CgojIHJlYWQgY29uZmlnIGZpbGUKbXkgJUNvbmZpZzsKb3BlbiAobXkgJElOLCAnPCcsICRvcHRze2N9ICkgfHwgZGllICJFUlJPUjogQ2FuJ3Qgb3BlbiAkb3B0c3tjfTogJCFcbiI7Cm15ICRDb250ZW50ID0gJyc7CndoaWxlICg8JElOPikgewogICAgJENvbnRlbnQgLj0gJF87Cn0KaWYgKCAhZXZhbCAkQ29udGVudCApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IEludmFsaWQgY29uZmlnIGZpbGUgJG9wdHN7Y306ICRAXG4iOwogICAgZXhpdCAxOwp9Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwpteSAlQ29tbW9uT2JqZWN0ID0gKCk7CiRDb21tb25PYmplY3R7Q29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TG9nT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldyggJUNvbW1vbk9iamVjdCwgTG9nUHJlZml4ID0+ICdvdHJzLk5hZ2lvc0NoZWNrJyApOwokQ29tbW9uT2JqZWN0e1RpbWVPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e01haW5PYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0RCT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldyglQ29tbW9uT2JqZWN0KTsKJENvbW1vbk9iamVjdHtUaWNrZXRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCVDb21tb25PYmplY3QpOwoKIyBzZWFyY2ggdGlja2V0cwpteSBAVGlja2V0SURzID0gJENvbW1vbk9iamVjdHtUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAleyAkQ29uZmlne1NlYXJjaH0gfSwKICAgIExpbWl0ICA9PiAxMDBfMDAwLAogICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICBVc2VySUQgPT4gMSwKKTsKbXkgJFRpY2tldENvdW50ID0gc2NhbGFyIEBUaWNrZXRJRHM7CgojIHZlcmJvc2UgbW9kZQppZiAoICRvcHRze3Z9ICkgewogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgIG15ICVUaWNrZXQgPSAkQ29tbW9uT2JqZWN0e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CiAgICAgICAgcHJpbnQgU1RERVJSICIkVGlja2V0e1RpY2tldElEfTokVGlja2V0e1RpY2tldE51bWJlcn1cbiI7CiAgICB9Cn0KCiMgbm8gY2hlY2tlciBtb2RlCmlmICggISRvcHRze059ICkgewogICAgcHJpbnQgIiRUaWNrZXRDb3VudFxuIjsKICAgIGV4aXQgMDsKfQoKIyBkbyBjcml0aWNhbCBhbmQgd2FybmluZyBjaGVjawpmb3IgbXkgJFR5cGUgKHF3KGNyaXRfdHJlc2hob2xkIHdhcm5fdHJlc2hob2xkKSkgewogICAgaWYgKCBkZWZpbmVkICRDb25maWd7ICdtaW5fJyAuICRUeXBlIH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlneyAnbWluXycgLiAkVHlwZSB9ID49ICRUaWNrZXRDb3VudCApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgIHByaW50ICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50XG4iOwogICAgICAgICAgICAgICAgZXhpdCAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFR5cGUgPX4gL153YXJuXy8gKSB7CiAgICAgICAgICAgICAgICBwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IFdBUk5JTkcgJENvbmZpZ3tXQVJOX1RYVH0gJFRpY2tldENvdW50XG4iOwogICAgICAgICAgICAgICAgZXhpdCAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCBkZWZpbmVkICRDb25maWd7ICdtYXhfJyAuICRUeXBlIH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlneyAnbWF4XycgLiAkVHlwZSB9IDw9ICRUaWNrZXRDb3VudCApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgIHByaW50ICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50XG4iOwogICAgICAgICAgICAgICAgZXhpdCAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFR5cGUgPX4gL153YXJuXy8gKSB7CiAgICAgICAgICAgICAgICBwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IFdBUk5JTkcgJENvbmZpZ3tXQVJOX1RYVH0gJFRpY2tldENvdW50XG4iOwogICAgICAgICAgICAgICAgZXhpdCAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojIHJldHVybiBvawpwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IE9LICRDb25maWd7T0tfVFhUfSAkVGlja2V0Q291bnR8dGlja2V0cz0kVGlja2V0Q291bnRcbiI7CmV4aXQgMDsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vUG9zdE1hc3Rlci9GaWx0ZXIvU3lzdGVtTW9uaXRvcmluZy5wbSAtIEJhc2ljIFN5c3RlbSBNb25pdG9yaW5nIEludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBTeXN0ZW1Nb25pdG9yaW5nLnBtLHYgMS4xLjEuMSAyMDA3LzEwLzA0IDEzOjM0OjQxIGJiIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3Jpbmc7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwoKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMS4xLjEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3JpbmcgLSBCYXNpYyBTeXN0ZW0gTW9uaXRvcmluZyBJbnRlcmZhY2UKCj1oZWFkMSBTWU5PUFNJUwoKVGhpcyBtb2R1bGUgaW1wbGVtZXRzIGEgYmFzaWMgaW50ZXJmYWNlIHRvIFN5c3RlbSBNb25pdG9yaW5nClN1aXRlcy4gSXQgd29ya3MgYnkgcmVjZWl2aW5nIGVtYWlsIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIE1vbml0b3JpbmcKU3VpdGUuIE5ldyB0aWNrZXRzIGFyZSBjcmVhdGVkIGluIGNhc2Ugb2YgY29tcG9uZW50IGZhaWx1cmVzLiBPbmNlIGEKdGlja2V0IGhhcyBiZWVuIG9wZW5lZCBtZXNzYWdlcyByZWdhcmRpbmcgdGhlIGVmZmVjdGVkIGNvbXBvbmVudCBhcmUKYXR0YWNoZWQgdG8gdGhpcyB0aWNrZXQuIFdoZW4gdGhlIGNvbXBvbmVudCByZWNvdmVycywgdGhlIHRpY2tldCBzdGF0ZQpjYW4gYmUgY2hhbmdlZCBvciB0aGUgdGlja2V0IGNhbiBiZSBjbG9zZWQuCgpPbmNlIGEgb3BlbiB0aWNrZXQgZm9yIGEgZ2l2ZW4gSG9zdC9TZXJ2aWNlIGNvbWJpbmF0aW9uIGV4aXN0cywgYWxsCm1haWxzIGNvbmNlcm5pbmcgdGhpcyBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlCnRpY2tldCB1bnRpbCBpdCdzIGNsb3NlZC4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBUaWNrZXRPYmplY3QgVGltZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIERlZmF1bHQgU2V0dGluZ3MKICAgICRTZWxmLT57Q29uZmlnfSA9IHsKICAgICAgICBTdGF0ZVJlZ0V4cCAgICAgICA9PiAnXHMqU3RhdGU6XHMrKFxTKyknLAogICAgICAgIEZyb21BZGRyZXNzUmVnRXhwID0+ICdzeXNtb25AZXhhbXBsZS5jb20nLAogICAgICAgIE5ld1RpY2tldFJlZ0V4cCAgID0+ICdDUklUSUNBTHxET1dOJywKICAgICAgICBDbG9zZVRpY2tldFJlZ0V4cCA9PiAnT0t8VVAnLAogICAgICAgIENsb3NlQWN0aW9uU3RhdGUgID0+ICdjbG9zZWQgc3VjY2Vzc2Z1bCcsCiAgICAgICAgQ2xvc2VQZW5kaW5nVGltZSAgPT4gNjAgKiA2MCAqIDI0ICogMiwgICAgICAgICAgICAgICAgICAgICAgICAjIDIgZGF5cwogICAgICAgIEhvc3RSZWdFeHAgICAgICAgID0+ICdccypBZGRyZXNzOlxzKyhcZCtcLlxkK1wuXGQrXC5cZCspXHMqJywKICAgICAgICBGcmVlVGV4dEhvc3QgICAgICA9PiAnMScsCiAgICAgICAgU2VydmljZVJlZ0V4cCAgICAgPT4gJ1xzKlNlcnZpY2U6XHMrKC4qKVxzKicsCiAgICAgICAgRGVmYXVsdFNlcnZpY2UgICAgPT4gJ0hvc3QnLAogICAgICAgIEZyZWVUZXh0U2VydmljZSAgID0+ICcyJywKICAgICAgICBTZW5kZXJUeXBlICAgICAgICA9PiAnc3lzdGVtJywKICAgICAgICBBcnRpY2xlVHlwZSAgICAgICA9PiAnbm90ZS1yZXBvcnQnLAogICAgfTsKICAgIHJldHVybiAkU2VsZjsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUaGUgYWN0dWFsIGZpbHRlci4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKc3ViIFJ1biB7CiAgICBteSAkU2VsZiAgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICAgPSBAXzsKICAgIG15ICRMb2dNZXNzYWdlID0gdW5kZWY7CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbnMsIHVzZSBkZWZhdWx0cyB1bmxlc3MgdmFsdWUgc3BlY2lmaWVkCiAgICBpZiAoICRQYXJhbXtKb2JDb25maWd9ICYmIHJlZiggJFBhcmFte0pvYkNvbmZpZ30gKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgZm9yZWFjaCAoIGtleXMoICV7ICRQYXJhbXtKb2JDb25maWd9IH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntDb25maWd9eyRffQogICAgICAgICAgICAgICAgJiYgKCAkU2VsZi0+e0NvbmZpZ317JF99ID0gJFBhcmFte0pvYkNvbmZpZ30tPnskX30gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBzZW5kZXIgaXMgb2YgaW50ZXJlc3QKICAgIGlmICggICAkUGFyYW17R2V0UGFyYW19LT57RnJvbX0KICAgICAgICAmJiAkUGFyYW17R2V0UGFyYW19LT57RnJvbX0gPX4gLyRTZWxmLT57Q29uZmlnfXtGcm9tQWRkcmVzc1JlZ0V4cH0vICkKICAgIHsKCiAgICAgICAgIyBUcnkgdG8gZ2V0IFN0YXRlLCBIb3N0IGFuZCBTZXJ2aWNlCiAgICAgICAgZm9yIG15ICRsaW5lICggc3BsaXQgL1xuLywgJFBhcmFte0dldFBhcmFtfS0+e0JvZHl9ICkgewogICAgICAgICAgICBmb3IgKHF3ICggU3RhdGUgSG9zdCBTZXJ2aWNlICkpIHsKICAgICAgICAgICAgICAgICRsaW5lID1+IC8kU2VsZi0+e0NvbmZpZ317JF8uJ1JlZ0V4cCd9LwogICAgICAgICAgICAgICAgICAgICYmICggJFNlbGYtPnskX30gPSAkMSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFdlIG5lZWQgU3RhdGUgYW5kIEhvc3QgdG8gcHJvY2VlZAogICAgICAgIGlmICggJFNlbGYtPntTdGF0ZX0gJiYgJFNlbGYtPntIb3N0fSApIHsKCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIFNlcnZpY2UKICAgICAgICAgICAgJFNlbGYtPntTZXJ2aWNlfQogICAgICAgICAgICAgICAgfHwgKCAkU2VsZi0+e1NlcnZpY2V9ID0gJFNlbGYtPntDb25maWd9e0RlZmF1bHRTZXJ2aWNlfSApOwogICAgICAgICAgICAkTG9nTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiIC0gSG9zdDogJFNlbGYtPntIb3N0fSwgU3RhdGU6ICRTZWxmLT57U3RhdGV9LCBTZXJ2aWNlOiAkU2VsZi0+e1NlcnZpY2V9IjsKCiAgICAgICAgICAgICMgSXMgdGhlcmUgYSB0aWNrZXQgZm9yIHRoaXMgSG9zdC9TZXJ2aWNlIHBhaXI/CiAgICAgICAgICAgIG15ICVxdWVyeSA9ICgKICAgICAgICAgICAgICAgIFJlc3VsdCAgICA9PiAnQVJSQVknLAogICAgICAgICAgICAgICAgTGltaXQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgIFN0YXRlVHlwZSA9PiAnT3BlbicKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIChxdyAoIEhvc3QgU2VydmljZSApKSB7CiAgICAgICAgICAgICAgICAkcXVlcnl7ICdUaWNrZXRGcmVlS2V5JyAuICRTZWxmLT57Q29uZmlnfXsgJ0ZyZWVUZXh0JyAuICRfIH0gfQogICAgICAgICAgICAgICAgICAgID0gJF87CiAgICAgICAgICAgICAgICAkcXVlcnl7ICdUaWNrZXRGcmVlVGV4dCcKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ317ICdGcmVlVGV4dCcgLiAkXyB9IH0gPSAkU2VsZi0+eyRffTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBteSAkVGlja2V0SUQKICAgICAgICAgICAgICAgID0gKCAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCglcXVlcnkpIClbMF0gKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBBbHdheXMgdXNlIGZpcnN0IHJlc3VsdCwgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLi4uCiAgICAgICAgICAgICAgICAjIE9LLCBmb3VuZCB0aWNrZXQgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE51bWJlckxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtRm9sbG93VXAtU2VuZGVyVHlwZSd9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ317U2VuZGVyVHlwZX07CiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1Gb2xsb3dVcC1BcnRpY2xlVHlwZSd9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ317QXJ0aWNsZVR5cGV9OwogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1N0YXRlfSA9fiAvJFNlbGYtPntDb25maWd9e0Nsb3NlVGlja2V0UmVnRXhwfS8gKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIENsb3NlIFRpY2tldCBDb25kaXRpb24gLT4gVGFrZSBDbG9zZSBBY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfXtDbG9zZUFjdGlvblN0YXRlfSBuZSAnT0xEJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtRm9sbG93VXAtU3RhdGUnfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ317Q2xvc2VBY3Rpb25TdGF0ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLVN0YXRlLVBlbmRpbmdUaW1lJ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJFNlbGYtPntDb25maWd9e0Nsb3NlUGVuZGluZ1RpbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRMb2dNZXNzYWdlID0gJ1JlY292ZXJlZCcgLiAkTG9nTWVzc2FnZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIEF0dGFjaCBub3RlIHRvIGV4aXN0aW5nIHRpY2tldAogICAgICAgICAgICAgICAgICAgICRMb2dNZXNzYWdlID0gJ05ldyBOb3RpY2UnIC4gJExvZ01lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkU2VsZi0+e1N0YXRlfSA9fiAvJFNlbGYtPntDb25maWd9e05ld1RpY2tldFJlZ0V4cH0vICkgewoKICAgICMgQ3JlYXRlIFRpY2tldCBDb25kaXRpb24gLT4gQ3JlYXRlIG5ldyBUaWNrZXQgYW5kIHJlY29yZCBIb3N0IGFuZCBTZXJ2aWNlCiAgICAgICAgICAgICAgICBmb3IgKHF3ICggSG9zdCBTZXJ2aWNlICkpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57ICdYLU9UUlMtVGlja2V0S2V5JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ317ICdGcmVlVGV4dCcgLiAkXyB9IH0gPSAkXzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57ICdYLU9UUlMtVGlja2V0VmFsdWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnfXsgJ0ZyZWVUZXh0JyAuICRfIH0gfQogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57JF99OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtU2VuZGVyVHlwZSd9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ317U2VuZGVyVHlwZX07CiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1BcnRpY2xlVHlwZSd9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ317QXJ0aWNsZVR5cGV9OwogICAgICAgICAgICAgICAgJExvZ01lc3NhZ2UgPSAnTmV3IFRpY2tldCcgLiAkTG9nTWVzc2FnZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIE5vIGV4aXN0aW5nIHRpY2tldCBhbmQgbm8gb3BlbiBjb25kaXRpb24gLT4gZHJvcCBzaWxlbnRseQogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtSWdub3JlJ30gPSAneWVzJzsKICAgICAgICAgICAgICAgICRMb2dNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAnTWFpbCBEcm9wcGVkLCBubyBtYXRjaGluZyB0aWNrZXQgZm91bmQsIG5vIG9wZW4gb24gdGhpcyBzdGF0ZScKICAgICAgICAgICAgICAgICAgICAuICRMb2dNZXNzYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTG9nTWVzc2FnZQogICAgICAgICAgICAgICAgPSAnU3lzdGVtTW9uaXRvcmluZzogQ291bGQgbm90IGZpbmQgaG9zdCBhZGRyZXNzIGFuZC9vciBzdGF0ZSBpbiBtYWlsID0+IElnbm9yaW5nJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRMb2dNZXNzYWdlKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU3lzdGVtTW9uaXRvcmluZyBNYWlsOiAnIC4gJExvZ01lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNb3JlIGRvY3VtZW50YXRpb24uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCj1oZWFkMSBDT05GSUdVUkFUSU9OIE9QVElPTlMKClRvIGFsbG93IGZsZXhpYmxlIGludGVncmF0aW9uIGJldHdlZW4gT1RSUyBhbmQgYSBTeXN0ZW0gTW9uaXRvcmluZwpTdWl0ZSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgYXZhaWxhYmxlLiBUaGUgZGVmYXVsdAp2YWx1ZXMgKGFzIHNob3duIGJlbG93KSBzaG91bGQgYmUgc3VpdGFibGUgZm9yIGEgc3RhbmRhcmQgTmFnaW9zCmluc3RhbGxhdGlvbi4KCj1vdmVyCgo9aXRlbSAqIEM8RnJvbUFkZHJlc3NSZWdFeHA+CgpPbmx5IG1haWxzIG1hdGNoaW5nIHRoaXMgQzxGcm9tOj4gYWRkcmVzcyB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIHRoaXMKZmlsdGVyLiAgWW91IG5lZWQgdG8gYWRqdXN0IHRoaXMgc2V0dGluZyB0byB0aGUgZnJvbSBhZGRyZXNzIHlvdXIKU3lzdGVtIE1vbml0b3JpbmcgU3VpdGUgdXNlcyBmb3Igb3V0Z29pbmcgbWFpbHMuCgpEZWZhdWx0OiBDPCdzeXNtb25AbXlzeXN0ZW0uY29tJz4KCj1pdGVtICogQzxTdGF0ZVJlZ0V4cD4KClJlZ3VsYXIgRXhwcmVzc2lvbiB0byBleHRyYWN0IEM8U3RhdGU+CgpEZWZhdWx0OiBDPCdccypTdGF0ZTpccysoXFMrKSc+Cgo9aXRlbSAqIEM8TmV3VGlja2V0UmVnRXhwPgoKUmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0ZWQgQzxTdGF0ZT4gdG8gdHJpZ2dlciBuZXcgdGlja2V0CgpEZWZhdWx0OiBDPCdDUklUSUNBTHxET1dOJz4KCj1pdGVtICogQzxDbG9zZVRpY2tldFJlZ0V4cD4KClJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgZXh0cmFjdGVkIEM8U3RhdGU+IHRvIHRyaWdnZXIgdGlja2V0IHRyYW5zaXRpb24KdG8gQzxDbG9zZUFjdGlvblN0YXRlPgoKRGVmYXVsdDogQzwnT0t8VVAnPgoKPWl0ZW0gKiBDPENsb3NlQWN0aW9uU3RhdGU+CgpOZXcgc3RhdHVzIGZvciB0aWNrZXQgd2hlbiBzZXJ2aWNlIHJlY292ZXJlcy4gVGhpcyBjYW4gYmUgZWl0aGVyIEM8T0xEPiBpbgp3aGljaCBjYXNlIHRoZSBvbGQgc3RhdHVzIHN0YXlzLCBvciB0aGUgbmFtZSBvZiB0aGUgbmV3IHN0YXR1cy4gUGxlYXNlIG5vdGUsCnRoYXQgdGhpcyBzdGF0ZSBuZWVkcyB0byBiZSBjb25maWd1cmVkIGluIHlvdXIgT1RSUyBpbnN0YWxsYXRpb24gYXMgdmFsaWQKc3RhdGUuIElmIHRoZSBzdGF0ZSB5b3Ugc2V0IGhlcmUgZG9lcyBub3QgZXhpc3QsIHRoZSB0aWNrZXQgc3RhdGUgd2lsbCBub3QgYmUKYWx0ZXJlZC4KCkRlZmF1bHQ6IEM8J2Nsb3NlZCBzdWNjZXNzZnVsJz4KCj1pdGVtICogQzxDbG9zZVBlbmRpbmdUaW1lPgoKUGVuZGluZyB0aW1lIGluIHNlY29uZHMgZm9yICdQZW5kaW5nLi4uJyBzdGF0dXMgdGltZS4gKElnbm9yZWQgZm9yIG90aGVyIHN0YXR1cwp0eXBlcykuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCBieSBPVFJTIHZlcnNpb25zIG9sZGVyIHRoYW4KMi4yLiBPbiB0aGVzZSBzeXN0ZW1zIHRoZSBwZW5kaW5nIHRpbWUgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRpY2tldCB3aWxsIGJlCnVzZWQsIHdoaWNoIG1heSBoYXZlIGluIHN1cnByaXNpbmcgZWZmZWN0cy4gSXQncyByZWNvbW1lbmRlZCBub3QgdG8gdXNlICdQZW5kaW5nLi4uJwpzdGF0ZXMgd2l0aCBPVFJTIHByaW9yIHRvIDIuMi4KCkRlZmF1bHQ6IEM8NjAqNjAqMjQqMj4gICgyIGRheXMpCgo9aXRlbSAqIEM8SG9zdFJlZ0V4cD4KClJlZ3VsYXIgZXhwcmVzc2lvbiB0byBleHRyYWN0IEM8SG9zdD4KCkRlZmF1bHQ6IEM8J1xzKkFkZHJlc3M6XHMrKFxkK1wuXGQrXC5cZCtcLlxkKylccyonPgoKPWl0ZW0gKiBDPEZyZWVUZXh0SG9zdD4KCkZyZWUgdGV4dCBmaWVsZCBpbmRleCB0byBzdG9yZSBDPEhvc3Q+CgpEZWZhdWx0OiBDPCcxJz4KCj1pdGVtICogQzxTZXJ2aWNlUmVnRXhwPgoKUmVndWxhciBleHByZXNzaW9uIHRvIGV4dHJhY3QgQzxTZXJ2aWNlPgoKRGVmYXVsdDogQzwnXHMqU2VydmljZTpccysoLiopXHMqJz4KCj1pdGVtICogQzxEZWZhdWx0U2VydmljZT4KCkRlZmF1bHQgZm9yIEM8U2VydmljZT47IHVzZWQgaWYgbm8gc2VydmljZSBjYW4gYmUgZXh0cmFjdGVkLCBpLmUuIGlmIGhvc3QKZ29lcyBET1dOL1VQCgpEZWZhdWx0OiBDPCdIb3N0Jz4KCj1pdGVtICogQzxGcmVlVGV4eVNlcnZpY2U+CgpGcmVlIHRleHQgZmllbGQgaW5kZXggdG8gc3RvcmUgc2VydmljZQoKRGVmYXVsdDogQzwnMic+Cgo9aXRlbSAqIEM8U2VuZGVyVHlwZT4KClNlbmRlciB0eXBlIHVzZWQgZm9yIGNyZWF0aW5nIHRpY2tldHMgYW5kIGF0dGFjaGluZyBub3RlcwoKRGVmYXVsdDogQzxzeXN0ZW0+Cgo9aXRlbSAqIEM8QXJ0aWNsZVR5cGU+CgpBcnRpY2xlIHR5cGUgdXNlZCB0byBhdHRhY2ggZm9sbG93IHVwIGVtYWlscyB0byBleGlzdGluZyB0aWNrZXRzCgpEZWZhdWx0OiBDPG5vdGUtcmVwb3J0PgoKPWJhY2sKCj1oZWFkMSBDT05UUk9MIEZMT1cKClRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBpbGx1c3RyYXRlcyBob3cgbWFpbHMgYXJlIGhhbmRsZWQgYnkgdGhpcyBtb2R1bGUKYW5kIGluIHdoaWNoIGNhc2VzIHRoZXkgdHJpZ2dlciB3aGljaCBhY3Rpb24uIFByZXR0eSBtdWNoIGFsbCBjaGVja3MgYXJlCmNvbmZpZ2FibGUgdXNpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlcnMgbGlzdGVkCmFib3ZlLgoKIE1haWwgbWF0Y2hlcyAnRnJvbUFkZHJlc3MnPwogfAogKy0+IE5PICAtPiBDb250aW51ZSB3aXRoIHJlZ3VsYXIgbWFpbCBwcm9jZXNzaW5nCiB8CiArLT4gWUVTIC0+IERvZXMgYSB0aWNrZXQgd2l0aCBtYXRjaGluZyBIb3N0L1NlcnZpY2UgY29tYmluYXRpb24KICAgICAgICAgICAgYWxyZWFkeSBleGlzdCBpbiBPVFJTPwogICAgICAgICAgICB8CiAgICAgICAgICAgICstPiBOTyAgLT4gRG9lcyAnU3RhdGU6JyBtYXRjaCAnTmV3VGlja2V0UmVnRXhwJz8KICAgICAgICAgICAgfCAgICAgICAgICB8CiAgICAgICAgICAgIHwgICAgICAgICAgKy0+IE5PICAtPiBTdG9wIHByb2Nlc3NpbmcgdGhpcyBtYWlsCiAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAoc2lsZW50IGRyb3ApCiAgICAgICAgICAgIHwgICAgICAgICAgfAogICAgICAgICAgICB8ICAgICAgICAgICstPiBZRVMgLT4gQ3JlYXRlIG5ldyB0aWNrZXQsIHJlY29yZCBIb3N0CiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICBhbmQgU2VydmljZSwgYXR0YWNoIG1haWwKICAgICAgICAgICAgfAogICAgICAgICAgICArLT4gWUVTIC0+IEF0dGFjaCBtYWlsIHRvIHRpY2tldAogICAgICAgICAgICAgICAgICAgIC0+IERvZXMgJ1N0YXRlOicgbWF0Y2ggJ0Nsb3NlVGlja2V0UmVnRXhwJz8KICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgKy0+IE5PICAtPiBDb250aW51ZSB3aXRoIHJlZ3VsYXIgbWFpbCBwcm9jZXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICstPiBZRVMgLT4gQ2hhbmdlIHRpY2tldCB0eXBlIGFzIGNvbmZpZ3VyZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDbG9zZUFjdGlvblN0YXRlJwoKQmVzaWRlcyBvZiBhIGZldyBhZGRpdGlvbmFsIHNhbml0eSBjaGVja3MgdGhpcyBpcyBob3cgdGhlClN5c3RlbU1vbml0b3JpbmcgbW9kdWwgdHJlYXRzIGluY29taW5nIG1haWxzLiBCeSBjaGFuZ2luZyB0aGUgcmVndWxhcgpleHByZXNzaW9ucyBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYWRvcHQgaXQgdG8gZGlmZmVyZW50IG1vbml0b3JpbmcKc3lzdGVtcy4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L05hZ2lvc0Fja25vd2xlZGdlLnBtIC0gYWNrbm93bGVnZSBuYWdpb3MgdGlja2V0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTmFnaW9zQWNrbm93bGVkZ2UucG0sdiAxLjcgMjAwOC8wOS8xMCAyMjowMjoxMyBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6TmFnaW9zQWNrbm93bGVkZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBMV1A6OlVzZXJBZ2VudDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBUaWNrZXRPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgQ3VzdG9tZXJVc2VyT2JqZWN0IFNlbmRtYWlsT2JqZWN0IFRpbWVPYmplY3QgRW5jb2RlT2JqZWN0IFVzZXJPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFRpY2tldElEIEV2ZW50IENvbmZpZykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBhY2tub3dsZWRnZSBpcyBhY3RpdmUKICAgIG15ICRUeXBlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ05hZ2lvczo6QWNrbm93bGVkZ2U6OlR5cGUnKTsKICAgIHJldHVybiAxIGlmICEkVHlwZTsKCiAgICAjIGNoZWNrIGlmIGl0J3MgYSBOYWdpb3MgcmVsYXRlZCB0aWNrZXQKICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSApOwogICAgaWYgKCAhJFRpY2tldHtUaWNrZXRGcmVlVGV4dDF9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZGVidWcnLCBNZXNzYWdlID0+ICJObyBOYWdpb3MgVGlja2V0ISIgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0J3MgYW4gYWNrbm93bGVkZ2UKICAgIHJldHVybiAxIGlmICRUaWNrZXR7TG9ja30gbmUgJ2xvY2snOwoKICAgICMgYWdlbnQgbG9va3VwCiAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLCAjIG5vdCByZXF1aXJlZCAtPiAwfDEgKGRlZmF1bHQgMCkKICAgICk7CgogICAgbXkgJFJldHVybjsKICAgIGlmICggJFR5cGUgZXEgJ3BpcGUnICkgewogICAgICAgICRSZXR1cm4gPSAkU2VsZi0+X1BpcGUoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlciAgID0+IFwlVXNlciwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkVHlwZSBlcSAnaHR0cCcgKSB7CiAgICAgICAgJFJldHVybiA9ICRTZWxmLT5fSFRUUCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBVc2VyICAgPT4gXCVVc2VyLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVua25vd24gTmFnaW9zIGFja25vd2xlZGdlIHR5cGUgKCRUeXBlKSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKCAkUmV0dXJuICkgewogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiU2VudCBBY2tub3dsZWRnZSB0byBOYWdpb3MgKCRUeXBlKS4iLAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiV2FzIG5vdCBhYmxlIHRvIHNlbmQgQWNrbm93bGVkZ2UgdG8gTmFnaW9zICgkVHlwZSkhIiwKICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CgpzdWIgX1BpcGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUaWNrZXQgVXNlcikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVVc2VyICAgPSAleyAkUGFyYW17VXNlcn0gfTsKCiAgICAjIHNlbmQgYWNrbm93bGVkZ2UgdG8gbmFnaW9zCiAgICBteSAkQ01EID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OkNNRCcgKTsKICAgIG15ICREYXRhOwogICAgaWYgKCAkVGlja2V0e1RpY2tldEZyZWVUZXh0Mn0gIX4gL15ob3N0JC9pKSB7CiAgICAgICAgJERhdGEgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ05hZ2lvczo6QWNrbm93bGVkZ2U6Ok5hbWVkUGlwZTo6U2VydmljZScgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6Okhvc3QnICk7CiAgICB9CgogICAgIyByZXBsYWNlIHRpY2tldCB0YWdzCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVRpY2tldCApIHsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRUaWNrZXR7JEtleX07CgogICAgICAgICMgc3RyaXAgbm90IGFsbG93ZCBjaGFycwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy8nLy9nOwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy87Ly9nOwogICAgICAgICREYXRhID1+IHMvPCRLZXk+LyRUaWNrZXR7JEtleX0vZzsKICAgIH0KCiAgICAjIHJlcGxhY2UgY29uZmlnIHRhZ3MKICAgICREYXRhID1+IHN7PENPTkZJR18oLis/KT59eyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCQxKX1lZ3g7CgogICAgIyByZXBsYWNlIGxvZ2luCiAgICAkRGF0YSA9fiBzLzxMT0dJTj4vJFVzZXJ7VXNlckxvZ2lufS9nOwoKICAgICMgcmVwbGFjZSBob3N0CiAgICAkRGF0YSA9fiBzLzxIT1NUX05BTUU+LyRUaWNrZXR7VGlja2V0RnJlZVRleHQxfS9nOwoKICAgICMgcmVwbGFjZSB0aW1lIHN0YW1wCiAgICAkRGF0YSA9fiBzLzxTRVJWSUNFX05BTUU+LyRUaWNrZXR7VGlja2V0RnJlZVRleHQyfS9nOwoKICAgICMgcmVwbGFjZSB0aW1lIHN0YW1wCiAgICBteSAkVGltZSA9IHRpbWUoKTsKICAgICREYXRhID1+IHMvPFVOSVhUSU1FPi8kVGltZS9nOwoKICAgICMgcmVwbGFjZSBPVVRQVVRTVFJJTkcKICAgICRDTUQgPX4gcy88T1VUUFVUU1RSSU5HPi8kRGF0YS9nOwoKI3ByaW50IFNUREVSUiAiJENNRFxuIjsKICAgIHN5c3RlbSAoICRDTUQgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9IVFRQIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0IFVzZXIpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlVXNlciAgID0gJXsgJFBhcmFte1VzZXJ9IH07CgogICAgbXkgJFVSTCAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTmFnaW9zOjpBY2tub3dsZWRnZTo6SFRUUDo6VVJMJyk7CiAgICBteSAkVXNlciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpVc2VyJyk7CiAgICBteSAkUHcgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpQYXNzd29yZCcpOwoKICAgIGlmICggJFRpY2tldHtUaWNrZXRGcmVlVGV4dDJ9ICF+IC9eaG9zdCQvaSkgewogICAgICAgICRVUkwgPX4gcy88Q01EX1RZUD4vMzQvZzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRVUkwgPX4gcy88Q01EX1RZUD4vMzMvZzsKICAgIH0KCiAgICAjIHJlcGxhY2UgaG9zdAogICAgJFVSTCA9fiBzLzxIT1NUX05BTUU+LyRUaWNrZXR7VGlja2V0RnJlZVRleHQxfS9nOwoKICAgICMgcmVwbGFjZSB0aW1lIHN0YW1wCiAgICAkVVJMID1+IHMvPFNFUlZJQ0VfTkFNRT4vJFRpY2tldHtUaWNrZXRGcmVlVGV4dDJ9L2c7CiAgICAjIHJlcGxhY2UgdGlja2V0IHRhZ3MKCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVRpY2tldCApIHsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRUaWNrZXR7JEtleX07CgogICAgICAgICMgc3RyaXAgbm90IGFsbG93ZCBjaGFycwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy8nLy9nOwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy87Ly9nOwogICAgICAgICRVUkwgPX4gcy88JEtleT4vJFRpY2tldHskS2V5fS9nOwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgdGFncwogICAgJFVSTCA9fiBzezxDT05GSUdfKC4rPyk+fXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkMSl9ZWd4OwoKICAgIG15ICRVc2VyQWdlbnQgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCk7CiAgICAkVXNlckFnZW50LT50aW1lb3V0KCAxNSApOwoKICAgIG15ICRSZXF1ZXN0ID0gSFRUUDo6UmVxdWVzdC0+bmV3KCBHRVQgPT4gJFVSTCApOwogICAgJFJlcXVlc3QtPmF1dGhvcml6YXRpb25fYmFzaWMoICRVc2VyLCAkUHcgKTsKICAgIG15ICRSZXNwb25zZSA9ICRVc2VyQWdlbnQtPnJlcXVlc3QoJFJlcXVlc3QpOwojICAgIG15ICRSZXNwb25zZSA9ICRVc2VyQWdlbnQtPmdldCggJFVSTCApOwogICAgaWYgKCAhJFJlc3BvbnNlLT5pc19zdWNjZXNzKCkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZXF1ZXN0ICRVUkw6ICIgLiAkUmVzcG9uc2UtPnN0YXR1c19saW5lKCksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiMgICAgcmV0dXJuICRSZXNwb25zZS0+Y29udGVudCgpOwoKICAgIHJldHVybiAxOwp9CjE7Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFN5c3RlbU1vbml0b3JpbmcueG1sLHYgMS4xMiAyMDA4LzA5LzExIDE4OjM2OjE1IG1hcnRpbiBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUG9zdE1hc3Rlcjo6UHJlRmlsdGVyTW9kdWxlIyMjMS1TeXN0ZW1Nb25pdG9yaW5nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+QmFzaWMgbWFpbCBpbnRlcmZhY2UgdG8gU3lzdGVtIE1vbml0b3JpbmcgU3VpdGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5mYWNoZSBFbWFpbCBTY2huaXR0c3RlbGxlIHp1IFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6UG9zdE1hc3RlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3Jpbmc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyb21BZGRyZXNzUmVnRXhwIj5uYWdpb3NAZXhhbXBsZS5jb208L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlN0YXRlUmVnRXhwIj5ccypTdGF0ZTpccysoXFMrKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSG9zdFJlZ0V4cCI+XHMqSG9zdDpccysoLiopXHMqPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlUmVnRXhwIj5ccypTZXJ2aWNlOlxzKyguKilccyo8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5ld1RpY2tldFJlZ0V4cCI+Q1JJVElDQUx8RE9XTjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VUaWNrZXRSZWdFeHAiPk9LfFVQPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbG9zZUFjdGlvblN0YXRlIj5jbG9zZWQgc3VjY2Vzc2Z1bDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VQZW5kaW5nVGltZSI+MTcyODAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0U2VydmljZSI+SG9zdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRIb3N0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcmVlVGV4dFNlcnZpY2UiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlbmRlclR5cGUiPnN5c3RlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXJ0aWNsZVR5cGUiPm5vdGUtcmVwb3J0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSBOYWdpb3MgYWNrbm93bGVkZ2UgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5OYWdpb3M6OkFja25vd2xlZGdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InBpcGUiPnBpcGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Imh0dHAiPmh0dHA8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6Ok5hbWVkUGlwZTo6Q01EIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZWQgcGlwZSBhY2tub3dsZWRnZSBjb21tYW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYW1lZCBwaXBlIEFja25vd2xlZGdlIEJlZmVobC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+ZWNobyAnJmx0O09VVFBVVFNUUklORyZndDsnID4gL3Vzci9sb2NhbC9uYWdpb3MvdmFyL3J3L25hZ2lvcy5jbWQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6Okhvc3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5OYW1lZCBwaXBlIGFja25vd2xlZGdlIGZvcm1hdCBmb3IgaG9zdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFtZWQgcGlwZSBBY2tub3dsZWRnZSBGb3JtYXQgZvxyIEhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlsmbHQ7VU5JWFRJTUUmZ3Q7XSBBQ0tOT1dMRURHRV9IT1NUX1BST0JMRU07Jmx0O0hPU1RfTkFNRSZndDs7MTsxOzE7Jmx0O0xPR0lOJmd0OzsmbHQ7YSBocmVmPSImbHQ7Q09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtDT05GSUdfRlFETiZndDsvJmx0O0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tJmFtcDtUaWNrZXRJRD0mbHQ7VGlja2V0SUQmZ3Q7IiZndDsmbHQ7Q09ORklHX1RpY2tldDo6SG9vayZndDsmbHQ7VGlja2V0TnVtYmVyJmd0OyZsdDsvYSZndDs8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OlNlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5OYW1lZCBwaXBlIGFja25vd2xlZGdlIGZvcm1hdCBmb3Igc2VydmljZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFtZWQgcGlwZSBBY2tub3dsZWRnZSBGb3JtYXQgZvxyIFNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlsmbHQ7VU5JWFRJTUUmZ3Q7XSBBQ0tOT1dMRURHRV9TVkNfUFJPQkxFTTsmbHQ7SE9TVF9OQU1FJmd0OzsmbHQ7U0VSVklDRV9OQU1FJmd0OzsxOzE7MTsmbHQ7TE9HSU4mZ3Q7OyZsdDthIGhyZWY9IiZsdDtDT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O0NPTkZJR19GUUROJmd0Oy8mbHQ7Q09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb20mYW1wO1RpY2tldElEPSZsdDtUaWNrZXRJRCZndDsiJmd0OyZsdDtDT05GSUdfVGlja2V0OjpIb29rJmd0OyZsdDtUaWNrZXROdW1iZXImZ3Q7Jmx0Oy9hJmd0OzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjOS1OYWdpb3NBY2tub3dsZWRnZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRpY2tldCBldmVudCBtb2R1bGUgdG8gc2VuZCBhbiBhY2tub3dsYWdlIHRvIE5hZ2lvcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+VGlja2V0IEV2ZW50IE1vZHVsIGb8ciBhdXRvbWF0aXNjaGVzIHNlbmRlbiBlaW5lcyBBY2tub3dsZWRnZSBhbiBOYWdpb3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6TmFnaW9zQWNrbm93bGVkZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRMb2NrVXBkYXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6SFRUUDo6VVJMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGh0dHAgYWNrbm93bGVkZ2UgdXJsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgaHR0cCBBY2tub3dsZWRnZSBVUkwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9uYWdpb3MuZXhhbXBsZS5jb20vbmFnaW9zL2NnaS1iaW4vY21kLmNnaT9jbWRfdHlwPSZsdDtDTURfVFlQJmd0OyZhbXA7Y21kX21vZD0yJmFtcDtob3N0PSZsdDtIT1NUX05BTUUmZ3Q7JmFtcDtzZXJ2aWNlPSZsdDtTRVJWSUNFX05BTUUmZ3Q7JmFtcDtzdGlja3lfYWNrPW9uJmFtcDtzZW5kX25vdGlmaWNhdGlvbj1vbiZhbXA7cGVyc2lzdGVudD1vbiZhbXA7Y29tX2RhdGE9Jmx0O1RpY2tldE51bWJlciZndDsmYW1wO2J0blN1Ym1pdD1Db21taXQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpVc2VyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGh0dHAgYWNrbm93bGVkZ2UgdXNlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIGh0dHAgQWNrbm93bGVkZ2UgQmVudXR6ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkpvaG48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpQYXNzd29yZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBodHRwIGFja25vd2xlZGdlIHBhc3N3b3JkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgaHR0cCBBY2tub3dsZWRnZSBQYXNzd29ydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+c29tZV9wYXNzPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEV4YW1wbGUgQ29uZmlnZmlsZSBmb3Igb3Rycy5OYWdpb3NDaGVjayAtIE9UUlMgTmFnaW9zIGNoZWNrZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE5hZ2lvc0NoZWNrLnBtLmV4YW1wbGUsdiAxLjEgMjAwOC8wOS8wOCAyMDoxNToyOSBtYXJ0aW4gRXhwICQKIyAtLQojIEZvciBwb3NzaWJsZSBzZWFyY2ggb3B0aW9ucyBzZWU6CiMgaHR0cDovL2Rldi5vdHJzLm9yZy9jdnMvS2VybmVsL1N5c3RlbS9UaWNrZXQuaHRtbCAtPiBUaWNrZXRTZWFyY2goKQojIEV4YW1wbGVzIHNlZSBiZWxvdwojIC0tCgolQ29uZmlnID0gKAogICBTZWFyY2ggPT4gewoKICAgICAgICMgdGlja2V0cyBjcmVhdGVkIGluIHRoZSBsYXN0IDEyMCBtaW51dGVzCiAgICAgICBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJNaW51dGVzID0+IDEyMCwKCiAgICAgICAjIHRpY2tldCBudW1iZXIgYXMgU1RSSU5HIG9yIGFzIEFSUkFZUkVGCiMgICAgICAgIFRpY2tldE51bWJlciA9PiAnJTEyMzU0NiUnLAojICAgICAgICBUaWNrZXROdW1iZXIgPT4gWyclMTIzNTQ2JScsICclMTIzNjY2JSddLAoKICAgICAgICMgdGlja2V0IHF1ZXVlcwojICAgICAgICBRdWV1ZXMgICA9PiBbJ3N5c3RlbSBxdWV1ZScsICdvdGhlciBxdWV1ZSddLAoKICAgICAgICMgdGlja2V0IHR5cGVzCiMgICAgICAgIFR5cGVzICAgPT4gWydub3JtYWwnLCAnY2hhbmdlJywgJ2luY2lkZW50J10sCgogICAgICAgIyB0aWNrZXQgcHJpb3JpdGllcwojICAgICAgICBQcmlvcml0aWVzICA9PiBbJzEgdmVyeSBsb3cnLCAnMiBsb3cnLCAnMyBub3JtYWwnXSwKCiAgICAgICAjIHRpY2tldCBzZXJ2aWNlcwojICAgICAgICBTZXJ2aWNlcyAgID0+IFsnU2VydmljZSBBJywgJ1NlcnZpY2UgQiddLAoKICAgICAgICMgdGlja2V0IGxvY2tzCiMgICAgICAgIExvY2tzICAgPT4gWyd1bmxvY2snXSwKCiAgICAgICAjIHRpY2tldCBjdXN0b21lcnMKIyAgICAgICAgQ3VzdG9tZXJJRCA9PiAnMTIzJywKIyAgICAgICAgQ3VzdG9tZXJJRCA9PiBbJzEyMycsICdBQkMnXSwKCiAgICAgICAjIDEuLjE2IGZyZWUgdGV4dCBmaWVsZHMKIyAgICAgICAgVGlja2V0RnJlZUtleTEgID0+ICdQcm9kdWN0JywKIyAgICAgICAgVGlja2V0RnJlZVRleHQxID0+ICdhZGFzZCcsCgogICAgICAgIyBvciB3aXRoIG11bHRpIG9wdGlvbnMgYXMgYXJyYXkgcmVmIG9yIHN0cmluZyBwb3NzaWJsZQojICAgICAgICBUaWNrZXRGcmVlS2V5MiAgPT4gWydQcm9kdWN0JywgJ1Byb2R1Y3QyJ10sCiMgICAgICAgIFRpY2tldEZyZWVUZXh0MiA9PiBbJ0Jyb3dzZXInLCAnU291bmQnLCAnTW91c2UnXSwKICAgfSwKCiMgRGVjbGFyYXRpb24gb2YgdHJlc2hob2xkcwojIG1pbl93YXJuX3RyZXNoaG9sZCA+IE51bWJlciBvZiB0aWNrZXRzIC0+IFdBUk5JTkcKIyBtYXhfd2Fybl90cmVzaGhvbGQgPCBOdW1iZXIgb2YgdGlja2V0cyAtPiBXQVJOSU5HCiMgbWluX2NyaXRfdHJlc2hob2xkID4gTnVtYmVyIG9mIHRpY2tldHMgLT4gQUxBUk0KIyBtYXhfd2Fybl90cmVzaGhvbGQgPCBOdW1iZXIgb2YgdGlja2V0cyAtPiBBTEFSTQoKICAgbWluX3dhcm5fdHJlc2hob2xkID0+IDUsCiAgIG1heF93YXJuX3RyZXNoaG9sZCA9PiAxMCwKICAgbWluX2NyaXRfdHJlc2hob2xkID0+IDIsCiAgIG1heF9jcml0X3RyZXNoaG9sZCA9PiAyMCwKCiMgSW5mb3JtYXRpb24gdXNlZCBieSBOYWdpb3MKIyBOYW1lIG9mIGNoZWNrIHNob3duIGluIE5hZ2lvcyBTdGF0dXMgSW5mb3JtYXRpb24KICAgY2hlY2tuYW1lID0+ICdPVFJTIENoZWNrZXInLAoKIyBUZXh0IHNob3duIGluIFN0YXR1cyBJbmZvcm1hdGlvbiBpZiBldmVyeXRoaW5nIGlzIG9rCiAgIE9LX1RYVCAgICA9PiAnZW5qb3kgICB0aWNrZXRzOicsCgojIFRleHQgc2hvd24gaW4gU3RhdHVzIEluZm9ybWF0aW9uIGlmIHdhcm5pbmcgdGhyZXNoaG9sZCByZWFjaGVkCiAgIFdBUk5fVFhUICA9PiAnbnVtYmVyIG9mIHRpY2tldHM6JywKCiMgVGV4dCBzaG93biBpbiBTdGF0dXMgSW5mb3JtYXRpb24gaWYgY3JpdGljYWwgdGhyZXNoaG9sZCByZWFjaGVkCiAgIENSSVRfVFhUICA9PiAnY3JpdGljYWwgbnVtYmVyIG9mIHRpY2tldHM6JywKCik7Cgo=
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==