<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>RotherOSS-CKEditorTimeStamp</Name>
    <Version>10.1.2</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-04-24 10:23:18" Version="10.1.2">Update to OTOBO 10.1.17.</ChangeLog>
    <ChangeLog Date="2022-07-25 09:03:42" Version="10.1.1">Update to OTOBO 10.1.</ChangeLog>
    <Description Lang="en">Adds a timestamp to the CKEDitor.</Description>
    <Description Lang="de">Fügt dem CKEditor einen Timestamp hinzu.</Description>
    <Framework>10.1.x</Framework>
    <BuildCommitID>4a2ec84e0838f975862528ab4eb0c5e380476655</BuildCommitID>
    <BuildDate>2026-04-24 10:23:18</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Output/HTML/Layout.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA0ZTBjZTFiNDRkN2ZhN2U2ZTkzNTg4ZWYxZTQzYTZjMzg1YTVhYWI5IC0gS2VybmVsL091dHB1dC9IVE1ML0xheW91dC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6Ok1ENSBxdyhtZDVfaGV4KTsKdXNlIFNjYWxhcjo6VXRpbCBxdyhibGVzc2VkKTsKCiMgQ1BBTiBtb2R1bGVzCnVzZSBVUkk6OkVzY2FwZSBxdyh1cmlfZXNjYXBlX3V0ZjgpOwp1c2UgUGxhY2s6OlJlc3BvbnNlOwp1c2UgUGxhY2s6OlV0aWw7CgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uICgpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6TGFuZ3VhZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SlNPTicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0b3JhYmxlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtTWFpbnRlbmFuY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmlkZW9DaGF0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCAtIGFsbCBnZW5lcmljIEhUTUwgZnVuY3Rpb25zCgo9Zm9yIHN0b3B3b3JkcyBzYW1lc2l0ZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgZ2VuZXJpYyBIVE1MIGZ1bmN0aW9ucy4gRS4gZy4gdG8gZ2V0IG9wdGlvbnMgZmllbGRzLCB0ZW1wbGF0ZSBwcm9jZXNzaW5nLCAuLi4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhIG5ldyBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKCiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoCiAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgTGFuZyAgICA9PiAnZGUnLAogICAgICAgIH0sCiAgICApOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgICMgJVBhcmFtIG9mdGVuIGhhcyBhIGVudHJ5IGZvciAnU2V0Q29va2llcycKICAgIG15ICRTZWxmID0gYmxlc3MgeyVQYXJhbX0sICRUeXBlOwoKICAgICMgc2V0IGRlZmF1bHRzCiAgICAkU2VsZi0+e0RlYnVnfSA9IDA7CiAgICAkU2VsZi0+e1NldENvb2tpZXN9IC8vPSB7fTsKCiAgICAjIHJlc2V0IGJsb2NrIGRhdGEKICAgIGRlbGV0ZSAkU2VsZi0+e0Jsb2NrRGF0YX07CgogICAgIyBlbXB0eSBhY3Rpb24gaWYgbm90IGRlZmluZWQKICAgICRTZWxmLT57QWN0aW9ufSAvLz0gJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQvc2V0IHNvbWUgY29tbW9uIHBhcmFtcwogICAgJFNlbGYtPntVc2VyVGhlbWV9ICAgIHx8PSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlZmF1bHRUaGVtZScpOwogICAgJFNlbGYtPntVc2VyVGltZVpvbmV9IHx8PSBLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUtPlVzZXJEZWZhdWx0VGltZVpvbmVHZXQoKTsKCiAgICAjIERldGVybWluZSB0aGUgbGFuZ3VhZ2UgdG8gdXNlIGJhc2VkIG9uIHRoZSBicm93c2VyIHNldHRpbmcsIGlmIHRoZXJlIGlzbid0IG9uZSB5ZXQuCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBpZiAoICEkU2VsZi0+e1VzZXJMYW5ndWFnZX0gKSB7CiAgICAgICAgbXkgQEJyb3dzZXJMYW5ndWFnZXMgPSBzcGxpdCAvXHMqLFxzKi8sICRTZWxmLT57TGFuZ30gfHwgJFBhcmFtT2JqZWN0LT5IVFRQKCdIVFRQX0FDQ0VQVF9MQU5HVUFHRScpIHx8ICcnOwogICAgICAgIG15ICVEYXRhID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0VXNlZExhbmd1YWdlcycpIH07CgogICAgICAgIExBTkdVQUdFOgogICAgICAgIGZvciBteSAkQnJvd3NlckxhbmcgKEBCcm93c2VyTGFuZ3VhZ2VzKSB7CiAgICAgICAgICAgIGZvciBteSAkTGFuZ3VhZ2UgKCByZXZlcnNlIHNvcnQga2V5cyAlRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHh4X1hYIGFuZCB4eC1YWCB0eXBlCiAgICAgICAgICAgICAgICBteSAkTGFuZ3VhZ2VPdGhlclR5cGUgPSAkTGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICAkTGFuZ3VhZ2VPdGhlclR5cGUgPX4gcy9fLy0vOwogICAgICAgICAgICAgICAgaWYgKCAkQnJvd3NlckxhbmcgPX4gL14oJExhbmd1YWdlfCRMYW5ndWFnZU90aGVyVHlwZSkvaSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gPSAkTGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBMQU5HVUFHRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1VzZXJMYW5ndWFnZX0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJExhbmd1YWdlICggcmV2ZXJzZSBzb3J0IGtleXMgJURhdGEgKSB7CgogICAgICAgICAgICAgICAgICAgICMgSWYgQnJvd3NlciByZXF1ZXN0cyAndmknLCBhbHNvIG9mZmVyICd2aV9WSScgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSAndmknCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTGFuZ3VhZ2UgPX4gbS9eJEJyb3dzZXJMYW5nL3NteGkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckxhbmd1YWdlfSA9ICRMYW5ndWFnZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgTEFOR1VBR0U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VXNlckxhbmd1YWdlfSB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwogICAgfQoKICAgICMgY3JlYXRlIGxhbmd1YWdlIG9iamVjdAogICAgaWYgKCAhJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAnS2VybmVsOjpMYW5ndWFnZScgPT4gewogICAgICAgICAgICAgICAgVXNlclRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyk7CiAgICB9CgogICAgIyBzZXQgY2hhcnNldCBpZiB0aGVyZSBpcyBubyBjaGFyc2V0IGdpdmVuCiAgICAkU2VsZi0+e1VzZXJDaGFyc2V0fSA9ICd1dGYtOCc7ICAgICAgICAgICAgICAgICAjIG9ubHkgdXRmLTggaXMgc3VwcG9ydGVkLCB1c2VkIGRpcmVjdGx5IGJ5IGZyb250ZW5kIG1vZHVsZXMKICAgICRTZWxmLT57Q2hhcnNldH0gICAgID0gJFNlbGYtPntVc2VyQ2hhcnNldH07ICAgICMganVzdCBmb3IgY29tcGF0aWJpbGl0eSwgdXNlZCBkaXJlY3RseSBieSBmcm9udGVuZCBtb2R1bGVzCiAgICAkU2VsZi0+e1Nlc3Npb25JRH0gICA9ICRQYXJhbXtTZXNzaW9uSUR9ICAgfHwgJyc7CiAgICAkU2VsZi0+e1Nlc3Npb25OYW1lfSA9ICRQYXJhbXtTZXNzaW9uTmFtZX0gfHwgJ1Nlc3Npb25JRCc7CgogICAgIyBCYXNlbGluayBpcyBhIGxvY2FsIGxpbmsgbGlrZSAvb3RvYm8vaW5kZXgucGw/CiAgICAkU2VsZi0+e0NHSUhhbmRsZX0gPSAkUGFyYW1PYmplY3QtPlNjcmlwdE5hbWUgfHwgJ05vLSRFTlZ7IlNDUklQVF9OQU1FIn0nOwogICAgJFNlbGYtPntCYXNlbGlua30gID0gJFNlbGYtPntDR0lIYW5kbGV9IC4gJz8nOwoKICAgICRTZWxmLT57VGltZX0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VGltZSgKICAgICAgICBBY3Rpb24gPT4gJ0dFVCcsCiAgICAgICAgRm9ybWF0ID0+ICdEYXRlRm9ybWF0JywKICAgICk7CiAgICAkU2VsZi0+e1RpbWVMb25nfSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UaW1lKAogICAgICAgIEFjdGlvbiA9PiAnR0VUJywKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVGb3JtYXRMb25nJywKICAgICk7CgogICAgIyBzZXQgdGV4dCBkaXJlY3Rpb24KICAgICRTZWxmLT57VGV4dERpcmVjdGlvbn0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259OwoKICAgICMgY2hlY2sgRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyRWxlbWVudFBvc3QKICAgICRTZWxmLT57RmlsdGVyRWxlbWVudFBvc3R9ID0ge307CgogICAgbXkgJUZpbHRlckVsZW1lbnRQb3N0ID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCcpIC8vIHt9IH07CgogICAgRklMVEVSOgogICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlckVsZW1lbnRQb3N0ICkgewoKICAgICAgICAjIGV4dHJhY3QgZmlsdGVyIGNvbmZpZwogICAgICAgIG15ICRGaWx0ZXJDb25maWcgPSAkRmlsdGVyRWxlbWVudFBvc3R7JEZpbHRlcn07CgogICAgICAgIG5leHQgRklMVEVSIGlmICEkRmlsdGVyQ29uZmlnIHx8IHJlZiAkRmlsdGVyQ29uZmlnIG5lICdIQVNIJzsKCiAgICAgICAgIyBleHRyYWN0IHRlbXBsYXRlIGxpc3QKICAgICAgICBteSAlVGVtcGxhdGVMaXN0ID0gJXsgJEZpbHRlckNvbmZpZy0+e1RlbXBsYXRlc30gfHwge30gfTsKCiAgICAgICAgaWYgKCAhJVRlbXBsYXRlTGlzdCB8fCAkVGVtcGxhdGVMaXN0e0FMTH0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiA8PCJFT0YiLAokRmlsdGVyQ29uZmlnLT57TW9kdWxlfSB3aWxsIGJlIGlnbm9yZWQgYmVjYXVzZSBpdCB3YW50cyB0byBvcGVyYXRlIG9uIGFsbCB0ZW1wbGF0ZXMgb3IgZG9lcyBub3Qgc3BlY2lmeSBhIHRlbXBsYXRlIGxpc3QuCkVPRgogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBGSUxURVI7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0ZpbHRlckVsZW1lbnRQb3N0fS0+eyRGaWx0ZXJ9ID0gJEZpbHRlckVsZW1lbnRQb3N0eyRGaWx0ZXJ9OwogICAgfQoKICAgICMgY2hlY2sgRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyQ29udGVudAogICAgJFNlbGYtPntGaWx0ZXJDb250ZW50fSA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyQ29udGVudCcpOwoKICAgICMgY2hlY2sgRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyVGV4dAogICAgJFNlbGYtPntGaWx0ZXJUZXh0fSA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyVGV4dCcpOwoKICAgICMgY2hlY2sgYnJvd3NlcgogICAgJFNlbGYtPntCcm93c2VyfSAgICAgICAgID0gJ1Vua25vd24nOwogICAgJFNlbGYtPntCcm93c2VyVmVyc2lvbn0gID0gMDsKICAgICRTZWxmLT57UGxhdGZvcm19ICAgICAgICA9ICcnOwogICAgJFNlbGYtPntJc01vYmlsZX0gICAgICAgID0gMDsKICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDE7CgogICAgJFNlbGYtPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ID0gMTsKCiAgICBteSAkSHR0cFVzZXJBZ2VudCA9IGxjKCAkUGFyYW1PYmplY3QtPkhUVFAoJ1VTRVJfQUdFTlQnKSAvLyAnJyApOwoKICAgIGlmICggISRIdHRwVXNlckFnZW50ICkgewogICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnVW5rbm93biAtIG5vICRFTlZ7IkhUVFBfVVNFUl9BR0VOVCJ9JzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrLCBpZiB3ZSBhcmUgb24gYSBtb2JpbGUgcGxhdGZvcm0uCiAgICAgICAgIyB0YWJsZXRzIGFyZSBoYW5kbGVkIGxpa2UgZGVza3RvcHMKICAgICAgICAjIG9ubHkgcGhvbmVzIGFyZSAibW9iaWxlIgogICAgICAgIGlmICggJEh0dHBVc2VyQWdlbnQgPX4gL21vYmlsZS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57SXNNb2JpbGV9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgYW5kcm9pZAogICAgICAgIGlmICggJEh0dHBVc2VyQWdlbnQgPX4gL2FuZHJvaWQvICkgewogICAgICAgICAgICAkU2VsZi0+e1BsYXRmb3JtfSA9ICdBbmRyb2lkJzsKICAgICAgICB9CgogICAgICAgICMgZWRnZSAvIHNwYXJ0YW4KICAgICAgICBpZiAoICRIdHRwVXNlckFnZW50ID1+IC9lZGdlLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdFZGdlJzsKICAgICAgICB9CgogICAgICAgICMgbXNpZQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJEh0dHBVc2VyQWdlbnQgPX4gL21zaWVccyhbMC05Ll0rKS8KICAgICAgICAgICAgfHwgJEh0dHBVc2VyQWdlbnQgPX4gL2ludGVybmV0XHNleHBsb3JlclwvKFswLTkuXSspLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ01TSUUnOwoKICAgICAgICAgICAgaWYgKCAkMSA9fiAvKFxkKylcLihcZCspLyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlck1ham9yVmVyc2lvbn0gPSAkMTsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlck1pbm9yVmVyc2lvbn0gPSAkMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvbGRlciB3aW5kb3dzIG1vYmlsZSBwaG9uZXMgKHVudGlsIElFOSksIHRoYXQgc3RpbGwgaGF2ZSAnTVNJRScgaW4gdGhlIHVzZXIgYWdlbnQgc3RyaW5nCiAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01vYmlsZX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BsYXRmb3JtfSA9ICdXaW5kb3dzIFBob25lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBtb2JpbGUgaWUKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9pZW1vYmlsZS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gID0gJ01TSUUnOwogICAgICAgICAgICAkU2VsZi0+e1BsYXRmb3JtfSA9ICdXaW5kb3dzIFBob25lJzsKICAgICAgICB9CgogICAgICAgICMgbW9iaWxlIGllIChzZWNvbmQgdHJ5KQogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL3RyaWRlbnQvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ01TSUUnOwoKICAgICAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvcnY6KFswLTldKStcLihbMC05XSkrLyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlck1ham9yVmVyc2lvbn0gPSAkMjsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlck1pbm9yVmVyc2lvbn0gPSAkMzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpT1MKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC8oaXBhZHxpcGhvbmV8aXBvZCkvICkgewogICAgICAgICAgICAkU2VsZi0+e1BsYXRmb3JtfSA9ICdpT1MnOwogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ICA9ICdTYWZhcmknOwoKICAgICAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvKGlwYWR8aXBob25lfGlwb2QpOy4qY3B1LipvcyAoWzAtOV0rKV8vICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyVmVyc2lvbn0gPSAkMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvY3Jpb3MvICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdDaHJvbWUnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFJpY2hUZXh0IGlzIHN1cHBvcnRlZCBpbiBpT1M2Ky4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0Jyb3dzZXJWZXJzaW9ufSA+PSA2ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2FmYXJpCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvc2FmYXJpLyApIHsKCiAgICAgICAgICAgICMgY2hyb21lCiAgICAgICAgICAgIGlmICggJEh0dHBVc2VyQWdlbnQgPX4gL2Nocm9tZS8gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0Nocm9tZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ1NhZmFyaSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMga29ucXVlcm9yCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAva29ucXVlcm9yLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdLb25xdWVyb3InOwoKICAgICAgICAgICAgIyBvbiBrb25xdWVyZXIgZGlzYWJsZSByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIGZpcmVmb3gKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9maXJlZm94LyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdGaXJlZm94JzsKICAgICAgICB9CgogICAgICAgICMgb3BlcmEKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9eb3BlcmEuKi8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnT3BlcmEnOwogICAgICAgIH0KCiAgICAgICAgIyBuZXRzY2FwZQogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL25ldHNjYXBlLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdOZXRzY2FwZSc7CiAgICAgICAgfQoKICAgICAgICAjIHczbQogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL153M20uKi8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gICAgICAgICAgICAgICAgICA9ICd3M20nOwogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBseW54CiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvXmx5bnguKi8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gICAgICAgICAgICAgICAgICA9ICdMeW54JzsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgbGlua3MKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9ebGlua3MuKi8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnTGlua3MnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdVbmtub3duIC0gJyAuICRIdHRwVXNlckFnZW50OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG1vYmlsZSBkZXZpY2VzIHRvIGRpc2FibGUgcmljaHRleHQgc3VwcG9ydAogICAgaWYgKAogICAgICAgICRTZWxmLT57SXNNb2JpbGV9CiAgICAgICAgJiYgJFNlbGYtPntQbGF0Zm9ybX0gbmUgJ2lPUycKICAgICAgICAmJiAkU2VsZi0+e1BsYXRmb3JtfSBuZSAnQW5kcm9pZCcKICAgICAgICAmJiAkU2VsZi0+e1BsYXRmb3JtfSBuZSAnV2luZG93cyBQaG9uZScKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHJpY2ggdGV4dCBjYW4gYmUgYWN0aXZlCiAgICBpZiAoICEkU2VsZi0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gfHwgISRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIEtleSAgID0+ICdGcm9udGVuZDo6UmljaFRleHQnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiByaWNoIHRleHQgaXMgYWN0aXZlCiAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7CiAgICB9CgogICAgIyBsb2FkIHRoZW1lCiAgICBteSAkVGhlbWUgPSAkU2VsZi0+e1VzZXJUaGVtZX0gfHwgJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0VGhlbWUnKSB8fCBUcmFuc2xhdGFibGUoJ1N0YW5kYXJkJyk7CgogICAgIyBmb3JjZSBhIHRoZW1lIGJhc2VkIG9uIGhvc3QgbmFtZQogICAgbXkgJERlZmF1bHRUaGVtZUhvc3RCYXNlZCA9ICRDb25maWdPYmplY3QtPkdldCgnRGVmYXVsdFRoZW1lOjpIb3N0QmFzZWQnKTsKICAgIG15ICRIb3N0ICAgICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkhUVFAoJ0hPU1QnKTsKICAgIGlmICggJERlZmF1bHRUaGVtZUhvc3RCYXNlZCAmJiAkSG9zdCApIHsKCiAgICAgICAgVEhFTUU6CiAgICAgICAgZm9yIG15ICRSZWdFeHAgKCBzb3J0IGtleXMgJXskRGVmYXVsdFRoZW1lSG9zdEJhc2VkfSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBlbXB0eSByZWdleHAgb3IgdGhlbWUgZGlyZWN0b3JpZXMKICAgICAgICAgICAgbmV4dCBUSEVNRSBpZiAhJFJlZ0V4cDsKICAgICAgICAgICAgbmV4dCBUSEVNRSBpZiAkUmVnRXhwIGVxICcnOwogICAgICAgICAgICBuZXh0IFRIRU1FIGlmICEkRGVmYXVsdFRoZW1lSG9zdEJhc2VkLT57JFJlZ0V4cH07CgogICAgICAgICAgICAjIGNoZWNrIGlmIHJlZ2V4cCBpcyBtYXRjaGluZwogICAgICAgICAgICBpZiAoICRIb3N0ID1+IG0vJFJlZ0V4cC9pICkgewogICAgICAgICAgICAgICAgJFRoZW1lID0gJERlZmF1bHRUaGVtZUhvc3RCYXNlZC0+eyRSZWdFeHB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbG9jYXRlIHRlbXBsYXRlIGZpbGVzCiAgICAkU2VsZi0+e1RlbXBsYXRlRGlyfSAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUZW1wbGF0ZURpcicpIC4gJy9IVE1ML1RlbXBsYXRlcy8nIC4gJFRoZW1lOwogICAgJFNlbGYtPntTdGFuZGFyZFRlbXBsYXRlRGlyfSA9ICRDb25maWdPYmplY3QtPkdldCgnVGVtcGxhdGVEaXInKSAuICcvSFRNTC9UZW1wbGF0ZXMvJyAuICdTdGFuZGFyZCc7CgogICAgIyBDaGVjayBpZiAnU3RhbmRhcmQnIGZhbGxiYWNrIGV4aXN0cwogICAgaWYgKCAhLWUgJFNlbGYtPntTdGFuZGFyZFRlbXBsYXRlRGlyfSApIHsKICAgICAgICAkU2VsZi0+RmF0YWxEaWUoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJObyBleGlzdGluZyB0ZW1wbGF0ZSBkaXJlY3RvcnkgZm91bmQgKCckU2VsZi0+e1RlbXBsYXRlRGlyfScpISBDaGVjayB5b3VyIEhvbWUgaW4gS2VybmVsL0NvbmZpZy5wbS4iCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICEtZSAkU2VsZi0+e1RlbXBsYXRlRGlyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICJObyBleGlzdGluZyB0ZW1wbGF0ZSBkaXJlY3RvcnkgZm91bmQgKCckU2VsZi0+e1RlbXBsYXRlRGlyfScpISIKICAgICAgICAgICAgICAgIC4gIiBEZWZhdWx0IHRoZW1lIHVzZWQgaW5zdGVhZC4iLAogICAgICAgICk7CgogICAgICAgICMgU2V0IFRlbXBsYXRlRGlyIHRvICdTdGFuZGFyZCcgYXMgYSBmYWxsYmFjay4KICAgICAgICAkVGhlbWUgPSAnU3RhbmRhcmQnOwogICAgICAgICRTZWxmLT57VGVtcGxhdGVEaXJ9ID0gJFNlbGYtPntTdGFuZGFyZFRlbXBsYXRlRGlyfTsKICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbVRlbXBsYXRlRGlyfSAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21UZW1wbGF0ZURpcicpIC4gJy9IVE1ML1RlbXBsYXRlcy8nIC4gJFRoZW1lOwogICAgJFNlbGYtPntDdXN0b21TdGFuZGFyZFRlbXBsYXRlRGlyfSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tVGVtcGxhdGVEaXInKSAuICcvSFRNTC9UZW1wbGF0ZXMvJyAuICdTdGFuZGFyZCc7CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIGxvYWQgc3ViIGxheW91dCBmaWxlcwogICAgbXkgJE5ld0RpciA9ICRDb25maWdPYmplY3QtPkdldCgnVGVtcGxhdGVEaXInKSAuICcvSFRNTC9MYXlvdXQnOwogICAgaWYgKCAtZSAkTmV3RGlyICkgewogICAgICAgIG15IEBOZXdGaWxlcyA9ICRNYWluT2JqZWN0LT5EaXJlY3RvcnlSZWFkKAogICAgICAgICAgICBEaXJlY3RvcnkgPT4gJE5ld0RpciwKICAgICAgICAgICAgRmlsdGVyICAgID0+ICcqLnBtJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkTmV3RmlsZSAoQE5ld0ZpbGVzKSB7CiAgICAgICAgICAgIGlmICggJE5ld0ZpbGUgIX4gL0xheW91dC5wbSQvICkgewogICAgICAgICAgICAgICAgJE5ld0ZpbGUgPX4gc3tcQS4qXC8oLis/KS5wbVx6fXskMX14bXM7CiAgICAgICAgICAgICAgICBteSAkTmV3Q2xhc3NOYW1lID0gIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ6OiROZXdGaWxlIjsKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlQmFzZUNsYXNzKCROZXdDbGFzc05hbWUpICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5GYXRhbERpZSgKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGxvYWQgY2xhc3MgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6JE5ld0ZpbGUuIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntTZXNzaW9uSUR9ICYmICRTZWxmLT57VXNlckNoYWxsZW5nZVRva2VufSApIHsKICAgICAgICAkU2VsZi0+e0NoYWxsZW5nZVRva2VuUGFyYW19ID0gIkNoYWxsZW5nZVRva2VuPSRTZWxmLT57VXNlckNoYWxsZW5nZVRva2VufTsiOwogICAgfQoKICAgICMgbG9hZCBOYXZpZ2F0aW9uTW9kdWxlIGlmIGRlZmluZWQKICAgIGlmICggJFNlbGYtPntNb2R1bGVSZWd9ICkgewogICAgICAgIG15ICROYXZpZ2F0aW9uTW9kdWxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJGcm9udGVuZDo6TmF2aWdhdGlvbk1vZHVsZSIpOwogICAgICAgIGlmICggJE5hdmlnYXRpb25Nb2R1bGUtPnsgJFBhcmFte0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntOYXZpZ2F0aW9uTW9kdWxlfSA9ICROYXZpZ2F0aW9uTW9kdWxlLT57ICRQYXJhbXtBY3Rpb259IH07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFNldEVudigpCgpBZGQgYWRkaXRpb25hbCBkYXRhIHRvIHRoZSB0ZW1wbGF0ZSBlbnZpcm9ubWVudCBiZWZvcmUgb3V0cHV0IGlzIGdlbmVyYXRlZC4KCj1jdXQKCnN1YiBTZXRFbnYgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgKHF3KEtleSBWYWx1ZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57RW52TmV3UmVmfS0+eyAkUGFyYW17S2V5fSB9ID0gJFBhcmFte1ZhbHVlfTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEJsb2NrKCkKCmNhbGwgYSBibG9jayBhbmQgcGFzcyBkYXRhIHRvIGl0IChvcHRpb25hbCkgdG8gZ2VuZXJhdGUgdGhlIGJsb2NrJ3Mgb3V0cHV0LgoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFRpbWUgPT4gLi4uLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEJsb2NrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBOYW1lIScKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyAkU2VsZi0+e0Jsb2NrRGF0YX0gd2lsbCBiZSB1c2VkIGluIHRoZSBzdWJyb3V0aW5lIE91dHB1dCgpCiAgICAjIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IHRoZSBiYXNlIG1vZHVsZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OjpUZW1wbGF0ZQogICAgJFNlbGYtPntCbG9ja0RhdGF9IC8vPSBbXTsKICAgIHB1c2ggQHsgJFNlbGYtPntCbG9ja0RhdGF9IH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgfTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEpTT05FbmNvZGUoKQoKU2VyaWFsaXplIGEgUGVybCBkYXRhIHN0cnVjdHVyZSBhcyBKU09OLgpUaGUgcGFyYW1ldGVycyBDPFNvcnRLZXlzPiBhbmQgQzxQcmV0dHk+IGFyZSBwYXNzZWQgb24gdG8gdGhlIG1ldGhvZCBDPEtlcm5lbDo6U3lzdGVtOjpKU09OOjpFbmNvZGUoKT4uCgogICAgbXkgJUhhc2ggPSAoCiAgICAgICAgS2V5MSA9PiAnU29tZXRoaW5nJywKICAgICAgICBLZXkyID0+IFsgIkZvbyIsICJCYXIiIF0sCiAgICApOwogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgIERhdGEgICAgID0+IFwlSGFzaCwKICAgICAgICBOb1F1b3RlcyA9PiAwLCAjIG9wdGlvbmFsOiAwfDEgbm8gZG91YmxlIHF1b3RlcyBhdCB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgSlNPTiBzdHJpbmcsIGRlZmF1bHQgaXMgMAogICAgICAgIFNvcnRLZXlzID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkSlNPTiA9IDw8J0VORF9KU09OJzsKICAgIHsKICAgICAgICJLZXkxIiA6ICJTb21ldGhpbmciLAogICAgICAgIktleTIiIDogWwogICAgICAgICAgIkZvbyIsCiAgICAgICAgICAiQmFyIgogICAgICAgXSwKICAgIH0KICAgIEVORF9KU09OCgo9Y3V0CgpzdWIgSlNPTkVuY29kZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJFBhcmFte0RhdGF9OwoKICAgICMgZ2V0IEpTT04gZW5jb2RlZCBkYXRhCiAgICBteSAkSlNPTiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkVuY29kZSgKICAgICAgICBEYXRhID0+ICRQYXJhbXtEYXRhfSwKICAgICkgfHwgJyIiJzsKCiAgICAjIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBkb3VibGUgcXVvdGVzIGlmIHJlcXVlc3RlZAogICAgaWYgKCAkUGFyYW17Tm9RdW90ZXN9ICkgewogICAgICAgICRKU09OID1+IHN7IFxBICIoLiopIiBceiB9eyQxfXNteDsKICAgIH0KCiAgICByZXR1cm4gJEpTT047Cn0KCj1oZWFkMiBSZWRpcmVjdCgpCgp0aHJvdyBhIEw8S2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uPiB0aGF0IHRyaWdnZXJzIGEgcmVkaXJlY3QuIFRoZSB0YXJnZXQgZm9yIHRoZSByZWRpcmVjdApjYW4gYmUgZ2l2ZW4gZWl0aGVyIHdpdGggdGhlIHBhcmFtZXRlciBDPE9QPiBvciBDPEV4dFVSTD4uCgogICAgIyBpbnRlcm5hbCByZWRpcmVjdHMKICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgIE9QID0+ICJBY3Rpb249QWRtaW5Vc2VyR3JvdXA7U3ViYWN0aW9uPVVzZXI7SUQ9JFVzZXJJRCIsCiAgICApOwoKICAgICMgZXh0ZXJuYWwgcmVkaXJlY3RzCiAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICBFeHRVUkwgPT4gImh0dHA6Ly9zb21lLmV4YW1wbGUuY29tLyIsCiAgICApOwoKRHVyaW5nIGxvZ2luIGFjdGlvbiwgQzxMb2dpbiA9PiAxPiBzaG91bGQgYmUgcGFzc2VkIHRvIFJlZGlyZWN0KCkuClRoaXMgaW5kaWNhdGVzIHRoYXQgaWYgdGhlIGJyb3dzZXIgaGFzIGNvb2tpZSBzdXBwb3J0LCBpdCBpcyBPSwpmb3IgdGhlIHNlc3Npb24gY29va2llIHRvIGJlIG5vdCB5ZXQgc2V0LgoKPWN1dAoKc3ViIFJlZGlyZWN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBGaWd1cmUgb3V0IHRvIHdoaWNoIFVSTCBzaG91bGQgYmUgcmVkaXJlY3RlZAogICAgbXkgJFJlZGlyZWN0VVJMOwogICAgaWYgKCAkUGFyYW17RXh0VVJMfSApIHsKICAgICAgICAkUmVkaXJlY3RVUkwgPSAkUGFyYW17RXh0VVJMfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRSZWRpcmVjdFVSTCA9ICRTZWxmLT57QmFzZWxpbmt9OyAgICAjIHRoZSBmYWxsYmFjayB3aGVuIHRoZXJlIGlzIG5vIHBhcmFtZXRlciBPUAoKICAgICAgICBpZiAoICRQYXJhbXtPUH0gKSB7CgogICAgICAgICAgICAjIEZpbHRlciBvdXQgaGF6YXJkb3VzIGNoYXJhY3RlcnMKICAgICAgICAgICAgaWYgKCAkUGFyYW17T1B9ID1+IHN7XHgwMH17fXNteGcgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTb21lb25lIHRyaWVzIHRvIHVzZSBhIG51bGwgYnl0ZXMgKFx4MDApIGNoYXJhY3RlciBpbiByZWRpcmVjdCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17T1B9ID1+IHN7XHJ9e31zbXhnICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU29tZW9uZSB0cmllcyB0byB1c2UgYSBjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVyIGluIHJlZGlyZWN0IScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtPUH0gPX4gc3tcbn17fXNteGcgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTb21lb25lIHRyaWVzIHRvIHVzZSBhIG5ld2xpbmUgY2hhcmFjdGVyIGluIHJlZGlyZWN0IScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGludGVybmFsIHJlZGlyZWN0CiAgICAgICAgICAgICRQYXJhbXtPUH0gPX4gcy9eLipcPyguKz8pJC8kMS87CiAgICAgICAgICAgICRSZWRpcmVjdFVSTCAuPSAkUGFyYW17T1B9OwogICAgICAgIH0KCiAgICAgICAgIyB0cmltbWluZywganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlCiAgICAgICAgJFJlZGlyZWN0VVJMID1+IHMvXlxzKy8vOwogICAgICAgICRSZWRpcmVjdFVSTCA9fiBzL1xzKyQvLzsKCiAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCB0byB0aGUgcmVkaXJlY3QgVVJMIHdoZW4gYXBwcm9wcmlhdGUKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlcmUgaW4gbm8gc2Vzc2lvbiBjb29raWUgeWV0CiAgICAgICAgICAgICYmICEoICRTZWxmLT57QnJvd3Nlckhhc0Nvb2tpZX0gJiYgJFBhcmFte0xvZ2lufSApICAgICMgbm90IHdoZW4gY29va2llIGRvZXMgbm90IGV4aXRzIGJlY2F1c2Ugd2UgaW4gTG9naW4KICAgICAgICAgICAgJiYgJFJlZGlyZWN0VVJMICF+IG0vaHR0cC9pICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA/Pz8KICAgICAgICAgICAgJiYgJFNlbGYtPntTZXNzaW9uSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVuIHdlIGFjdHVhbGx5IGhhdmUgYSBzZXNzaW9uCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIFRPRE86IHRoaW5rIGFib3V0IHVzaW5nIFVSSTo6cXVlcnlfZm9ybSgpIGZvciBtZXNzaW5nIHdpdGggdGhlIFVSTAoKICAgICAgICAgICAgIyBsb29rIGZvciB0aGUgZnJhZ21lbnQgcGFydCBvZiB0aGUgVVJMLCB0aGUgZnJhZ21lbnQgcGFydCBzdGFydHMgd2l0aCBhbiAnIycgYW5kIGlzIGFsd2F5cyBhdCB0aGUgZW5kIG9mIHRoZSBVUkwKICAgICAgICAgICAgbXkgKCAkVGFyZ2V0LCAkRnJhZ21lbnQgKTsKICAgICAgICAgICAgaWYgKCAkUmVkaXJlY3RVUkwgPX4gbS9eKC4rPykjKHwuKz8pJC8gKSB7CiAgICAgICAgICAgICAgICAkVGFyZ2V0ICAgPSAkMTsKICAgICAgICAgICAgICAgICRGcmFnbWVudCA9ICIjJDIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRhcmdldCAgID0gJFJlZGlyZWN0VVJMOwogICAgICAgICAgICAgICAgJEZyYWdtZW50ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZmluZCBvdXQgaG93IHRvIGNvcnJlY3QgaW5qZWN0IHRoZSBzZXNzaW9uIGlkIHBhcmFtZXRlciwgZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiB0YXJnZXQKICAgICAgICAgICAgbXkgJEpvaW5lciA9IGV2YWwgewoKICAgICAgICAgICAgICAgICMgZWl0aGVyIGFuIGVtcHR5IHF1ZXJ5IHBhcnQgb3IgYW4gZW1wdHkgZmluYWwgcXVlcnkgcGFyYW0KICAgICAgICAgICAgICAgIHJldHVybiAnJyBpZiAkVGFyZ2V0ID1+IG0vKFw/fCYpJC87CgogICAgICAgICAgICAgICAgIyB0aGVyZSBpcyBubyBxdWVyeSBwYXJ0IHlldAogICAgICAgICAgICAgICAgcmV0dXJuICc/JyBpZiAkVGFyZ2V0ICF+IG0vXD8vOwoKICAgICAgICAgICAgICAgICMgYWRkIHF1ZXJ5IHBhcmFtIHRvIGV4aXN0aW5nIHF1ZXJ5IHBhcnQKICAgICAgICAgICAgICAgIHJldHVybiAnJic7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAjIGFkZCB0aGUgZnJhZ21lbnQgcGFydCBvZiB0aGUgVVJMIGFnYWluCiAgICAgICAgICAgICRSZWRpcmVjdFVSTCA9ICRUYXJnZXQgLiAkSm9pbmVyIC4gIiRTZWxmLT57U2Vzc2lvbk5hbWV9PSRTZWxmLT57U2Vzc2lvbklEfSIgLiAkRnJhZ21lbnQ7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFuIHJlc3BvbnNlIG9iamVjdCB3ZSBjYW4gd29yayB3aXRoCiAgICBteSAkUmVkaXJlY3RSZXNwb25zZSA9IFBsYWNrOjpSZXNwb25zZS0+bmV3KCk7CiAgICAkUmVkaXJlY3RSZXNwb25zZS0+cmVkaXJlY3QoJFJlZGlyZWN0VVJMKTsKCiAgICAjIEFkZCB0aGUgY29va2llcyB0aGF0IGhhZCBiZWVuIHNldCBpbiB0aGUgY29uc3RydWN0b3IuCiAgICAjIFRoZSB2YWx1ZXMgb2YgJFNlbGYtPntTZXRDb29raWVzfSBhcmUgcGxhaW4gaGFzaCByZWZlcmVuY2VzLgogICAgIyBGb3Igc29tZSByZWFzb24gdGhlIG5hbWUgZXZlbnR1YWxseSB1c2VkIGJ5IENvb2tpZTo6QmFrZXI6OmJha2VfY29va2llKCkgaXMgdGhlIGF0dHJpYnV0ZSAnbmFtZScgb2YgdGhlIGhhc2hyZWYuCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1NldENvb2tpZXN9CiAgICAgICAgJiYgcmVmICRTZWxmLT57U2V0Q29va2llc30gZXEgJ0hBU0gnCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llJykKICAgICAgICApCiAgICB7CiAgICAgICAgZm9yICggc29ydCBrZXlzICRTZWxmLT57U2V0Q29va2llc30tPiUqICkgewoKICAgICAgICAgICAgIyBtYWtlIGEgY29weSBiZWNhdXNlIHdlIG1pZ2h0IG5lZWQgJFNlbGYtPntTZXRDb29raWVzfSBsYXRlciBvbgogICAgICAgICAgICBteSAlSW5ncmVkaWVudHMgPSAkU2VsZi0+e1NldENvb2tpZXN9LT57JF99LT4lKjsKICAgICAgICAgICAgbXkgJE5hbWUgICAgICAgID0gZGVsZXRlICRJbmdyZWRpZW50c3tuYW1lfTsKCiAgICAgICAgICAgICMgdGhlIG1ldGhvZCAnY29va2llcycgaXMgaW4gbG93ZXIgY2FzZSBiZWNhdXNlIHdlIHVzZSBQbGFjazo6UmVzcG9uc2UgZGlyZWN0bHkKICAgICAgICAgICAgJFJlZGlyZWN0UmVzcG9uc2UtPmNvb2tpZXMtPnskTmFtZX0gPSBcJUluZ3JlZGllbnRzOwogICAgICAgIH0KICAgIH0KCiAgICAjIFRoZSBleGNlcHRpb24gaXMgY2F1Z2h0IGJlIFBsYWNrOjpNaWRkbGV3YXJlOjpIVFRQRXhjZXB0aW9ucwogICAgZGllIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbi0+bmV3KAogICAgICAgIFBsYWNrUmVzcG9uc2UgPT4gJFJlZGlyZWN0UmVzcG9uc2UKICAgICk7Cn0KCnN1YiBMb2dpbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IEFjdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBsb2FkZXIKICAgICRTZWxmLT57QWN0aW9ufSA9ICdMb2dpbic7CiAgICAkUGFyYW17SXNMb2dpblBhZ2V9ID0gMTsKCiAgICAjIGdldCBzaW5nbGV0b25zCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewoKICAgICAgICAjIGFsd2F5cyBzZXQgYSBjb29raWUsIHNvIHRoYXQgYXQgdGhlIHRpbWUgdGhlIHVzZXIgc3VibWl0cwogICAgICAgICMgdGhlIHBhc3N3b3JkLCB3ZSBrbm93IGFscmVhZHkgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgY29va2llcy4KICAgICAgICAjICggdGhlIHNlc3Npb24gY29va2llIGlzbid0IGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUgKS4KCiAgICAgICAgIyBSZXN0cmljdCBDb29raWUgdG8gSFRUUFMgaWYgaXQgaXMgdXNlZC4KICAgICAgICBteSAkQ29va2llU2VjdXJlQXR0cmlidXRlID0gJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpIGVxICdodHRwcycgPyAxIDogdW5kZWY7CgogICAgICAgIG15ICRFeHBpcmVzID0gJysnIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTWF4VGltZScpIC4gJ3MnOwogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZUFmdGVyQnJvd3NlckNsb3NlJykgKSB7CiAgICAgICAgICAgICRFeHBpcmVzID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhIGNvb2tpZSB0ZW50YXRpdmVseSBmb3IgY2hlY2tpbmcgY29va2llIHN1cHBvcnQKICAgICAgICAkU2VsZi0+U2V0Q29va2llKAogICAgICAgICAgICBLZXkgICAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgVmFsdWUgICAgPT4gMSwKICAgICAgICAgICAgRXhwaXJlcyAgPT4gJEV4cGlyZXMsCiAgICAgICAgICAgIFBhdGggICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKSwKICAgICAgICAgICAgU2VjdXJlICAgPT4gJENvb2tpZVNlY3VyZUF0dHJpYnV0ZSwKICAgICAgICAgICAgSHR0cE9ubHkgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG1lc3NhZ2Ugb2YgdGhlIGRheQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nob3dNb3RkJykgKSB7CiAgICAgICAgJFBhcmFte01vdGR9ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdNb3RkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICAgICApOwogICAgfQoKICAgICMgR2VuZXJhdGUgdGhlIG1pbmlmaWVkIENTUyBhbmQgSmF2YVNjcmlwdCBmaWxlcyBhbmQgdGhlIHRhZ3MgcmVmZXJlbmNpbmcgdGhlbSAoc2VlIExheW91dExvYWRlcikKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVBZ2VudENTU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQWdlbnRKU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlSmF2YVNjcmlwdFRyYW5zbGF0aW9uRGF0YSgpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUZW1wbGF0ZURhdGEoKTsKCiAgICAjIHdlIG5lZWQgdGhlIGJhc2VsaW5rIGZvciBWZXJmaWZpZWRHZXQoKSBvZiBzZWxlbml1bSB0ZXN0cwogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQmFzZWxpbmsnLAogICAgICAgIFZhbHVlID0+ICRTZWxmLT57QmFzZWxpbmt9LAogICAgKTsKCiAgICAjIEFkZCBoZWFkZXIgbG9nbywgaWYgY29uZmlndXJlZAogICAgaWYgKCBkZWZpbmVkICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRMb2dvJykgKSB7CiAgICAgICAgbXkgJUFnZW50TG9nbyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRMb2dvJykgfTsKICAgICAgICBteSAlRGF0YTsKCiAgICAgICAgZm9yIG15ICRDU1NTdGF0ZW1lbnQgKCBzb3J0IGtleXMgJUFnZW50TG9nbyApIHsKICAgICAgICAgICAgaWYgKCAkQ1NTU3RhdGVtZW50IGVxICdVUkwnICkgewogICAgICAgICAgICAgICAgbXkgJFdlYlBhdGggPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fSAhfiAvKGh0dHB8ZnRwfGh0dHBzKTpcLy9pICkgewogICAgICAgICAgICAgICAgICAgICRXZWJQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJERhdGF7J1VSTCd9ID0gJ3VybCgnIC4gJFdlYlBhdGggLiAkQWdlbnRMb2dveyRDU1NTdGF0ZW1lbnR9IC4gJyknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJERhdGF7JENTU1N0YXRlbWVudH0gPSAkQWdlbnRMb2dveyRDU1NTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckxvZ29DU1MnLAogICAgICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIGxvZ2luIGxvZ28sIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggZGVmaW5lZCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FnZW50TG9naW5Mb2dvJykgKSB7CiAgICAgICAgbXkgJUFnZW50TG9naW5Mb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ2luTG9nbycpIH07CiAgICAgICAgbXkgJURhdGE7CgogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICggc29ydCBrZXlzICVBZ2VudExvZ2luTG9nbyApIHsKICAgICAgICAgICAgaWYgKCAkQ1NTU3RhdGVtZW50IGVxICdVUkwnICkgewogICAgICAgICAgICAgICAgbXkgJFdlYlBhdGggPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEFnZW50TG9naW5Mb2dveyRDU1NTdGF0ZW1lbnR9ICF+IC8oaHR0cHxmdHB8aHR0cHMpOlwvL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFdlYlBhdGggPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXsnVVJMJ30gPSAndXJsKCcgLiAkV2ViUGF0aCAuICRBZ2VudExvZ2luTG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEFnZW50TG9naW5Mb2dveyRDU1NTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xvZ2luTG9nb0NTUycsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTG9naW5Mb2dvJwogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc3lzdGVtIG1haW50ZW5hbmNlIG9iamVjdAogICAgbXkgJFN5c3RlbU1haW50ZW5hbmNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbU1haW50ZW5hbmNlJyk7CgogICAgbXkgJEFjdGl2ZU1haW50ZW5hbmNlID0gJFN5c3RlbU1haW50ZW5hbmNlT2JqZWN0LT5TeXN0ZW1NYWludGVuYW5jZUlzQWN0aXZlKCk7CgogICAgIyBjaGVjayBpZiBzeXN0ZW0gbWFpbnRlbmFuY2UgaXMgYWN0aXZlCiAgICBpZiAoJEFjdGl2ZU1haW50ZW5hbmNlKSB7CiAgICAgICAgbXkgJFN5c3RlbU1haW50ZW5hbmNlRGF0YSA9ICRTeXN0ZW1NYWludGVuYW5jZU9iamVjdC0+U3lzdGVtTWFpbnRlbmFuY2VHZXQoCiAgICAgICAgICAgIElEICAgICA9PiAkQWN0aXZlTWFpbnRlbmFuY2UsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggJFN5c3RlbU1haW50ZW5hbmNlRGF0YS0+e1Nob3dMb2dpbk1lc3NhZ2V9ICkgewoKICAgICAgICAgICAgbXkgJExvZ2luTWVzc2FnZSA9CiAgICAgICAgICAgICAgICAkU3lzdGVtTWFpbnRlbmFuY2VEYXRhLT57TG9naW5NZXNzYWdlfQogICAgICAgICAgICAgICAgfHwgJENvbmZpZ09iamVjdC0+R2V0KCdTeXN0ZW1NYWludGVuYW5jZTo6SXNBY3RpdmVEZWZhdWx0TG9naW5NZXNzYWdlJykKICAgICAgICAgICAgICAgIHx8ICJTeXN0ZW0gbWFpbnRlbmFuY2UgaXMgYWN0aXZlLCBub3QgcG9zc2libGUgdG8gcGVyZm9ybSBhIGxvZ2luISI7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTeXN0ZW1NYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMb2dpbk1lc3NhZ2UgPT4gJExvZ2luTWVzc2FnZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBwcmVsb2dpbiBibG9jaywgaWYgaW4gcHJlbG9naW4gbW9kZSAoZS5nLiBTU08gbG9naW4pCiAgICBpZiAoIGRlZmluZWQgJFBhcmFteydNb2RlJ30gJiYgJFBhcmFteydNb2RlJ30gZXEgJ1ByZUxvZ2luJyApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByZUxvZ2luJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBpZiBub3QgaW4gUHJlTG9naW4gbW9kZSwgc2hvdyBub3JtYWwgbG9naW4gZm9ybQogICAgZWxzZSB7CgogICAgICAgIG15ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Rpc2FibGVMb2dpbkF1dG9jb21wbGV0ZScpOwogICAgICAgICRQYXJhbXtVc2VyTmFtZUF1dG9jb21wbGV0ZX0gPSAkRGlzYWJsZUxvZ2luQXV0b2NvbXBsZXRlID8gJ29mZicgOiAndXNlcm5hbWUnOwogICAgICAgICRQYXJhbXtQYXNzd29yZEF1dG9jb21wbGV0ZX0gPSAkRGlzYWJsZUxvZ2luQXV0b2NvbXBsZXRlID8gJ29mZicgOiAnY3VycmVudC1wYXNzd29yZCc7CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTG9naW5Cb3gnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IDIgZmFjdG9yIHBhc3N3b3JkIGlucHV0IGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGJhY2tlbmQgZW5hYmxlZAogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCJBdXRoVHdvRmFjdG9yTW9kdWxlJENvdW50Iik7CgogICAgICAgICAgICAjIGlmIG5vIGVtcHR5IHNoYXJlZCBzZWNyZXRzIGFyZSBhbGxvd2VkLCBpbnB1dCBpcyBtYW5kYXRvcnkKICAgICAgICAgICAgbXkgJU1hbmRhdG9yeU9wdGlvbnM7CiAgICAgICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgiQXV0aFR3b0ZhY3Rvck1vZHVsZSR7Q291bnR9OjpBbGxvd0VtcHR5U2VjcmV0IikgKSB7CiAgICAgICAgICAgICAgICAlTWFuZGF0b3J5T3B0aW9ucyA9ICgKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICdNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F1dGhUd29GYWN0b3InLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICVNYW5kYXRvcnlPcHRpb25zLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICglTWFuZGF0b3J5T3B0aW9ucykgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F1dGhUd29GYWN0b3JNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhc3QgQ09VTlQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsb3N0IHBhc3N3b3JkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0xvc3RQYXNzd29yZCcpCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQXV0aE1vZHVsZScpIGVxICdLZXJuZWw6OlN5c3RlbTo6QXV0aDo6REInCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xvc3RQYXNzd29yZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9zdFBhc3N3b3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ0xvZ2luRmFpbGVkJywKICAgICAgICBWYWx1ZSA9PiAkUGFyYW17TG9naW5GYWlsZWR9LAogICAgKTsKCiAgICAjIGRlY2xhcmUgaGVhZGVycyBpbmNsdWRpbmcgdGhlIFgtT1RPQk8tTG9naW4gaGVhZGVyIGZpZWxkCiAgICAkU2VsZi0+X0FkZEhlYWRlcnNUb1Jlc3BvbnNlT2JqZWN0KAogICAgICAgIFhMb2dpbkhlYWRlciA9PiAxLAogICAgKTsKCiAgICAkUGFyYW17RGlzYWJsZVN0YW5kYXJkTG9naW59ID0gJFNlbGYtPl9IYXNPbmx5T0lEQ0F1dGhNb2R1bGVzKCk7CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0xvZ2luJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBDaGFsbGVuZ2VUb2tlbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyByZXR1cm4gaWYgZmVhdHVyZSBpcyBkaXNhYmxlZAogICAgcmV0dXJuIDEgaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2Vzc2lvbkNTUkZQcm90ZWN0aW9uJyk7CgogICAgIyBnZXQgY2hhbGxlbmdlIHRva2VuIGFuZCBjaGVjayBpdAogICAgbXkgJENoYWxsZW5nZVRva2VuID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYWxsZW5nZVRva2VuJyApIHx8ICcnOwoKICAgICMgY2hlY2sgcmVndWxhciBDaGFsbGVuZ2VUb2tlbgogICAgcmV0dXJuIDEgaWYgJENoYWxsZW5nZVRva2VuIGVxICRTZWxmLT57VXNlckNoYWxsZW5nZVRva2VufTsKCiAgICAjIGNoZWNrIENoYWxsZW5nZVRva2VuIG9mIGFsbCBvd24gc2Vzc2lvbnMKICAgIG15ICRTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CiAgICBteSBAU2Vzc2lvbnMgICAgICA9ICRTZXNzaW9uT2JqZWN0LT5HZXRBbGxTZXNzaW9uSURzKCk7CgogICAgU0VTU0lPTjoKICAgIGZvciBteSAkU2Vzc2lvbklEIChAU2Vzc2lvbnMpIHsKICAgICAgICBteSAlRGF0YSA9ICRTZXNzaW9uT2JqZWN0LT5HZXRTZXNzaW9uSUREYXRhKCBTZXNzaW9uSUQgPT4gJFNlc3Npb25JRCApOwogICAgICAgIG5leHQgU0VTU0lPTiBpZiAhJERhdGF7VXNlcklEfTsKICAgICAgICBuZXh0IFNFU1NJT04gaWYgJERhdGF7VXNlcklEfSBuZSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgbmV4dCBTRVNTSU9OIGlmICEkRGF0YXtVc2VyQ2hhbGxlbmdlVG9rZW59OwoKICAgICAgICAjIGNoZWNrIENoYWxsZW5nZVRva2VuCiAgICAgICAgcmV0dXJuIDEgaWYgJENoYWxsZW5nZVRva2VuIGVxICREYXRhe1VzZXJDaGFsbGVuZ2VUb2tlbn07CiAgICB9CgogICAgIyBubyB2YWxpZCB0b2tlbiBmb3VuZAogICAgaWYgKCAkUGFyYW17VHlwZX0gJiYgbGMgJFBhcmFte1R5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgJFNlbGYtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnSW52YWxpZCBDaGFsbGVuZ2UgVG9rZW4hJywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0ludmFsaWQgQ2hhbGxlbmdlIFRva2VuIScsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCnN1YiBGYXRhbEVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBQcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uIGluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCBUZW1wbGF0ZSBlbmdpbmUuCiAgICByZXR1cm4gaWYgJFNlbGYtPntJbkZhdGFsRXJyb3J9Kys7CgogICAgaWYgKCAkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRPdXRwdXQgPSBqb2luICcnLAogICAgICAgICRTZWxmLT5IZWFkZXIoCiAgICAgICAgICAgIEFyZWEgID0+ICdGcm9udGVuZCcsCiAgICAgICAgICAgIFRpdGxlID0+ICdGYXRhbCBFcnJvcicKICAgICAgICApLAogICAgICAgICRTZWxmLT5FcnJvciglUGFyYW0pLAogICAgICAgICRTZWxmLT5Gb290ZXIoKTsKCiAgICAjIE1vZGlmeSB0aGUgb3V0cHV0IGJ5IGFwcGx5aW5nIHRoZSBvdXRwdXQgZmlsdGVycy4KICAgICRPdXRwdXQgPSAkU2VsZi0+QXBwbHlPdXRwdXRGaWx0ZXJzKCBPdXRwdXQgPT4gJE91dHB1dCApOwoKICAgICMgVGhlIENvbnRlbnQtTGVuZ3RoIHdpbGwgYmUgc2V0IGxhdGVyIGluIHRoZSBtaWRkbGV3YXJlIFBsYWNrOjpNaWRkbGV3YXJlOjpDb250ZW50TGVuZ3RoLiBUaGlzIHJlcXVpcmVzIHRoYXQKICAgICMgdGhlcmUgYXJlIG5vIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgZGVsaXZlcmVkIGNvbnRlbnQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgbWlkZGxld2FyZQogICAgIyB1c2VzIGNvcmU6Omxlbmd0aCgpIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudCBsZW5ndGguCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCggXCRPdXRwdXQgKTsKCiAgICAjIFRoZSBPVE9CTyByZXNwb25zZSBvYmplY3QgYWxyZWFkeSBoYXMgdGhlIEhUUFAgaGVhZGVycy4KICAgICMgRW5oYW5jZSBpdCB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFuZCB0aGUgY29udGVudC4KICAgIG15ICRFcnJvclJlc3BvbnNlID0gUGxhY2s6OlJlc3BvbnNlLT5uZXcoCiAgICAgICAgMjAwLAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyktPkhlYWRlcnMoKSwKICAgICAgICAkT3V0cHV0CiAgICApOwoKICAgICMgVGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkhUVFBFeGNlcHRpb25zCiAgICBkaWUgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uLT5uZXcoCiAgICAgICAgUGxhY2tSZXNwb25zZSA9PiAkRXJyb3JSZXNwb25zZQogICAgKTsKfQoKc3ViIFNlY3VyZU1vZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAkU2VsZi0+SGVhZGVyKAogICAgICAgICAgICBBcmVhICA9PiAnRnJvbnRlbmQnLAogICAgICAgICAgICBUaXRsZSA9PiAnU2VjdXJlIE1vZGUnCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VjdXJlTW9kZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICAgICAgKSwKICAgICAgICAkU2VsZi0+Rm9vdGVyKCk7Cn0KCnN1YiBGYXRhbERpZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBDYWxsZXIgICA9PiAxLAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUGFyYW17TWVzc2FnZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScKICAgICkgfHwgJyc7CiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJFNlbGYtPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFBhcmFte0JhY2tlbmRNZXNzYWdlfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgKTsKICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkUGFyYW17QmFja2VuZE1lc3NhZ2V9OwogICAgfQoKICAgICMgU3RyaW5ncyBhcmUgbm90IGNhdWdodCBieSBQbGFjazo6TWlkZGxld2FyZTo6SFRUUEV4Y2VwdGlvbnMKICAgIGRpZSAkUGFyYW17TWVzc2FnZX07Cn0KCnN1YiBFcnJvclNjcmVlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBqb2luICcnLAogICAgICAgICRTZWxmLT5IZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKSwKICAgICAgICAkU2VsZi0+RXJyb3IoJVBhcmFtKSwKICAgICAgICAkU2VsZi0+Rm9vdGVyKCk7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMKICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgKSB8fCAnJzsKICAgIGlmICggISRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSB8fCAnPycsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJwogICAgICAgICkgfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0Vycm9yJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKc3ViIFdhcm5pbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdOb3RpY2UnLAogICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkKICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkgfHwgJyc7CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1dhcm5pbmcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9Cgo9aGVhZDIgTm90aWZ5KCkKCmNyZWF0ZSBub3RpZnkgbGluZXMKCiAgICBpbmZvcywgdGhlIHRleHQgd2lsbCBiZSB0cmFuc2xhdGVkCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBQcmlvcml0eSA9PiAnV2FybmluZycsCiAgICAgICAgSW5mbyA9PiAnU29tZSBJbmZvIE1lc3NhZ2UnLAogICAgKTsKCiAgICBkYXRhIHdpdGggbGluaywgdGhlIHRleHQgd2lsbCBiZSB0cmFuc2xhdGVkCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBQcmlvcml0eSAgPT4gJ1dhcm5pbmcnLAogICAgICAgIERhdGEgICAgICA9PiAnVGVtcGxhdGUgY29udGVudCcsCiAgICAgICAgTGluayAgICAgID0+ICdodHRwOi8vZXhhbXBsZS5jb20vJywKICAgICAgICBMaW5rQ2xhc3MgPT4gJ3NvbWVfQ1NTX2NsYXNzJywgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7CgogICAgZXJyb3JzLCB0aGUgdGV4dCB3aWxsIGJlIHRyYW5zbGF0ZWQKCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgSW5mbyA9PiAnU29tZSBFcnJvciBNZXNzYWdlJywKICAgICk7CgogICAgZXJyb3JzIGZyb20gbG9nIGJhY2tlbmQsIGlmIG5vIGVycm9yIGV4aXN0cywgYSAnJyB3aWxsIGJlIHJldHVybmVkCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgKTsKCj1jdXQKCnN1YiBOb3RpZnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIGlmICggISRQYXJhbXtJbmZvfSAmJiAhJFBhcmFte0RhdGF9ICkgewogICAgICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICBUeXBlID0+ICdOb3RpY2UnLAogICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgKQogICAgICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICkgfHwgJyc7CgogICAgICAgICRQYXJhbXtJbmZvfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CgogICAgICAgICMgcmV0dXJuIGlmIHdlIGhhdmUgbm90aGluZyB0byBzaG93CiAgICAgICAgcmV0dXJuICcnIGlmICEkUGFyYW17SW5mb307CiAgICB9CgogICAgbXkgJEJveENsYXNzID0gJ05vdGljZSc7CgogICAgaWYgKCAkUGFyYW17SW5mb30gKSB7CiAgICAgICAgJFBhcmFte0luZm99ID1+IHMvXG4vL2c7CiAgICB9CiAgICBpZiAoICRQYXJhbXtQcmlvcml0eX0gJiYgJFBhcmFte1ByaW9yaXR5fSBlcSAnRXJyb3InICkgewogICAgICAgICRCb3hDbGFzcyA9ICdFcnJvcic7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtQcmlvcml0eX0gJiYgJFBhcmFte1ByaW9yaXR5fSBlcSAnU3VjY2VzcycgKSB7CiAgICAgICAgJEJveENsYXNzID0gJ1N1Y2Nlc3MnOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17UHJpb3JpdHl9ICYmICRQYXJhbXtQcmlvcml0eX0gZXEgJ0luZm8nICkgewogICAgICAgICRCb3hDbGFzcyA9ICdJbmZvJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtMaW5rfSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtTdGFydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua1N0YXJ0ID0+ICRQYXJhbXtMaW5rfSwKICAgICAgICAgICAgICAgIExpbmtDbGFzcyA9PiAkUGFyYW17TGlua0NsYXNzfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RGF0YX0gKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RleHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0xpbmt9ICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1N0b3AnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExpbmtTdG9wID0+ICc8L2E+JywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdOb3RpZnknLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQm94Q2xhc3MgPT4gJEJveENsYXNzLAogICAgICAgIH0sCiAgICApOwp9Cgo9aGVhZDIgTm90aWZ5Tm9uVXBkYXRlZFRpY2tldHMoKQoKQWRkcyBub3RpZmljYXRpb24gYWJvdXQgdGlja2V0cyB3aGljaCBhcmUgbm90IHVwZGF0ZWQuCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk5vdGlmeU5vblVwZGF0ZWRUaWNrZXRzKCk7Cgo9Y3V0CgpzdWIgTm90aWZ5Tm9uVXBkYXRlZFRpY2tldHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICA9PiAnTm9uVXBkYXRlZFRpY2tldHNTdHJpbmctJyAuICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmc7CgogICAgIyBEZWxldGUgdGhpcyB2YWx1ZSBmcm9tIHRoZSBjYWNoZS4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnVGlja2V0JywKICAgICAgICBLZXkgID0+ICdOb25VcGRhdGVkVGlja2V0c1N0cmluZy0nIC4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPk5vdGlmeSgKICAgICAgICBJbmZvID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICJUaGUgZm9sbG93aW5nIHRpY2tldHMgYXJlIG5vdCB1cGRhdGVkOiAlcy4iLCAkTm9uVXBkYXRlZFRpY2tldHNTdHJpbmcgKSwKICAgICk7Cgp9Cgo9aGVhZDIgSGVhZGVyKCkKCmdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIHBhZ2UgYmVnaW4gaW4gdGhlIEFnZW50IGludGVyZmFjZS4KQXMgYSBzaWRlIGVmZmVjdCBIVFRQIGhlYWRlcnMgYXJlIGFkZGVkIHRvIHRoZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZSBvYmplY3QuCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU21hbGwnLCAgICMgKG9wdGlvbmFsKSAnJyAoRGVmYXVsdCwgZnVsbCBoZWFkZXIpIG9yICdTbWFsbCcgKGJsYW5rIGhlYWRlcikKICAgICAgICBTaG93VG9vbGJhckl0ZW1zICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBTaG93UHJlZkxpbmsgICAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBTaG93TG9nb3V0QnV0dG9uICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCA9PiAxLCAgICAgICAgICMgKG9wdGlvbmFsLCBkZWZhdWx0IDApIC0gc3VwcHJlc3MgWC1GcmFtZS1PcHRpb25zIGhlYWRlci4KICAgICk7Cgo9Y3V0CgpzdWIgSGVhZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBleHRyYWN0IHBhcmFtcwogICAgbXkgJFR5cGUgPSAkUGFyYW17VHlwZX0gfHwgJyc7CgogICAgIyBjaGVjayBwYXJhbXMKICAgICRQYXJhbXtTaG93VG9vbGJhckl0ZW1zfSAvLz0gMTsKICAgICRQYXJhbXtTaG93UHJlZkxpbmt9ICAgICAvLz0gMTsKICAgICRQYXJhbXtTaG93TG9nb3V0QnV0dG9ufSAvLz0gMTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGRvIG5vdCBzaG93IHByZWZlcmVuY2VzIGxpbmsgaWYgdGhlIHByZWZlcmVuY2VzIG1vZHVsZSBpcyBkaXNhYmxlZAogICAgbXkgJE1vZHVsZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKTsKICAgIGlmICggISRNb2R1bGVzLT57QWdlbnRQcmVmZXJlbmNlc30gKSB7CiAgICAgICAgJFBhcmFte1Nob3dQcmVmTGlua30gPSAwOwogICAgfQoKICAgICMgc2V0IHJ0bCBpZiBuZWVkZWQKICAgIGlmICggJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAmJiAkU2VsZi0+e1RleHREaXJlY3Rpb259IGVxICdydGwnICkgewogICAgICAgICRQYXJhbXtCb2R5Q2xhc3N9ID0gJ1JUTCc7CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkRlYnVnTW9kZScpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVidWdSVExCdXR0b24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUFnZW50Q1NTQ2FsbHMoKTsKCiAgICBteSAlQWdlbnRMb2dvOwoKICAgICMgY2hlY2sgaWYgd2UgbmVlZCB0byBkaXNwbGF5IGEgY3VzdG9tIGxvZ28gZm9yIHRoZSBzZWxlY3RlZCBza2luCiAgICBteSAkQWdlbnRMb2dvQ3VzdG9tID0gJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ29DdXN0b20nKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1NraW5TZWxlY3RlZH0KICAgICAgICAmJiAkQWdlbnRMb2dvQ3VzdG9tCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoJEFnZW50TG9nb0N1c3RvbSkKICAgICAgICAmJiAkQWdlbnRMb2dvQ3VzdG9tLT57ICRTZWxmLT57U2tpblNlbGVjdGVkfSB9CiAgICAgICAgKQogICAgewogICAgICAgICVBZ2VudExvZ28gPSAleyAkQWdlbnRMb2dvQ3VzdG9tLT57ICRTZWxmLT57U2tpblNlbGVjdGVkfSB9IH07CiAgICB9CgogICAgIyBPdGhlcndpc2Ugc2hvdyBkZWZhdWx0IGhlYWRlciBsb2dvLCBpZiBjb25maWd1cmVkCiAgICBlbHNpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSApIHsKICAgICAgICAlQWdlbnRMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudExvZ28nKSB9OwogICAgfQoKICAgIGlmICggJUFnZW50TG9nbyAmJiBrZXlzICVBZ2VudExvZ28gKSB7CgogICAgICAgIG15ICVEYXRhOwogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICggc29ydCBrZXlzICVBZ2VudExvZ28gKSB7CiAgICAgICAgICAgIGlmICggJENTU1N0YXRlbWVudCBlcSAnVVJMJyApIHsKICAgICAgICAgICAgICAgIG15ICRXZWJQYXRoID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRBZ2VudExvZ297JENTU1N0YXRlbWVudH0gIX4gLyhodHRwfGZ0cHxodHRwcyk6XC8vaSApIHsKICAgICAgICAgICAgICAgICAgICAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkRmlsZSA9ICRQYXJhbXtGaWxlbmFtZX0gfHwgJFNlbGYtPntBY3Rpb259IHx8ICd1bmtub3duJzsKCiAgICAjIHNldCBmaWxlIG5hbWUgZm9yICJzYXZlIHBhZ2UgYXMiCiAgICAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufSA9ICJmaWxlbmFtZT1cIiRGaWxlLmh0bWxcIiI7CgogICAgIyBhcmVhIGFuZCB0aXRsZQogICAgaWYgKCAhJFBhcmFte0FyZWF9ICkgewogICAgICAgICRQYXJhbXtBcmVhfSA9ICgKICAgICAgICAgICAgZGVmaW5lZCAkU2VsZi0+e0FjdGlvbn0KICAgICAgICAgICAgPyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfS0+e05hdkJhck5hbWV9CiAgICAgICAgICAgIDogJycKICAgICAgICApOwogICAgfQogICAgaWYgKCAhJFBhcmFte1RpdGxlfSApIHsKICAgICAgICAkUGFyYW17VGl0bGV9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0tPntUaXRsZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBmb3IgbXkgJFdvcmQgKHF3KFZhbHVlIFRpdGxlIEFyZWEpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JFdvcmR9ICkgewogICAgICAgICAgICAkUGFyYW17VGl0bGVBcmVhfSAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17JFdvcmR9ICkgLiAnIC0gJzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgcnVuIGhlYWRlciBtZXRhIG1vZHVsZXMKICAgIG15ICRIZWFkZXJNZXRhTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6SGVhZGVyTWV0YU1vZHVsZScpOwogICAgaWYgKCByZWYgJEhlYWRlck1ldGFNb2R1bGUgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXskSGVhZGVyTWV0YU1vZHVsZX07CgogICAgICAgIE1PRFVMRToKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBhbmQgcnVuIG1vZHVsZQogICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRPYmplY3Q7CiAgICAgICAgICAgICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gdG9vbCBiYXIgaXRlbSBtb2R1bGVzCiAgICBpZiAoICRTZWxmLT57VXNlcklEfSAmJiAkU2VsZi0+e1VzZXJUeXBlfSBlcSAnVXNlcicgKSB7CiAgICAgICAgbXkgJFRvb2xCYXJNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpUb29sQmFyTW9kdWxlJyk7CiAgICAgICAgaWYgKCAkUGFyYW17U2hvd1Rvb2xiYXJJdGVtc30gJiYgcmVmICRUb29sQmFyTW9kdWxlIGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Rvb2xCYXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJU1vZHVsZXM7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXskVG9vbEJhck1vZHVsZX07CgogICAgICAgICAgICAjIGdldCBncm91cCBvYmplY3QKICAgICAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICAgICBNT0RVTEU6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBhbmQgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwgICAgIyBVc2VySUQgZXRjLgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkT2JqZWN0OwoKICAgICAgICAgICAgICAgIG15ICRUb29sQmFyQWNjZXNzT2s7CgogICAgICAgICAgICAgICAgIyBpZiBncm91cCByZXN0cmljdGlvbiBmb3IgdG9vbC1iYXIgaXMgc2V0LCBjaGVjayB1c2VyIHBlcm1pc3Npb24KICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntHcm91cH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHdoaXRlLXNwYWNlcwogICAgICAgICAgICAgICAgICAgICRKb2JzeyRKb2J9LT57R3JvdXB9ID1+IHN7XHN9e314bXNnOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCBncm91cCBjb25maWd1cmF0aW9ucwogICAgICAgICAgICAgICAgICAgIG15IEBJdGVtcyA9IHNwbGl0IC87LywgJEpvYnN7JEpvYn0tPntHcm91cH07CgogICAgICAgICAgICAgICAgICAgIElURU06CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtIChASXRlbXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgc3BsaXQgdmFsdWVzIGludG8gcGVybWlzc2lvbiBhbmQgZ3JvdXAKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCAkUGVybWlzc2lvbiwgJEdyb3VwTmFtZSApID0gc3BsaXQgLzovLCAkSXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbG9nIGFuIGVycm9yIGlmIG5vdCB2YWxpZCBzZXR0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRQZXJtaXNzaW9uIHx8ICEkR3JvdXBOYW1lICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBjb25maWcgZm9yIFRvb2xCYXJNb2R1bGUgJEpvYiAtIEtleSBHcm91cDogJyRJdGVtJyEgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJOZWVkIHNvbWV0aGluZyBsaWtlICdQZXJtaXNzaW9uOkdyb3VwOyciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgZ3JvdXBzIGZvciBjdXJyZW50IHVzZXIKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICRQZXJtaXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXh0IGpvYiBpZiB1c2VyIGhhdmUgbm90IGdyb3VwcwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IElURU0gaWYgISVHcm91cHM7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHVzZXIgYmVsb25ncyB0byB0aGUgY29ycmVjdCBncm91cAogICAgICAgICAgICAgICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSA9IHJldmVyc2UgJUdyb3VwczsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBJVEVNIGlmICEkR3JvdXBzUmV2ZXJzZXskR3JvdXBOYW1lfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRUb29sQmFyQWNjZXNzT2sgPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBJVEVNOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBnbyB0byB0aGUgbmV4dCBtb2R1bGUgaWYgbm90IHBlcm1pc3Npb25zCiAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhlIGN1cnJlbnQgb25lCiAgICAgICAgICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRUb29sQmFyQWNjZXNzT2s7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJU1vZHVsZXMgPSAoICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwgJU1vZHVsZXMgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBSb3RoZXIgT1NTIFRPRE86IE5vdCBzbyBuaWNlIGltcGxlbWVudGVkLCByZXZpZXcKCiAgICAgICAgICAgIG15ICRUb29sQmFySXRlbVNlcGFyYXRvclNob3J0Y3V0ICA9IDA7CiAgICAgICAgICAgIG15ICRUb29sQmFySXRlbVNlcGFyYXRvck15VGlja2V0cyA9IDA7CiAgICAgICAgICAgIG15ICRUb29sQmFySXRlbVNlcGFyYXRvclNlYXJjaCAgICA9IDA7CgogICAgICAgICAgICAjIENoZWNrIHdoaWNoIHNlcGVyYXRvciBpcyBuZWVkZWQKICAgICAgICAgICAgU0hPUlRDVVRBVkFJTElCTEU6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVNb2R1bGVzICkgewogICAgICAgICAgICAgICAgbmV4dCBTSE9SVENVVEFWQUlMSUJMRSBpZiAhJXsgJE1vZHVsZXN7JEtleX0gfTsKCiAgICAgICAgICAgICAgICBpZiAoICRNb2R1bGVzeyRLZXl9e0Jsb2NrfSBlcSAnVG9vbEJhckl0ZW0nICkgewogICAgICAgICAgICAgICAgICAgICRUb29sQmFySXRlbVNlcGFyYXRvck15VGlja2V0cyA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBTSE9SVENVVEFWQUlMSUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJE1vZHVsZXN7JEtleX17QmxvY2t9IGVxICdUb29sQmFySXRlbVNob3J0Y3V0JyApIHsKICAgICAgICAgICAgICAgICAgICAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTaG9ydGN1dCA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBTSE9SVENVVEFWQUlMSUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJE1vZHVsZXN7JEtleX17QmxvY2t9ID1+IG0vVG9vbEJhclNlYXJjaC4qLyApIHsKICAgICAgICAgICAgICAgICAgICAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTZWFyY2ggPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgU0hPUlRDVVRBVkFJTElCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU2hvdyBzZXBhcmF0b3IgYmV0d2VlbiBzaG9ydGN1dHMgYW5kIG15IHRpY2tldHMKICAgICAgICAgICAgaWYgKCAkVG9vbEJhckl0ZW1TZXBhcmF0b3JTaG9ydGN1dCA9PSAxICkgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlRvb2xCYXJJdGVtU2VwYXJhdG9yU2hvcnRjdXQiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IHRvb2wgYmFyIHNob3J0Y3V0IGl0ZW1zCiAgICAgICAgICAgIE1PRFVMRVNIT1JUQ1VUOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTW9kdWxlcyApIHsKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFU0hPUlRDVVQgaWYgISV7ICRNb2R1bGVzeyRLZXl9IH07CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRVNIT1JUQ1VUIGlmICRNb2R1bGVzeyRLZXl9e0Jsb2NrfSBuZSAnVG9vbEJhckl0ZW1TaG9ydGN1dCc7CgogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJE1vZHVsZXN7JEtleX0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRNb2R1bGVzeyRLZXl9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0tleVJlZmVyZW5jZSA9PiAkTW9kdWxlc3skS2V5fS0+e0FjY2Vzc0tleX0KICAgICAgICAgICAgICAgICAgICAgICAgPyAiICgkTW9kdWxlc3skS2V5fS0+e0FjY2Vzc0tleX0pIgogICAgICAgICAgICAgICAgICAgICAgICA6ICcnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIGlmIHNob3J0Y3V0IG5lZWRlZAogICAgICAgICAgICBpZiAoICRUb29sQmFySXRlbVNlcGFyYXRvck15VGlja2V0cyA9PSAxICkgewoKICAgICAgICAgICAgICAgICMgU2hvdyBzZXBhcmF0b3IgYmV0d2VlbiBzaG9ydGN1dHMgYW5kIG15IHRpY2tldHMKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJUb29sQmFySXRlbVNlcGFyYXRvck15VGlja2V0cyIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgdG9vbCBiYXIgaXRlbXMKICAgICAgICAgICAgTU9EVUxFOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTW9kdWxlcyApIHsKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEleyAkTW9kdWxlc3skS2V5fSB9OwogICAgICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgJE1vZHVsZXN7JEtleX17QmxvY2t9IGVxICdUb29sQmFySXRlbVNob3J0Y3V0JzsKCiAgICAgICAgICAgICAgICAjIEZvciBUb29sQmFyU2VhcmNoRnVsbHRleHQgbW9kdWxlIHRha2UgaW50byBjb25zaWRlcmF0aW9uIFNlYXJjaEluQXJjaGl2ZSBzZXR0aW5ncy4KICAgICAgICAgICAgICAgICMgU2VlIGJ1ZyMxMzc5MCAoaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzc5MCkuCiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpBcmNoaXZlU3lzdGVtJykgJiYgJE1vZHVsZXN7JEtleX0tPntCbG9ja30gZXEgJ1Rvb2xCYXJTZWFyY2hGdWxsdGV4dCcgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRNb2R1bGVzeyRLZXl9LT57U2VhcmNoSW5BcmNoaXZlfSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRTZWFyY2gnKS0+e0RlZmF1bHRzfS0+e1NlYXJjaEluQXJjaGl2ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJE1vZHVsZXN7JEtleX0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRNb2R1bGVzeyRLZXl9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0tleVJlZmVyZW5jZSA9PiAkTW9kdWxlc3skS2V5fS0+e0FjY2Vzc0tleX0KICAgICAgICAgICAgICAgICAgICAgICAgPyAiICgkTW9kdWxlc3skS2V5fS0+e0FjY2Vzc0tleX0pIgogICAgICAgICAgICAgICAgICAgICAgICA6ICcnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIGlmIHNob3J0Y3V0IG5lZWRlZAogICAgICAgICAgICBpZiAoICRUb29sQmFySXRlbVNlcGFyYXRvclNlYXJjaCA9PSAxICkgewoKICAgICAgICAgICAgICAgICMgU2hvdyBzZXBhcmF0b3IgYmV0d2VlbiBzaG9ydGN1dHMgYW5kIG15IHRpY2tldHMKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJUb29sQmFySXRlbVNlcGFyYXRvclNlYXJjaCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcsIFNpbGVudCA9PiAxICkgKSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDaGF0RW5naW5lOjpBY3RpdmUnKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0NoYXRFbmdpbmU6OkFjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDaGF0RW5naW5lOjpBY3RpdmUnKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBhdmF0YXIKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkF2YXRhckVuZ2luZScpIGVxICdHcmF2YXRhcicgJiYgJFNlbGYtPntVc2VyRW1haWx9ICkgewogICAgICAgICAgICBteSAkRGVmYXVsdEljb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpHcmF2YXRhcjo6RGVmYXVsdEltYWdlJykgfHwgJ21wJzsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoIFwkU2VsZi0+e1VzZXJFbWFpbH0gKTsKICAgICAgICAgICAgJFBhcmFte0F2YXRhcn0gPSAnLy93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci8nIC4gbWQ1X2hleCggbGMgJFNlbGYtPntVc2VyRW1haWx9ICkgLiAnP3M9MTAwJmQ9JyAuICREZWZhdWx0SWNvbjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VyICAgICAgICAgID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIE5vT3V0T2ZPZmZpY2UgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtVc2VySW5pdGlhbHN9ID0gJFNlbGYtPlVzZXJJbml0aWFsc0dldCggRnVsbG5hbWUgPT4gJFVzZXJ7VXNlckZ1bGxuYW1lfSApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGxvZ2dlZCBpbiBub3RpY2UKICAgICAgICBpZiAoICRQYXJhbXtTaG93UHJlZkxpbmt9ICkgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb2dpbldpdGhvdXRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBsb2dvdXQgYnV0dG9uIChpZiByZWdpc3RlcmVkKQogICAgICAgIGlmICgKICAgICAgICAgICAgJFBhcmFte1Nob3dMb2dvdXRCdXR0b259CiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57TG9nb3V0fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb2dvdXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+X0FkZEhlYWRlcnNUb1Jlc3BvbnNlT2JqZWN0KAogICAgICAgIENvbnRlbnREaXNwb3NpdGlvbiAgICAgICAgICAgID0+ICRQYXJhbXtDb250ZW50RGlzcG9zaXRpb259LAogICAgICAgIERpc2FibGVJRnJhbWVPcmlnaW5SZXN0cmljdGVkID0+ICRQYXJhbXtEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZH0sCiAgICApOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICJIZWFkZXIkVHlwZSIsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1oZWFkMiBfQWRkSGVhZGVyc1RvUmVzcG9uc2VPYmplY3QoKQoKYmFzaWNhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIGV4ZWN1dGluZyB0aGUgZm9ybWVybHkgdXNlZCB0ZW1wbGF0ZSBIVFRQSGVhZGVycy50dAoKICAgIG15ICRTdWNjZXNzID0gJExheW91dE9iamVjdC0+X0FkZEhlYWRlcnNUb1Jlc3BvbnNlT2JqZWN0KAogICAgICAgIERhdGEgPT4gXCVQYXJhbXMsCiAgICApOwoKVGhlIGNvb2tpZXMgYXJlIGFsc28gYWRkZWQgaGVyZS4KVGhlIHByZXZpb3VzbHkgc2V0IGhlYWRlcnMgYXJlIGRpc2NhcmRlZC4KCj1jdXQKCnN1YiBfQWRkSGVhZGVyc1RvUmVzcG9uc2VPYmplY3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRoZXJlIGFyZSBubyByZXF1aXJlZCBwYXJhbWV0ZXJzCgogICAgIyBmaXJzdCB0aGUgdW5jb25kaXRpb25hbCBoZWFkZXJzCiAgICBteSAlSGVhZGVycyA9ICgKICAgICAgICAnQ29udGVudC1UeXBlJyAgICA9PiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAnWC1VQS1Db21wYXRpYmxlJyA9PiAnSUU9ZWRnZSxjaHJvbWU9MScsCiAgICAgICAgJ0V4cGlyZXMnICAgICAgICAgPT4gJ1R1ZSwgMSBKYW4gMTk4MCAxMjowMDowMCBHTVQnLAogICAgICAgICdDYWNoZS1Db250cm9sJyAgID0+ICduby1jYWNoZScsCiAgICAgICAgJ1ByYWdtYScgICAgICAgICAgPT4gJ25vLWNhY2hlJywKICAgICk7CgogICAgaWYgKCAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufSApIHsKICAgICAgICAkSGVhZGVyc3snQ29udGVudC1EaXNwb3NpdGlvbid9ID0gJFBhcmFte0NvbnRlbnREaXNwb3NpdGlvbn07CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1NlY3VyZTo6RGlzYWJsZUJhbm5lcicpICkgewogICAgICAgICRIZWFkZXJzeydYLVBvd2VyZWQtQnknfSA9IGpvaW4gJyAnLCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2R1Y3QnKSwgJENvbmZpZ09iamVjdC0+R2V0KCdWZXJzaW9uJyksICcoaHR0cHM6Ly9vdG9iby5pby8pJzsKICAgIH0KCiAgICBpZiAoCiAgICAgICAgISRDb25maWdPYmplY3QtPkdldCgnRGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWQnKQogICAgICAgICYmICEkUGFyYW17RGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWR9CiAgICAgICAgKQogICAgewogICAgICAgICRIZWFkZXJzeydYLUZyYW1lLU9wdGlvbnMnfSA9ICdTQU1FT1JJR0lOJzsKICAgIH0KCiAgICAjIFdpdGggdGhpcyBYLUhlYWRlciwgQ29yZS5BSkFYIGNhbiByZWNvZ25pemUgdGhhdCB0aGUgQUpBWCByZXF1ZXN0IHJldHVybmVkIHRoZSBsb2dpbiBwYWdlIChzZXNzaW9uIHRpbWVvdXQpIGFuZCBwZXJmb3JtIGEgcmVkaXJlY3QuCiAgICBpZiAoICRQYXJhbXtYTG9naW5IZWFkZXJ9ICkgewogICAgICAgICRIZWFkZXJzeydYLU9UT0JPLUxvZ2luJ30gPSAkU2VsZi0+e0Jhc2VsaW5rfTsKICAgIH0KCiAgICBteSAkUmVzcG9uc2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZScpOwogICAgJFJlc3BvbnNlT2JqZWN0LT5IZWFkZXJzKCBbJUhlYWRlcnNdICk7CgogICAgIyBBZGQgdGhlIGNvb2tpZXMgdGhhdCBoYWQgYmVlbiBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yLgogICAgIyBUaGUgdmFsdWVzIG9mICRTZWxmLT57U2V0Q29va2llc30gYXJlIHBsYWluIGhhc2ggcmVmZXJlbmNlcy4KICAgICMgRm9yIHNvbWUgcmVhc29uIHRoZSBuYW1lIGV2ZW50dWFsbHkgdXNlZCBieSBDb29raWU6OkJha2VyOjpiYWtlX2Nvb2tpZSgpIGlzIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIG9mIHRoZSBoYXNocmVmLgogICAgaWYgKAogICAgICAgICRTZWxmLT57U2V0Q29va2llc30KICAgICAgICAmJiByZWYgJFNlbGYtPntTZXRDb29raWVzfSBlcSAnSEFTSCcKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKQogICAgICAgICkKICAgIHsKICAgICAgICBmb3IgKCBzb3J0IGtleXMgJFNlbGYtPntTZXRDb29raWVzfS0+JSogKSB7CgogICAgICAgICAgICAjIG1ha2UgYSBjb3B5IGJlY2F1c2Ugd2UgbWlnaHQgbmVlZCAkU2VsZi0+e1NldENvb2tpZXN9IGxhdGVyIG9uCiAgICAgICAgICAgIG15ICVJbmdyZWRpZW50cyA9ICRTZWxmLT57U2V0Q29va2llc30tPnskX30tPiUqOwogICAgICAgICAgICBteSAkTmFtZSAgICAgICAgPSBkZWxldGUgJEluZ3JlZGllbnRze25hbWV9OwogICAgICAgICAgICAkUmVzcG9uc2VPYmplY3QtPkNvb2tpZXMtPnskTmFtZX0gPSBcJUluZ3JlZGllbnRzOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWVuZCBJbnRlcm5hbDoKCj1oZWFkMiBGb290ZXIoKQoKZ2VuZXJhdGVzIHRoZSBIVE1MIGZvciB0aGUgcGFnZSBlbmQgaW4gdGhlIEFnZW50IGludGVyZmFjZS4KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7Cgo9Y3V0CgpzdWIgRm9vdGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFR5cGUgICAgICAgICAgPSAkUGFyYW17VHlwZX0gICAgICAgICAgIHx8ICcnOwogICAgbXkgJEhhc0RhdGVwaWNrZXIgPSAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9IHx8IDA7CgogICAgIyBnZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUFnZW50SlNDYWxscygpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUcmFuc2xhdGlvbkRhdGEoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVKYXZhU2NyaXB0VGVtcGxhdGVEYXRhKCk7CgogICAgIyBnZXQgZGF0ZXBpY2tlciBkYXRhLCBpZiBuZWVkZWQgaW4gbW9kdWxlCiAgICBpZiAoJEhhc0RhdGVwaWNrZXIpIHsKICAgICAgICBteSAkVmFjYXRpb25EYXlzICA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCk7CiAgICAgICAgbXkgJFRleHREaXJlY3Rpb24gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259IHx8ICcnOwoKICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdEYXRlcGlja2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzID0+ICRWYWNhdGlvbkRheXMsCiAgICAgICAgICAgICAgICBJc1JUTCAgICAgICAgPT4gKCAkVGV4dERpcmVjdGlvbiBlcSAncnRsJyApID8gMSA6IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUyBpZiBOZXdUaWNrZXRJbk5ld1dpbmRvdyBpcyBlbmFibGVkCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnTmV3VGlja2V0SW5OZXdXaW5kb3c6OkVuYWJsZWQnKSApIHsKICAgICAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnTmV3VGlja2V0SW5OZXdXaW5kb3cnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBBdXRvQ29tcGxldGUtQ29uZmlnCiAgICBteSAkQXV0b2NvbXBsZXRlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvQ29tcGxldGU6OkFnZW50Jyk7CgogICAgZm9yIG15ICRDb25maWdFbGVtZW50ICggc29ydCBrZXlzICV7JEF1dG9jb21wbGV0ZUNvbmZpZ30gKSB7CiAgICAgICAgJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fS0+e0J1dHRvblRleHR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEF1dG9jb21wbGV0ZUNvbmZpZy0+eyRDb25maWdFbGVtZW50fS0+e0J1dHRvblRleHR9ICk7CiAgICB9CgogICAgIyBTZWFyY2ggZnJvbnRlbmQgKEphdmFTY3JpcHQpCiAgICBteSAkU2VhcmNoRnJvbnRlbmRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpTZWFyY2g6OkphdmFTY3JpcHQnKTsKCiAgICAjIGdldCB0YXJnZXQgamF2YXNjcmlwdCBmdW5jdGlvbgogICAgbXkgJEpTQ2FsbCA9ICcnOwoKICAgIGlmICggJFNlYXJjaEZyb250ZW5kQ29uZmlnICYmICRTZWxmLT57QWN0aW9ufSApIHsKICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICV7JFNlYXJjaEZyb250ZW5kQ29uZmlnfSApIHsKICAgICAgICAgICAgUkVHRVhQOgogICAgICAgICAgICBmb3IgbXkgJFJlZ0V4cCAoIHNvcnQga2V5cyAleyAkU2VhcmNoRnJvbnRlbmRDb25maWctPnskR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57QWN0aW9ufSA9fiAvJFJlZ0V4cC8gKSB7CiAgICAgICAgICAgICAgICAgICAgJEpTQ2FsbCA9ICRTZWFyY2hGcm9udGVuZENvbmZpZy0+eyRHcm91cH0tPnskUmVnRXhwfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IFJFR0VYUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIENoZWNrIGlmIHZpZGVvIGNoYXQgaXMgZW5hYmxlZC4KICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICRQYXJhbXtWaWRlb0NoYXRFbmFibGVkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaWRlb0NoYXQnKS0+SXNFbmFibGVkKCkKICAgICAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VuaXRUZXN0TW9kZScgKSAvLyAwOwogICAgfQoKICAgICMgU2V0IGFuIGFycmF5IHdpdGggcGVuZGluZyBzdGF0ZXMuIFNraXAgZm9yIGluc3RhbGxlciBhbmQgbWlncmF0aW9uIHNjcmlwdC4KICAgIG15IEBQZW5kaW5nU3RhdGVJRHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NlY3VyZU1vZGUnKQogICAgICAgID8gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0U3RhdGVzQnlUeXBlKAogICAgICAgICAgICBTdGF0ZVR5cGUgPT4gWyAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgICAgIFJlc3VsdCAgICA9PiAnSUQnLAogICAgICAgICkKICAgICAgICA6ICgpOwoKICAgIG15ICRXZWJQYXRoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6V2ViUGF0aCcpOwoKICAgICMgYWRkIEpTIGRhdGEKICAgIG15ICVKU0NvbmZpZyA9ICgKICAgICAgICBCYXNlbGluayAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntCYXNlbGlua30sCiAgICAgICAgQ0dJSGFuZGxlICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q0dJSGFuZGxlfSwKICAgICAgICBXZWJQYXRoICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFdlYlBhdGgsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBTdWJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntTdWJhY3Rpb259LAogICAgICAgIFNlc3Npb25JRENvb2tpZSAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0sCiAgICAgICAgU2Vzc2lvbk5hbWUgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57U2Vzc2lvbk5hbWV9LAogICAgICAgIFNlc3Npb25JRCAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgU2Vzc2lvblVzZUNvb2tpZSAgICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpLAogICAgICAgIENoYWxsZW5nZVRva2VuICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn0sCiAgICAgICAgQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJyksCiAgICAgICAgVXNlckxhbmd1YWdlICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSwKICAgICAgICBXZWJNYXhGaWxlVXBsb2FkICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdXZWJNYXhGaWxlVXBsb2FkJyksCiAgICAgICAgUmljaFRleHRTZXQgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JyksCiAgICAgICAgQ2hlY2tFbWFpbEFkZHJlc3NlcyAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpLAogICAgICAgIE1lbnVEcmFnRHJvcEVuYWJsZWQgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNZW51RHJhZ0Ryb3BFbmFibGVkJyksCiAgICAgICAgT3Blbk1haW5NZW51T25Ib3ZlciAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnT3Blbk1haW5NZW51T25Ib3ZlcicpLAogICAgICAgIEN1c3RvbWVySW5mb1NldCAgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSwKICAgICAgICBJbmNsdWRlVW5rbm93blRpY2tldEN1c3RvbWVycyAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkluY2x1ZGVVbmtub3duVGlja2V0Q3VzdG9tZXJzJyksCiAgICAgICAgSW5wdXRGaWVsZHNBY3RpdmF0ZWQgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnTW9kZXJuaXplRm9ybUZpZWxkcycpLAogICAgICAgIFZpZGVvQ2hhdEVuYWJsZWQgICAgICAgICAgICAgICA9PiAkUGFyYW17VmlkZW9DaGF0RW5hYmxlZH0sCiAgICAgICAgUGVuZGluZ1N0YXRlSURzICAgICAgICAgICAgICAgID0+IFxAUGVuZGluZ1N0YXRlSURzLAogICAgICAgIENoZWNrU2VhcmNoU3RyaW5nc0ZvclN0b3BXb3JkcyA9PiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZWFyY2hJbmRleDo6V2Fybk9uU3RvcFdvcmRVc2FnZScpCiAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZWFyY2hJbmRleE1vZHVsZScpCiAgICAgICAgICAgICAgICAgICAgZXEgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGVTZWFyY2hJbmRleDo6REInCiAgICAgICAgICAgICAgICApCiAgICAgICAgKSA/IDEgOiAwLAogICAgICAgIFNlYXJjaEZyb250ZW5kID0+ICRKU0NhbGwsCiAgICAgICAgQXV0b2NvbXBsZXRlICAgPT4gJEF1dG9jb21wbGV0ZUNvbmZpZywKICAgICk7CgogICAgZm9yIG15ICRDb25maWcgKCBzb3J0IGtleXMgJUpTQ29uZmlnICkgewogICAgICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICRDb25maWcsCiAgICAgICAgICAgIFZhbHVlID0+ICRKU0NvbmZpZ3skQ29uZmlnfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICJGb290ZXIkVHlwZSIsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cn0KCnN1YiBBcHBseU91dHB1dEZpbHRlcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFRoZSBwYXJhbSBPdXRwdXQgbWF5IGJlIGFueXRoaW5nIHRoYXQgbWF5IGJlIHBhc3NlZCB0byBQbGFjazo6UmVzcG9uc2U6OmJvZHkoKS4KICAgIG15ICRPdXRwdXQgPSAkUGFyYW17T3V0cHV0fTsKCiAgICAjIFJldHVybiBlYXJseSB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCiAgICAjIFRoaXMgc2hvdWxkIGJlIGNoZWFwLCBhcyBQZXJsIGhhcyBjb3B5IG9uIHdyaXRlLgogICAgcmV0dXJuICRPdXRwdXQgdW5sZXNzICRTZWxmLT57RmlsdGVyQ29udGVudH07CiAgICByZXR1cm4gJE91dHB1dCB1bmxlc3MgcmVmICRTZWxmLT57RmlsdGVyQ29udGVudH0gZXEgJ0hBU0gnOwoKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIGFwcGx5IHRoZSBmaWx0ZXJzLCBleHBsaWNpdGx5IHRyYWNrIHdoZXRoZXIgdGhlcmUgYWN0dWFsbHkgd2FzIGEgbW9kaWZpY2F0aW9uCiAgICBteSAlRmlsdGVyTGlzdCA9ICRTZWxmLT57RmlsdGVyQ29udGVudH0tPiUqOwogICAgbXkgKCAkTnVtQXBwbGllZEZpbHRlcnMsICRNb2RpZmllZE91dHB1dCApID0gKCAwLCAnJyApOwogICAgRklMVEVSOgogICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlckxpc3QgKSB7CgogICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgY29uZmlnCiAgICAgICAgbXkgJEZpbHRlckNvbmZpZyA9ICRGaWx0ZXJMaXN0eyRGaWx0ZXJ9OwoKICAgICAgICBuZXh0IEZJTFRFUiB1bmxlc3MgJEZpbHRlckNvbmZpZzsKICAgICAgICBuZXh0IEZJTFRFUiB1bmxlc3MgcmVmICRGaWx0ZXJDb25maWcgZXEgJ0hBU0gnOwoKICAgICAgICAjIGV4dHJhY3QgdGVtcGxhdGUgbGlzdAogICAgICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkRmlsdGVyQ29uZmlnLT57VGVtcGxhdGVzfTsKCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgaWYgKCAhJFRlbXBsYXRlTGlzdCB8fCByZWYgJFRlbXBsYXRlTGlzdCBuZSAnSEFTSCcgfHwgISRUZW1wbGF0ZUxpc3QtPiUqICkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGFkZCBhIHRlbXBsYXRlIGxpc3QgdG8gb3V0cHV0IGZpbHRlciAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfSAiCiAgICAgICAgICAgICAgICAgICAgLiAidG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gVXNlIEFMTCBpZiBPdXRwdXRGaWx0ZXIgc2hvdWxkIG1vZGlmeSBhbGwgIgogICAgICAgICAgICAgICAgICAgIC4gInRlbXBsYXRlcyBvZiB0aGUgc3lzdGVtIChkZXByZWNhdGVkKS4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVGaWxlfSAmJiByZWYgJFRlbXBsYXRlTGlzdCBlcSAnSEFTSCcgJiYgISRUZW1wbGF0ZUxpc3QtPntBTEx9ICkgewogICAgICAgICAgICBuZXh0IEZJTFRFUiB1bmxlc3MgJFRlbXBsYXRlTGlzdC0+eyAkUGFyYW17VGVtcGxhdGVGaWxlfSB9OwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGSUxURVIgdW5sZXNzICRNYWluT2JqZWN0LT5SZXF1aXJlKCAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfSApOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgICAgICBteSAkT2JqZWN0ID0gJEZpbHRlckNvbmZpZy0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwoKICAgICAgICBuZXh0IEZJTFRFUiB1bmxlc3MgJE9iamVjdDsKCiAgICAgICAgIyBUaGUgb3V0cHV0IGZpbHRlcnMgb3BlcmF0ZSBvbiBzdHJpbmdzLgogICAgICAgICMgTGF6aWx5IGdlbmVyYXRlIHRoZSBzdHJpbmcgb25seSB3aGVuIGl0IGlzIG5lZWRlZCBmb3IgdGhlIGZpcnN0IGZpbHRlci4KICAgICAgICBpZiAoICEkTnVtQXBwbGllZEZpbHRlcnMgKSB7CgogICAgICAgICAgICAjIFVzaW5nIFBsYWNrOjpVdGlsOjpmb3JlYWNoKCkgaW4gb3JkZXIgdG8gY292ZXIgYWxsIGNhc2VzLCBlLmcuIHdoZW4gJE91dHB1dCBpcyBhIGZpbGUgaGFuZGxlLgogICAgICAgICAgICAjIFRoZSBsb2dpYyBpcyBpbnNwaXJlZCBieSBQbGFjazo6UmVzcG9uc2U6Ol9ib2R5KCkuCiAgICAgICAgICAgIG15ICRQU0dJQm9keTsKICAgICAgICAgICAgaWYgKCAhcmVmICRPdXRwdXQgKSB7CiAgICAgICAgICAgICAgICAkUFNHSUJvZHkgPSBbJE91dHB1dF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBibGVzc2VkKCRPdXRwdXQpICYmIG92ZXJsb2FkOjpNZXRob2QoICRPdXRwdXQsIHEoIiIpICkgJiYgISRPdXRwdXQtPmNhbignZ2V0bGluZScpICkgewogICAgICAgICAgICAgICAgJFBTR0lCb2R5ID0gWyRPdXRwdXRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBTR0lCb2R5ID0gJE91dHB1dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUGxhY2s6OlV0aWw6OmZvcmVhY2goCiAgICAgICAgICAgICAgICAkUFNHSUJvZHksCiAgICAgICAgICAgICAgICBzdWIgewogICAgICAgICAgICAgICAgICAgIG15ICgkTGluZSkgPSBAXzsKCiAgICAgICAgICAgICAgICAgICAgJE1vZGlmaWVkT3V0cHV0IC49ICRMaW5lOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJ1biBvdXRwdXQgZmlsdGVyCiAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAleyRGaWx0ZXJDb25maWd9LAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCRNb2RpZmllZE91dHB1dCwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICRQYXJhbXtUZW1wbGF0ZUZpbGV9IHx8ICcnLAogICAgICAgICk7CgogICAgICAgICROdW1BcHBsaWVkRmlsdGVycysrOwogICAgfQoKICAgICMgcmV0dXJuIHRoZSBvcmlnaW5hbCBvdXRwdXQgd2hlbiBubyBmaWx0ZXJzIHJhbgogICAgcmV0dXJuICROdW1BcHBsaWVkRmlsdGVycyA/ICRNb2RpZmllZE91dHB1dCA6ICRPdXRwdXQ7Cn0KCj1oZWFkMiBBc2NpaTJIdG1sKCkKCmNvbnZlcnQgQVNDSUkgdG8gSFRNTCBzdHJpbmcKCiAgICBteSAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgID0+ICdTb21lIDw+IFRlc3QgPGZvbnQgY29sb3I9InJlZCI+VGVzdDwvZm9udD4nLAogICAgICAgIE1heCAgICAgICAgICAgICA9PiAyMCwgICAgICAgIyBtYXggMjAgY2hhcnMgZmxvd2VkIGJ5IFsuLl0KICAgICAgICBWTWF4ICAgICAgICAgICAgPT4gMTUsICAgICAgICMgZmlyc3QgMTUgbGluZXMKICAgICAgICBOZXdMaW5lICAgICAgICAgPT4gMCwgICAgICAgICMgbW92ZSBcciB0byBcbgogICAgICAgIEhUTUxSZXN1bHRNb2RlICA9PiAwLCAgICAgICAgIyByZXBsYWNlICIgIiB3aXRoIEM8Jm5ic3A7PgogICAgICAgIFN0cmlwRW1wdHlMaW5lcyA9PiAwLAogICAgICAgIFR5cGUgICAgICAgICAgICA9PiAnTm9ybWFsJywgIyBKU1RleHQgb3IgTm9ybWFsIHRleHQKICAgICAgICBMaW5rRmVhdHVyZSAgICAgPT4gMCwgICAgICAgICMgZG8gc29tZSBVUkwgZGV0ZWN0aW9ucwogICAgKTsKCkEgcmVmZXJlbmNlIHRvIGEgc3RyaW5nIGNhbiBhbHNvIGJlIHBhc3NlZC4gSW4gdGhpcyBjYXN0IHRoZSByZXN1bHQgd2lsbCBhbHNvIGJlIGEgcmVmZXJlbmNlIHRvIGEgc3RyaW5nLgoKICAgIG15ICRIVE1MU3RyaW5nUmVmID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICBUZXh0ID0+IFwkU3RyaW5nLAogICAgKTsKCj1jdXQKCnN1YiBBc2NpaTJIdG1sIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW0KICAgIHJldHVybiAnJyB1bmxlc3MgZGVmaW5lZCAkUGFyYW17VGV4dH07CgogICAgIyBjaGVjayB0ZXh0CiAgICBteSAkVGV4dDsKICAgIGlmICggIXJlZiAkUGFyYW17VGV4dH0gKSB7CiAgICAgICAgJFRleHQgPSBcJFBhcmFte1RleHR9OwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RleHR9IGVxICdTQ0FMQVInICkgewogICAgICAgICRUZXh0ID0gJFBhcmFte1RleHR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAiJyAuIHJlZiggJFBhcmFte1RleHR9ICkgLiAnIiBvZiBUZXh0IHBhcmFtIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgICMgcnVuIG91dHB1dCBmaWx0ZXIgdGV4dAogICAgbXkgQEZpbHRlcnM7CiAgICBpZiAoICRQYXJhbXtMaW5rRmVhdHVyZX0gJiYgJFNlbGYtPntGaWx0ZXJUZXh0fSAmJiByZWYgJFNlbGYtPntGaWx0ZXJUZXh0fSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgbGlzdAogICAgICAgIG15ICVGaWx0ZXJMaXN0ID0gJXsgJFNlbGYtPntGaWx0ZXJUZXh0fSB9OwoKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgIEZJTFRFUjoKICAgICAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVyTGlzdCApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBmaWx0ZXIgY29uZmlnCiAgICAgICAgICAgIG15ICRGaWx0ZXJDb25maWcgPSAkRmlsdGVyTGlzdHskRmlsdGVyfTsKCiAgICAgICAgICAgIG5leHQgRklMVEVSIGlmICEkRmlsdGVyQ29uZmlnOwogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiByZWYgJEZpbHRlckNvbmZpZyBuZSAnSEFTSCc7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGVtcGxhdGUgbGlzdAogICAgICAgICAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEZpbHRlckNvbmZpZy0+e1RlbXBsYXRlc307CgogICAgICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlTGlzdCB8fCByZWYgJFRlbXBsYXRlTGlzdCBuZSAnSEFTSCcgfHwgISV7JFRlbXBsYXRlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGFkZCBhIHRlbXBsYXRlIGxpc3QgdG8gb3V0cHV0IGZpbHRlciAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRvIGltcHJvdmUgcGVyZm9ybWFuY2UuIFVzZSBBTEwgaWYgT3V0cHV0RmlsdGVyIHNob3VsZCBtb2RpZnkgYWxsICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAidGVtcGxhdGVzIG9mIHRoZSBzeXN0ZW0gKGRlcHJlY2F0ZWQpLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGxpc3QKICAgICAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVGaWxlfSAmJiByZWYgJFRlbXBsYXRlTGlzdCBlcSAnSEFTSCcgJiYgISRUZW1wbGF0ZUxpc3QtPntBTEx9ICkgewogICAgICAgICAgICAgICAgbmV4dCBGSUxURVIgaWYgISRUZW1wbGF0ZUxpc3QtPnsgJFBhcmFte1RlbXBsYXRlRmlsZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRGllKCkgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfSApOwoKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkRmlsdGVyQ29uZmlnLT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJE9iamVjdDsKCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBARmlsdGVycywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QgPT4gJE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlckNvbmZpZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByZSBydW4KICAgICAgICBmb3IgbXkgJEZpbHRlciAoQEZpbHRlcnMpIHsKCiAgICAgICAgICAgICRUZXh0ID0gJEZpbHRlci0+e09iamVjdH0tPlByZSgKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLT57RmlsdGVyfSwKICAgICAgICAgICAgICAgIERhdGEgICA9PiAkVGV4dCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBtYXggd2lkdGgKICAgIGlmICggJFBhcmFte01heH0gJiYgbGVuZ3RoICR7JFRleHR9ID4gJFBhcmFte01heH0gKSB7CiAgICAgICAgJHskVGV4dH0gPSBzdWJzdHIoICR7JFRleHR9LCAwLCAkUGFyYW17TWF4fSAtIDUgKSAuICdbLi4uXSc7CiAgICB9CgogICAgIyBuZXdsaW5lCiAgICBpZiAoICRQYXJhbXtOZXdMaW5lfSAmJiBsZW5ndGgoICR7JFRleHR9ICkgPCAxNDBfMDAwICkgewogICAgICAgICR7JFRleHR9ID1+IHMvKFxuXHJ8XHJcclxufFxyXG4pL1xuL2c7CiAgICAgICAgJHskVGV4dH0gPX4gcy9cci9cbi9nOwogICAgICAgICR7JFRleHR9ID1+IHMvKC57NCwkUGFyYW17TmV3TGluZX19KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgfQoKICAgICMgcmVtb3ZlIHRhYnMKICAgICR7JFRleHR9ID1+IHMvXHQvIC9nOwoKICAgICMgc3RyaXAgZW1wdHkgbGluZXMKICAgIGlmICggJFBhcmFte1N0cmlwRW1wdHlMaW5lc30gKSB7CiAgICAgICAgJHskVGV4dH0gPX4gcy9eXHMqXG4vL21nOwogICAgfQoKICAgICMgbWF4IGxpbmVzCiAgICBpZiAoICRQYXJhbXtWTWF4fSApIHsKICAgICAgICBteSBAVGV4dExpc3QgPSBzcGxpdCAvXG4vLCAkeyRUZXh0fTsKICAgICAgICAkeyRUZXh0fSA9ICcnOwogICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICBmb3IgKEBUZXh0TGlzdCkgewogICAgICAgICAgICBpZiAoICRDb3VudGVyIDw9ICRQYXJhbXtWTWF4fSApIHsKICAgICAgICAgICAgICAgICR7JFRleHR9IC49ICRfIC4gIlxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KICAgICAgICBpZiAoICRDb3VudGVyID49ICRQYXJhbXtWTWF4fSApIHsKICAgICAgICAgICAgJHskVGV4dH0gLj0gIlsuLi5dXG4iOwogICAgICAgIH0KICAgIH0KCiAgICAjIGh0bWwgcXVvdGluZwogICAgJHskVGV4dH0gPX4gcy8mLyZhbXA7L2c7CiAgICAkeyRUZXh0fSA9fiBzLzwvJmx0Oy9nOwogICAgJHskVGV4dH0gPX4gcy8+LyZndDsvZzsKICAgICR7JFRleHR9ID1+IHMvIi8mcXVvdDsvZzsKCiAgICAjIHRleHQgLT4gaHRtbCBmb3JtYXQgcXVvdGluZwogICAgaWYgKCAkUGFyYW17TGlua0ZlYXR1cmV9ICkgewogICAgICAgIGZvciBteSAkRmlsdGVyIChARmlsdGVycykgewogICAgICAgICAgICAkVGV4dCA9ICRGaWx0ZXItPntPYmplY3R9LT5Qb3N0KAogICAgICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXItPntGaWx0ZXJ9LAogICAgICAgICAgICAgICAgRGF0YSAgID0+ICRUZXh0LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtIVE1MUmVzdWx0TW9kZX0gKSB7CiAgICAgICAgJHskVGV4dH0gPX4gcy9cbi88YnJcLz5cbi9nOwogICAgICAgICR7JFRleHR9ID1+IHMvICAvJm5ic3A7Jm5ic3A7L2c7CgogICAgICAgICMgQ29udmVydCB0aGUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAoc2VlIGJ1ZyMxNDM0NiAtIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNDYpLgogICAgICAgICR7JFRleHR9ID1+IHMvXG4gL1xuJm5ic3A7L2c7CiAgICB9CgogICAgaWYgKCAkUGFyYW17VHlwZX0gJiYgJFBhcmFte1R5cGV9IGVxICdKU1RleHQnICkgewogICAgICAgICR7JFRleHR9ID1+IHMvJy9cXCcvZzsKICAgIH0KCiAgICAjIFRoZSBpbnB1dCBwYXJhbWV0ZXIgVGV4dCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZQogICAgcmV0dXJuICRUZXh0IGlmIHJlZiAkUGFyYW17VGV4dH07CiAgICByZXR1cm4gJHskVGV4dH07Cn0KCj1oZWFkMiBMaW5rUXVvdGUoKQoKZGV0ZWN0IGxpbmtzIGluIHRleHQKCiAgICBteSAkSFRNTFdpdGhMaW5rcyA9ICRMYXlvdXRPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICBUZXh0ID0+ICRIVE1MV2l0aE91dExpbmtzLAogICAgKTsKCmFsc28gc3RyaW5nIHJlZiBpcyBwb3NzaWJsZQoKICAgIG15ICRIVE1MV2l0aExpbmtzUmVmID0gJExheW91dE9iamVjdC0+TGlua1F1b3RlKAogICAgICAgIFRleHQgPT4gXCRIVE1MV2l0aE91dExpbmtzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rUXVvdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGV4dCA9ICRQYXJhbXtUZXh0fSB8fCAnJzsKCiAgICAjIGNoZWNrIHJlZgogICAgbXkgJFRleHRTY2FsYXI7CiAgICBpZiAoICFyZWYgJFRleHQgKSB7CiAgICAgICAgJFRleHRTY2FsYXIgPSAkVGV4dDsKICAgICAgICAkVGV4dCAgICAgICA9IFwkVGV4dFNjYWxhcjsKICAgIH0KCiAgICAjIHJ1biBvdXRwdXQgZmlsdGVyIHRleHQKICAgIG15IEBGaWx0ZXJzOwogICAgaWYgKCAkU2VsZi0+e0ZpbHRlclRleHR9ICYmIHJlZiAkU2VsZi0+e0ZpbHRlclRleHR9IGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBleHRyYWN0IGZpbHRlciBsaXN0CiAgICAgICAgbXkgJUZpbHRlckxpc3QgPSAleyAkU2VsZi0+e0ZpbHRlclRleHR9IH07CgogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgRklMVEVSOgogICAgICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJMaXN0ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGZpbHRlciBjb25maWcKICAgICAgICAgICAgbXkgJEZpbHRlckNvbmZpZyA9ICRGaWx0ZXJMaXN0eyRGaWx0ZXJ9OwoKICAgICAgICAgICAgbmV4dCBGSUxURVIgaWYgISRGaWx0ZXJDb25maWc7CiAgICAgICAgICAgIG5leHQgRklMVEVSIGlmIHJlZiAkRmlsdGVyQ29uZmlnIG5lICdIQVNIJzsKCiAgICAgICAgICAgICMgZXh0cmFjdCB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkRmlsdGVyQ29uZmlnLT57VGVtcGxhdGVzfTsKCiAgICAgICAgICAgICMgY2hlY2sgdGVtcGxhdGUgbGlzdAogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVMaXN0IHx8IHJlZiAkVGVtcGxhdGVMaXN0IG5lICdIQVNIJyB8fCAhJXskVGVtcGxhdGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgYWRkIGEgdGVtcGxhdGUgbGlzdCB0byBvdXRwdXQgZmlsdGVyICRGaWx0ZXJDb25maWctPntNb2R1bGV9ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAidG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gVXNlIEFMTCBpZiBPdXRwdXRGaWx0ZXIgc2hvdWxkIG1vZGlmeSBhbGwgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJ0ZW1wbGF0ZXMgb2YgdGhlIHN5c3RlbSAoZGVwcmVjYXRlZCkuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgdGVtcGxhdGUgbGlzdAogICAgICAgICAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZUZpbGV9ICYmIHJlZiAkVGVtcGxhdGVMaXN0IGVxICdIQVNIJyAmJiAhJFRlbXBsYXRlTGlzdC0+e0FMTH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJFRlbXBsYXRlTGlzdC0+eyAkUGFyYW17VGVtcGxhdGVGaWxlfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxEaWUoKSBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRGaWx0ZXJDb25maWctPntNb2R1bGV9ICk7CgogICAgICAgICAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRGaWx0ZXJDb25maWctPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRklMVEVSIGlmICEkT2JqZWN0OwoKICAgICAgICAgICAgcHVzaCBARmlsdGVycywgewogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlckNvbmZpZywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICRGaWx0ZXIgKEBGaWx0ZXJzKSB7CiAgICAgICAgJFRleHQgPSAkRmlsdGVyLT57T2JqZWN0fS0+UHJlKAogICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlci0+e0ZpbHRlcn0sCiAgICAgICAgICAgIERhdGEgICA9PiAkVGV4dAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEZpbHRlciAoQEZpbHRlcnMpIHsKICAgICAgICAkVGV4dCA9ICRGaWx0ZXItPntPYmplY3R9LT5Qb3N0KAogICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlci0+e0ZpbHRlcn0sCiAgICAgICAgICAgIERhdGEgICA9PiAkVGV4dAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyBtYWlsIHRvIHF1b3RlCiAgICAkeyRUZXh0fSA9fiBzLyhtYWlsdG86Lis/KShcLlxzfFxzfFwpfFwifF18JykvPGEgaHJlZj1cIiQxXCI+JDE8XC9hPiQyL2dpOwoKICAgICMgY2hlY2sgcmVmICYmIHJldHVybiByZXN1bHQgbGlrZSBjYWxsZWQKICAgIGlmICgkVGV4dFNjYWxhcikgewogICAgICAgIHJldHVybiAkeyRUZXh0fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkVGV4dDsKICAgIH0KfQoKPWhlYWQyIEhUTUxMaW5rUXVvdGUoKQoKZGV0ZWN0IGxpbmtzIGluIEhUTUwgY29kZQoKICAgIG15ICRIVE1MV2l0aExpbmtzID0gJExheW91dE9iamVjdC0+SFRNTExpbmtRdW90ZSgKICAgICAgICBTdHJpbmcgPT4gJEhUTUxTdHJpbmcsCiAgICApOwoKYWxzbyBzdHJpbmcgcmVmIGlzIHBvc3NpYmxlCgogICAgbXkgJEhUTUxXaXRoTGlua3NSZWYgPSAkTGF5b3V0T2JqZWN0LT5IVE1MTGlua1F1b3RlKAogICAgICAgIFN0cmluZyA9PiBcJEhUTUxTdHJpbmcsCiAgICApOwoKPWN1dAoKc3ViIEhUTUxMaW5rUXVvdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5MaW5rUXVvdGUoCiAgICAgICAgU3RyaW5nICAgID0+ICRQYXJhbXtTdHJpbmd9LAogICAgICAgIFRhcmdldEFkZCA9PiAxLAogICAgICAgIFRhcmdldCAgICA9PiAnX2JsYW5rJywKICAgICk7Cn0KCj1oZWFkMiBMaW5rRW5jb2RlKCkKCnBlcmZvcm0gVVJMIGVuY29kaW5nIG9uIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXIgbmFtZXMgb3IgdmFsdWVzLgoKICAgIG15ICRQYXJhbVZhbHVlRW5jb2RlZCA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFBhcmFtVmFsdWUpOwoKRG9uJ3QgZW5jb2RlIGVudGlyZSBVUkxzLCBiZWNhdXNlIHRoaXMgd2lsbCBtYWtlIHRoZW0gaW52YWxpZAooPywgJiBhbmQgOyB3aWxsIGJlIGVuY29kZWQgYXMgd2VsbCkuIE9ubHkgcGFzcyBvbmUgcGFyYW1ldGVyIG5hbWUKb3IgdmFsdWUgYXQgYSB0aW1lLgoKPWN1dAoKc3ViIExpbmtFbmNvZGUgewogICAgbXkgKCAkU2VsZiwgJExpbmsgKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkTGluazsKCiAgICByZXR1cm4gdXJpX2VzY2FwZV91dGY4KCRMaW5rKTsKfQoKc3ViIEN1c3RvbWVyQWdlSW5Ib3VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBZ2UgICAgICAgPSBkZWZpbmVkKCAkUGFyYW17QWdlfSApID8gJFBhcmFte0FnZX0gOiByZXR1cm47CiAgICBteSAkU3BhY2UgICAgID0gJFBhcmFte1NwYWNlfSB8fCAnPGJyLz4nOwogICAgbXkgJEFnZVN0cmcgICA9ICcnOwogICAgbXkgJEhvdXJEc2MgICA9IFRyYW5zbGF0YWJsZSgnaCcpOwogICAgbXkgJE1pbnV0ZURzYyA9IFRyYW5zbGF0YWJsZSgnbScpOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpbWVTaG93Q29tcGxldGVEZXNjcmlwdGlvbicpICkgewogICAgICAgICRIb3VyRHNjICAgPSBUcmFuc2xhdGFibGUoJ2hvdXIocyknKTsKICAgICAgICAkTWludXRlRHNjID0gVHJhbnNsYXRhYmxlKCdtaW51dGUocyknKTsKICAgIH0KICAgIGlmICggJEFnZSA9fiAvXi0oLiopLyApIHsKICAgICAgICAkQWdlICAgICA9ICQxOwogICAgICAgICRBZ2VTdHJnID0gJy0nOwogICAgfQoKICAgICMgZ2V0IGhvdXJzCiAgICBpZiAoICRBZ2UgPj0gMzYwMCApIHsKICAgICAgICAkQWdlU3RyZyAuPSBpbnQoICggJEFnZSAvIDM2MDAgKSApIC4gJyAnOwogICAgICAgICRBZ2VTdHJnIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEhvdXJEc2MpOwogICAgICAgICRBZ2VTdHJnIC49ICRTcGFjZTsKICAgIH0KCiAgICAjIGdldCBtaW51dGVzIChqdXN0IGlmIGFnZSA8IDEgZGF5KQogICAgaWYgKCAkQWdlIDw9IDM2MDAgfHwgaW50KCAoICRBZ2UgLyA2MCApICUgNjAgKSApIHsKICAgICAgICAkQWdlU3RyZyAuPSBpbnQoICggJEFnZSAvIDYwICkgJSA2MCApIC4gJyAnOwogICAgICAgICRBZ2VTdHJnIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJE1pbnV0ZURzYyk7CiAgICB9CiAgICByZXR1cm4gJEFnZVN0cmc7Cn0KCnN1YiBDdXN0b21lckFnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRBZ2UgICAgICAgPSBkZWZpbmVkKCAkUGFyYW17QWdlfSApID8gJFBhcmFte0FnZX0gOiByZXR1cm47CiAgICBteSAkU3BhY2UgICAgID0gJFBhcmFte1NwYWNlfSB8fCAnPGJyLz4nOwogICAgbXkgJEFnZVN0cmcgICA9ICcnOwogICAgbXkgJERheURzYyAgICA9IFRyYW5zbGF0YWJsZSgnZCcpOwogICAgbXkgJEhvdXJEc2MgICA9IFRyYW5zbGF0YWJsZSgnaCcpOwogICAgbXkgJE1pbnV0ZURzYyA9IFRyYW5zbGF0YWJsZSgnbScpOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpbWVTaG93Q29tcGxldGVEZXNjcmlwdGlvbicpICkgewogICAgICAgICREYXlEc2MgICAgPSBUcmFuc2xhdGFibGUoJ2RheShzKScpOwogICAgICAgICRIb3VyRHNjICAgPSBUcmFuc2xhdGFibGUoJ2hvdXIocyknKTsKICAgICAgICAkTWludXRlRHNjID0gVHJhbnNsYXRhYmxlKCdtaW51dGUocyknKTsKICAgIH0KICAgIGlmICggJEFnZSA9fiAvXi0oLiopLyApIHsKICAgICAgICAkQWdlICAgICA9ICQxOwogICAgICAgICRBZ2VTdHJnID0gJy0nOwogICAgfQoKICAgICMgZ2V0IGRheXMKICAgIGlmICggJEFnZSA+PSA4NjQwMCApIHsKICAgICAgICAkQWdlU3RyZyAuPSBpbnQoICggJEFnZSAvIDM2MDAgKSAvIDI0ICkgLiAnICc7CiAgICAgICAgJEFnZVN0cmcgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkRGF5RHNjKTsKICAgICAgICAkQWdlU3RyZyAuPSAkU3BhY2U7CiAgICB9CgogICAgIyBnZXQgaG91cnMKICAgIGlmICggJEFnZSA+PSAzNjAwICkgewogICAgICAgICRBZ2VTdHJnIC49IGludCggKCAkQWdlIC8gMzYwMCApICUgMjQgKSAuICcgJzsKICAgICAgICAkQWdlU3RyZyAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRIb3VyRHNjKTsKICAgICAgICAkQWdlU3RyZyAuPSAkU3BhY2U7CiAgICB9CgogICAgIyBnZXQgbWludXRlcyAoanVzdCBpZiBhZ2UgPCAxIGRheSkKICAgIGlmICggKCAkUGFyYW17VGltZVNob3dBbHdheXNMb25nfSB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpbWVTaG93QWx3YXlzTG9uZycpIHx8ICRBZ2UgPCA4NjQwMCApICYmICRBZ2UgIT0gMCApIHsKICAgICAgICAkQWdlU3RyZyAuPSBpbnQoICggJEFnZSAvIDYwICkgJSA2MCApIC4gJyAnOwogICAgICAgICRBZ2VTdHJnIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJE1pbnV0ZURzYyk7CiAgICB9CiAgICByZXR1cm4gJEFnZVN0cmc7Cn0KCj1oZWFkMiBCdWlsZFNlbGVjdGlvbigpCgpidWlsZCBhIEhUTUwgb3B0aW9uIGVsZW1lbnQgYmFzZWQgb24gZ2l2ZW4gZGF0YQoKICAgIG15ICRIVE1MID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICAgID0+ICRBcnJheVJlZiwgICAgICAgICMgdXNlICRIYXNoUmVmLCAkQXJyYXlSZWYgb3IgJEFycmF5SGFzaFJlZiAoc2VlIGJlbG93KQogICAgICAgIE5hbWUgICAgICAgICAgICA9PiAnVGhlTmFtZScsICAgICAgICAjIG5hbWUgb2YgZWxlbWVudAogICAgICAgIElEICAgICAgICAgICAgICA9PiAnSFRNTElEJywgICAgICAgICAjIChvcHRpb25hbCkgdGhlIEhUTUwgSUQgZm9yIHRoaXMgZWxlbWVudCwgaWYgbm90IHByb3ZpZGVkLCB0aGUgbmFtZSB3aWxsIGJlIHVzZWQgYXMgSUQgYXMgd2VsbAogICAgICAgIE11bHRpcGxlICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCiAgICAgICAgU2l6ZSAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgZWxlbWVudCBzaXplCiAgICAgICAgQ2xhc3MgICAgICAgICAgID0+ICdjbGFzcycsICAgICAgICAgICMgKG9wdGlvbmFsKSBhIGNzcyBjbGFzcywgaW5jbHVkZSAnTW9kZXJuaXplJyB0byBhY3RpdmF0ZSBJbnB1dEZpZWxkcwogICAgICAgIERpc2FibGVkICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpIGRpc2FibGUgdGhlIGVsZW1lbnQKICAgICAgICBBdXRvQ29tcGxldGUgICAgPT4gJ29mZicsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgT25DaGFuZ2UgICAgICAgID0+ICdqYXZhc2NyaXB0JywgICAgICMgKG9wdGlvbmFsKQogICAgICAgIE9uQ2xpY2sgICAgICAgICA9PiAnamF2YXNjcmlwdCcsICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB1c2UgaW50ZWdlciBvciBhcnJheXJlZiAodW5hYmxlIHRvIHVzZSB3aXRoIEFycmF5SGFzaFJlZikKICAgICAgICBTZWxlY3RlZElEICAgICA9PiBbMSwgNSwgM10sICAgICAgICAgIyAob3B0aW9uYWwpIHVzZSBpbnRlZ2VyIG9yIGFycmF5cmVmICh1bmFibGUgdG8gdXNlIHdpdGggQXJyYXlIYXNoUmVmKQogICAgICAgIFNlbGVjdGVkVmFsdWUgID0+ICd0ZXN0JywgICAgICAgICAgICAjIChvcHRpb25hbCkgdXNlIHN0cmluZyBvciBhcnJheXJlZiAodW5hYmxlIHRvIHVzZSB3aXRoIEFycmF5SGFzaFJlZikKICAgICAgICBTZWxlY3RlZFZhbHVlICA9PiBbJ3Rlc3QnLCAndGVzdDEnXSwgIyAob3B0aW9uYWwpIHVzZSBzdHJpbmcgb3IgYXJyYXlyZWYgKHVuYWJsZSB0byB1c2Ugd2l0aCBBcnJheUhhc2hSZWYpCgogICAgICAgIFNvcnQgICAgICAgICAgID0+ICdOdW1lcmljVmFsdWUnLCAgICAjIChvcHRpb25hbCkgKEFscGhhbnVtZXJpY1ZhbHVlfE51bWVyaWNWYWx1ZXxBbHBoYW51bWVyaWNLZXl8TnVtZXJpY0tleXxUcmVlVmlld3xJbmRpdmlkdWFsS2V5fEluZGl2aWR1YWxWYWx1ZSkgdW5hYmxlIHRvIHVzZSB3aXRoIEFycmF5SGFzaFJlZgogICAgICAgIFNvcnRJbmRpdmlkdWFsID0+IFsnc2VjJywgJ21pbiddICAgICAjIChvcHRpb25hbCkgb25seSBzb3J0IGlzIHNldCB0byBJbmRpdmlkdWFsS2V5IG9yIEluZGl2aWR1YWxWYWx1ZQogICAgICAgIFNvcnRSZXZlcnNlICAgID0+IDAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgcmV2ZXJzZSB0aGUgbGlzdAoKICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAxLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKSB0cmFuc2xhdGUgdmFsdWUKICAgICAgICBQb3NzaWJsZU5vbmUgICA9PiAwLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBhZGQgYSBsZWFkaW5nIGVtcHR5IHNlbGVjdGlvbgogICAgICAgIFRyZWVWaWV3ICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCiAgICAgICAgRGlzYWJsZWRCcmFuY2ggPT4gJ0JyYW5jaCcsICAgICAgICAgICMgKG9wdGlvbmFsKSBkaXNhYmxlIGFsbCBlbGVtZW50cyBvZiB0aGlzIGJyYW5jaCAodXNlIHN0cmluZyBvciBhcnJheXJlZikKICAgICAgICBNYXggICAgICAgICAgICA9PiAxMDAsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMTAwIG1heCBzaXplIG9mIHRoZSBzaG93biB2YWx1ZQogICAgICAgIEhUTUxRdW90ZSAgICAgID0+IDAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpIGRpc2FibGUgaHRtbCBxdW90ZQogICAgICAgIFRpdGxlICAgICAgICAgID0+ICdDPFRvb2x0aXA+IFRleHQnLCAgICAjIChvcHRpb25hbCkgc3RyaW5nIHdpbGwgYmUgc2hvd24gYXMgYzxUb29sdGlwPiBvbiBjPG1vdXNlb3Zlcj4KICAgICAgICBPcHRpb25UaXRsZSAgICA9PiAxLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBzaG93IHRpdGxlIGF0dHJpYnV0ZSAodGhlIG9wdGlvbiB2YWx1ZSkgb24gZXZlcnkgb3B0aW9uIGVsZW1lbnQKCiAgICAgICAgRmlsdGVycyA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBmaWx0ZXIgZGF0YSwgdXNlZCBieSBJbnB1dEZpZWxkcwogICAgICAgICAgICBMYXN0T3duZXJzID0+IHsgICAgICAgICAgICAgICAgICAjIGZpbHRlciBpZAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICdMYXN0IG93bmVycycsICAgICAjIG5hbWUgb2YgdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgVmFsdWVzID0+IHsgICAgICAgICAgICAgICAgICAjIGZpbHRlcmVkIGRhdGEgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgICAgS2V5MSA9PiAnVmFsdWUxJywKICAgICAgICAgICAgICAgICAgICBLZXkyID0+ICdWYWx1ZTInLAogICAgICAgICAgICAgICAgICAgIEtleTMgPT4gJ1ZhbHVlMycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQWN0aXZlID0+IDEsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpIG1ha2UgdGhpcyBmaWx0ZXIgaW1tZWRpYXRlbHkgYWN0aXZlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEludm9sdmVkQWdlbnRzID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnSW52b2x2ZWQgaW4gdGhpcyB0aWNrZXQnLAogICAgICAgICAgICAgICAgVmFsdWVzID0+IFwlSGFzaFdpdGhEYXRhLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwYW5kRmlsdGVycyAgPT4gMSwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAgKDB8MSkgZXhwYW5kIGZpbHRlcnMgbGlzdCBieSBkZWZhdWx0CgogICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyICA9PiAnMjAxNi0wMS0wMScsICAjIChvcHRpb25hbCkgdmFsaWRhdGUgdGhhdCBkYXRlIGlzIGFmdGVyIHN1cHBsaWVkIHZhbHVlCiAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlID0+ICcyMDE2LTAxLTAxJywgICMgKG9wdGlvbmFsKSB2YWxpZGF0ZSB0aGF0IGRhdGUgaXMgYmVmb3JlIHN1cHBsaWVkIHZhbHVlCiAgICApOwoKICAgIG15ICRIYXNoUmVmID0gewogICAgICAgIEtleTEgPT4gJ1ZhbHVlMScsCiAgICAgICAgS2V5MiA9PiAnVmFsdWUyJywKICAgICAgICBLZXkzID0+ICdWYWx1ZTMnLAogICAgfTsKCiAgICBteSAkQXJyYXlSZWYgPSBbCiAgICAgICAgJ0tleVZhbHVlMScsCiAgICAgICAgJ0tleVZhbHVlMicsCiAgICAgICAgJ0tleVZhbHVlMycsCiAgICAgICAgJ0tleVZhbHVlNCcsCiAgICBdOwoKICAgIG15ICRBcnJheUhhc2hSZWYgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnMScsCiAgICAgICAgICAgIFZhbHVlID0+ICdWYWx1ZTEnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICA9PiAnMicsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICdWYWx1ZTE6OlN1YnZhbHVlMScsCiAgICAgICAgICAgIFNlbGVjdGVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICczJywKICAgICAgICAgICAgVmFsdWUgPT4gJ1ZhbHVlMTo6U3VidmFsdWUyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJzQnLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAnVmFsdWUyJywKICAgICAgICAgICAgRGlzYWJsZWQgPT4gMSwKICAgICAgICB9CiAgICBdOwoKPWN1dAoKc3ViIEJ1aWxkU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoTmFtZSBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBUaGUgcGFyYW1ldGVycyAnQWpheCcgYW5kICdPbkNoYW5nZScgYXJlIGV4Y2x1c2l2ZQogICAgaWYgKCAkUGFyYW17QWpheH0gJiYgJFBhcmFte09uQ2hhbmdlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXJzICdPbkNoYW5nZScgYW5kICdBamF4JyBleGNsdWRlIGVhY2ggb3RoZXIhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IE9uQ2hhbmdlIGlmIEFKQVggaXMgdXNlZAogICAgaWYgKCAkUGFyYW17QWpheH0gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0FqYXh9LT57RGVwZW5kfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgRGVwZW5kIFBhcmFtIEFqYXggb3B0aW9uIScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte0FqYXh9LT57VXBkYXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXBkYXRlIFBhcmFtIEFqYXggb3B0aW9uKCkhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgbXkgJFNlbGVjdG9yID0gJFBhcmFte0lEfSB8fCAkUGFyYW17TmFtZX07CiAgICAgICAgJFBhcmFte09uQ2hhbmdlfSA9ICJDb3JlLkFKQVguRm9ybVVwZGF0ZShcJCgnIyIKICAgICAgICAgICAgLiAkU2VsZWN0b3IgLiAiJyksICciIC4gJFBhcmFte0FqYXh9LT57U3ViYWN0aW9ufSAuICInLCIKICAgICAgICAgICAgLiAiICckUGFyYW17TmFtZX0nLCIKICAgICAgICAgICAgLiAiIFsnIgogICAgICAgICAgICAuIGpvaW4oICInLCAnIiwgQHsgJFBhcmFte0FqYXh9LT57VXBkYXRlfSB9ICkgLiAiJ10pOyI7CiAgICB9CgogICAgIyBjcmVhdGUgT3B0aW9uUmVmCiAgICBteSAkT3B0aW9uUmVmID0gJFNlbGYtPl9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSglUGFyYW0pOwoKICAgICMgY3JlYXRlIEF0dHJpYnV0ZVJlZgogICAgbXkgJEF0dHJpYnV0ZVJlZiA9ICRTZWxmLT5fQnVpbGRTZWxlY3Rpb25BdHRyaWJ1dGVSZWZDcmVhdGUoJVBhcmFtKTsKCiAgICAjIGNyZWF0ZSBEYXRhUmVmCiAgICBteSAkRGF0YVJlZiA9ICRTZWxmLT5fQnVpbGRTZWxlY3Rpb25EYXRhUmVmQ3JlYXRlKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgQXR0cmlidXRlUmVmID0+ICRBdHRyaWJ1dGVSZWYsCiAgICAgICAgT3B0aW9uUmVmICAgID0+ICRPcHRpb25SZWYsCiAgICApOwoKICAgICMgY3JlYXRlIEZpbHRlcnNSZWYKICAgIG15IEBGaWx0ZXJzOwogICAgbXkgJEZpbHRlckFjdGl2ZTsKICAgIGlmICggJFBhcmFte0ZpbHRlcnN9ICkgewogICAgICAgIG15ICRJbmRleCA9IDE7CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJXsgJFBhcmFte0ZpbHRlcnN9IH0gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRQYXJhbXtGaWx0ZXJzfS0+eyRGaWx0ZXJ9LT57TmFtZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtGaWx0ZXJzfS0+eyRGaWx0ZXJ9LT57VmFsdWVzfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkRmlsdGVyRGF0YSA9ICRTZWxmLT5fQnVpbGRTZWxlY3Rpb25EYXRhUmVmQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17RmlsdGVyc30tPnskRmlsdGVyfS0+e1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUmVmID0+ICRBdHRyaWJ1dGVSZWYsCiAgICAgICAgICAgICAgICAgICAgT3B0aW9uUmVmICAgID0+ICRPcHRpb25SZWYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBARmlsdGVycywgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0ZpbHRlcnN9LT57JEZpbHRlcn0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRGaWx0ZXJEYXRhLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0ZpbHRlcnN9LT57JEZpbHRlcn0tPntBY3RpdmV9ICkgewogICAgICAgICAgICAgICAgICAgICRGaWx0ZXJBY3RpdmUgPSAkSW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdFYWNoIEZpbHRlciBtdXN0IHByb3ZpZGUgTmFtZSBhbmQgVmFsdWVzIScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRJbmRleCsrOwogICAgICAgIH0KICAgICAgICBARmlsdGVycyA9IHNvcnQgeyAkYS0+e05hbWV9IGNtcCAkYi0+e05hbWV9IH0gQEZpbHRlcnM7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uT3V0cHV0KAogICAgICAgIEF0dHJpYnV0ZVJlZiAgICAgICA9PiAkQXR0cmlidXRlUmVmLAogICAgICAgIERhdGFSZWYgICAgICAgICAgICA9PiAkRGF0YVJlZiwKICAgICAgICBPcHRpb25UaXRsZSAgICAgICAgPT4gJFBhcmFte09wdGlvblRpdGxlfSwKICAgICAgICBUcmVlVmlldyAgICAgICAgICAgPT4gJFBhcmFte1RyZWVWaWV3fSwKICAgICAgICBGaWx0ZXJzUmVmICAgICAgICAgPT4gXEBGaWx0ZXJzLAogICAgICAgIEZpbHRlckFjdGl2ZSAgICAgICA9PiAkRmlsdGVyQWN0aXZlLAogICAgICAgIEV4cGFuZEZpbHRlcnMgICAgICA9PiAkUGFyYW17RXhwYW5kRmlsdGVyc30sCiAgICAgICAgVmFsaWRhdGVEYXRlQWZ0ZXIgID0+ICRQYXJhbXtWYWxpZGF0ZURhdGVBZnRlcn0sCiAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlID0+ICRQYXJhbXtWYWxpZGF0ZURhdGVCZWZvcmV9LAogICAgKTsKfQoKc3ViIE5vUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRXaXRoSGVhZGVyID0gJFBhcmFte1dpdGhIZWFkZXJ9IHx8ICd5ZXMnOwoKICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAiVGhpcyB0aWNrZXQgZG9lcyBub3QgZXhpc3QsIG9yIHlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb25zIHRvIGFjY2VzcyBpdCBpbiBpdHMgY3VycmVudCBzdGF0ZS4gWW91IGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6IgogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbiBmb3IgcG9zc2libGUgbmV4dCBhY3Rpb25zCiAgICBteSAkUG9zc2libGVOZXh0QWN0aW9ucyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUG9zc2libGVOZXh0QWN0aW9ucycpOwoKICAgIFBPU1NJQkxFOgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVOZXh0QWN0aW9ucykgKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQb3NzaWJsZU5leHRBY3Rpb25Db250YWluZXInLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskUG9zc2libGVOZXh0QWN0aW9uc30gKSB7CiAgICAgICAgICAgIG5leHQgUE9TU0lCTEUgaWYgISRLZXk7CiAgICAgICAgICAgIG5leHQgUE9TU0lCTEUgaWYgISRQb3NzaWJsZU5leHRBY3Rpb25zLT57JEtleX07CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQb3NzaWJsZU5leHRBY3Rpb25Sb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkUG9zc2libGVOZXh0QWN0aW9ucy0+eyRLZXl9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICBteSAkT3V0cHV0OwogICAgJE91dHB1dCA9ICRTZWxmLT5IZWFkZXIoIFRpdGxlID0+ICdJbnN1ZmZpY2llbnQgUmlnaHRzJyApIGlmICRXaXRoSGVhZGVyIGVxICd5ZXMnOwogICAgJE91dHB1dCAuPSAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnTm9QZXJtaXNzaW9uJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPkZvb3RlcigpIGlmICRXaXRoSGVhZGVyIGVxICd5ZXMnOwoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCj1oZWFkMiBQZXJtaXNzaW9uKCkKCmNoZWNrIGlmIGFjY2VzcyB0byBhIGZyb250ZW5kIG1vZHVsZSBleGlzdHMKCiAgICBteSAkQWNjZXNzID0gJExheW91dE9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBBY3Rpb24gPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICBUeXBlICAgPT4gJ3J3JywgIyByb3xydyBwb3NzaWJsZQogICAgKTsKCj1jdXQKCnN1YiBQZXJtaXNzaW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFjdGlvbiBUeXBlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiR290IG5vICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBjb25maWcgb3B0aW9uIGZvciBmcm9udGVuZCBtb2R1bGUuCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0FjdGlvbn0gfTsKICAgIHJldHVybiBpZiAhJENvbmZpZzsKCiAgICBteSAkSXRlbSA9ICRDb25maWctPnsgJFBhcmFte1R5cGV9IGVxICdybycgPyAnR3JvdXBSbycgOiAnR3JvdXAnIH07CgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAkU2VsZi0+e1VzZXJUeXBlfSBlcSAnQ3VzdG9tZXInID8gJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyA6ICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnCiAgICApOwoKICAgICMgTm8gYWNjZXNzIHJlc3RyaWN0aW9uPwogICAgaWYgKAogICAgICAgIHJlZiAkQ29uZmlnLT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICYmICFzY2FsYXIgQHsgJENvbmZpZy0+e0dyb3VwUm99IH0KICAgICAgICAmJiByZWYgJENvbmZpZy0+e0dyb3VwfSBlcSAnQVJSQVknCiAgICAgICAgJiYgIXNjYWxhciBAeyAkQ29uZmlnLT57R3JvdXB9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBBcnJheSBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkSXRlbSkgKSB7CiAgICAgICAgZm9yIG15ICRHcm91cE5hbWUgKCBAeyRJdGVtfSApIHsKICAgICAgICAgICAgcmV0dXJuIDEgaWYgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEFsbG93IGFjY2VzcyBpZiB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uIGZvciBtb2R1bGUgZ3JvdXAgcGVybWlzc2lvbi4KICAgIGVsc2lmICggIUlzQXJyYXlSZWZXaXRoRGF0YSggJENvbmZpZy0+e0dyb3VwUm99ICkgJiYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJENvbmZpZy0+e0dyb3VwfSApICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpzdWIgQ2hlY2tNaW1lVHlwZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtBY3Rpb259ICkgewogICAgICAgICRQYXJhbXtBY3Rpb259ID0gJ1slIEVudigiQWN0aW9uIikgJV0nOwogICAgfQoKICAgICMgY2hlY2sgaWYgaXQgaXMgYSB0ZXh0L3BsYWluIGVtYWlsCiAgICBpZiAoICRQYXJhbXtNaW1lVHlwZX0gJiYgJFBhcmFte01pbWVUeXBlfSAhfiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICByZXR1cm4gJzxwPjxpIGNsYXNzPSJzbWFsbCI+JwogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRoaXMgaXMgYSIpCiAgICAgICAgICAgIC4gIiAkUGFyYW17TWltZVR5cGV9ICIKICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJlbWFpbCIpCiAgICAgICAgICAgIC4gJywgPGEgaHJlZj0iJwogICAgICAgICAgICAuICRTZWxmLT57QmFzZWxpbmt9CiAgICAgICAgICAgIC4gIkFjdGlvbj0kUGFyYW17QWN0aW9ufTtUaWNrZXRJRD0iCiAgICAgICAgICAgIC4gIiRQYXJhbXtUaWNrZXRJRH07QXJ0aWNsZUlEPSRQYXJhbXtBcnRpY2xlSUR9O1N1YmFjdGlvbj1TaG93SFRNTGVNYWlsXCIgIgogICAgICAgICAgICAuICd0YXJnZXQ9IkhUTUxlTWFpbCI+JwogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoImNsaWNrIGhlcmUiKQogICAgICAgICAgICAuICc8L2E+ICcKICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJ0byBvcGVuIGl0IGluIGEgbmV3IHdpbmRvdy4iKQogICAgICAgICAgICAuICc8L2k+PC9wPic7CiAgICB9CgogICAgIyBqdXN0IHRvIGJlIGNvbXBhdAogICAgZWxzaWYgKCAkUGFyYW17Qm9keX0gPX4gL148LkRPQ1RZUEVccytodG1sfF48SFRNTD4vaSApIHsKICAgICAgICByZXR1cm4gJzxwPjxpIGNsYXNzPSJzbWFsbCI+JwogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRoaXMgaXMgYSIpCiAgICAgICAgICAgIC4gIiAkUGFyYW17TWltZVR5cGV9ICIKICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJlbWFpbCIpCiAgICAgICAgICAgIC4gJywgPGEgaHJlZj0iJwogICAgICAgICAgICAuICRTZWxmLT57QmFzZWxpbmt9CiAgICAgICAgICAgIC4gJ0FjdGlvbj0kUGFyYW17QWN0aW9ufTtUaWNrZXRJRD0nCiAgICAgICAgICAgIC4gIiRQYXJhbXtUaWNrZXRJRH07QXJ0aWNsZUlEPSRQYXJhbXtBcnRpY2xlSUR9O1N1YmFjdGlvbj1TaG93SFRNTGVNYWlsXCIgIgogICAgICAgICAgICAuICd0YXJnZXQ9IkhUTUxlTWFpbCI+JwogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoImNsaWNrIGhlcmUiKQogICAgICAgICAgICAuICc8L2E+ICcKICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJ0byBvcGVuIGl0IGluIGEgbmV3IHdpbmRvdy4iKQogICAgICAgICAgICAuICc8L2k+PC9wPic7CiAgICB9CgogICAgcmV0dXJuICcnOwp9CgpzdWIgUmV0dXJuVmFsdWUgewogICAgbXkgKCAkU2VsZiwgJFdoYXQgKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+eyRXaGF0fTsKfQoKPWhlYWQyIEF0dGFjaG1lbnQoKQoKcmV0dXJucyBicm93c2VyIG91dHB1dCB0byBkaXNwbGF5L2Rvd25sb2FkIGEgYXR0YWNobWVudC4KCiAgICAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnaW5saW5lJywgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdDogYXR0YWNobWVudCwgcG9zc2libGU6IGlubGluZXxhdHRhY2htZW50CiAgICAgICAgRmlsZW5hbWUgICAgICAgICA9PiAnRmlsZU5hbWUucG5nJywgICAgIyBvcHRpb25hbAogICAgICAgIEFkZGl0aW9uYWxIZWFkZXIgPT4gWyAka2V5ID0+ICR2YWwgXSAgICMgb3B0aW9uYWwsIGFuIGFycmF5IHJlZgogICAgICAgIENvbnRlbnRUeXBlICAgICAgPT4gJ2ltYWdlL3BuZycsCiAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAkQ29udGVudCwKICAgICAgICBTYW5kYm94ICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0IDA7IHVzZSBjb250ZW50IHNlY3VyaXR5IHBvbGljeSB0byBwcm9oaWJpdCBleHRlcm5hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBzY3JpcHRzLCBmbGFzaCBldGMuCiAgICApOwoKT3IgZm9yIEFKQVggSFRNTCBzbmlwcGV0czoKCiAgICAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0OiBhdHRhY2htZW50LCBwb3NzaWJsZTogaW5saW5lfGF0dGFjaG1lbnQKICAgICAgICBGaWxlbmFtZSAgICA9PiAnRmlsZU5hbWUuaHRtbCcsICMgb3B0aW9uYWwKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICBDaGFyc2V0ICAgICA9PiAndXRmLTgnLCAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICBOb0NhY2hlICAgICA9PiAxLCAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7CgpBcyBhIHNpZGUgZWZmZWN0IHRoZSBoZWFkZXJzIG9mIHRoZSBIVFRQIHJlc3BvbnNlIGFyZSBzZXQgaW4gdGhlIG9iamVjdCBDPEtlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlPi4KCj1jdXQKCnN1YiBBdHRhY2htZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBmb3IgKHF3KENvbnRlbnQgQ29udGVudFR5cGUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiR290IG5vICRfISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgc2luZ2xldG9ucwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJUhlYWRlcnM7CgogICAgIyByZXR1cm4gYXR0YWNobWVudAogICAgewogICAgICAgIG15ICRDb250ZW50RGlzcG9zaXRpb24gPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSApIHsKICAgICAgICAgICAgJENvbnRlbnREaXNwb3NpdGlvbiAuPSAkUGFyYW17VHlwZX07CiAgICAgICAgICAgICRDb250ZW50RGlzcG9zaXRpb24gLj0gJzsgJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDb250ZW50RGlzcG9zaXRpb24gLj0gJENvbmZpZ09iamVjdC0+R2V0KCdBdHRhY2htZW50RG93bmxvYWRUeXBlJykgfHwgJ2F0dGFjaG1lbnQnOwogICAgICAgICAgICAkQ29udGVudERpc3Bvc2l0aW9uIC49ICc7ICc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtGaWxlbmFtZX0gKSB7CgogICAgICAgICAgICAjIElFIDEwKyBzdXBwb3J0cyB0aGlzCiAgICAgICAgICAgIG15ICRVUkxFbmNvZGVkRmlsZW5hbWUgPSB1cmlfZXNjYXBlX3V0ZjgoICRQYXJhbXtGaWxlbmFtZX0gKTsKICAgICAgICAgICAgJENvbnRlbnREaXNwb3NpdGlvbiAuPSAiIGZpbGVuYW1lPVwiJFBhcmFte0ZpbGVuYW1lfVwiOyBmaWxlbmFtZSo9dXRmLTgnJyRVUkxFbmNvZGVkRmlsZW5hbWUiOwogICAgICAgIH0KICAgICAgICAkSGVhZGVyc3snQ29udGVudC1EaXNwb3NpdGlvbid9ID0gJENvbnRlbnREaXNwb3NpdGlvbjsKICAgIH0KCiAgICAjIGFkZCBubyBjYWNoZSBoZWFkZXJzCiAgICBpZiAoICRQYXJhbXtOb0NhY2hlfSApIHsKICAgICAgICAkSGVhZGVyc3snRXhwaXJlcyd9ICAgICAgID0gJ1R1ZSwgMSBKYW4gMTk4MCAxMjowMDowMCBHTVQnOwogICAgICAgICRIZWFkZXJzeydDYWNoZS1Db250cm9sJ30gPSAnbm8tY2FjaGUnOwogICAgICAgICRIZWFkZXJzeydQcmFnbWEnfSAgICAgICAgPSAnbm8tY2FjaGUnOwogICAgfQoKICAgICRIZWFkZXJzeydYLVVBLUNvbXBhdGlibGUnfSA9ICdJRT1lZGdlLGNocm9tZT0xJzsKCiAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0Rpc2FibGVJRnJhbWVPcmlnaW5SZXN0cmljdGVkJykgKSB7CiAgICAgICAgJEhlYWRlcnN7J1gtRnJhbWUtT3B0aW9ucyd9ID0gJ1NBTUVPUklHSU4nOwogICAgfQoKICAgIGlmICggJFBhcmFte1NhbmRib3h9ICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Rpc2FibGVDb250ZW50U2VjdXJpdHlQb2xpY3knKSApIHsKCiAgICAgICAgIyBEbyBub3QgYWxsb3cgZXh0ZXJuYWwgYW5kIGlubGluZSBzY3JpcHRzLCBhY3RpdmUgY29udGVudCwgZnJhbWVzLCBidXQga2VlcCBhbGxvd2luZyBpbmxpbmUgc3R5bGVzCiAgICAgICAgIyAgIGFzIHRoaXMgaXMgYSBjb21tb24gdXNlIGNhc2UgaW4gZW1haWxzLgogICAgICAgICMgQWxzbyBkaXNhbGxvdyByZWZlcnJlciBoZWFkZXJzIHRvIHByZXZlbnQgcmVmZXJyZXIgbGVha3MgdmlhIG9sZC1zdHlsZSBwb2xpY3kgZGlyZWN0aXZlLiBQbGVhc2Ugbm90ZSB0aGlzIGhhcwogICAgICAgICMgICBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgT1RPQk8gdmVyc2lvbnMgaW4gZmF2b3Igb2YgYSBzZXBhcmF0ZSBoZWFkZXIgKHNlZSBiZWxvdykuCiAgICAgICAgIyBpbWctc3JjOiAgICBhbGxvdyBleHRlcm5hbCBhbmQgaW5saW5lIChkYXRhOikgaW1hZ2VzCiAgICAgICAgIyBzY3JpcHQtc3JjOiBibG9jayBhbGwgc2NyaXB0cwogICAgICAgICMgb2JqZWN0LXNyYzogYWxsb3cgJ3NlbGYnIHNvIHRoYXQgdGhlIGJyb3dzZXIgY2FuIGxvYWQgcGx1Z2lucyBmb3IgUERGIGRpc3BsYXkKICAgICAgICAjIGZyYW1lLXNyYzogIGJsb2NrIGFsbCBmcmFtZXMKICAgICAgICAjIHN0eWxlLXNyYzogIGFsbG93IGlubGluZSBzdHlsZXMgZm9yIG5pY2UgZW1haWwgZGlzcGxheQogICAgICAgICMgcmVmZXJyZXI6ICAgZG9uJ3Qgc2VuZCByZWZlcnJlcnMgdG8gcHJldmVudCByZWZlcnJlci1sZWFrIGF0dGFja3MKICAgICAgICAkSGVhZGVyc3snQ29udGVudC1TZWN1cml0eS1Qb2xpY3knfQogICAgICAgICAgICA9IHF7ZGVmYXVsdC1zcmMgJ3NlbGYnOyBpbWctc3JjICogZGF0YTo7IHNjcmlwdC1zcmMgJ25vbmUnOyBvYmplY3Qtc3JjICdzZWxmJzsgZnJhbWUtc3JjICdub25lJzsgc3R5bGUtc3JjICd1bnNhZmUtaW5saW5lJzsgcmVmZXJyZXIgbm8tcmVmZXJyZXI7fTsKCiAgICAgICAgIyBVc2UgUmVmZXJyZXItUG9saWN5IGhlYWRlciB0byBzdXBwcmVzcyByZWZlcnJlciBpbmZvcm1hdGlvbiBpbiBtb2Rlcm4gYnJvd3NlcnMKICAgICAgICAjICAgKHRvIHByZXZlbnQgcmVmZXJyZXItbGVhayBhdHRhY2tzKS4KICAgICAgICAkSGVhZGVyc3snUmVmZXJyZXItUG9saWN5J30gPSAnbm8tcmVmZXJyZXInOwogICAgfQoKICAgIGlmICggJFBhcmFte0NoYXJzZXR9ICkgewogICAgICAgICRIZWFkZXJzeydDb250ZW50LVR5cGUnfSA9ICIkUGFyYW17Q29udGVudFR5cGV9OyBjaGFyc2V0PSRQYXJhbXtDaGFyc2V0fTsiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEhlYWRlcnN7J0NvbnRlbnQtVHlwZSd9ID0gIiRQYXJhbXtDb250ZW50VHlwZX0iOwogICAgfQoKICAgICMgYWRkaXRpb25hbCBoZWFkZXJzIGFyZSBzdXBwb3J0ZWQsIGJ1dCBjdXJyZW50bHkgbm90IHVzZWQKICAgIG15IEBBZGRpdGlvbmFsSGVhZGVycyA9ICggJFBhcmFte0FkZGl0aW9uYWxIZWFkZXJ9IC8vIFtdICktPkAqOwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKS0+SGVhZGVycyggWyAlSGVhZGVycywgQEFkZGl0aW9uYWxIZWFkZXJzIF0gKTsKCiAgICAjIGZpeCBmb3IgZmlyZWZveCBIRUFEIHByb2JsZW0KICAgIG15ICRSZXF1ZXN0TWV0aG9kID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5SZXF1ZXN0TWV0aG9kKCk7CiAgICBpZiAoICRSZXF1ZXN0TWV0aG9kICYmICRSZXF1ZXN0TWV0aG9kIGVxICdIRUFEJyApIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb250ZW50fTsKfQoKPWhlYWQyIFBhZ2VOYXZCYXIoKQoKZ2VuZXJhdGVzIGEgcGFnZSBuYXZpZ2F0aW9uIGJhcgoKICAgIG15ICVQYWdlTmF2QmFyID0gJExheW91dE9iamVjdC0+UGFnZU5hdkJhcigKICAgICAgICBMaW1pdCAgICAgICA9PiAxMDAsICAgICAgICAgIyBtYXJrcyByZXN1bHQgb2YgVG90YWxIaXRzIHJlZCBpZiBMaW1pdCBpcyBnZXJhdGVyIHRoZW4gQWxsSGl0cwogICAgICAgIFdpbmRvd1NpemUgID0+IDE1LCAgICAgICAgICAjIG1heCBzaG93biBwYWdlcyB0byBjbGljawogICAgICAgIFN0YXJ0SGl0ICAgID0+IDEsICAgICAgICAgICAjIHN0YXJ0IHRvIHNob3cgaXRlbXMKICAgICAgICBQYWdlU2hvd24gICA9PiAxNSwgICAgICAgICAgIyBudW1iZXIgb2Ygc2hvd24gaXRlbXMgYSBwYWdlCiAgICAgICAgQWxsSGl0cyAgICAgPT4gNTYsICAgICAgICAgICMgbnVtYmVyIG9mIHRvdGFsIGhpdHMKICAgICAgICBBY3Rpb24gICAgICA9PiAnQWdlbnRYWFgnLCAgIyBlLiBnLiAnQWN0aW9uPScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntBY3Rpb259CiAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssICAgICAgICMgZS4gZy4gJ1N1YmFjdGlvbj1WaWV3OycKICAgICAgICBBSkFYUmVwbGFjZSA9PiAnSURFbGVtZW50JywgIyBJREVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkCiAgICAgICAgSURQcmVmaXggICAgPT4gJ1RpY2tldHMnLCAgICMgUHJlZml4IGZvciB0aGUgaWQgcGFyYW1ldGVyCiAgICApOwoKICAgIHJldHVybiB2YWx1ZXMgb2YgaGFzaAoKICAgICAgICBUb3RhbEhpdHMgICMgdG90YWwgaGl0cwogICAgICAgIFJlc3VsdCAgICAgIyBzaG93biBpdGVtcyBlLiBnLiAiMS01IiBvciAiMTYtMzAiCiAgICAgICAgU2l0ZU5hdkJhciAjIGh0bWwgZm9yIHBhZ2UgbmF2IGJhciBlLiBnLiAiMSAyIDMgNCIKCiAgICAgICAgUmVzdWx0TG9uZyAgICAgIyBzaG93biBpdGVtcyBlLiBnLiAiMS01IG9mIDMyIiBvciAiMTYtMzAgb2YgNjQiCiAgICAgICAgU2l0ZU5hdkJhckxvbmcgIyBodG1sIGZvciBwYWdlIG5hdiBiYXIgZS4gZy4gIlBhZ2U6IDEgMiAzIDQiCgo9Y3V0CgpzdWIgUGFnZU5hdkJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gfHwgMDsKICAgICRQYXJhbXtBbGxIaXRzfSAgPSAwIGlmICggISRQYXJhbXtBbGxIaXRzfSApOwogICAgJFBhcmFte1N0YXJ0SGl0fSA9IDAgaWYgKCAhJFBhcmFte0FsbEhpdHN9ICk7CiAgICBteSAkUGFnZXMgICAgICA9IGludCggKCAkUGFyYW17QWxsSGl0c30gLyAkUGFyYW17UGFnZVNob3dufSApICsgMC45OTk5OSApOwogICAgbXkgJFBhZ2UgICAgICAgPSBpbnQoICggJFBhcmFte1N0YXJ0SGl0fSAvICRQYXJhbXtQYWdlU2hvd259ICkgKyAwLjk5OTk5ICk7CiAgICBteSAkV2luZG93U2l6ZSA9ICRQYXJhbXtXaW5kb3dTaXplfSB8fCA1OwogICAgbXkgJElEUHJlZml4ICAgPSAkUGFyYW17SURQcmVmaXh9ICAgfHwgJ0dlbmVyaWMnOwoKICAgICMgYnVpbGQgUmVzdWx0cyAoMS01IG9yIDE2LTMwKQogICAgaWYgKCAkUGFyYW17QWxsSGl0c30gPj0gKCAkUGFyYW17U3RhcnRIaXR9ICsgJFBhcmFte1BhZ2VTaG93bn0gKSApIHsKICAgICAgICAkUGFyYW17UmVzdWx0c30gPSAkUGFyYW17U3RhcnRIaXR9IC4gIi0iIC4gKCAkUGFyYW17U3RhcnRIaXR9ICsgJFBhcmFte1BhZ2VTaG93bn0gLSAxICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17UmVzdWx0c30gPSAiJFBhcmFte1N0YXJ0SGl0fS0kUGFyYW17QWxsSGl0c30iOwogICAgfQoKICAgICMgY2hlY2sgdG90YWwgaGl0cwogICAgaWYgKCAkTGltaXQgPT0gJFBhcmFte0FsbEhpdHN9ICkgewogICAgICAgICRQYXJhbXtUb3RhbEhpdHN9ID0gIjxzcGFuIGNsYXNzPVwiUGFnaW5hdGlvbkxpbWl0XCI+JFBhcmFte0FsbEhpdHN9PC9zcGFuPiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VG90YWxIaXRzfSA9ICRQYXJhbXtBbGxIaXRzfTsKICAgIH0KCiAgICAjIGJ1aWxkIHBhZ2UgbmF2IGJhcgogICAgbXkgJFdpbmRvd1N0YXJ0ID0gc3ByaW50ZiggIiUuMGYiLCAoICRQYXJhbXtTdGFydEhpdH0gLyAkUGFyYW17UGFnZVNob3dufSApICk7CiAgICAkV2luZG93U3RhcnQgPSBpbnQoICggJFdpbmRvd1N0YXJ0IC8gJFdpbmRvd1NpemUgKSApICsgMTsKICAgICRXaW5kb3dTdGFydCA9ICggJFdpbmRvd1N0YXJ0ICogJFdpbmRvd1NpemUgKSAtICgkV2luZG93U2l6ZSk7CiAgICBteSAkQWN0aW9uICAgPSAkUGFyYW17QWN0aW9ufSB8fCAnJzsKICAgIG15ICRMaW5rICAgICA9ICRQYXJhbXtMaW5rfSAgIHx8ICcnOwogICAgbXkgJEJhc2VsaW5rID0gIiRTZWxmLT57QmFzZWxpbmt9JEFjdGlvbjskTGluayI7CiAgICBteSAkaSAgICAgICAgPSAwOwogICAgbXkgJVBhZ2luYXRpb25EYXRhOwogICAgbXkgJFdpZGdldE5hbWU7CiAgICBteSAkQ2xhc3NXaWRnZXROYW1lOwoKICAgIGlmICggJFBhcmFte0FKQVhSZXBsYWNlfSApIHsKICAgICAgICAkV2lkZ2V0TmFtZSA9ICRQYXJhbXtBSkFYUmVwbGFjZX07CiAgICAgICAgJFdpZGdldE5hbWUgPX4gc3stfXt9eG1zZzsKCiAgICAgICAgJENsYXNzV2lkZ2V0TmFtZSA9ICRXaWRnZXROYW1lOwogICAgICAgICRDbGFzc1dpZGdldE5hbWUgPX4gcy9eRGFzaGJvYXJkLy87CiAgICB9CgogICAgd2hpbGUgKCAkaSA8PSAoICRQYWdlcyAtIDEgKSApIHsKICAgICAgICAkaSsrOwoKICAgICAgICAjIHNob3cgbm9ybWFsIHBhZ2UgMSwyLDMsLi4uCiAgICAgICAgaWYgKCAkaSA8PSAoICRXaW5kb3dTdGFydCArICRXaW5kb3dTaXplICkgJiYgJGkgPiAkV2luZG93U3RhcnQgKSB7CiAgICAgICAgICAgIG15ICRCYXNlbGlua0FsbCA9ICRCYXNlbGluawogICAgICAgICAgICAgICAgLiAiU3RhcnRXaW5kb3c9JFdpbmRvd1N0YXJ0O1N0YXJ0SGl0PSIKICAgICAgICAgICAgICAgIC4gKCAoICggJGkgLSAxICkgKiAkUGFyYW17UGFnZVNob3dufSApICsgMSApOwogICAgICAgICAgICBteSAkU2VsZWN0ZWRQYWdlID0gJyc7CiAgICAgICAgICAgIG15ICRQYWdlTnVtYmVyICAgPSAkaTsKCiAgICAgICAgICAgIGlmICggJFBhZ2UgPT0gJGkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRQYWdlID0gJ1NlbGVjdGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CgogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRQYWdlTnVtYmVyfSA9IHsKICAgICAgICAgICAgICAgICAgICBCYXNlbGluayAgICA9PiAkQmFzZWxpbmtBbGwsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlQWpheCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsICA9PiAkQmFzZWxpbmtBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyICAgPT4gJFBhZ2VOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIElEUHJlZml4ICAgICA9PiAkSURQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUGFnZSA9PiAkU2VsZWN0ZWRQYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua0FsbCAgPT4gJEJhc2VsaW5rQWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyICAgPT4gJFBhZ2VOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIElEUHJlZml4ICAgICA9PiAkSURQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUGFnZSA9PiAkU2VsZWN0ZWRQYWdlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3ZlciB3aW5kb3cgIj4+IiBhbmQgIj58IgogICAgICAgIGVsc2lmICggJGkgPiAoICRXaW5kb3dTdGFydCArICRXaW5kb3dTaXplICkgKSB7CiAgICAgICAgICAgIG15ICRCYXNlbGlua09uZUZvcndhcmQgPSAkQmFzZWxpbmsgLiAiU3RhcnRIaXQ9IiAuICggKCAkaSAtIDEgKSAqICRQYXJhbXtQYWdlU2hvd259ICsgMSApOwogICAgICAgICAgICBteSAkQmFzZWxpbmtBbGxGb3J3YXJkID0gJEJhc2VsaW5rIC4gIlN0YXJ0SGl0PSIgLiAoICggJFBhcmFte1BhZ2VTaG93bn0gKiAoICRQYWdlcyAtIDEgKSApICsgMSApOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17QUpBWFJlcGxhY2V9ICkgewogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua09uZUZvcndhcmR9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua09uZUZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua0FsbEZvcndhcmR9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua0FsbEZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlRm9yd2FyZEFqYXgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua09uZUZvcndhcmQgPT4gJEJhc2VsaW5rT25lRm9yd2FyZCwKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxGb3J3YXJkID0+ICRCYXNlbGlua0FsbEZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICAgICAgICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgICAgICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VGb3J3YXJkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtPbmVGb3J3YXJkID0+ICRCYXNlbGlua09uZUZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsRm9yd2FyZCA9PiAkQmFzZWxpbmtBbGxGb3J3YXJkLAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaSA9IDk5OTk5OTk5OwogICAgICAgIH0KCiAgICAgICAgIyBvdmVyIHdpbmRvdyAiPDwiIGFuZCAifDwiCiAgICAgICAgZWxzaWYgKCAkaSA8ICRXaW5kb3dTdGFydCAmJiAoICRpIC0gMSApIDwgJFBhZ2VzICkgewogICAgICAgICAgICBteSAkQmFzZWxpbmtBbGxCYWNrID0gJEJhc2VsaW5rIC4gJ1N0YXJ0SGl0PTE7U3RhcnRXaW5kb3c9MSc7CiAgICAgICAgICAgIG15ICRCYXNlbGlua09uZUJhY2sgPSAkQmFzZWxpbmsgLiAnU3RhcnRIaXQ9JyAuICggKCAkV2luZG93U3RhcnQgLSAxICkgKiAoICRQYXJhbXtQYWdlU2hvd259ICkgKyAxICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CgogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua09uZUJhY2t9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua09uZUJhY2ssCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJFBhZ2luYXRpb25EYXRheyRCYXNlbGlua0FsbEJhY2t9ID0gewogICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rICAgID0+ICRCYXNlbGlua0FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgQWpheFJlcGxhY2UgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICA9PiAkQ2xhc3NXaWRnZXROYW1lCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlQmFja0FqYXgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua09uZUJhY2sgPT4gJEJhc2VsaW5rT25lQmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxCYWNrID0+ICRCYXNlbGlua0FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICAgICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXROYW1lICAgICAgPT4gJENsYXNzV2lkZ2V0TmFtZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtPbmVCYWNrID0+ICRCYXNlbGlua09uZUJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsQmFjayA9PiAkQmFzZWxpbmtBbGxCYWNrLAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaSA9ICRXaW5kb3dTdGFydCAtIDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1BhZ2luYXRpb25EYXRhJyAuICRDbGFzc1dpZGdldE5hbWUsCiAgICAgICAgICAgIFZhbHVlID0+IFwlUGFnaW5hdGlvbkRhdGEKICAgICAgICApOwogICAgfQoKICAgICRQYXJhbXtTZWFyY2hOYXZCYXJ9ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1BhZ2luYXRpb24nLAogICAgICAgIEFKQVggICAgICAgICA9PiAkUGFyYW17QUpBWH0sCiAgICApOwoKICAgICMgb25seSBzaG93IHRvdGFsIGFtb3VudCBvZiBwYWdlcyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCiAgICBpZiAoICRQYWdlcyA+IDEgKSB7CiAgICAgICAgJFBhcmFte05hdkJhckxvbmd9ID0gIi0gIiAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlBhZ2UiKSAuICI6ICRQYXJhbXtTZWFyY2hOYXZCYXJ9IjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtTZWFyY2hOYXZCYXJ9ID0gJyc7CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICgKICAgICAgICBUb3RhbEhpdHMgID0+ICRQYXJhbXtUb3RhbEhpdHN9LAogICAgICAgIFJlc3VsdCAgICAgPT4gJFBhcmFte1Jlc3VsdHN9LAogICAgICAgIFJlc3VsdExvbmcgPT4gIiRQYXJhbXtSZXN1bHRzfSAiCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgib2YiKQogICAgICAgICAgICAuICIgJFBhcmFte1RvdGFsSGl0c30iLAogICAgICAgIFNpdGVOYXZCYXIgICAgID0+ICRQYXJhbXtTZWFyY2hOYXZCYXJ9LAogICAgICAgIFNpdGVOYXZCYXJMb25nID0+ICRQYXJhbXtOYXZCYXJMb25nfSwKICAgICAgICBMaW5rICAgICAgICAgICA9PiAkUGFyYW17TGlua30sCiAgICApOwp9CgpzdWIgTmF2aWdhdGlvbkJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkUGFyYW17VHlwZX0gPSAkU2VsZi0+e01vZHVsZVJlZ30tPntOYXZCYXJOYW1lfSB8fCAnVGlja2V0JzsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIENyZWF0ZSBtZW51IGl0ZW1zLgogICAgbXkgJU5hdkJhcjsKCiAgICBteSAkRnJvbnRlbmRSZWdpc3RyYXRpb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKTsKICAgIG15ICRGcm9udGVuZE5hdmlnYXRpb24gICA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok5hdmlnYXRpb24nKTsKCiAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICBNT0RVTEU6CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRGcm9udGVuZE5hdmlnYXRpb259ICkgewoKICAgICAgICAjIFNraXAgaWYgbW9kdWxlIGlzIGRpc2FibGVkIGluIGZyb250ZW5kIHJlZ2lzdHJhdGlvbi4KICAgICAgICBuZXh0IE1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9ICk7CgogICAgICAgICMgVG9wLWxldmVsIGZyb250ZW5kIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbiBzaG91bGQgYWx3YXlzIGJlIGEgaGFzaC4KICAgICAgICBuZXh0IE1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfSApOwoKICAgICAgICBteSBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3M7CgogICAgICAgICMgR28gdGhyb3VnaCBhbGwgZGVmaW5lZCBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgbW9kdWxlIGFuZCBzb3J0IHRoZW0gYnkgdGhlIGtleSAoMDAjLU1vZHVsZSkuCiAgICAgICAgTkFWSUdBVElPTl9DT05GSUc6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9IHx8IHt9IH0gKSB7CiAgICAgICAgICAgIG5leHQgTkFWSUdBVElPTl9DT05GSUcgaWYgJEtleSAhfiBte15cZCt9OwoKICAgICAgICAgICAgIyBGSVhNRTogU3VwcG9ydCBib3RoIG9sZCAoSEFTSCkgYW5kIG5ldyAoQVJSQVkgb2YgSEFTSCkgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9ucywgZm9yIHJlYXNvbnMgb2YgYmFja3dhcmRzCiAgICAgICAgICAgICMgICBjb21wYXRpYmlsaXR5LiBPbmNlIHdlIGFyZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gbWlncmF0ZWQgY29ycmVjdGx5LCBzdXBwb3J0IGZvciBIQVNILW9ubHkKICAgICAgICAgICAgIyAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRyb3BwZWQgaW4gZnV0dXJlIG1ham9yIHJlbGVhc2UuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9LT57JEtleX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRGcm9udGVuZE5hdmlnYXRpb24tPnskTW9kdWxlfS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgQHsgJEZyb250ZW5kTmF2aWdhdGlvbi0+eyRNb2R1bGV9LT57JEtleX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTa2lwIGluY29tcGF0aWJsZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgTkFWSUdBVElPTl9DT05GSUc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIElURU06CiAgICAgICAgZm9yIG15ICRJdGVtIChATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3MpIHsKICAgICAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e05hdkJhcn07CgogICAgICAgICAgICAkSXRlbS0+e0NTU30gPSAnJzsKCiAgICAgICAgICAgICMgSGlnaGxpZ2h0IGFjdGl2ZSBhcmVhIGxpbmsuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggJEl0ZW0tPntUeXBlfSAmJiAkSXRlbS0+e1R5cGV9IGVxICdNZW51JyApCiAgICAgICAgICAgICAgICAmJiAoICRJdGVtLT57TmF2QmFyfSAmJiAkSXRlbS0+e05hdkJhcn0gZXEgJFBhcmFte1R5cGV9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDU1N9IC49ICcgU2VsZWN0ZWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSW5oZXJpdFBlcm1pc3Npb25zID0gMDsKCiAgICAgICAgICAgICMgSW5oZXJpdCBwZXJtaXNzaW9ucyBmcm9tIGZyb250ZW5kIHJlZ2lzdHJhdGlvbiBpZiBubyBwZXJtaXNzaW9ucyB3ZXJlIGRlZmluZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIGVudHJ5LgogICAgICAgICAgICBpZiAoICEkSXRlbS0+e0dyb3VwUm99ICYmICEkSXRlbS0+e0dyb3VwfSApIHsKICAgICAgICAgICAgICAgIGlmICggJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57R3JvdXBSb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntHcm91cFJvfSA9ICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+e0dyb3VwUm99OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPntHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntHcm91cH0gPSAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPntHcm91cH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkSW5oZXJpdFBlcm1pc3Npb25zID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNob3duID0gMDsKCiAgICAgICAgICAgIFBFUk1JU1NJT046CiAgICAgICAgICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKCiAgICAgICAgICAgICAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYgJEl0ZW0tPntHcm91cFJvfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkSXRlbS0+e0dyb3VwUm99IH0KICAgICAgICAgICAgICAgICAgICAmJiByZWYgJEl0ZW0tPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJEl0ZW0tPntHcm91cH0gfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEFycmF5IGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPnskUGVybWlzc2lvbn0gJiYgcmVmICRJdGVtLT57JFBlcm1pc3Npb259IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIEB7ICRJdGVtLT57JFBlcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyA/ICdybycgOiAncncnLAoKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIElmIHdlIHBhc3NlZCB0aGUgaW5pdGlhbCBwZXJtaXNzaW9uIGNoZWNrIGFuZCBkaWRuJ3QgaW5oZXJpdCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBtb2R1bGUgcmVnaXN0cmF0aW9uLAogICAgICAgICAgICAjICAgbWFrZSBzdXJlIHRvIGFsc28gY2hlY2sgYWNjZXNzIHRvIHRoZSBtb2R1bGUsIHNpbmNlIG5hdmlnYXRpb24gaXRlbSBtaWdodCBiZSBvdXQgb2Ygc3luYy4KICAgICAgICAgICAgaWYgKCAkU2hvd24gJiYgISRJbmhlcml0UGVybWlzc2lvbnMgKSB7CiAgICAgICAgICAgICAgICBteSAkTW9kdWxlUGVybWlzc2lvbjsKCiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OOgogICAgICAgICAgICAgICAgZm9yIG15ICRQZXJtaXNzaW9uIChxdyhHcm91cFJvIEdyb3VwKSkgewoKICAgICAgICAgICAgICAgICAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwUm99IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9LT57R3JvdXB9IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+e0dyb3VwfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAkTW9kdWxlUGVybWlzc2lvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgQXJyYXkgYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57JE1vZHVsZX0tPnskUGVybWlzc2lvbn0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+eyRNb2R1bGV9LT57JFBlcm1pc3Npb259IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkRnJvbnRlbmRSZWdpc3RyYXRpb24tPnskTW9kdWxlfS0+eyRQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEdyb3VwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyA/ICdybycgOiAncncnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEhhc1Blcm1pc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTW9kdWxlUGVybWlzc2lvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgSGlkZSBpdGVtIGlmIG5vIHBlcm1pc3Npb24gd2FzIGdyYW50ZWQgdG8gYWNjZXNzIHRoZSBtb2R1bGUuCiAgICAgICAgICAgICAgICBpZiAoICEkTW9kdWxlUGVybWlzc2lvbiApIHsKICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IElURU0gaWYgISRTaG93bjsKCiAgICAgICAgICAgICMgc2V0IHByaW8gb2YgaXRlbQogICAgICAgICAgICBteSAkS2V5ID0gKCAkSXRlbS0+e0Jsb2NrfSB8fCAnJyApIC4gc3ByaW50ZiggIiUwN2QiLCAkSXRlbS0+e1ByaW99ICk7CiAgICAgICAgICAgIENPVU5UOgogICAgICAgICAgICBmb3IgKCAxIC4uIDUxICkgewogICAgICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAhJE5hdkJhcnskS2V5fTsKCiAgICAgICAgICAgICAgICAkSXRlbS0+e1ByaW99Kys7CiAgICAgICAgICAgICAgICAkS2V5ID0gKCAkSXRlbS0+e0Jsb2NrfSB8fCAnJyApIC4gc3ByaW50ZiggIiUwN2QiLCAkSXRlbS0+e1ByaW99ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBhcyBtYWluIG1lbnUKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1R5cGV9IGVxICdNZW51JyApIHsKICAgICAgICAgICAgICAgICROYXZCYXJ7JEtleX0gPSAkSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFzIHN1YiBvZiBtYWluIG1lbnUKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTmF2QmFye1N1Yn0tPnsgJEl0ZW0tPntOYXZCYXJ9IH0tPnskS2V5fSA9ICRJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIFJ1biB0aGUgbWVudSBpdGVtIG1vZHVsZXMgZm9yIHR3ZWFraW5nIHRoZSBtYWluIG1lbnUuCiAgICAjIFRoZXNlIG1vZHVsZXMgbWF5IGFkZCBvciByZW1vdmUgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIGxpc3RzLgogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgfTsKCiAgICAgICAgTUVOVU1PRFVMRToKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgISRPYmplY3Q7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJU5hdkJhciA9ICgKICAgICAgICAgICAgICAgICVOYXZCYXIsCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICAgICBOYXZCYXIgPT4gXCVOYXZCYXIgfHwge30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHRoZSBtYWluIG1lbnUKICAgIElURU06CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTmF2QmFyICkgewogICAgICAgIG5leHQgSVRFTSBpZiAkS2V5IGVxICdTdWInOwogICAgICAgIG5leHQgSVRFTSBpZiAhJXsgJE5hdkJhcnskS2V5fSB9OwogICAgICAgIG15ICRJdGVtID0gJE5hdkJhcnskS2V5fTsKICAgICAgICAkSXRlbS0+e05hbWVGb3JJRH0gPSAkSXRlbS0+e05hbWV9OwogICAgICAgICRJdGVtLT57TmFtZUZvcklEfSA9fiBzL1sgJjtdLy9pZzsKICAgICAgICBteSAkU3ViID0gJE5hdkJhcntTdWJ9LT57ICRJdGVtLT57TmF2QmFyfSB9OwoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1BcmVhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRJdGVtfSwKICAgICAgICAgICAgICAgIEFjY2Vzc0tleVJlZmVyZW5jZSA9PiAkSXRlbS0+e0FjY2Vzc0tleX0gPyAiICgkSXRlbS0+e0FjY2Vzc0tleX0pIiA6ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBzdWIgbWVudSAob25seSBpZiBzdWIgZWxlbWVudHMgYXZhaWxhYmxlKQogICAgICAgIG5leHQgSVRFTSBpZiAhJFN1YjsKICAgICAgICBuZXh0IElURU0gaWYgIWtleXMgJXskU3VifTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJdGVtQXJlYVN1YicsCiAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTb3J0IEFkbWluIHN1YiBtb2R1bGVzIChmYXZvcml0ZXMpIGNvcnJlY3RseS4gU2VlIGJ1ZyMxMzEwMyBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgIG15IEBTdWJzID0gc29ydCBrZXlzICV7JFN1Yn07CiAgICAgICAgaWYgKCAkSXRlbS0+e05hbWVGb3JJRH0gZXEgJ0FkbWluJyApIHsKICAgICAgICAgICAgQFN1YnMgPSBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyRTdWJ9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRLZXkgKEBTdWJzKSB7CiAgICAgICAgICAgIG15ICRJdGVtU3ViID0gJFN1Yi0+eyRLZXl9OwogICAgICAgICAgICAkSXRlbVN1Yi0+e05hbWVGb3JJRH0gPSAkSXRlbVN1Yi0+e05hbWV9OwogICAgICAgICAgICAkSXRlbVN1Yi0+e05hbWVGb3JJRH0gPX4gcy9bICY7XS8vaWc7CiAgICAgICAgICAgICRJdGVtU3ViLT57TmFtZVRvcH0gPSAkSXRlbS0+e05hbWVGb3JJRH07CiAgICAgICAgICAgICRJdGVtU3ViLT57RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICB8fD0gJEl0ZW1TdWItPntOYW1lfTsgICAgIyB1c2UgJ25hbWUnIGFzIGZhbGxiYWNrLCB0aGlzIGlzIHNob3duIGFzIHRoZSBsaW5rIHRpdGxlCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1BcmVhU3ViSXRlbScsICAgICMkSXRlbS0+e0Jsb2NrfSB8fCAnSXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRJdGVtU3VifSwKICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLZXlSZWZlcmVuY2UgPT4gJEl0ZW1TdWItPntBY2Nlc3NLZXl9ID8gIiAoJEl0ZW1TdWItPntBY2Nlc3NLZXl9KSIgOiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHVzZXIgcHJlZmVyZW5jZXMgZm9yIGN1c3RvbSBuYXYgYmFyIGl0ZW0gb3JkZXJpbmcKICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkTmF2YmFyT3JkZXJJdGVtcyA9ICRVc2VyUHJlZmVyZW5jZXN7J1VzZXJOYXZCYXJJdGVtc09yZGVyJ30gfHwgJyc7CiAgICAkU2VsZi0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXZiYXJPcmRlckl0ZW1zJywKICAgICAgICBWYWx1ZSA9PiAkTmF2YmFyT3JkZXJJdGVtcywKICAgICk7CgogICAgbXkgJEZyb250ZW5kU2VhcmNoID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6U2VhcmNoJykgfHwge307CgogICAgbXkgJFNlYXJjaEFkZGVkOwoKICAgICMgc2hvdyBzZWFyY2ggaWNvbiBpZiBhbnkgc2VhcmNoIHJvdXRlciBpcyBjb25maWd1cmVkCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRGcm9udGVuZFNlYXJjaCkgKSB7CgogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRGcm9udGVuZFNlYXJjaH0gKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJEZyb250ZW5kU2VhcmNoLT57JEtleX0gKTsKCiAgICAgICAgICAgIGZvciBteSAkUmVnZXggKCBzb3J0IGtleXMgJXsgJEZyb250ZW5kU2VhcmNoLT57JEtleX0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkUmVnZXg7CgogICAgICAgICAgICAgICAgIyBDaGVjayBpZiByZWdleCBtYXRjaGVzIGN1cnJlbnQgYWN0aW9uLgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0FjdGlvbn0gPX4gbXskUmVnZXh9ZyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IEFjdGlvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgICAgIG15ICgkQWN0aW9uKSA9ICRGcm9udGVuZFNlYXJjaC0+eyRLZXl9LT57JFJlZ2V4fSA9fiBte0FjdGlvbj0oLio/KSg7LiopPyR9OwoKICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBzaG93IFNlYXJjaCBpY29uIGlmIGFjdGlvbiBpcyBub3QgcmVnaXN0ZXJlZC4KICAgICAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJEZyb250ZW5kUmVnaXN0cmF0aW9uLT57JEFjdGlvbn07CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoSWNvbicsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEFkZGVkID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEtFWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIElmIFNlYXJjaCBpY29uIGlzIG5vdCBhZGRlZCwgY2hlY2sgaWYgQWdlbnRUaWNrZXRTZWFyY2ggaXMgZW5hYmxlZCBhbmQgYWRkIGl0LgogICAgaWYgKCAhJFNlYXJjaEFkZGVkICYmICRGcm9udGVuZFJlZ2lzdHJhdGlvbi0+e0FnZW50VGlja2V0U2VhcmNofSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEljb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TmF2aWdhdGlvbkJhcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgUnVuIG5hdiBiYXIgb3V0cHV0IG1vZHVsZXMuIE5hdiBiYXIgb3V0cHV0IGFyZSBub3QgdXNlZCBpbiBPVE9CTyBjb3JlLAogICAgIyBidXQgY2FuIGJlIHVzZWQgYnkgT1RPQk8gcGFja2FnZXMuIFRoZSBvdXRwdXQgb2YgYSBuYXYgYmFyIG91dHB1dCBtb2R1bGUKICAgICMgaXMgc3BsaWNlZCBpbiBiZXR3ZWVuIHRoZSBtYWluIG1lbnUgYW5kIHRoZSBub3RpZmljYXRpb24uCiAgICBteSAkTmF2QmFyT3V0cHV0TW9kdWxlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2QmFyT3V0cHV0TW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkTmF2QmFyT3V0cHV0TW9kdWxlQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICROYXZCYXJPdXRwdXRNb2R1bGVDb25maWctPiUqOwoKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgSk9CIHVubGVzcyAkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgSk9CIHVubGVzcyAkT2JqZWN0OwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRPdXRwdXQgLj0gJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biBub3RpZmljYXRpb24gbW9kdWxlcwogICAgbXkgJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6Tm90aWZ5TW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkRnJvbnRlbmROb3RpZnlNb2R1bGVDb25maWcgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnLT4lKjsKCiAgICAgICAgSk9COgogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IEpPQiB1bmxlc3MgJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEpPQiB1bmxlc3MgJE9iamVjdDsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkT3V0cHV0IC49ICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gbmF2IGJhciBtb2R1bGUKICAgIGlmICggJFNlbGYtPntOYXZpZ2F0aW9uTW9kdWxlfSApIHsKCiAgICAgICAgIyBydW4gbmF2YmFyIG1vZHVsZXMKICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57TmF2aWdhdGlvbk1vZHVsZX0gfTsKCiAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3tNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgbXkgJE9iamVjdCA9ICRKb2Jze01vZHVsZX0tPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkT2JqZWN0ICkgewogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICRPdXRwdXQgLj0gJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiBcJUpvYnMgKTsKICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFRyYW5zZm9ybURhdGVTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBrZXkgcHJlZml4CiAgICBteSAkUHJlZml4ID0gJFBhcmFte1ByZWZpeH0gfHwgJyc7CgogICAgIyB0aW1lIHpvbmUgdHJhbnNsYXRpb24gaWYgbmVlZGVkCiAgICAjIGZyb20gdXNlciB0aW1lIHpvbmUgdG8gT1RPQk8gdGltZSB6b25lCiAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFllYXIgICAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgTW9udGggICAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9LAogICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSwKICAgICAgICAgICAgICAgIEhvdXIgICAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgfHwgMCwKICAgICAgICAgICAgICAgIE1pbnV0ZSAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gfHwgMCwKICAgICAgICAgICAgICAgIFNlY29uZCAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdTZWNvbmQnIH0gfHwgMCwKICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJERhdGVUaW1lT2JqZWN0KSB7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgIG15ICREYXRlVGltZVZhbHVlcyA9ICREYXRlVGltZU9iamVjdC0+R2V0KCk7CgogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSAgID0gJERhdGVUaW1lVmFsdWVzLT57WWVhcn07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntNb250aH07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdEYXknIH0gICAgPSAkRGF0ZVRpbWVWYWx1ZXMtPntEYXl9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnSG91cicgfSAgID0gJERhdGVUaW1lVmFsdWVzLT57SG91cn07CiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gPSAkRGF0ZVRpbWVWYWx1ZXMtPntNaW51dGV9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnU2Vjb25kJyB9ID0gJERhdGVUaW1lVmFsdWVzLT57U2Vjb25kfTsKICAgICAgICB9CiAgICB9CgogICAgIyByZXNldCBwcmVmaXgKICAgICRQYXJhbXtQcmVmaXh9ID0gJyc7CgogICAgcmV0dXJuICVQYXJhbTsKfQoKPWhlYWQyIEJ1aWxkRGF0ZVNlbGVjdGlvbigpCgpidWlsZCB0aGUgSFRNTCBjb2RlIHRvIHJlcHJlc2VudCBhIGRhdGUgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBkYXRhLgpEZXBlbmRpbmcgb24gdGhlIFN5c0NvbmZpZyBzZXR0aW5ncyB0aGUgY29udHJvbHMgdG8gc2V0IHRoZSBkYXRlIGNvdWxkIGJlIG11bHRpcGxlIHNlbGVjdCBvciBpbnB1dCBmaWVsZHMKCiAgICBteSAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICdzb21lIHByZWZpeCcsICAgICAgICAjIG9wdGlvbmFsLCAobmVlZGVkIHRvIHNwZWNpZnkgb3RoZXIgcGFyYW1ldGVycykKICAgICAgICA8UHJlZml4PlllYXIgICAgID0+IDIwMTUsICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IHllYXIsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5Nb250aCAgICA9PiA2LCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBtb250aCwgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgdmFsdWUKICAgICAgICA8UHJlZml4PkRheSAgICAgID0+IDksICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGRheSwgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgdmFsdWUKICAgICAgICA8UHJlZml4PkhvdXIgICAgID0+IDEyLCAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGhvdXIsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5NaW51dGUgICA9PiAyNiwgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBtaW51dGUsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5TZWNvbmQgICA9PiA1OSwgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY3VycmVudCBzZWNvbmQsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICAgPFByZWZpeD5PcHRpb25hbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwLCB3aGVuIGFjdGl2ZSBhIGNoZWNrYm94IGlzIGluY2x1ZGVkIHRvIHNwZWNpZnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgaWYgdGhlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgb3Igbm90CiAgICAgICAgPFByZWZpeD5Vc2VkICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwLCB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY2hlY2tib3gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgbWVudGlvbmVkIGFib3ZlCiAgICAgICAgPFByZWZpeD5SZXF1aXJlZCA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdCAwIChEZXByZWNhdGVkKQogICAgICAgIDxwcmVmaXg+Q2xhc3MgICAgPT4gJ3NvbWUgY2xhc3MnLCAgICAgICAgICMgb3B0aW9uYWwsIHNwZWNpZnkgYW4gYWRkaXRpb25hbCBjbGFzcyB0byB0aGUgSFRNTCBlbGVtZW50cwogICAgICAgIEFyZWEgICAgID0+ICdzb21lIGFyZWEnLCAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIGRlZmF1bHQgJ0FnZW50JyAoRGVwcmVjYXRlZCkKICAgICAgICBEaWZmVGltZSA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0IDAsIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHRpbWUgaW5mbHVlbmNpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGN1cnJlbnQgdGltZSAoaW4gc2Vjb25kcykKICAgICAgICBPdmVycmlkZVRpbWVab25lID0+IDEsICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsICgxIG9yIDApLCB3aGVuIGFjdGl2ZSB0aGUgdGltZSBpcyBub3QgdHJhbnNsYXRlZCB0byB0aGUgdXNlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0aW1lIHpvbmUKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDMsICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCB1c2VkIHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIHllYXJzIGluIGZ1dHVyZSB0byBiZSBkaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGluIHRoZSB5ZWFyIHNlbGVjdAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIHVzZWQgdG8gZGVmaW5lIHRoZSBudW1iZXIgb2YgeWVhcnMgaW4gcGFzdCB0byBiZSBkaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGluIHRoZSB5ZWFyIHNlbGVjdAogICAgICAgIFllYXJEaWZmICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwuIHVzZWQgdG8gZGVmaW5lIHRoZSBudW1iZXIgb2YgeWVhcnMgdG8gYmUgZGlzcGxheWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGluIHRoZSB5ZWFyIHNlbGVjdCAoYWx0ZXJuYXRpdmVseSB0byBZZWFyUGVyaW9kRnV0dXJlIGFuZCBZZWFyUGVyaW9kUGFzdCkKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSAgICAgPT4gMSwgICAgICAgICAgICAjIG9wdGlvbmFsICgxIG9yIDApLCB3aGVuIGFjdGl2ZSBzZXRzIGFuIHNwZWNpYWwgY2xhc3MgdG8gdmFsaWRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgdGhhdCB0aGUgZGF0ZSBzZXQgaW4gdGhlIGNvbnRyb2xzIHRvIGJlIGluIHRoZSBmdXR1cmUKICAgICAgICBWYWxpZGF0ZURhdGVOb3RJbkZ1dHVyZSAgPT4gMSwgICAgICAgICAgICAjIG9wdGlvbmFsICgxIG9yIDApLCB3aGVuIGFjdGl2ZSBzZXRzIGFuIHNwZWNpYWwgY2xhc3MgdG8gdmFsaWRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgdGhhdCB0aGUgZGF0ZSBzZXQgaW4gdGhlIGNvbnRyb2xzIG5vdCB0byBiZSBpbiB0aGUgZnV0dXJlCiAgICAgICAgVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggID0+ICdTdGFydCcsICAgICAgIyBvcHRpb25hbCAoUHJlZml4KSwgd2hlbiBkZWZpbmVkIHNldHMgYSBzcGVjaWFsIGNsYXNzIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyBjb21lcyBhZnRlciB0aGUgZGF0ZSB3aXRoIFByZWZpeAogICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyVmFsdWUgICA9PiAnMjAxNi0wMS0wMScsICMgb3B0aW9uYWwgKERhdGUpLCB3aGVuIGRlZmluZWQgc2V0cyBhIHNwZWNpYWwgZGF0YSBwYXJhbWV0ZXIgdG8gdmFsaWRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgdGhhdCB0aGUgZGF0ZSBzZXQgaW4gdGhlIGNvbnRyb2xzIGNvbWVzIGFmdGVyIHRoZSBzdXBwbGllZCBkYXRlCiAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4ID0+ICdFbmQnLCAgICAgICAgIyBvcHRpb25hbCAoUHJlZml4KSwgd2hlbiBkZWZpbmVkIHNldHMgYSBzcGVjaWFsIGNsYXNzIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyBjb21lcyBiZWZvcmUgdGhlIGRhdGUgd2l0aCBQcmVmaXgKICAgICAgICBWYWxpZGF0ZURhdGVCZWZvcmVWYWx1ZSAgPT4gJzIwMTYtMDEtMDEnLCAjIG9wdGlvbmFsIChEYXRlKSwgd2hlbiBkZWZpbmVkIHNldHMgYSBzcGVjaWFsIGRhdGEgcGFyYW1ldGVyIHRvIHZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgdGhlIGRhdGUgc2V0IGluIHRoZSBjb250cm9scyBjb21lcyBiZWZvcmUgdGhlIHN1cHBsaWVkIGRhdGUKICAgICAgICBDYWxlbmRhciA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCB1c2VkIHRvIGRlZmluZSB0aGUgU3lzQ29uZmlnIGNhbGVuZGFyIG9uIHdoaWNoIHRoZSBEYXRlcGlja2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHdpbGwgYmUgYmFzZWQgb24gdG8gc2hvdyB0aGUgdmFjYXRpb24gZGF5cyBhbmQgdGhlIHN0YXJ0IHdlZWsgZGF5CiAgICAgICAgRm9ybWF0ICAgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsICAgICAgICAgICAgIyBvcHRpb25hbCwgb3IgJ0RhdGVJbnB1dEZvcm1hdExvbmcnLCB1c2VkIHRvIGRlZmluZSBpZiBvbmx5IGRhdGUgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgZGF0ZS90aW1lIGNvbXBvbmVudHMgc2hvdWxkIGJlIHNob3duIChEYXRlSW5wdXRGb3JtYXRMb25nIHNob3dzIGRhdGUvdGltZSkKICAgICAgICBWYWxpZGF0ZSA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsICgxIG9yIDApLCBkZWZpbmVzIGlmIHRoZSBkYXRlIHNlbGVjdGlvbiBzaG91bGQgYmUgdmFsaWRhdGVkIG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGNsaWVudCBzaWRlIHdpdGggSlMKICAgICAgICBEaXNhYmxlZCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsICgxIG9yIDApLCB3aGVuIGFjdGl2ZSBzZWxlY3QgYW5kIGNoZWNrYm94IGNvbnRyb2xzIGdldHMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIGRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgaW5wdXQgZmllbGRzIGdldHMgdGhlIHJlYWQgb25seSBhdHRyaWJ1dGUKICAgICk7Cgo9Y3V0CgpzdWIgQnVpbGREYXRlU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJERhdGVJbnB1dFN0eWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaW1lSW5wdXRGb3JtYXQnKTsKICAgIG15ICRNaW51dGVTdGVwICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGltZUlucHV0TWludXRlc1N0ZXAnKTsKICAgIG15ICRQcmVmaXggICAgICAgICA9ICRQYXJhbXtQcmVmaXh9IHx8ICcnOwoKICAgICMgc2FuaXRpemUgcHJlZml4CiAgICAjICAgYWxsb3cgdGhlIGZvbGxvd2luZzoKICAgICMgICAgICAgLSBjaGFyYWN0ZXJzIChub3Qgb25seSBBLVphLXosIGFzIHVtbGF1dHMgc2hvdWxkIGJlIGFsbG93ZWQgYXMgd2VsbCkKICAgICMgICAgICAgLSBkaWdpdHMgKGFyYWJpYyBhcyB3ZWxsIGFzIG5vbi1hcmFiaWMpCiAgICAjICAgICAgIC0gZGFzaCAoZS5nLiBmb3IgZHluYW1pYyBmaWVsZCBuYW1lc3BhY2VzKQogICAgIyAgICAgICAtIHVuZGVyc2NvcmUKICAgICMgICAgICAgLSA6IGFuZCAjIChlLmcuIGZvciBzeXN0ZW0gY29uZmlndXJhdGlvbiBuYW1lcykKICAgICRQcmVmaXggPX4gcy9bXlx3XGRcLV86I10vL2c7CgogICAgbXkgJERpZmZUaW1lID0gJFBhcmFte0RpZmZUaW1lfSB8fCAwOwogICAgbXkgJEZvcm1hdCAgID0gZGVmaW5lZCggJFBhcmFte0Zvcm1hdH0gKSA/ICRQYXJhbXtGb3JtYXR9IDogJ0RhdGVJbnB1dEZvcm1hdExvbmcnOwogICAgbXkgJE9wdGlvbmFsID0gJFBhcmFteyAkUHJlZml4IC4gJ09wdGlvbmFsJyB9IHx8IDA7CiAgICBteSAkVXNlZCAgICAgPSAkUGFyYW17ICRQcmVmaXggLiAnVXNlZCcgfSAgICAgfHwgMDsKICAgIG15ICRDbGFzcyAgICA9ICRQYXJhbXsgJFByZWZpeCAuICdDbGFzcycgfSAgICB8fCAnJzsKCiAgICAjIERlZmluZXMsIGlmIHRoZSBkYXRlIHNlbGVjdGlvbiBzaG91bGQgYmUgdmFsaWRhdGVkIG9uIGNsaWVudCBzaWRlIHdpdGggSlMKICAgIG15ICRWYWxpZGF0ZSA9ICRQYXJhbXtWYWxpZGF0ZX0gfHwgMDsKCiAgICAjIFZhbGlkYXRlIHRoYXQgdGhlIGRhdGUgaXMgaW4gdGhlIGZ1dHVyZSAoZS4gZy4gcGVuZGluZyB0aW1lcykKICAgIG15ICRWYWxpZGF0ZURhdGVJbkZ1dHVyZSAgICA9ICRQYXJhbXtWYWxpZGF0ZURhdGVJbkZ1dHVyZX0gICAgfHwgMDsKICAgIG15ICRWYWxpZGF0ZURhdGVOb3RJbkZ1dHVyZSA9ICRQYXJhbXtWYWxpZGF0ZURhdGVOb3RJbkZ1dHVyZX0gfHwgMDsKCiAgICAjIFZhbGlkYXRlIHRoYXQgdGhlIGRhdGUgaXMgc2V0IGFmdGVyL2JlZm9yZSBzdXBwbGllZCBkYXRlCiAgICBteSAkVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggID0gJFBhcmFte1ZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4fSAgfHwgJyc7CiAgICBteSAkVmFsaWRhdGVEYXRlQWZ0ZXJWYWx1ZSAgID0gJFBhcmFte1ZhbGlkYXRlRGF0ZUFmdGVyVmFsdWV9ICAgfHwgJyc7CiAgICBteSAkVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4ID0gJFBhcmFte1ZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeH0gfHwgJyc7CiAgICBteSAkVmFsaWRhdGVEYXRlQmVmb3JlVmFsdWUgID0gJFBhcmFte1ZhbGlkYXRlRGF0ZUJlZm9yZVZhbHVlfSAgfHwgJyc7CgogICAgbXkgJEdldEN1clN5c0RUVW5pdEZyb21Mb3dlc3QgPSBzdWIgewogICAgICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfQogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtBZGRTZWNvbmRzfSApIHsKICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5BZGQoIFNlY29uZHMgPT4gJFBhcmFte0FkZFNlY29uZHN9ICk7CiAgICAgICAgfQoKICAgICAgICBteSAlRGV0YWlscyA9ICV7ICREYXRlVGltZU9iamVjdC0+R2V0KCkgfTsKCiAgICAgICAgcmV0dXJuIG1hcCB7ICREZXRhaWxzeyRffSB9IChxdyhTZWNvbmQgTWludXRlIEhvdXIgRGF5IE1vbnRoIFllYXIpKTsKICAgIH07CgogICAgbXkgKCB1bmRlZiwgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkR2V0Q3VyU3lzRFRVbml0RnJvbUxvd2VzdC0+KAogICAgICAgIEFkZFNlY29uZHMgPT4gJERpZmZUaW1lLAogICAgKTsKICAgIG15ICggdW5kZWYsIHVuZGVmLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCAkQ1kgKSA9ICRHZXRDdXJTeXNEVFVuaXRGcm9tTG93ZXN0LT4oKTsKCiAgICAjIHRpbWUgem9uZSB0cmFuc2xhdGlvbgogICAgaWYgKAogICAgICAgICRTZWxmLT57VXNlclRpbWVab25lfQogICAgICAgICYmICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9CiAgICAgICAgJiYgJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9CiAgICAgICAgJiYgJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfQogICAgICAgICYmICEkUGFyYW17T3ZlcnJpZGVUaW1lWm9uZX0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ1llYXInIH0sCiAgICAgICAgICAgICAgICBNb250aCAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9LAogICAgICAgICAgICAgICAgRGF5ICAgID0+ICRQYXJhbXsgJFByZWZpeCAuICdEYXknIH0sCiAgICAgICAgICAgICAgICBIb3VyICAgPT4gJFBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH0gICB8fCAwLAogICAgICAgICAgICAgICAgTWludXRlID0+ICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gfHwgMCwKICAgICAgICAgICAgICAgIFNlY29uZCA9PiAkUGFyYW17ICRQcmVmaXggLiAnU2Vjb25kJyB9IHx8IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCREYXRlVGltZU9iamVjdCkgewogICAgICAgICAgICAkRGF0ZVRpbWVPYmplY3QtPlRvVGltZVpvbmUoIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSApOwogICAgICAgICAgICBteSAkRGF0ZVRpbWVWYWx1ZXMgPSAkRGF0ZVRpbWVPYmplY3QtPkdldCgpOwoKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ1llYXInIH0gICA9ICREYXRlVGltZVZhbHVlcy0+e1llYXJ9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH0gID0gJERhdGVUaW1lVmFsdWVzLT57TW9udGh9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9ICAgID0gJERhdGVUaW1lVmFsdWVzLT57RGF5fTsKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH0gICA9ICREYXRlVGltZVZhbHVlcy0+e0hvdXJ9OwogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9ID0gJERhdGVUaW1lVmFsdWVzLT57TWludXRlfTsKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ1NlY29uZCcgfSA9ICREYXRlVGltZVZhbHVlcy0+e1NlY29uZH07CiAgICAgICAgfQogICAgfQoKICAgICMgeWVhcgogICAgaWYgKCAkRGF0ZUlucHV0U3R5bGUgZXEgJ09wdGlvbicgKSB7CiAgICAgICAgbXkgJVllYXI7CiAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXtZZWFyUGVyaW9kUGFzdH0gJiYgZGVmaW5lZCAkUGFyYW17WWVhclBlcmlvZEZ1dHVyZX0gKSB7CiAgICAgICAgICAgIGZvciAoICRZIC0gJFBhcmFte1llYXJQZXJpb2RQYXN0fSAuLiAkWSArICRQYXJhbXtZZWFyUGVyaW9kRnV0dXJlfSApIHsKICAgICAgICAgICAgICAgICRZZWFyeyRffSA9ICRfOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgKCAyMDAxIC4uICRZICsgMSArICggJFBhcmFte1llYXJEaWZmfSB8fCAwICkgKSB7CiAgICAgICAgICAgICAgICAkWWVhcnskX30gPSAkXzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiB0aGUgRGlmZlRpbWUgaXMgaW4gYSBmdXR1cmUgeWVhci4gSW4gdGhpcyBjYXNlLCB3ZSBhZGQgdGhlIG1pc3NpbmcgeWVhcnMgYmV0d2VlbgogICAgICAgICMgJENZIChjdXJyZW50IHllYXIpIGFuZCAkWSAoeWVhcikgdG8gYWxsb3cgdGhlIHVzZXIgdG8gbWFudWFsbHkgc2V0IGJhY2sgdGhlIHllYXIgaWYgbmVlZGVkLgogICAgICAgIGlmICggJFkgPiAkQ1kgKSB7CiAgICAgICAgICAgIGZvciAoICRDWSAuLiAkWSApIHsKICAgICAgICAgICAgICAgICRZZWFyeyRffSA9ICRfOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17WWVhcn0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRQcmVmaXggLiAnWWVhcicsCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlWWVhciwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSB8fCAkWSApLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkVmFsaWRhdGUgPyAiVmFsaWRhdGVfRGF0ZVllYXIgJENsYXNzIiA6ICRDbGFzcywKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnWWVhcicpLAogICAgICAgICAgICBEaXNhYmxlZCAgICA9PiAkUGFyYW17RGlzYWJsZWR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17WWVhcn0gPSAiPGlucHV0IHR5cGU9XCJ0ZXh0XCIgIgogICAgICAgICAgICAuICggJFZhbGlkYXRlID8gImNsYXNzPVwiVmFsaWRhdGVfRGF0ZVllYXIgJENsYXNzXCIgIiA6ICJjbGFzcz1cIiRDbGFzc1wiICIgKQogICAgICAgICAgICAuICJuYW1lPVwiJHtQcmVmaXh9WWVhclwiIGlkPVwiJHtQcmVmaXh9WWVhclwiIHNpemU9XCI0XCIgbWF4bGVuZ3RoPVwiNFwiICIKICAgICAgICAgICAgLiAidGl0bGU9XCIiCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnWWVhcicpCiAgICAgICAgICAgIC4gIlwiIHZhbHVlPVwiIgogICAgICAgICAgICAuIHNwcmludGYoICIlMDJkIiwgKCAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSB8fCAkWSApICkgLiAiXCIgIgogICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdyZWFkb25seT0icmVhZG9ubHkiJyA6ICcnICkgLiAiLz4iOwogICAgfQoKICAgICMgbW9udGgKICAgIGlmICggJERhdGVJbnB1dFN0eWxlIGVxICdPcHRpb24nICkgewogICAgICAgIG15ICVNb250aCA9IG1hcCB7ICRfID0+IHNwcmludGYoICIlMDJkIiwgJF8gKTsgfSAoIDEgLi4gMTIgKTsKICAgICAgICAkUGFyYW17TW9udGh9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkUHJlZml4IC4gJ01vbnRoJywKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVNb250aCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH0gfHwgJE0gKSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJFZhbGlkYXRlID8gIlZhbGlkYXRlX0RhdGVNb250aCAkQ2xhc3MiIDogJENsYXNzLAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNb250aCcpLAogICAgICAgICAgICBEaXNhYmxlZCAgICA9PiAkUGFyYW17RGlzYWJsZWR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17TW9udGh9ID0gIjxpbnB1dCB0eXBlPVwidGV4dFwiICIKICAgICAgICAgICAgLiAoICRWYWxpZGF0ZSA/ICJjbGFzcz1cIlZhbGlkYXRlX0RhdGVNb250aCAkQ2xhc3NcIiAiIDogImNsYXNzPVwiJENsYXNzXCIgIiApCiAgICAgICAgICAgIC4gIm5hbWU9XCIke1ByZWZpeH1Nb250aFwiIGlkPVwiJHtQcmVmaXh9TW9udGhcIiBzaXplPVwiMlwiIG1heGxlbmd0aD1cIjJcIiAiCiAgICAgICAgICAgIC4gInRpdGxlPVwiIgogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ01vbnRoJykKICAgICAgICAgICAgLiAiXCIgdmFsdWU9XCIiCiAgICAgICAgICAgIC4gc3ByaW50ZiggIiUwMmQiLCAoICRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSB8fCAkTSApICkgLiAiXCIgIgogICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdyZWFkb25seT0icmVhZG9ubHkiJyA6ICcnICkgLiAiLz4iOwogICAgfQoKICAgIG15ICREYXRlVmFsaWRhdGVDbGFzc2VzID0gJyc7CiAgICBpZiAoJFZhbGlkYXRlKSB7CiAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMKICAgICAgICAgICAgLj0gIlZhbGlkYXRlX0RhdGVEYXkgVmFsaWRhdGVfRGF0ZVllYXJfJHtQcmVmaXh9WWVhciBWYWxpZGF0ZV9EYXRlTW9udGhfJHtQcmVmaXh9TW9udGgiOwoKICAgICAgICBpZiAoICRGb3JtYXQgZXEgJ0RhdGVJbnB1dEZvcm1hdExvbmcnICkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcwogICAgICAgICAgICAgICAgLj0gIiBWYWxpZGF0ZV9EYXRlSG91cl8ke1ByZWZpeH1Ib3VyIFZhbGlkYXRlX0RhdGVNaW51dGVfJHtQcmVmaXh9TWludXRlIjsKICAgICAgICB9CgogICAgICAgIGlmICgkVmFsaWRhdGVEYXRlSW5GdXR1cmUpIHsKICAgICAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMgLj0gIiBWYWxpZGF0ZV9EYXRlSW5GdXR1cmUiOwogICAgICAgIH0KICAgICAgICBpZiAoJFZhbGlkYXRlRGF0ZU5vdEluRnV0dXJlKSB7CiAgICAgICAgICAgICREYXRlVmFsaWRhdGVDbGFzc2VzIC49ICIgVmFsaWRhdGVfRGF0ZU5vdEluRnV0dXJlIjsKICAgICAgICB9CiAgICAgICAgaWYgKCAkVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggfHwgJFZhbGlkYXRlRGF0ZUFmdGVyVmFsdWUgKSB7CiAgICAgICAgICAgICREYXRlVmFsaWRhdGVDbGFzc2VzIC49ICcgVmFsaWRhdGVfRGF0ZUFmdGVyJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4IHx8ICRWYWxpZGF0ZURhdGVCZWZvcmVWYWx1ZSApIHsKICAgICAgICAgICAgJERhdGVWYWxpZGF0ZUNsYXNzZXMgLj0gJyBWYWxpZGF0ZV9EYXRlQmVmb3JlJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRWYWxpZGF0ZURhdGVBZnRlclByZWZpeCkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcyAuPSAiIFZhbGlkYXRlX0RhdGVBZnRlcl8kVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXgiOwogICAgICAgIH0KICAgICAgICBpZiAoJFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCkgewogICAgICAgICAgICAkRGF0ZVZhbGlkYXRlQ2xhc3NlcyAuPSAiIFZhbGlkYXRlX0RhdGVCZWZvcmVfJFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCI7CiAgICAgICAgfQogICAgfQoKICAgICMgZGF5CiAgICBpZiAoICREYXRlSW5wdXRTdHlsZSBlcSAnT3B0aW9uJyApIHsKICAgICAgICBteSAlRGF5ID0gbWFwIHsgJF8gPT4gc3ByaW50ZiggIiUwMmQiLCAkXyApOyB9ICggMSAuLiAzMSApOwogICAgICAgICRQYXJhbXtEYXl9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJFByZWZpeCAuICdEYXknLAogICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVEYXksCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgICAgICA9PiBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdEYXknIH0gfHwgJEQgKSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICA9PiAiJERhdGVWYWxpZGF0ZUNsYXNzZXMgJENsYXNzIiwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RheScpLAogICAgICAgICAgICBEaXNhYmxlZCAgICAgICAgICAgPT4gJFBhcmFte0Rpc2FibGVkfSwKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQWZ0ZXIgID0+ICRWYWxpZGF0ZURhdGVBZnRlclZhbHVlLAogICAgICAgICAgICBWYWxpZGF0ZURhdGVCZWZvcmUgPT4gJFZhbGlkYXRlRGF0ZUJlZm9yZVZhbHVlLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17RGF5fSA9ICI8aW5wdXQgdHlwZT1cInRleHRcIiAiCiAgICAgICAgICAgIC4gImNsYXNzPVwiJERhdGVWYWxpZGF0ZUNsYXNzZXMgJENsYXNzXCIgIgogICAgICAgICAgICAuICJuYW1lPVwiJHtQcmVmaXh9RGF5XCIgaWQ9XCIke1ByZWZpeH1EYXlcIiBzaXplPVwiMlwiIG1heGxlbmd0aD1cIjJcIiAiCiAgICAgICAgICAgIC4gInRpdGxlPVwiIgogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RheScpCiAgICAgICAgICAgIC4gIlwiIHZhbHVlPVwiIgogICAgICAgICAgICAuIHNwcmludGYoICIlMDJkIiwgKCAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9IHx8ICREICkgKSAuICJcIiAiCiAgICAgICAgICAgIC4gKCAkUGFyYW17RGlzYWJsZWR9ID8gJ3JlYWRvbmx5PSJyZWFkb25seSInIDogJycgKSAuICIvPiI7CgogICAgfQoKICAgIGlmICggJEZvcm1hdCBlcSAnRGF0ZUlucHV0Rm9ybWF0TG9uZycgKSB7CgogICAgICAgICMgaG91cgogICAgICAgIGlmICggJERhdGVJbnB1dFN0eWxlIGVxICdPcHRpb24nICkgewogICAgICAgICAgICBteSAlSG91ciA9IG1hcCB7ICRfID0+IHNwcmludGYoICIlMDJkIiwgJF8gKTsgfSAoIDAgLi4gMjMgKTsKICAgICAgICAgICAgJFBhcmFte0hvdXJ9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkUHJlZml4IC4gJ0hvdXInLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJUhvdXIsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgID8gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnSG91cicgfSApCiAgICAgICAgICAgICAgICA6IGludCgkaCksCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJFZhbGlkYXRlID8gKCAnVmFsaWRhdGVfRGF0ZUhvdXIgJyAuICRDbGFzcyApIDogJENsYXNzLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSG91cnMnKSwKICAgICAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRQYXJhbXtEaXNhYmxlZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17SG91cn0gPSAiPGlucHV0IHR5cGU9XCJ0ZXh0XCIgIgogICAgICAgICAgICAgICAgLiAoICRWYWxpZGF0ZSA/ICJjbGFzcz1cIlZhbGlkYXRlX0RhdGVIb3VyICRDbGFzc1wiICIgOiAiY2xhc3M9XCIkQ2xhc3NcIiAiICkKICAgICAgICAgICAgICAgIC4gIm5hbWU9XCIke1ByZWZpeH1Ib3VyXCIgaWQ9XCIke1ByZWZpeH1Ib3VyXCIgc2l6ZT1cIjJcIiBtYXhsZW5ndGg9XCIyXCIgIgogICAgICAgICAgICAgICAgLiAidGl0bGU9XCIiCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0hvdXJzJykKICAgICAgICAgICAgICAgIC4gIlwiIHZhbHVlPVwiIgogICAgICAgICAgICAgICAgLiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICIlMDJkIiwKICAgICAgICAgICAgICAgICAgICAoIGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICkgPyBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICkgOiAkaCApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuICJcIiAiCiAgICAgICAgICAgICAgICAuICggJFBhcmFte0Rpc2FibGVkfSA/ICdyZWFkb25seT0icmVhZG9ubHkiJyA6ICcnICkgLiAiLz4iOwoKICAgICAgICB9CgogICAgICAgICMgbWludXRlCiAgICAgICAgaWYgKCAkRGF0ZUlucHV0U3R5bGUgZXEgJ09wdGlvbicgKSB7CiAgICAgICAgICAgIG15ICVNaW51dGUgPSBtYXAgeyAkXyA9PiBzcHJpbnRmKCAiJTAyZCIsICRfICk7IH0gbWFwIHsgJF8gKiAkTWludXRlU3RlcCB9ICggMCAuLiAoIDYwIC8gJE1pbnV0ZVN0ZXAgLSAxICkgKTsKICAgICAgICAgICAgJFBhcmFte01pbnV0ZX0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnTWludXRlJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVNaW51dGUsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgPyBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgOiBpbnQoICRtIC0gJG0gJSAkTWludXRlU3RlcCApLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRWYWxpZGF0ZSA/ICggJ1ZhbGlkYXRlX0RhdGVNaW51dGUgJyAuICRDbGFzcyApIDogJENsYXNzLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWludXRlcycpLAogICAgICAgICAgICAgICAgRGlzYWJsZWQgICAgPT4gJFBhcmFte0Rpc2FibGVkfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNaW51dGV9ID0gIjxpbnB1dCB0eXBlPVwidGV4dFwiICIKICAgICAgICAgICAgICAgIC4gKCAkVmFsaWRhdGUgPyAiY2xhc3M9XCJWYWxpZGF0ZV9EYXRlTWludXRlICRDbGFzc1wiICIgOiAiY2xhc3M9XCIkQ2xhc3NcIiAiICkKICAgICAgICAgICAgICAgIC4gIm5hbWU9XCIke1ByZWZpeH1NaW51dGVcIiBpZD1cIiR7UHJlZml4fU1pbnV0ZVwiIHNpemU9XCIyXCIgbWF4bGVuZ3RoPVwiMlwiICIKICAgICAgICAgICAgICAgIC4gInRpdGxlPVwiIgogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNaW51dGVzJykKICAgICAgICAgICAgICAgIC4gIlwiIHZhbHVlPVwiIgogICAgICAgICAgICAgICAgLiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICIlMDJkIiwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgICAgICAgICA/IGludCggJFBhcmFteyAkUHJlZml4IC4gJ01pbnV0ZScgfSApCiAgICAgICAgICAgICAgICAgICAgICAgIDogJG0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApIC4gIlwiICIKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RGlzYWJsZWR9ID8gJ3JlYWRvbmx5PSJyZWFkb25seSInIDogJycgKSAuICIvPiI7CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IGZpcnN0IGRheSBvZiB0aGUgd2VlawogICAgbXkgJFdlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKTsKICAgIGlmICggJFBhcmFte0NhbGVuZGFyfSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCggIlRpbWVab25lOjpDYWxlbmRhciIgLiAkUGFyYW17Q2FsZW5kYXJ9IC4gIk5hbWUiICkgKSB7CiAgICAgICAgICAgICRXZWVrRGF5U3RhcnQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICJDYWxlbmRhcldlZWtEYXlTdGFydDo6Q2FsZW5kYXIiIC4gJFBhcmFte0NhbGVuZGFyfSApOwogICAgICAgIH0KICAgIH0KICAgIGlmICggIWRlZmluZWQgJFdlZWtEYXlTdGFydCApIHsKICAgICAgICAkV2Vla0RheVN0YXJ0ID0gMTsKICAgIH0KCiAgICAjIHNhbml0aXplIFdlZWtEYXlTdGFydAogICAgIyAgIGFsbG93IHRoZSBmb2xsb3dpbmc6CiAgICAjICAgICAgIC0gY2hhcmFjdGVycyAobm90IG9ubHkgQS1aYS16LCBhcyB1bWxhdXRzIHNob3VsZCBiZSBhbGxvd2VkIGFzIHdlbGwpCiAgICAjICAgICAgIC0gZGlnaXRzIChhcmFiaWMgYXMgd2VsbCBhcyBub24tYXJhYmljKQogICAgIyAgICAgICAtIGRhc2ggKGUuZy4gZm9yIGR5bmFtaWMgZmllbGQgbmFtZXNwYWNlcykKICAgICMgICAgICAgLSB1bmRlcnNjb3JlCiAgICAjICAgICAgIC0gOiBhbmQgIyAoZS5nLiBmb3Igc3lzdGVtIGNvbmZpZ3VyYXRpb24gbmFtZXMpCiAgICAkV2Vla0RheVN0YXJ0ID1+IHMvW15cd1xkXC1fOiNdLy9nOwoKICAgIG15ICRPdXRwdXQgPSAnJzsKCiAgICAjIG9wdGlvbmFsIGNoZWNrYm94CiAgICBpZiAoJE9wdGlvbmFsKSB7CiAgICAgICAgbXkgJENoZWNrZWQgPSAnJzsKICAgICAgICBpZiAoJFVzZWQpIHsKICAgICAgICAgICAgJENoZWNrZWQgPSAnIGNoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAiPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCIiCiAgICAgICAgICAgIC4gJFByZWZpeAogICAgICAgICAgICAuICJVc2VkXCIgaWQ9XCIiIC4gJFByZWZpeCAuICJVc2VkXCIgdmFsdWU9XCIxXCIiCiAgICAgICAgICAgIC4gJENoZWNrZWQKICAgICAgICAgICAgLiAiIGNsYXNzPVwiJENsYXNzXCIiCiAgICAgICAgICAgIC4gIiB0aXRsZT1cIiIKICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDaGVjayB0byBhY3RpdmF0ZSB0aGlzIGRhdGUnKQogICAgICAgICAgICAuICJcIiAiCiAgICAgICAgICAgIC4gKCAkUGFyYW17RGlzYWJsZWR9ID8gJ2Rpc2FibGVkPSJkaXNhYmxlZCInIDogJycgKQogICAgICAgICAgICAuICIvPiZuYnNwOyI7CiAgICB9CgogICAgIyByZW1vdmUgJ1NlY29uZCcgYmVjYXVzZSBpdCBpcyBuZXZlciB1c2VkIGFuZCBidWcgIzk0NDEKICAgIGRlbGV0ZSAkUGFyYW17ICRQcmVmaXggLiAnU2Vjb25kJyB9OwoKICAgICMgZGF0ZSBmb3JtYXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRpbWUoCiAgICAgICAgQWN0aW9uID0+ICdSZXR1cm4nLAogICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICBNb2RlICAgPT4gJ05vdE51bWVyaWMnLAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgIyBwcmVwYXJlIGRhdGVwaWNrZXIgZm9yIHNwZWNpZmljIGNhbGVuZGFyCiAgICBteSAkVmFjYXRpb25EYXlzID0gJyc7CiAgICBpZiAoICRQYXJhbXtDYWxlbmRhcn0gKSB7CiAgICAgICAgJFZhY2F0aW9uRGF5cyA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKAogICAgICAgICAgICBDYWxlbmRhciA9PiAkUGFyYW17Q2FsZW5kYXJ9LAogICAgICAgICk7CiAgICB9CiAgICBteSAkVmFjYXRpb25EYXlzSlNPTiA9ICRTZWxmLT5KU09ORW5jb2RlKAogICAgICAgIERhdGEgPT4gJFZhY2F0aW9uRGF5cywKICAgICk7CgogICAgIyBBZGQgRGF0ZXBpY2tlciBKUyB0byBvdXRwdXQuCiAgICBteSAkRGF0ZXBpY2tlckpTID0gJwogICAgQ29yZS5VSS5EYXRlcGlja2VyLkluaXQoewogICAgICAgIERheTogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigiJyAuICRQcmVmaXggLiAnIikgKyAiRGF5IiksCiAgICAgICAgTW9udGg6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkUHJlZml4IC4gJyIpICsgIk1vbnRoIiksCiAgICAgICAgWWVhcjogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigiJyAuICRQcmVmaXggLiAnIikgKyAiWWVhciIpLAogICAgICAgIEhvdXI6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkUHJlZml4IC4gJyIpICsgIkhvdXIiKSwKICAgICAgICBNaW51dGU6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoIicgLiAkUHJlZml4IC4gJyIpICsgIk1pbnV0ZSIpLAogICAgICAgIFZhY2F0aW9uRGF5czogJyAuICRWYWNhdGlvbkRheXNKU09OIC4gJywKICAgICAgICBEYXRlSW5GdXR1cmU6ICcgLiAgICAoICRWYWxpZGF0ZURhdGVJbkZ1dHVyZSAgICA/ICd0cnVlJyA6ICdmYWxzZScgKSAuICcsCiAgICAgICAgRGF0ZU5vdEluRnV0dXJlOiAnIC4gKCAkVmFsaWRhdGVEYXRlTm90SW5GdXR1cmUgPyAndHJ1ZScgOiAnZmFsc2UnICkgLiAnLAogICAgICAgIFdlZWtEYXlTdGFydDogJyAuICRXZWVrRGF5U3RhcnQgLiAnCiAgICB9KTsnOwoKICAgICRTZWxmLT5BZGRKU09uRG9jdW1lbnRDb21wbGV0ZSggQ29kZSA9PiAkRGF0ZXBpY2tlckpTICk7CiAgICAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9ID0gMTsgICAgIyBDYWxsIHNvbWUgRGF0ZXBpY2tlciBpbml0IGNvZGUuCgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCj1oZWFkMiBIdW1hblJlYWRhYmxlRGF0YVNpemUoKQoKUHJvZHVjZXMgaHVtYW4gcmVhZGFibGUgZGF0YSBzaXplLgoKICAgIG15ICRTaXplU3RyID0gJExheW91dE9iamVjdC0+SHVtYW5SZWFkYWJsZURhdGFTaXplKAogICAgICAgIFNpemUgPT4gMTIzLCAgIyBzaXplIGluIGJ5dGVzCiAgICApOwoKUmV0dXJucwoKICAgICRTaXplU3RyID0gJzEyMyBCJzsgICAgICAgICAjIGV4YW1wbGUgd2l0aCBkZWNpbWFsIHBvaW50OiAxMjMuNCBNQgoKPWN1dAoKc3ViIEh1bWFuUmVhZGFibGVEYXRhU2l6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgVXNlIHNpbXBsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiB0byBmb3JtYXQgcmVhbCBudW1iZXIuICJzcHJpbnRmIiB1c2VzIGRvdCAoLikgYXMgZGVjaW1hbCBzZXBhcmF0b3IgdW5sZXNzCiAgICAjICAgbG9jYWxlIGFuZCBQT1NJWCAoTENfTlVNRVJJQykgaXMgdXNlZC4gRXZlbiBpbiB0aGlzIGNhc2UsIHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gdXNlIGN1c3RvbSBzZXBhcmF0b3IKICAgICMgICAoYXMgZGVmaW5lZCBpbiBsYW5ndWFnZSBmaWxlcykuCgogICAgbXkgJEZvcm1hdFNpemUgPSBzdWIgewogICAgICAgIG15ICgkTnVtYmVyKSA9IEBfOwoKICAgICAgICBteSAkUmVhZGFibGVTaXplOwoKICAgICAgICBpZiAoIElzSW50ZWdlcigkTnVtYmVyKSApIHsKICAgICAgICAgICAgJFJlYWRhYmxlU2l6ZSA9ICROdW1iZXI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBHZXQgaW50ZWdlciBhbmQgZGVjaW1hbCBwYXJ0cy4KICAgICAgICAgICAgbXkgKCAkSW50ZWdlciwgJEZsb2F0ICkgPSBzcGxpdCggL1wuLywgc3ByaW50ZiggIiUuMWYiLCAkTnVtYmVyICkgKTsKCiAgICAgICAgICAgIG15ICRTZXBhcmF0b3IgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+e0RlY2ltYWxTZXBhcmF0b3J9IHx8ICcuJzsKCiAgICAgICAgICAgICMgRm9ybWF0IHNpemUgd2l0aCBwcm92aWRlZCBkZWNpbWFsIHNlcGFyYXRvci4KICAgICAgICAgICAgJFJlYWRhYmxlU2l6ZSA9ICRJbnRlZ2VyIC4gJFNlcGFyYXRvciAuICRGbG9hdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkUmVhZGFibGVTaXplOwogICAgfTsKCiAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17U2l6ZX0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2l6ZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggIUlzSW50ZWdlciggJFBhcmFte1NpemV9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTaXplIG11c3QgYmUgaW50ZWdlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgVXNlIGNvbnZlbnRpb24gZGVzY3JpYmVkIG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZpbGVfc2l6ZQogICAgbXkgKCAkU2l6ZVN0ciwgJFJlYWRhYmxlU2l6ZSApOwoKICAgIGlmICggJFBhcmFte1NpemV9ID49ICggMTAyNCoqNCApICkgewoKICAgICAgICAkUmVhZGFibGVTaXplID0gJEZvcm1hdFNpemUtPiggJFBhcmFte1NpemV9IC8gKCAxMDI0Kio0ICkgKTsKICAgICAgICAkU2l6ZVN0ciAgICAgID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIFRCJywgJFJlYWRhYmxlU2l6ZSApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17U2l6ZX0gPj0gKCAxMDI0KiozICkgKSB7CgogICAgICAgICRSZWFkYWJsZVNpemUgPSAkRm9ybWF0U2l6ZS0+KCAkUGFyYW17U2l6ZX0gLyAoIDEwMjQqKjMgKSApOwogICAgICAgICRTaXplU3RyICAgICAgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgR0InLCAkUmVhZGFibGVTaXplICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtTaXplfSA+PSAoIDEwMjQqKjIgKSApIHsKCiAgICAgICAgJFJlYWRhYmxlU2l6ZSA9ICRGb3JtYXRTaXplLT4oICRQYXJhbXtTaXplfSAvICggMTAyNCoqMiApICk7CiAgICAgICAgJFNpemVTdHIgICAgICA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBNQicsICRSZWFkYWJsZVNpemUgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1NpemV9ID49IDEwMjQgKSB7CgogICAgICAgICRSZWFkYWJsZVNpemUgPSAkRm9ybWF0U2l6ZS0+KCAkUGFyYW17U2l6ZX0gLyAxMDI0ICk7CiAgICAgICAgJFNpemVTdHIgICAgICA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBLQicsICRSZWFkYWJsZVNpemUgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTaXplU3RyID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIEInLCAkUGFyYW17U2l6ZX0gKTsKICAgIH0KCiAgICByZXR1cm4gJFNpemVTdHI7Cn0KCnN1YiBDdXN0b21lckxvZ2luIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte1RpdGxlQXJlYX0gICA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0xvZ2luJykgLiAnIC0gJzsKICAgICRQYXJhbXtJc0xvZ2luUGFnZX0gPSAxOwoKICAgICMgc2V0IEFjdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBsb2FkZXIKICAgICRTZWxmLT57QWN0aW9ufSA9ICdDdXN0b21lckxvZ2luJzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewoKICAgICAgICAjIGFsd2F5cyBzZXQgYSBjb29raWUsIHNvIHRoYXQgYXQgdGhlIHRpbWUgdGhlIHVzZXIgc3VibWl0cwogICAgICAgICMgdGhlIHBhc3N3b3JkLCB3ZSBrbm93IGFscmVhZHkgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgY29va2llcy4KICAgICAgICAjICggdGhlIHNlc3Npb24gY29va2llIGlzbid0IGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUgKS4KCiAgICAgICAgIyBSZXN0cmljdCBDb29raWUgdG8gSFRUUFMgaWYgaXQgaXMgdXNlZC4KICAgICAgICBteSAkQ29va2llU2VjdXJlQXR0cmlidXRlID0gJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpIGVxICdodHRwcycgPyAxIDogdW5kZWY7CgogICAgICAgIG15ICRFeHBpcmVzID0gJysnIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTWF4VGltZScpIC4gJ3MnOwogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZUFmdGVyQnJvd3NlckNsb3NlJykgKSB7CiAgICAgICAgICAgICRFeHBpcmVzID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhIGNvb2tpZSB0ZW50YXRpdmVseSBmb3IgY2hlY2tpbmcgY29va2llIHN1cHBvcnQKICAgICAgICAkU2VsZi0+e1NldENvb2tpZXN9LT57T1RPQk9Ccm93c2VySGFzQ29va2llfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+U2V0Q29va2llKAogICAgICAgICAgICBLZXkgICAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgVmFsdWUgICAgPT4gMSwKICAgICAgICAgICAgRXhwaXJlcyAgPT4gJEV4cGlyZXMsCiAgICAgICAgICAgIFBhdGggICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKSwKICAgICAgICAgICAgU2VjdXJlICAgPT4gJENvb2tpZVNlY3VyZUF0dHJpYnV0ZSwKICAgICAgICAgICAgSHR0cE9ubHkgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgQWRkIHRoZSBjb29raWVzIHRoYXQgaGFkIGJlZW4gc2V0IGluIHRoZSBjb25zdHJ1Y3Rvci4KICAgICMgVGhlIHZhbHVlcyBvZiAkU2VsZi0+e1NldENvb2tpZXN9IGFyZSBwbGFpbiBoYXNoIHJlZmVyZW5jZXMuCiAgICAjIEZvciBzb21lIHJlYXNvbiB0aGUgbmFtZSBldmVudHVhbGx5IHVzZWQgYnkgQ29va2llOjpCYWtlcjo6YmFrZV9jb29raWUoKSBpcyB0aGUgYXR0cmlidXRlICduYW1lJyBvZiB0aGUgaGFzaHJlZi4KICAgIG15ICRSZXNwb25zZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyk7CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntTZXRDb29raWVzfQogICAgICAgICYmIHJlZiAkU2VsZi0+e1NldENvb2tpZXN9IGVxICdIQVNIJwogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpCiAgICAgICAgKQogICAgewogICAgICAgIGZvciAoIHNvcnQga2V5cyAkU2VsZi0+e1NldENvb2tpZXN9LT4lKiApIHsKCiAgICAgICAgICAgICMgbWFrZSBhIGNvcHkgYmVjYXVzZSB3ZSBtaWdodCBuZWVkICRTZWxmLT57U2V0Q29va2llc30gbGF0ZXIgb24KICAgICAgICAgICAgbXkgJUluZ3JlZGllbnRzID0gJFNlbGYtPntTZXRDb29raWVzfS0+eyRffS0+JSo7CiAgICAgICAgICAgIG15ICROYW1lICAgICAgICA9IGRlbGV0ZSAkSW5ncmVkaWVudHN7bmFtZX07CiAgICAgICAgICAgICRSZXNwb25zZU9iamVjdC0+Q29va2llcy0+eyROYW1lfSA9IFwlSW5ncmVkaWVudHM7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24KICAgIGlmICggJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaWduZXQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUN1c3RvbWVyQ1NTQ2FsbHMoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVDdXN0b21lckpTQ2FsbHMoKTsKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVKYXZhU2NyaXB0VHJhbnNsYXRpb25EYXRhKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlSmF2YVNjcmlwdFRlbXBsYXRlRGF0YSgpOwoKICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ0Jhc2VsaW5rJywKICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0Jhc2VsaW5rfSwKICAgICk7CgogICAgIyBBZGQgaGVhZGVyIGxvZ28sIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggZGVmaW5lZCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyTG9nbycpICkgewogICAgICAgIG15ICVDdXN0b21lckxvZ28gPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyTG9nbycpIH07CiAgICAgICAgbXkgJURhdGE7CgogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICggc29ydCBrZXlzICVDdXN0b21lckxvZ28gKSB7CiAgICAgICAgICAgIGlmICggJENTU1N0YXRlbWVudCBlcSAnVVJMJyApIHsKICAgICAgICAgICAgICAgIG15ICRXZWJQYXRoID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckxvZ297JENTU1N0YXRlbWVudH0gIX4gLyhodHRwfGZ0cHxodHRwcyk6XC8vaSApIHsKICAgICAgICAgICAgICAgICAgICAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEN1c3RvbWVyTG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEN1c3RvbWVyTG9nb3skQ1NTU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHN5c3RlbSBtYWludGVuYW5jZSBvYmplY3QKICAgIG15ICRTeXN0ZW1NYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1NYWludGVuYW5jZScpOwoKICAgIG15ICRBY3RpdmVNYWludGVuYW5jZSA9ICRTeXN0ZW1NYWludGVuYW5jZU9iamVjdC0+U3lzdGVtTWFpbnRlbmFuY2VJc0FjdGl2ZSgpOwoKICAgICMgY2hlY2sgaWYgc3lzdGVtIG1haW50ZW5hbmNlIGlzIGFjdGl2ZQogICAgaWYgKCRBY3RpdmVNYWludGVuYW5jZSkgewogICAgICAgIG15ICRTeXN0ZW1NYWludGVuYW5jZURhdGEgPSAkU3lzdGVtTWFpbnRlbmFuY2VPYmplY3QtPlN5c3RlbU1haW50ZW5hbmNlR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJEFjdGl2ZU1haW50ZW5hbmNlLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFN5c3RlbU1haW50ZW5hbmNlRGF0YS0+e1Nob3dMb2dpbk1lc3NhZ2V9ICkgewogICAgICAgICAgICBteSAkTG9naW5NZXNzYWdlID0KICAgICAgICAgICAgICAgICRTeXN0ZW1NYWludGVuYW5jZURhdGEtPntMb2dpbk1lc3NhZ2V9CiAgICAgICAgICAgICAgICB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbU1haW50ZW5hbmNlOjpJc0FjdGl2ZURlZmF1bHRMb2dpbk1lc3NhZ2UnKQogICAgICAgICAgICAgICAgfHwgIlN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUsIG5vdCBwb3NzaWJsZSB0byBwZXJmb3JtIGEgbG9naW4hIjsKCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N5c3RlbU1haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExvZ2luTWVzc2FnZSA9PiAkTG9naW5NZXNzYWdlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHByZWxvZ2luIGJsb2NrLCBpZiBpbiBwcmVsb2dpbiBtb2RlIChlLmcuIFNTTyBsb2dpbikKICAgIGlmICggZGVmaW5lZCAkUGFyYW17J01vZGUnfSAmJiAkUGFyYW17J01vZGUnfSBlcSAnUHJlTG9naW4nICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJlTG9naW4nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIG5vdCBpbiBQcmVMb2dpbiBtb2RlLCBzaG93IG5vcm1hbCBsb2dpbiBmb3JtCiAgICBlbHNlIHsKCiAgICAgICAgbXkgJERpc2FibGVMb2dpbkF1dG9jb21wbGV0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnRGlzYWJsZUxvZ2luQXV0b2NvbXBsZXRlJyk7CiAgICAgICAgJFBhcmFte1VzZXJOYW1lQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICd1c2VybmFtZSc7CiAgICAgICAgJFBhcmFte1Bhc3N3b3JkQXV0b2NvbXBsZXRlfSA9ICREaXNhYmxlTG9naW5BdXRvY29tcGxldGUgPyAnb2ZmJyA6ICdjdXJyZW50LXBhc3N3b3JkJzsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb2dpbkJveCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgMiBmYWN0b3IgcGFzc3dvcmQgaW5wdXQgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYmFja2VuZCBlbmFibGVkCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyOjpBdXRoVHdvRmFjdG9yTW9kdWxlJENvdW50Iik7CgogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdXRoVHdvRmFjdG9yJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxvc3QgcGFzc3dvcmQgb3V0cHV0CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb3N0UGFzc3dvcmQnKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlJykgZXEKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6OkRCJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb3N0UGFzc3dvcmRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9zdFBhc3N3b3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBhY2NvdW50IG91dHB1dAogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudCcpCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXI6OkF1dGhNb2R1bGUnKSBlcQogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6REInCiAgICAgICAgICAgICkKCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDcmVhdGVBY2NvdW50TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NyZWF0ZUFjY291bnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnTG9naW5GYWlsZWQnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtMb2dpbkZhaWxlZH0sCiAgICApOwoKICAgIG15ICRCR0NvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJMb2dpbjo6U2V0dGluZ3MnKTsKICAgICRQYXJhbXtMb2dpblRleHR9ICA9ICRCR0NvbmZpZy0+e0xvZ2luVGV4dH0gLy8gJ1lvdXIgVGlja2V0cy4gWW91ciBPVE9CTy4nOwogICAgJFBhcmFte0JhY2tncm91bmR9ID0gJEJHQ29uZmlnLT57QmFja2dyb3VuZH0gfHwgJyc7CiAgICAkUGFyYW17QmFja2dyb3VuZH0gPX4gc3s8T1RPQk9fQ09ORklHXyguKz8pPn17JENvbmZpZ09iamVjdC0+R2V0KCQxKX1lZ3g7CgogICAgIyBkZWZpbmUgY29sb3Igc2NoZW1lCiAgICBteSAkQ29sb3JEZWZpbml0aW9ucyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJDb2xvckRlZmluaXRpb25zJyk7CiAgICBmb3IgbXkgJENvbG9yICggc29ydCBrZXlzICV7JENvbG9yRGVmaW5pdGlvbnN9ICkgewogICAgICAgICRQYXJhbXtDb2xvckRlZmluaXRpb25zfSAuPSAiLS1jb2wkQ29sb3I6JENvbG9yRGVmaW5pdGlvbnMtPnsgJENvbG9yIH07IjsKICAgIH0KCiAgICAkU2VsZi0+X0FkZEhlYWRlcnNUb1Jlc3BvbnNlT2JqZWN0KAogICAgICAgIFhMb2dpbkhlYWRlciA9PiAxLAogICAgKTsKCiAgICAkUGFyYW17RGlzYWJsZVN0YW5kYXJkTG9naW59ID0gJFNlbGYtPl9IYXNPbmx5T0lEQ0F1dGhNb2R1bGVzKCBMb2dpblR5cGUgPT4gJ0N1c3RvbWVyJyApOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckxvZ2luJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBDdXN0b21lckhlYWRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUeXBlID0gJFBhcmFte1R5cGV9IHx8ICcnOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRGaWxlID0gJFBhcmFte0ZpbGVuYW1lfSB8fCAkU2VsZi0+e0FjdGlvbn0gfHwgJ3Vua25vd24nOwoKICAgICMgc2V0IGZpbGUgbmFtZSBmb3IgInNhdmUgcGFnZSBhcyIKICAgICRQYXJhbXtDb250ZW50RGlzcG9zaXRpb259ID0gImZpbGVuYW1lPVwiJEZpbGUuaHRtbFwiIjsKCiAgICAjIGFyZWEgYW5kIHRpdGxlCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcmVhfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0FyZWF9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfQogICAgICAgICAgICAtPntOYXZCYXJOYW1lfSB8fCAnJzsKICAgIH0KICAgIGlmICgKICAgICAgICAhJFBhcmFte1RpdGxlfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0tPntUaXRsZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcmVhfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9CiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtBcmVhfSA9ICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9CiAgICAgICAgICAgIC0+e05hdkJhck5hbWV9IHx8ICcnOwogICAgfQogICAgaWYgKAogICAgICAgICEkUGFyYW17VGl0bGV9CiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdQdWJsaWNGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1RpdGxlfSA9ICRDb25maWdPYmplY3QtPkdldCgnUHVibGljRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9LT57VGl0bGV9CiAgICAgICAgICAgIHx8ICcnOwogICAgfQogICAgZm9yIG15ICRXb3JkIChxdyhWYWx1ZSBUaXRsZSBBcmVhKSkgewogICAgICAgIGlmICggJFBhcmFteyRXb3JkfSApIHsKICAgICAgICAgICAgJFBhcmFte1RpdGxlQXJlYX0gLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFBhcmFteyRXb3JkfSApIC4gJyAtICc7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGcm9udGVuZDsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAkRnJvbnRlbmQgPSAnQ3VzdG9tZXInOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEZyb250ZW5kID0gJ1B1YmxpYyc7CiAgICB9CgogICAgIyBydW4gaGVhZGVyIG1ldGEgbW9kdWxlcyBmb3IgY3VzdG9tZXIgYW5kIHB1YmxpYyBmcm9udGVuZHMKICAgIG15ICRIZWFkZXJNZXRhTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCAkRnJvbnRlbmQgLiAnRnJvbnRlbmQ6OkhlYWRlck1ldGFNb2R1bGUnICk7CiAgICBpZiAoIHJlZiAkSGVhZGVyTWV0YU1vZHVsZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyRIZWFkZXJNZXRhTW9kdWxlfTsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBNT0RVTEU6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgYW5kIHJ1biBtb2R1bGUKICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgTGF5b3V0T2JqZWN0ID0+ICRTZWxmICk7CiAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkT2JqZWN0OwogICAgICAgICAgICAkT2JqZWN0LT5SdW4oICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHJ0bCBpZiBuZWVkZWQKICAgIGlmICggJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAmJiAkU2VsZi0+e1RleHREaXJlY3Rpb259IGVxICdydGwnICkgewogICAgICAgICRQYXJhbXtCb2R5Q2xhc3N9ID0gJ1JUTCc7CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OkRlYnVnTW9kZScpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVidWdSVExCdXR0b24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWZpbmUgKGN1c3RvbSkgbG9nbwogICAgbXkgJFdlYlBhdGggPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAkUGFyYW17VVJMU2lnbmV0fSA9ICRXZWJQYXRoIC4gJ3NraW5zL0N1c3RvbWVyL2RlZmF1bHQvaW1nL290b2JvX3NpZ25ldF93LnN2Zyc7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSApIHsKICAgICAgICBteSAlQ3VzdG9tZXJMb2dvID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckxvZ28nKSB9OwoKICAgICAgICBMT0dPOgogICAgICAgIGZvciBteSAkU3RhdGVtZW50IChxdyhVUkxTaWduZXQpKSB7CiAgICAgICAgICAgIG5leHQgTE9HTyBpZiAhJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fTsKCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fSAhfiAvKGh0dHB8ZnRwfGh0dHBzKTpcLy9pICkgewogICAgICAgICAgICAgICAgJFBhcmFteyRTdGF0ZW1lbnR9ID0gJFdlYlBhdGggLiAkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFteyRTdGF0ZW1lbnR9ID0gJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdlbmVyYXRlIHRoZSBtaW5pZmllZCBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKICAgICMgYW5kIHRoZSB0YWdzIHJlZmVyZW5jaW5nIHRoZW0gKHNlZSBMYXlvdXRMb2FkZXIpCiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQ3VzdG9tZXJDU1NDYWxscygpOwoKICAgICMgZGVmaW5lIGNvbG9yIHNjaGVtZQogICAgbXkgJENvbG9yRGVmaW5pdGlvbnMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyQ29sb3JEZWZpbml0aW9ucycpOwogICAgZm9yIG15ICRDb2xvciAoIHNvcnQga2V5cyAleyRDb2xvckRlZmluaXRpb25zfSApIHsKICAgICAgICAkUGFyYW17Q29sb3JEZWZpbml0aW9uc30gLj0gIi0tY29sJENvbG9yOiRDb2xvckRlZmluaXRpb25zLT57ICRDb2xvciB9OyI7CiAgICB9CgogICAgJFNlbGYtPl9BZGRIZWFkZXJzVG9SZXNwb25zZU9iamVjdCgKICAgICAgICBDb250ZW50RGlzcG9zaXRpb24gICAgICAgICAgICA9PiAkUGFyYW17Q29udGVudERpc3Bvc2l0aW9ufSwKICAgICAgICBEaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCA9PiAkUGFyYW17RGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWR9LAogICAgKTsKCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAiQ3VzdG9tZXJIZWFkZXIkVHlwZSIsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgpzdWIgQ3VzdG9tZXJGb290ZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVHlwZSAgICAgICAgICA9ICRQYXJhbXtUeXBlfSAgICAgICAgICAgfHwgJyc7CiAgICBteSAkSGFzRGF0ZXBpY2tlciA9ICRTZWxmLT57SGFzRGF0ZXBpY2tlcn0gfHwgMDsKCiAgICAjIEdlbmVyYXRlIHRoZSBtaW5pZmllZCBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKICAgICMgYW5kIHRoZSB0YWdzIHJlZmVyZW5jaW5nIHRoZW0gKHNlZSBMYXlvdXRMb2FkZXIpCiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQ3VzdG9tZXJKU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlSmF2YVNjcmlwdFRyYW5zbGF0aW9uRGF0YSgpOwogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUphdmFTY3JpcHRUZW1wbGF0ZURhdGEoKTsKCiAgICAjIGdldCBkYXRlcGlja2VyIGRhdGEsIGlmIG5lZWRlZCBpbiBtb2R1bGUKICAgIGlmICgkSGFzRGF0ZXBpY2tlcikgewogICAgICAgIG15ICRWYWNhdGlvbkRheXMgID0gJFNlbGYtPkRhdGVwaWNrZXJHZXRWYWNhdGlvbkRheXMoKTsKICAgICAgICBteSAkVGV4dERpcmVjdGlvbiA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT57VGV4dERpcmVjdGlvbn0gfHwgJyc7CgogICAgICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0RhdGVwaWNrZXInLAogICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICBWYWNhdGlvbkRheXMgPT4gJFZhY2F0aW9uRGF5cywKICAgICAgICAgICAgICAgIElzUlRMICAgICAgICA9PiAoICRUZXh0RGlyZWN0aW9uIGVxICdydGwnICkgPyAxIDogMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgQ2hlY2sgaWYgdmlkZW8gY2hhdCBpcyBlbmFibGVkLgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OlZpZGVvQ2hhdCcsIFNpbGVudCA9PiAxICkgKSB7CiAgICAgICAgJFBhcmFte1ZpZGVvQ2hhdEVuYWJsZWR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpZGVvQ2hhdCcpLT5Jc0VuYWJsZWQoKQogICAgICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnVW5pdFRlc3RNb2RlJyApIC8vIDA7CiAgICB9CgogICAgIyBDaGVjayBpZiBjdXN0b21lciB1c2VyIGhhcyBwZXJtaXNzaW9uIGZvciBjaGF0LgogICAgbXkgJEN1c3RvbWVyQ2hhdFBlcm1pc3Npb247CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcsIFNpbGVudCA9PiAxICkgKSB7CgogICAgICAgIG15ICRDdXN0b21lckNoYXRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57J0N1c3RvbWVyQ2hhdCd9IHx8IHt9OwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKQogICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRDdXN0b21lckNoYXRDb25maWctPntHcm91cFJvfSApCiAgICAgICAgICAgICAgICB8fCBJc0FycmF5UmVmV2l0aERhdGEoICRDdXN0b21lckNoYXRDb25maWctPntHcm91cH0gKQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyk7CgogICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRHcm91cE5hbWUgKCBAeyAkQ3VzdG9tZXJDaGF0Q29uZmlnLT57R3JvdXBSb30gfSwgQHsgJEN1c3RvbWVyQ2hhdENvbmZpZy0+e0dyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyQ2hhdFBlcm1pc3Npb24gPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbGFzdCBHUk9VUCBpZiAkQ3VzdG9tZXJDaGF0UGVybWlzc2lvbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEN1c3RvbWVyQ2hhdFBlcm1pc3Npb24gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIEF1dG9Db21wbGV0ZS1Db25maWcKICAgIG15ICRBdXRvY29tcGxldGVDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9Db21wbGV0ZTo6Q3VzdG9tZXInKTsKCiAgICBmb3IgbXkgJENvbmZpZ0VsZW1lbnQgKCBzb3J0IGtleXMgJXskQXV0b2NvbXBsZXRlQ29uZmlnfSApIHsKICAgICAgICAkQXV0b2NvbXBsZXRlQ29uZmlnLT57JENvbmZpZ0VsZW1lbnR9LT57QnV0dG9uVGV4dH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkQXV0b2NvbXBsZXRlQ29uZmlnLT57JENvbmZpZ0VsZW1lbnR9e0J1dHRvblRleHR9ICk7CiAgICB9CgogICAgIyBhZGQgSlMgZGF0YQogICAgbXkgJUpTQ29uZmlnID0gKAogICAgICAgIEJhc2VsaW5rICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Jhc2VsaW5rfSwKICAgICAgICBDR0lIYW5kbGUgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDR0lIYW5kbGV9LAogICAgICAgIFdlYlBhdGggICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyksCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBTdWJhY3Rpb24gICAgICAgICAgICAgICAgPT4gJFNlbGYtPntTdWJhY3Rpb259LAogICAgICAgIFNlc3Npb25JRENvb2tpZSAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0sCiAgICAgICAgU2Vzc2lvbk5hbWUgICAgICAgICAgICAgID0+ICRTZWxmLT57U2Vzc2lvbk5hbWV9LAogICAgICAgIFNlc3Npb25JRCAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgU2Vzc2lvblVzZUNvb2tpZSAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpLAogICAgICAgIENoYWxsZW5nZVRva2VuICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn0sCiAgICAgICAgQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJyksCiAgICAgICAgVXNlckxhbmd1YWdlICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlckxhbmd1YWdlfSwKICAgICAgICBDaGVja0VtYWlsQWRkcmVzc2VzICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyksCiAgICAgICAgSW5wdXRGaWVsZHNBY3RpdmF0ZWQgICAgID0+IDEsCiAgICAgICAgQXV0b2NvbXBsZXRlICAgICAgICAgICAgID0+ICRBdXRvY29tcGxldGVDb25maWcsCiAgICAgICAgVmlkZW9DaGF0RW5hYmxlZCAgICAgICAgID0+ICRQYXJhbXtWaWRlb0NoYXRFbmFibGVkfSwKICAgICAgICBXZWJNYXhGaWxlVXBsb2FkICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdXZWJNYXhGaWxlVXBsb2FkJyksCiAgICAgICAgQ3VzdG9tZXJDaGF0UGVybWlzc2lvbiAgID0+ICRDdXN0b21lckNoYXRQZXJtaXNzaW9uLAogICAgKTsKCiAgICBmb3IgbXkgJENvbmZpZyAoIHNvcnQga2V5cyAlSlNDb25maWcgKSB7CiAgICAgICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgVmFsdWUgPT4gJEpTQ29uZmlneyRDb25maWd9LAogICAgICAgICk7CiAgICB9CgogICAgIyBEaXNwbGF5IGZvb3RlciBsaW5rcy4KICAgIG15ICRGb290ZXJMaW5rcyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6Rm9vdGVyTGlua3MnKTsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEZvb3RlckxpbmtzKSApIHsKCiAgICAgICAgbXkgQEZvb3RlckxpbmtzOwogICAgICAgIG15ICVVUkxDb25maWcgPSAoCiAgICAgICAgICAgIEh0dHBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKSAgICAvLyAnJywKICAgICAgICAgICAgRlFETiAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdGUUROJykgICAgICAgIC8vICcnLAogICAgICAgICAgICBTY3JpcHRBbGlhcyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NjcmlwdEFsaWFzJykgLy8gJycsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRMaW5rICggc29ydCBrZXlzICV7JEZvb3RlckxpbmtzfSApIHsKICAgICAgICAgICAgbXkgJFN1YnN0aXR1ZGVkTGluayA9ICRMaW5rOwogICAgICAgICAgICBmb3IgbXkgJE9wdGlvbiAocXcvSHR0cFR5cGUgRlFETiBTY3JpcHRBbGlhcy8pIHsKICAgICAgICAgICAgICAgICRTdWJzdGl0dWRlZExpbmsgPX4gcy88T1RPQk9fQ09ORklHXyRPcHRpb24+LyRVUkxDb25maWd7ICRPcHRpb24gfS9nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBGb290ZXJMaW5rcywgewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEZvb3RlckxpbmtzLT57JExpbmt9LAogICAgICAgICAgICAgICAgVGFyZ2V0ICAgICAgPT4gJFN1YnN0aXR1ZGVkTGluaywKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtGb290ZXJMaW5rc30gPSBcQEZvb3RlckxpbmtzOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICJDdXN0b21lckZvb3RlciRUeXBlIiwKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBDdXN0b21lckZhdGFsRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIFRlbXBsYXRlIGVuZ2luZS4KICAgIHJldHVybiBpZiAoICRTZWxmLT57SW5GYXRhbEVycm9yfSsrICk7CgogICAgaWYgKCAkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRPdXRwdXQgPSBqb2luICcnLAogICAgICAgICRTZWxmLT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgQXJlYSAgPT4gJ0Zyb250ZW5kJywKICAgICAgICAgICAgVGl0bGUgPT4gJ0ZhdGFsIEVycm9yJwogICAgICAgICksCiAgICAgICAgJFNlbGYtPkN1c3RvbWVyRXJyb3IoJVBhcmFtKSwKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAjIE1vZGlmeSB0aGUgb3V0cHV0IGJ5IGFwcGx5aW5nIHRoZSBvdXRwdXQgZmlsdGVycy4KICAgICRPdXRwdXQgPSAkU2VsZi0+QXBwbHlPdXRwdXRGaWx0ZXJzKCBPdXRwdXQgPT4gJE91dHB1dCApOwoKICAgICMgVGhlIENvbnRlbnQtTGVuZ3RoIHdpbGwgYmUgc2V0IGxhdGVyIGluIHRoZSBtaWRkbGV3YXJlIFBsYWNrOjpNaWRkbGV3YXJlOjpDb250ZW50TGVuZ3RoLiBUaGlzIHJlcXVpcmVzIHRoYXQKICAgICMgdGhlcmUgYXJlIG5vIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgZGVsaXZlcmVkIGNvbnRlbnQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgbWlkZGxld2FyZQogICAgIyB1c2VzIGNvcmU6Omxlbmd0aCgpIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudCBsZW5ndGguCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCggXCRPdXRwdXQgKTsKCiAgICAjIFRoZSBPVE9CTyByZXNwb25zZSBvYmplY3QgYWxyZWFkeSBoYXMgdGhlIEhUUFAgaGVhZGVycy4KICAgICMgRW5oYW5jZSBpdCB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFuZCB0aGUgY29udGVudC4KICAgIG15ICRQbGFja1Jlc3BvbnNlID0gUGxhY2s6OlJlc3BvbnNlLT5uZXcoCiAgICAgICAgMjAwLAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyktPkhlYWRlcnMoKSwKICAgICAgICAkT3V0cHV0CiAgICApOwoKICAgICMgVGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkhUVFBFeGNlcHRpb25zCiAgICBkaWUgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uLT5uZXcoCiAgICAgICAgUGxhY2tSZXNwb25zZSA9PiAkUGxhY2tSZXNwb25zZQogICAgKTsKfQoKc3ViIEN1c3RvbWVyTmF2aWdhdGlvbkJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY3JlYXRlIG1lbnUgaXRlbXMKICAgIG15ICVOYXZCYXJNb2R1bGU7CiAgICBteSAkRnJvbnRlbmRNb2R1bGUgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyk7CiAgICBteSAkTmF2aWdhdGlvbkNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TmF2aWdhdGlvbicpOwoKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyk7CgogICAgTU9EVUxFOgogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskTmF2aWdhdGlvbkNvbmZpZ30gKSB7CgogICAgICAgICMgU2tpcCBpZiBtb2R1bGUgaXMgZGlzYWJsZWQgaW4gZnJvbnRlbmQgcmVnaXN0cmF0aW9uLgogICAgICAgIG5leHQgTU9EVUxFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0gKTsKCiAgICAgICAgIyBUb3AtbGV2ZWwgZnJvbnRlbmQgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9uIHNob3VsZCBhbHdheXMgYmUgYSBoYXNoLgogICAgICAgIG5leHQgTU9EVUxFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJE5hdmlnYXRpb25Db25maWctPnskTW9kdWxlfSApOwoKICAgICAgICBteSBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3M7CgogICAgICAgICMgR28gdGhyb3VnaCBhbGwgZGVmaW5lZCBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgbW9kdWxlIGFuZCBzb3J0IHRoZW0gYnkgdGhlIGtleSAoMDAjLU1vZHVsZSkuCiAgICAgICAgTkFWSUdBVElPTl9DT05GSUc6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJE5hdmlnYXRpb25Db25maWctPnskTW9kdWxlfSB8fCB7fSB9ICkgewogICAgICAgICAgICBuZXh0IE5BVklHQVRJT05fQ09ORklHIGlmICRLZXkgIX4gbXteXGQrfTsKCiAgICAgICAgICAgICMgRklYTUU6IFN1cHBvcnQgYm90aCBvbGQgKEhBU0gpIGFuZCBuZXcgKEFSUkFZIG9mIEhBU0gpIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbnMsIGZvciByZWFzb25zIG9mIGJhY2t3YXJkcwogICAgICAgICAgICAjICAgY29tcGF0aWJpbGl0eS4gT25jZSB3ZSBhcmUgc3VyZSBldmVyeXRoaW5nIGhhcyBiZWVuIG1pZ3JhdGVkIGNvcnJlY3RseSwgc3VwcG9ydCBmb3IgSEFTSC1vbmx5CiAgICAgICAgICAgICMgICBjb25maWd1cmF0aW9uIGNhbiBiZSBkcm9wcGVkIGluIGZ1dHVyZSBtYWpvciByZWxlYXNlLgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkTmF2aWdhdGlvbkNvbmZpZy0+eyRNb2R1bGV9LT57JEtleX0gKSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQE1vZHVsZU5hdmlnYXRpb25Db25maWdzLCAkTmF2aWdhdGlvbkNvbmZpZy0+eyRNb2R1bGV9LT57JEtleX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICROYXZpZ2F0aW9uQ29uZmlnLT57JE1vZHVsZX0tPnskS2V5fSApICkgewogICAgICAgICAgICAgICAgcHVzaCBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3MsIEB7ICROYXZpZ2F0aW9uQ29uZmlnLT57JE1vZHVsZX0tPnskS2V5fSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNraXAgaW5jb21wYXRpYmxlIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dCBOQVZJR0FUSU9OX0NPTkZJRzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgSVRFTToKICAgICAgICBmb3IgbXkgJEl0ZW0gKEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncykgewogICAgICAgICAgICBuZXh0IElURU0gaWYgISRJdGVtLT57TmF2QmFyfTsKCiAgICAgICAgICAgIG15ICRJbmhlcml0UGVybWlzc2lvbnMgPSAwOwoKICAgICAgICAgICAgIyBJbmhlcml0IHBlcm1pc3Npb25zIGZyb20gZnJvbnRlbmQgcmVnaXN0cmF0aW9uIGlmIG5vIHBlcm1pc3Npb25zIHdlcmUgZGVmaW5lZCBmb3IgdGhlIG5hdmlnYXRpb24gZW50cnkuCiAgICAgICAgICAgIGlmICggISRJdGVtLT57R3JvdXBSb30gJiYgISRJdGVtLT57R3JvdXB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkRnJvbnRlbmRNb2R1bGUtPntHcm91cFJvfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0dyb3VwUm99ID0gJEZyb250ZW5kTW9kdWxlLT57R3JvdXBSb307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRGcm9udGVuZE1vZHVsZS0+e0dyb3VwfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0dyb3VwfSA9ICRGcm9udGVuZE1vZHVsZS0+e0dyb3VwfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRJbmhlcml0UGVybWlzc2lvbnMgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU2hvd24gPSAwOwoKICAgICAgICAgICAgUEVSTUlTU0lPTjoKICAgICAgICAgICAgZm9yIG15ICRQZXJtaXNzaW9uIChxdyhHcm91cFJvIEdyb3VwKSkgewoKICAgICAgICAgICAgICAgICMgTm8gYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIHJlZiAkSXRlbS0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRJdGVtLT57R3JvdXBSb30gfQogICAgICAgICAgICAgICAgICAgICYmIHJlZiAkSXRlbS0+e0dyb3VwfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkSXRlbS0+e0dyb3VwfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRTaG93biA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgQXJyYXkgYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+eyRQZXJtaXNzaW9ufSAmJiByZWYgJEl0ZW0tPnskUGVybWlzc2lvbn0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggQHsgJEl0ZW0tPnskUGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyA/ICdybycgOiAncncnLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEhhc1Blcm1pc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTaG93biA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSWYgd2UgcGFzc2VkIHRoZSBpbml0aWFsIHBlcm1pc3Npb24gY2hlY2sgYW5kIGRpZG4ndCBpbmhlcml0IHBlcm1pc3Npb25zIGZyb20gdGhlIG1vZHVsZSByZWdpc3RyYXRpb24sCiAgICAgICAgICAgICMgICBtYWtlIHN1cmUgdG8gYWxzbyBjaGVjayBhY2Nlc3MgdG8gdGhlIG1vZHVsZSwgc2luY2UgbmF2aWdhdGlvbiBpdGVtIG1pZ2h0IGJlIG91dCBvZiBzeW5jLgogICAgICAgICAgICBpZiAoICRTaG93biAmJiAhJEluaGVyaXRQZXJtaXNzaW9ucyApIHsKICAgICAgICAgICAgICAgIG15ICRNb2R1bGVQZXJtaXNzaW9uOwoKICAgICAgICAgICAgICAgIFBFUk1JU1NJT046CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBlcm1pc3Npb24gKHF3KEdyb3VwUm8gR3JvdXApKSB7CgogICAgICAgICAgICAgICAgICAgICMgTm8gYWNjZXNzIHJlc3RyaWN0aW9uLgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgcmVmICRGcm9udGVuZE1vZHVsZS0+eyRNb2R1bGV9LT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRGcm9udGVuZE1vZHVsZS0+eyRNb2R1bGV9LT57R3JvdXBSb30gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRGcm9udGVuZE1vZHVsZS0+eyRNb2R1bGV9LT57R3JvdXB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRNb2R1bGVQZXJtaXNzaW9uID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBBcnJheSBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkRnJvbnRlbmRNb2R1bGUtPnskTW9kdWxlfS0+eyRQZXJtaXNzaW9ufQogICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJEZyb250ZW5kTW9kdWxlLT57JE1vZHVsZX0tPnskUGVybWlzc2lvbn0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIEB7ICRGcm9udGVuZE1vZHVsZS0+eyRNb2R1bGV9LT57JFBlcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkSGFzUGVybWlzc2lvbiA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJFBlcm1pc3Npb24gZXEgJ0dyb3VwUm8nID8gJ3JvJyA6ICdydycsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkSGFzUGVybWlzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRNb2R1bGVQZXJtaXNzaW9uID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBIaWRlIGl0ZW0gaWYgbm8gcGVybWlzc2lvbiB3YXMgZ3JhbnRlZCB0byBhY2Nlc3MgdGhlIG1vZHVsZS4KICAgICAgICAgICAgICAgIGlmICggISRNb2R1bGVQZXJtaXNzaW9uICkgewogICAgICAgICAgICAgICAgICAgICRTaG93biA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgSVRFTSBpZiAhJFNob3duOwoKICAgICAgICAgICAgIyBzZXQgcHJpbyBvZiBpdGVtCiAgICAgICAgICAgIG15ICRLZXkgPSAoICRJdGVtLT57QmxvY2t9IHx8ICcnICkgLiBzcHJpbnRmKCAiJTA3ZCIsICRJdGVtLT57UHJpb30gKTsKICAgICAgICAgICAgQ09VTlQ6CiAgICAgICAgICAgIGZvciAoIDEgLi4gNTEgKSB7CiAgICAgICAgICAgICAgICBsYXN0IENPVU5UIGlmICEkTmF2QmFyTW9kdWxleyRLZXl9OwoKICAgICAgICAgICAgICAgICRJdGVtLT57UHJpb30rKzsKICAgICAgICAgICAgICAgICRLZXkgPSAoICRJdGVtLT57QmxvY2t9IHx8ICcnICkgLiBzcHJpbnRmKCAiJTA3ZCIsICRJdGVtLT57UHJpb30gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTaG93IGFzIG1haW4gbWVudS4KICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1R5cGV9IGVxICdNZW51JyApIHsKICAgICAgICAgICAgICAgICROYXZCYXJNb2R1bGV7JEtleX0gPSAkSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFzIHN1YiBvZiBtYWluIG1lbnUKICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e1R5cGV9IGVxICdTdWJtZW51JyApIHsKICAgICAgICAgICAgICAgICROYXZCYXJNb2R1bGV7U3VifS0+eyAkSXRlbS0+e05hdkJhcn0gfS0+eyRLZXl9ID0gJEl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgcnVuIG1lbnUgaXRlbSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok5hdkJhck1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgfTsKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGVidWcgICAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICVOYXZCYXJNb2R1bGUgPSAoCiAgICAgICAgICAgICAgICAlTmF2QmFyTW9kdWxlLAogICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICAgICAgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICAgICAgTmF2QmFyTW9kdWxlID0+IFwlTmF2QmFyTW9kdWxlIHx8IHt9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFRvdGFsID0ga2V5cyAlTmF2QmFyTW9kdWxlOwoKICAgIGlmICggJE5hdkJhck1vZHVsZXtTdWJ9ICkgewogICAgICAgICRUb3RhbCA9IGludCgkVG90YWwpIC0gMTsKICAgIH0KCiAgICAjIE9ubHkgaGlnaGxpZ2h0IHRoZSBmaXJzdCBtYXRjaGVkIG5hdmlnYXRpb24gZW50cnkuIElmIHRoZXJlIGFyZSBzZXZlcmFsIGVudHJpZXMKICAgICMgICB3aXRoIHRoZSBzYW1lIEFjdGlvbiBhbmQgU3ViYWN0aW9uLCBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aGljaCBvbmUgd2FzIHVzZWQuCiAgICAjICAgVGhlcmVmb3JlIHdlIGp1c3QgaGlnaGxpZ2h0IHRoZSBmaXJzdCBvbmUuCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVOYXZCYXJNb2R1bGUgKSB7CiAgICAgICAgbmV4dCBJVEVNIGlmICEleyAkTmF2QmFyTW9kdWxleyRJdGVtfSB9OwogICAgICAgIG5leHQgSVRFTSBpZiAkSXRlbSBlcSAnU3ViJzsKCiAgICAgICAgbXkgJFNWR1N0cmluZzsKICAgICAgICBpZiAoICROYXZCYXJNb2R1bGV7JEl0ZW19e3N2Z0ljb259ICkgewogICAgICAgICAgICBpZiAoICROYXZCYXJNb2R1bGV7JEl0ZW19e3N2Z0ljb259ICF+IC9cLnN2ZyQvaSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEl0ZW06ICdzdmdJY29uJyBoYXMgdG8gYmUgYW4gLnN2Zy1maWxlISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSG9tZSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdIb21lJyk7CiAgICAgICAgICAgIG15ICRTVkdSZWYgPSAkTWFpbk9iamVjdC0+RmlsZVJlYWQoCiAgICAgICAgICAgICAgICBMb2NhdGlvbiA9PiAiJEhvbWUvJE5hdkJhck1vZHVsZXskSXRlbX17c3ZnSWNvbn0iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTVkdSZWYpIHsKICAgICAgICAgICAgICAgICRTVkdTdHJpbmcgPSAkeyRTVkdSZWZ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgQ2FsbGVyICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3Qgb3BlbiAkTmF2QmFyTW9kdWxleyRJdGVtfXtzdmdJY29ufTogJCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1c2UgdGhlIHJvdW5kIE9UT0JPIE8gYXMgdGhlIGRlZmF1bHQgaWNvbgogICAgICAgIGlmICggISRTVkdTdHJpbmcgKSB7CiAgICAgICAgICAgICRTVkdTdHJpbmcgPQoKICAgICAgICAgICAgICAgICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaWQ9InJhZGlvX2J1dHRvbl91bmNoZWNrZWQtMjRweCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiB2aWV3Qm94PSIwIDAgNTAgNTAiPgogICAgPGRlZnM+CiAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAuY2xzLTF7ZmlsbDpub25lfQogICAgICAgIDwvc3R5bGU+CiAgICA8L2RlZnM+CiAgICA8cGF0aCBpZD0iUGZhZF8xMzczNSIgZD0iTTAgMGg1MHY1MEgweiIgY2xhc3M9ImNscy0xIiBkYXRhLW5hbWU9IlBmYWQgMTM3MzUiLz4KICAgIDxwYXRoIGlkPSJQZmFkXzEzNzM2IiBkPSJNMjIuNjM3IDJhMjAuNjM3IDIwLjYzNyAwIDEgMCAyMC42MzggMjAuNjM3QTIwLjY0NSAyMC42NDUgMCAwIDAgMjIuNjM3IDJ6bTAgMzcuMTQ3YTE2LjUxIDE2LjUxIDAgMSAxIDE2LjUxLTE2LjUxIDE2LjUwNSAxNi41MDUgMCAwIDEtMTYuNTEgMTYuNTF6IiBkYXRhLW5hbWU9IlBmYWQgMTM3MzYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMzYzIDIuMzYyKSIvPgogPC9zdmc+JzsKCiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJE5hdkJhck1vZHVsZXskSXRlbX0tPntCbG9ja30gfHwgJ0l0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7ICROYXZCYXJNb2R1bGV7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICBTVkcgPT4gJFNWR1N0cmluZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgcnVuIG5vdGlmaWNhdGlvbiBtb2R1bGVzCiAgICBteSAkRnJvbnRlbmROb3RpZnlNb2R1bGVDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok5vdGlmeU1vZHVsZScpOwogICAgaWYgKCByZWYgJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICRGcm9udGVuZE5vdGlmeU1vZHVsZUNvbmZpZy0+JSo7CgogICAgICAgIEpPQjoKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgSk9CIGlmICEkT2JqZWN0OwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb259IC49ICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICApOwogICAgJFBhcmFte1VzZXJOYW1lfSA9ICIkVXNlcntVc2VyRmlyc3RuYW1lfSAkVXNlcntVc2VyTGFzdG5hbWV9IjsKCiAgICAjIGdlbmVyYXRlIGF2YXRhcgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpBdmF0YXJFbmdpbmUnKSBlcSAnR3JhdmF0YXInICYmICRTZWxmLT57VXNlckVtYWlsfSApIHsKICAgICAgICBteSAkRGVmYXVsdEljb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpHcmF2YXRhcjo6RGVmYXVsdEltYWdlJykgfHwgJ21tJzsKICAgICAgICAkUGFyYW17QXZhdGFyfSA9ICcvL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLycgLiBtZDVfaGV4KCBsYyAkU2VsZi0+e1VzZXJFbWFpbH0gKSAuICc/cz0xMDAmZD0nIC4gJERlZmF1bHRJY29uOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1VzZXJJbml0aWFsc30gPSBzdWJzdHIoICRVc2Vye1VzZXJGaXJzdG5hbWV9LCAwLCAxICkgLiBzdWJzdHIoICRVc2Vye1VzZXJMYXN0bmFtZX0sIDAsIDEgKTsKICAgIH0KCiAgICAjIGRlZmluZSAoY3VzdG9tKSBsb2dvCiAgICBteSAkV2ViUGF0aCA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICRQYXJhbXtVUkxMb2dvfSAgID0gJFdlYlBhdGggLiAnc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9pbWcvb3RvYm9fbG9nb19zaW1wbGVfdy5zdmcnOwogICAgJFBhcmFte1VSTFNpZ25ldH0gPSAkV2ViUGF0aCAuICdza2lucy9DdXN0b21lci9kZWZhdWx0L2ltZy9vdG9ib19zaWduZXRfdy5zdmcnOwogICAgaWYgKCBkZWZpbmVkICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJMb2dvJykgKSB7CiAgICAgICAgbXkgJUN1c3RvbWVyTG9nbyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJMb2dvJykgfTsKCiAgICAgICAgTE9HTzoKICAgICAgICBmb3IgbXkgJFN0YXRlbWVudCAocXcoVVJMTG9nbyBVUkxTaWduZXQpKSB7CiAgICAgICAgICAgIG5leHQgTE9HTyBpZiAhJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fTsKCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fSAhfiAvKGh0dHB8ZnRwfGh0dHBzKTpcLy9pICkgewogICAgICAgICAgICAgICAgJFBhcmFteyRTdGF0ZW1lbnR9ID0gJFdlYlBhdGggLiAkQ3VzdG9tZXJMb2dveyRTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFteyRTdGF0ZW1lbnR9ID0gJEN1c3RvbWVyTG9nb3skU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHdoZXRoZXIgY3VzdG9tZXIgcHJlZmVyZW5jZXMgc2hvdWxkIGJlIHNob3duCiAgICBQRVJNSVNTSU9OOgogICAgZm9yIG15ICRQZXJtaXNzaW9uIChxdyhHcm91cFJvIEdyb3VwKSkgewoKICAgICAgICAjIE5vIGFjY2VzcyByZXN0cmljdGlvbi4KICAgICAgICBpZiAoCiAgICAgICAgICAgIHJlZiAkRnJvbnRlbmRNb2R1bGUtPntDdXN0b21lclByZWZlcmVuY2VzfS0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkRnJvbnRlbmRNb2R1bGUtPntDdXN0b21lclByZWZlcmVuY2VzfS0+e0dyb3VwUm99IH0KICAgICAgICAgICAgJiYgcmVmICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57R3JvdXB9IGVxICdBUlJBWScKICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkRnJvbnRlbmRNb2R1bGUtPntDdXN0b21lclByZWZlcmVuY2VzfS0+e0dyb3VwfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtTaG93UHJlZmVyZW5jZXN9ID0gMTsKICAgICAgICAgICAgbGFzdCBQRVJNSVNTSU9OOwogICAgICAgIH0KCiAgICAgICAgIyBBcnJheSBhY2Nlc3MgcmVzdHJpY3Rpb24uCiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkRnJvbnRlbmRNb2R1bGUtPntDdXN0b21lclByZWZlcmVuY2VzfS0+eyRQZXJtaXNzaW9ufQogICAgICAgICAgICAmJiByZWYgJEZyb250ZW5kTW9kdWxlLT57Q3VzdG9tZXJQcmVmZXJlbmNlc30tPnskUGVybWlzc2lvbn0gZXEgJ0FSUkFZJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIEB7ICRGcm9udGVuZE1vZHVsZS0+e0N1c3RvbWVyUHJlZmVyZW5jZXN9LT57JFBlcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkR3JvdXA7CiAgICAgICAgICAgICAgICBteSAkSGFzUGVybWlzc2lvbiA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRHcm91cCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJFBlcm1pc3Npb24gZXEgJ0dyb3VwUm8nID8gJ3JvJyA6ICdydycsCgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkSGFzUGVybWlzc2lvbikgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtTaG93UHJlZmVyZW5jZXN9ID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyTmF2aWdhdGlvbkJhcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKfQoKc3ViIEN1c3RvbWVyRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScKICAgICkgfHwgJyc7CiAgICBpZiAoICEkUGFyYW17QmFja2VuZE1lc3NhZ2V9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUGFyYW17TWVzc2FnZX0gfHwgJz8nLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0JhY2tlbmRNZXNzYWdlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+R2V0TG9nRW50cnkoCiAgICAgICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScKICAgICAgICApIHx8ICcnOwogICAgfQoKICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkUGFyYW17QmFja2VuZE1lc3NhZ2V9OwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckVycm9yJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKc3ViIEN1c3RvbWVyRXJyb3JTY3JlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKSwKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJFcnJvciglUGFyYW0pLAogICAgICAgICRTZWxmLT5DdXN0b21lckZvb3RlcigpOwp9CgpzdWIgQ3VzdG9tZXJXYXJuaW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYmFja2VuZCBlcnJvciBtZXNzYWdlcwogICAgJFBhcmFte0JhY2tlbmRNZXNzYWdlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+R2V0TG9nRW50cnkoCiAgICAgICAgVHlwZSA9PiAnTm90aWNlJywKICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICApCiAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICApIHx8ICcnOwoKICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkUGFyYW17QmFja2VuZE1lc3NhZ2V9OwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lcldhcm5pbmcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgQ3VzdG9tZXJOb1Blcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkV2l0aEhlYWRlciA9ICRQYXJhbXtXaXRoSGVhZGVyfSB8fCAneWVzJzsKCiAgICAkUGFyYW17TWVzc2FnZX0gfHw9IFRyYW5zbGF0YWJsZSgnTm8gUGVybWlzc2lvbiEnKTsKCiAgICAjIGNyZWF0ZSBvdXRwdXQKICAgIG15ICRPdXRwdXQ7CiAgICAkT3V0cHV0ID0gJFNlbGYtPkN1c3RvbWVySGVhZGVyKCBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ05vIFBlcm1pc3Npb24nKSApIGlmICRXaXRoSGVhZGVyIGVxICd5ZXMnOwogICAgJE91dHB1dCAuPSAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnTm9QZXJtaXNzaW9uJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPkN1c3RvbWVyRm9vdGVyKCkgaWYgJFdpdGhIZWFkZXIgZXEgJ3llcyc7CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJE91dHB1dDsKfQoKIyBzaW1pbGFyIHRvIEN1c3RvbWVyRXJyb3IoKSBidXQgbmVpdGhlciB0aGUgbGFzdCBsb2cgbWVzc2FnZSBub3IgdGhlIGJhY2t0cmFjZSBpcyBwcmludGVkCnN1YiBQdWJsaWNFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dCwgdXNpbmcgdGhlIHNhbWUgbGF5b3V0IGFzIGluIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJFcnJvcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cn0KCiMgdXNpbmcgUHVibGljRXJyb3IoKSBpbnRlcm5hbGx5CnN1YiBQdWJsaWNGYXRhbEVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBQcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uIGluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCBUZW1wbGF0ZSBlbmdpbmUuCiAgICByZXR1cm4gaWYgJFNlbGYtPntJbkZhdGFsRXJyb3J9Kys7CgogICAgaWYgKCAkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRPdXRwdXQgPSBqb2luICcnLAogICAgICAgICRTZWxmLT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgQXJlYSAgPT4gJ0Zyb250ZW5kJywKICAgICAgICAgICAgVGl0bGUgPT4gJ0ZhdGFsIEVycm9yJwogICAgICAgICksCiAgICAgICAgJFNlbGYtPlB1YmxpY0Vycm9yKCVQYXJhbSksICAgICMgd2l0aG91dCBsYXN0IGVycm9yIG1lc3NhZ2UgYW5kIHdpdGhvdXQgbGFzdCB0cmFjZWJhY2sKICAgICAgICAkU2VsZi0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAjIE1vZGlmeSB0aGUgb3V0cHV0IGJ5IGFwcGx5aW5nIHRoZSBvdXRwdXQgZmlsdGVycy4KICAgICRPdXRwdXQgPSAkU2VsZi0+QXBwbHlPdXRwdXRGaWx0ZXJzKCBPdXRwdXQgPT4gJE91dHB1dCApOwoKICAgICMgVGhlIENvbnRlbnQtTGVuZ3RoIHdpbGwgYmUgc2V0IGxhdGVyIGluIHRoZSBtaWRkbGV3YXJlIFBsYWNrOjpNaWRkbGV3YXJlOjpDb250ZW50TGVuZ3RoLiBUaGlzIHJlcXVpcmVzIHRoYXQKICAgICMgdGhlcmUgYXJlIG5vIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgZGVsaXZlcmVkIGNvbnRlbnQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgbWlkZGxld2FyZQogICAgIyB1c2VzIGNvcmU6Omxlbmd0aCgpIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudCBsZW5ndGguCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCggXCRPdXRwdXQgKTsKCiAgICAjIFRoZSBPVE9CTyByZXNwb25zZSBvYmplY3QgYWxyZWFkeSBoYXMgdGhlIEhUUFAgaGVhZGVycy4KICAgICMgRW5oYW5jZSBpdCB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFuZCB0aGUgY29udGVudC4KICAgIG15ICRQbGFja1Jlc3BvbnNlID0gUGxhY2s6OlJlc3BvbnNlLT5uZXcoCiAgICAgICAgMjAwLAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyktPkhlYWRlcnMoKSwKICAgICAgICAkT3V0cHV0CiAgICApOwoKICAgICMgVGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYmUgUGxhY2s6Ok1pZGRsZXdhcmU6OkhUVFBFeGNlcHRpb25zCiAgICBkaWUgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uLT5uZXcoCiAgICAgICAgUGxhY2tSZXNwb25zZSA9PiAkUGxhY2tSZXNwb25zZQogICAgKTsKfQoKIyB1c2luZyBQdWJsaWNFcnJvcigpIGludGVybmFsbHkKc3ViIFB1YmxpY0Vycm9yU2NyZWVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGpvaW4gJycsCiAgICAgICAgJFNlbGYtPkN1c3RvbWVySGVhZGVyKCBUaXRsZSA9PiAnRXJyb3InICksCiAgICAgICAgJFNlbGYtPlB1YmxpY0Vycm9yKCVQYXJhbSksCiAgICAgICAgJFNlbGYtPkN1c3RvbWVyRm9vdGVyKCk7Cn0KCj1oZWFkMiBBc2NpaTJSaWNoVGV4dCgpCgpjb252ZXJ0cyB0ZXh0IHRvIHJpY2ggdGV4dAoKICAgIG15ICRIVE1MU3RyaW5nID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgU3RyaW5nID0+ICRUZXh0U3RyaW5nLAogICAgKTsKCj1jdXQKCnN1YiBBc2NpaTJSaWNoVGV4dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFN0cmluZykpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzY2lpIDIgaHRtbAogICAgJFBhcmFte1N0cmluZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWhlYWQyIFJpY2hUZXh0MkFzY2lpKCkKCmNvbnZlcnRzIHRleHQgdG8gcmljaCB0ZXh0CgogICAgbXkgJFRleHRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICBTdHJpbmcgPT4gJEhUTUxTdHJpbmcsCiAgICApOwoKPWN1dAoKc3ViIFJpY2hUZXh0MkFzY2lpIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNjaWkgMiBodG1sCiAgICAkUGFyYW17U3RyaW5nfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWhlYWQyIFJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgpCgoxKSBhZGQgaHRtbCwgYm9keSwgLi4uIHRhZ3MgdG8gYmUgYSB2YWxpZCBodG1sIGRvY3VtZW50CjIpIHJlcGxhY2UgbGlua3Mgb2YgaW5saW5lIGNvbnRlbnQgZS4gZy4gaW1hZ2VzIHRvIDxpbWcgc3JjPSJjaWQ6eHh4eCIgLz4KCiAgICAkSFRNTEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgU3RyaW5nID0+ICRIVE1MQm9keSwKICAgICk7Cgo9Y3V0CgpzdWIgUmljaFRleHREb2N1bWVudENvbXBsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpbWFnZSBsaW5rIHdpdGggY29udGVudCBpZCBmb3IgdXBsb2FkZWQgaW1hZ2VzCiAgICBteSAkU3RyaW5nUmVmID0gJFNlbGYtPl9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50KAogICAgICAgIFN0cmluZyA9PiBcJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICRQYXJhbXtTdHJpbmd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgIFN0cmluZyAgPT4gJHskU3RyaW5nUmVmfSwKICAgICAgICBDaGFyc2V0ID0+ICRTZWxmLT57VXNlckNoYXJzZXR9LAogICAgKTsKCiAgICAjIGRvIGNvcnJlY3QgZGlyZWN0aW9uCiAgICBpZiAoICRTZWxmLT57VGV4dERpcmVjdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte1N0cmluZ30gPX4gcy88Ym9keS88Ym9keSBkaXI9IiRTZWxmLT57VGV4dERpcmVjdGlvbn0iL2k7CiAgICB9CgogICAgIyBmaWx0ZXIgbGlua3MgaW4gcmVzcG9uc2UKICAgICRQYXJhbXtTdHJpbmd9ID0gJFNlbGYtPkhUTUxMaW5rUXVvdGUoIFN0cmluZyA9PiAkUGFyYW17U3RyaW5nfSApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50KCkKCnJlcGxhY2UgbGlua3Mgb2YgaW5saW5lIGNvbnRlbnQgZS4gZy4gaW1hZ2VzCgogICAgJEhUTUxCb2R5U3RyaW5nUmVmID0gJExheW91dE9iamVjdC0+X1JpY2hUZXh0UmVwbGFjZUxpbmtPZklubGluZUNvbnRlbnQoCiAgICAgICAgU3RyaW5nID0+ICRIVE1MQm9keVN0cmluZ1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX1JpY2hUZXh0UmVwbGFjZUxpbmtPZklubGluZUNvbnRlbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTdHJpbmcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpbWFnZSBsaW5rIHdpdGggY29udGVudCBpZCBmb3IgdXBsb2FkZWQgaW1hZ2VzCiAgICAkeyAkUGFyYW17U3RyaW5nfSB9ID1+IHN7CiAgICAgICAgKDxpbWcuKz9zcmM9KCJ8JykpW14iJz5dKz9Db250ZW50SUQ9KC4rPykoInwnKShbXj5dKj4pCiAgICB9CiAgICB7CiAgICAgICAgbXkgKCRTdGFydCwgJENJRCwgJENsb3NlLCAkRW5kKSA9ICgkMSwgJDMsICQ0LCAkNSk7CiAgICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZXQgdGhlIENJRCBhbmQgbm90IGV4dHJhIHN0dWZmIGxpa2Ugc2Vzc2lvbiBpbmZvcm1hdGlvbgogICAgICAgICRDSUQgPX4gc3teKFteOyZdKykuKn17JDF9c214OwogICAgICAgICRTdGFydCAuICdjaWQ6JyAuICRDSUQgLiAkQ2xvc2UgLiAkRW5kOwogICAgfWVzZ3hpOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWVuZCBJbnRlcm5hbDoKCj1oZWFkMiBSaWNoVGV4dERvY3VtZW50U2VydmUoKQoKU2VydmUgYSByaWNoIHRleHQgKEhUTUwpIGRvY3VtZW50IGZvciBsb2NhbCB2aWV3IGluc2lkZSBvZiBhbiBDPGlmcmFtZT4gaW4gY29ycmVjdCBjaGFyc2V0IGFuZCB3aXRoIGNvcnJlY3QgbGlua3MgZm9yCmlubGluZSBkb2N1bWVudHMuCgpCeSBkZWZhdWx0LCBhbGwgaW5saW5lL2FjdGl2ZSBjb250ZW50IChzdWNoIGFzIEM8c2NyaXB0PiwgQzxvYmplY3Q+LCBDPGFwcGxldD4gb3IgQzxlbWJlZD4gdGFncykgd2lsbCBiZSBzdHJpcHBlZC4gSWYKdGhlcmUgYXJlIGV4dGVybmFsIGltYWdlcywgdGhleSB3aWxsIGJlIHN0cmlwcGVkIHRvbywgYnV0IGEgbWVzc2FnZSB3aWxsIGJlIHNob3duIGFsbG93aW5nIHRoZSB1c2VyIHRvIHJlbG9hZCB0aGUgcGFnZQpzaG93aW5nIHRoZSBleHRlcm5hbCBpbWFnZXMuCgogICAgbXkgJUhUTUxGaWxlID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudFNlcnZlKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSFRNTEJvZHlSZWYsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiJywKICAgICAgICB9LAogICAgICAgIFVSTCAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldEF0dGFjaG1lbnQ7U3ViYWN0aW9uPUhUTUxWaWV3O1RpY2tldElEPTEyMztBcnRpY2xlSUQ9MTIzO0ZpbGVJRD0nLAogICAgICAgIEF0dGFjaG1lbnRzICAgICAgID0+IFwlQXR0YWNobWVudExpc3RPZklubGluZUF0dGFjaG1lbnRzLAoKICAgICAgICBMb2FkSW5saW5lQ29udGVudCA9PiAwLCAgICAgIyBTZXJ2ZSB0aGUgZG9jdW1lbnQgaW5jbHVkaW5nIGFsbCBpbmxpbmUgY29udGVudC4gV0FSTklORzogVGhpcyBtaWdodCBiZSBkYW5nZXJvdXMuCgogICAgICAgIExvYWRFeHRlcm5hbEltYWdlcyA9PiAwLCAgICAjIExvYWQgZXh0ZXJuYWwgaW1hZ2VzPyBJZiB0aGlzIGlzIDAsIGEgbWVzc2FnZSB3aWxsIGJlIGluY2x1ZGVkIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0ZXJuYWwgaW1hZ2VzIHdlcmUgZm91bmQgYW5kIHJlbW92ZWQuCiAgICApOwoKPWN1dAoKc3ViIFJpY2hUZXh0RG9jdW1lbnRTZXJ2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KERhdGEgVVJMIEF0dGFjaG1lbnRzKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IGNoYXJzZXQgZnJvbSBwYXNzZWQgY29udGVudCB0eXBlIHBhcmFtZXRlci4KICAgIG15ICRDaGFyc2V0OwogICAgaWYgKCAkUGFyYW17RGF0YX0tPntDb250ZW50VHlwZX0gPX4gbS8uKz9jaGFyc2V0PSgifCd8KSguKykvaWcgKSB7CiAgICAgICAgJENoYXJzZXQgPSAkMjsKICAgICAgICAkQ2hhcnNldCA9fiBzLyJ8Jy8vZzsKICAgIH0KICAgIGlmICggISRDaGFyc2V0ICkgewogICAgICAgICRDaGFyc2V0ID0gJ3VzLWFzY2lpJzsKICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50VHlwZX0gLj0gJzsgY2hhcnNldD0idXMtYXNjaWkiJzsKICAgIH0KCiAgICAjIENvbnZlcnQgdG8gaW50ZXJuYWwgY2hhcnNldC4KICAgIGlmICgkQ2hhcnNldCkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5Db252ZXJ0KAogICAgICAgICAgICBUZXh0ICA9PiAkUGFyYW17RGF0YX0tPntDb250ZW50fSwKICAgICAgICAgICAgRnJvbSAgPT4gJENoYXJzZXQsCiAgICAgICAgICAgIFRvICAgID0+ICd1dGYtOCcsCiAgICAgICAgICAgIENoZWNrID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBSZXBsYWNlIGNoYXJzZXQgaW4gY29udGVudCB0eXBlIGFuZCBjb250ZW50LgogICAgICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnRUeXBlfSA9fiBzL1xRJENoYXJzZXRcRS91dGYtOC9naTsKICAgICAgICBpZiAoICEoICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID1+IHMvKDxtZXRhW14+XStjaGFyc2V0PSgifCd8KSlcUSRDaGFyc2V0XEUvJDF1dGYtOC9naSApICkgewoKICAgICAgICAgICAgIyBBZGQgZXhwbGljaXQgY2hhcnNldCBpZiBtaXNzaW5nLgogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fQogICAgICAgICAgICAgICAgPX4gcy8oPG1ldGEgW14+XSsgaHR0cC1lcXVpdj0oInwnKT9Db250ZW50LVR5cGUoInwnKT8gW14+XSsgY29udGVudD0oInwnKT9bXjsiJz5dKykvJDE7IGNoYXJzZXQ9dXRmLTgvaXhtczsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgaHRtbCBsaW5rcwogICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPSAkU2VsZi0+SFRNTExpbmtRdW90ZSgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57Q29udGVudH0sCiAgICApOwoKICAgICMgY2xlYW51cCBzb21lIGh0bWwgdGFncyB0byBiZSBjcm9zcyBicm93c2VyIGNvbXBhdC4KICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID0gJFNlbGYtPlJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntDb250ZW50fSwKICAgICk7CgogICAgIyBzYWZldHkgY2hlY2sKICAgIGlmICggISRQYXJhbXtMb2FkSW5saW5lQ29udGVudH0gKSB7CgogICAgICAgICMgU3RyaXAgb3V0IGFjdGl2ZSBjb250ZW50IGZpcnN0LCBrZWVwaW5nIGV4dGVybmFsIGltYWdlcy4KICAgICAgICBteSAlQ29tbW9uU2FmZXR5UGFyYW1zID0gKAogICAgICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICAgICAgTm9PYmplY3QgICAgID0+IDEsCiAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICBOb1NWRyAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm9JbnRTcmNMb2FkID0+IDAsCiAgICAgICAgICAgIE5vSmF2YVNjcmlwdCA9PiAxLAogICAgICAgICAgICBEZWJ1ZyAgICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgKTsKICAgICAgICBteSAlU2FmZXR5Q2hlY2tSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9LAogICAgICAgICAgICAlQ29tbW9uU2FmZXR5UGFyYW1zLAogICAgICAgICAgICBOb0V4dFNyY0xvYWQgPT4gMCwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9ICRTYWZldHlDaGVja1Jlc3VsdHtTdHJpbmd9OwoKICAgICAgICBpZiAoICEkUGFyYW17TG9hZEV4dGVybmFsSW1hZ2VzfSApIHsKCiAgICAgICAgICAgICMgU3RyaXAgb3V0IGV4dGVybmFsIGNvbnRlbnQuCiAgICAgICAgICAgIG15ICVTYWZldHlDaGVja1Jlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+U2FmZXR5KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgJUNvbW1vblNhZmV0eVBhcmFtcywKICAgICAgICAgICAgICAgIE5vRXh0U3JjTG9hZCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKCiAgICAgICAgICAgICMgU2hvdyBjb25maXJtYXRpb24gYnV0dG9uIHRvIGxvYWQgZXh0ZXJuYWwgY29udGVudCBleHBsaWNpdGx5IG9ubHkgaWYgQmxvY2tMb2FkaW5nUmVtb3RlQ29udGVudCBpcyBkaXNhYmxlZC4KICAgICAgICAgICAgIyAkU2FmZXR5Q2hlY2tSZXN1bHR7UmVwbGFjZX0gZG9lcyBub3Qgc2hvdyBhbGwgcmVwbGFjZW1lbnRzLCBidXQgYXQgbGVhc3QgdGhvc2UgdGhhdCBhcmUKICAgICAgICAgICAgIyB0cmlnZ2VyZWQgYnkgTm9FeHRTcmNMb2FkLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2FmZXR5Q2hlY2tSZXN1bHR7UmVwbGFjZX0KICAgICAgICAgICAgICAgICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSBibG9ja2VyIG1lc3NhZ2UuCiAgICAgICAgICAgICAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQXR0YWNobWVudEJsb2NrZXInICk7CgogICAgICAgICAgICAgICAgIyBBZGQgaXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYm9keSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSBwcmVwZW5kIGl0LgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9fiAvPGJvZHkuKj8+L3NpICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9ID1+IHMvKDxib2R5Lio/PikvJDFcbiRNZXNzYWdlL3NpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPSAkTWVzc2FnZSAuICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgYmFzZSB1cmwgZm9yIGlubGluZSBpbWFnZXMKICAgIG15ICRTZXNzaW9uSUQgPSAnJzsKICAgIGlmICggJFNlbGYtPntTZXNzaW9uSUR9ICYmICEkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0gKSB7CiAgICAgICAgJFNlc3Npb25JRCA9ICc7JyAuICRTZWxmLT57U2Vzc2lvbk5hbWV9IC4gJz0nIC4gJFNlbGYtPntTZXNzaW9uSUR9OwogICAgfQoKICAgICMgcmVwbGFjZSBpbmxpbmUgaW1hZ2VzIGluIGNvbnRlbnQgd2l0aCBydW50aW1lIHVybCB0byBpbWFnZXMKICAgIG15ICRBdHRhY2htZW50TGluayA9ICRTZWxmLT57QmFzZWxpbmt9IC4gJFBhcmFte1VSTH07CiAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9fiBzewogICAgICAgICg9fCJ8JyljaWQ6KC4qPykoInwnfD58XC8+fFxzKQogICAgfQogICAgewogICAgICAgIG15ICRTdGFydD0gJDE7CiAgICAgICAgbXkgJENvbnRlbnRJRCA9ICQyOwogICAgICAgIG15ICRFbmQgPSAkMzsKCiAgICAgICAgIyBpbXByb3ZlIGh0bWwgcXVhbGl0eQogICAgICAgIGlmICggJFN0YXJ0IG5lICciJyAmJiAkU3RhcnQgbmUgJ1wnJyApIHsKICAgICAgICAgICAgJFN0YXJ0IC49ICciJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRW5kIG5lICciJyAmJiAkRW5kIG5lICdcJycgKSB7CiAgICAgICAgICAgICRFbmQgPSAnIicgLiAkRW5kOwogICAgICAgIH0KCiAgICAgICAgIyBmaW5kIG1hdGNoaW5nIGF0dGFjaG1lbnQgYW5kIHJlcGxhY2UgaXQgd2l0aCBydW50aW1lIHVybCB0byBpbWFnZQogICAgICAgIEFUVEFDSE1FTlRfSUQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50SUQgKCAgc29ydCBrZXlzICV7ICRQYXJhbXtBdHRhY2htZW50c30gfSkgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlRfSUQgaWYgbGMgJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfSBuZSBsYyAiPCRDb250ZW50SUQ+IjsKICAgICAgICAgICAgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50TGluayAuICRBdHRhY2htZW50SUQgLiAkU2Vzc2lvbklEOwogICAgICAgICAgICBsYXN0IEFUVEFDSE1FTlRfSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBuZXcgcnVudGltZSB1cmwKICAgICAgICAkU3RhcnQgLiAkQ29udGVudElEIC4gJEVuZDsKICAgIH1lZ3hpOwoKICAgICMgYnVnICM1MDUzCiAgICAjIGlubGluZSBpbWFnZXMgdXNpbmcgQ29udGVudC1Mb2NhdGlvbiBhcyBpZGVudGlmaWVyIGluc3RlYWQgb2YgQ29udGVudC1JRCBldmVuIFJGQzI1NTcKICAgICMgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjU1Ny50eHQKCiAgICAjIGZpbmQgbWF0Y2hpbmcgYXR0YWNobWVudCBhbmQgcmVwbGFjZSBpdCB3aXRoIHJ1bnRsaW1lIHVybCB0byBpbWFnZQogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudElEICggc29ydCBrZXlzICV7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRQYXJhbXtBdHRhY2htZW50c30tPnskQXR0YWNobWVudElEfS0+e0NvbnRlbnRJRH07CgogICAgICAgICMgY29udGVudCBpZCBjbGVhbnVwCiAgICAgICAgJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfSA9fiBzL148Ly87CiAgICAgICAgJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfSA9fiBzLz4kLy87CgogICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfTsKCiAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPX4gc3sKICAgICAgICAoPXwifCcpKFxRJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfVxFKSgifCd8PnxcLz58XHMpCiAgICB9CiAgICB7CiAgICAgICAgbXkgJFN0YXJ0PSAkMTsKICAgICAgICBteSAkQ29udGVudElEID0gJDI7CiAgICAgICAgbXkgJEVuZCA9ICQzOwoKICAgICAgICAjIGltcHJvdmUgaHRtbCBxdWFsaXR5CiAgICAgICAgaWYgKCAkU3RhcnQgbmUgJyInICYmICRTdGFydCBuZSAnXCcnICkgewogICAgICAgICAgICAkU3RhcnQgLj0gJyInOwogICAgICAgIH0KICAgICAgICBpZiAoICRFbmQgbmUgJyInICYmICRFbmQgbmUgJ1wnJyApIHsKICAgICAgICAgICAgJEVuZCA9ICciJyAuICRFbmQ7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBuZXcgcnVudGltZSB1cmwKICAgICAgICAkQ29udGVudElEID0gJEF0dGFjaG1lbnRMaW5rIC4gJEF0dGFjaG1lbnRJRCAuICRTZXNzaW9uSUQ7CiAgICAgICAgJFN0YXJ0IC4gJENvbnRlbnRJRCAuICRFbmQ7CiAgICB9ZWd4aTsKICAgIH0KCiAgICByZXR1cm4gJXsgJFBhcmFte0RhdGF9IH07Cn0KCj1oZWFkMiBSaWNoVGV4dERvY3VtZW50Q2xlYW51cCgpCgpwbGVhc2Ugc2VlIEw8S2VybmVsOjpTeXN0ZW06OkhUTUw6OkxheW91dDo6RG9jdW1lbnRDbGVhbnVwKCk+Cgo9Y3V0CgpzdWIgUmljaFRleHREb2N1bWVudENsZWFudXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTdHJpbmcpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1N0cmluZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkRvY3VtZW50Q2xlYW51cCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSgpCgpjcmVhdGUgdGhlIG9wdGlvbiBoYXNoCgogICAgbXkgJE9wdGlvblJlZiA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIG15ICRPcHRpb25SZWYgPSB7CiAgICAgICAgU29ydCAgICAgICAgID0+ICdudW1lcmljJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgfQoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IFNlbGVjdGVkSUQgb3B0aW9uCiAgICBteSAkT3B0aW9uUmVmID0ge307CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1NlbGVjdGVkSUR9ICkgewogICAgICAgIGlmICggcmVmICRQYXJhbXtTZWxlY3RlZElEfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJEtleSAoIEB7ICRQYXJhbXtTZWxlY3RlZElEfSB9ICkgewogICAgICAgICAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkSUR9LT57JEtleX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3B0aW9uUmVmLT57U2VsZWN0ZWRJRH0tPnsgJFBhcmFte1NlbGVjdGVkSUR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBTZWxlY3RlZFZhbHVlIG9wdGlvbgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICBpZiAoIHJlZiAkUGFyYW17U2VsZWN0ZWRWYWx1ZX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgZm9yIG15ICRWYWx1ZSAoIEB7ICRQYXJhbXtTZWxlY3RlZFZhbHVlfSB9ICkgewogICAgICAgICAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9LT57JFZhbHVlfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfS0+eyAkUGFyYW17U2VsZWN0ZWRWYWx1ZX0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IFNvcnQgb3B0aW9uCiAgICAkT3B0aW9uUmVmLT57U29ydH0gPSAwOwogICAgaWYgKCAkUGFyYW17U29ydH0gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnR9ID0gJFBhcmFte1NvcnR9OwogICAgfQoKICAgICMgbG9vayBpZiBhIGluZGl2aWR1YWwgc29ydCBpcyBhdmFpbGFibGUKICAgIGlmICggJFBhcmFte1NvcnRJbmRpdmlkdWFsfSAmJiByZWYgJFBhcmFte1NvcnRJbmRpdmlkdWFsfSBlcSAnQVJSQVknICkgewogICAgICAgICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gPSAkUGFyYW17U29ydEluZGl2aWR1YWx9OwogICAgfQoKICAgICMgc2V0IFNvcnRSZXZlcnNlIG9wdGlvbgogICAgJE9wdGlvblJlZi0+e1NvcnRSZXZlcnNlfSA9IDA7CiAgICBpZiAoICRQYXJhbXtTb3J0UmV2ZXJzZX0gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnRSZXZlcnNlfSA9IDE7CiAgICB9CgogICAgIyBzZXQgVHJhbnNsYXRpb24gb3B0aW9uCiAgICAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ID0gMTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VHJhbnNsYXRpb259ICYmICRQYXJhbXtUcmFuc2xhdGlvbn0gPT0gMCApIHsKICAgICAgICAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ID0gMDsKICAgIH0KCiAgICAjIGNvcnJlY3Rpbmcgc2VsZWN0ZWQgdmFsdWUgaGFzaCBpZiB0cmFuc2xhdGlvbiBpcyBvbgogICAgaWYgKAogICAgICAgICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0KICAgICAgICAmJiAkT3B0aW9uUmVmLT57U2VsZWN0ZWRWYWx1ZX0KICAgICAgICAmJiByZWYgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9IGVxICdIQVNIJwogICAgICAgICkKICAgIHsKICAgICAgICBteSAlU2VsZWN0ZWRWYWx1ZU5ldzsKICAgICAgICBmb3IgbXkgJE9yaWdpbmFsS2V5ICggc29ydCBrZXlzICV7ICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfSB9ICkgewogICAgICAgICAgICBteSAkVHJhbnNsYXRlZEtleSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJE9yaWdpbmFsS2V5KTsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWVOZXd7JFRyYW5zbGF0ZWRLZXl9ID0gMTsKICAgICAgICB9CiAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9ID0gXCVTZWxlY3RlZFZhbHVlTmV3OwogICAgfQoKICAgICMgc2V0IFBvc3NpYmxlTm9uZSBvcHRpb24KICAgICRPcHRpb25SZWYtPntQb3NzaWJsZU5vbmV9ID0gMDsKICAgIGlmICggJFBhcmFte1Bvc3NpYmxlTm9uZX0gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1Bvc3NpYmxlTm9uZX0gPSAxOwogICAgfQoKICAgICMgc2V0IFRyZWVWaWV3IG9wdGlvbgogICAgJE9wdGlvblJlZi0+e1RyZWVWaWV3fSA9IDA7CiAgICBpZiAoICRQYXJhbXtUcmVlVmlld30gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1RyZWVWaWV3fSA9IDE7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnR9ICAgICA9ICdUcmVlVmlldyc7CiAgICB9CgogICAgIyBzZXQgRGlzYWJsZWRCcmFuY2ggb3B0aW9uCiAgICBpZiAoICRQYXJhbXtEaXNhYmxlZEJyYW5jaH0gKSB7CiAgICAgICAgaWYgKCByZWYgJFBhcmFte0Rpc2FibGVkQnJhbmNofSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJEJyYW5jaCAoIEB7ICRQYXJhbXtEaXNhYmxlZEJyYW5jaH0gfSApIHsKICAgICAgICAgICAgICAgICRPcHRpb25SZWYtPntEaXNhYmxlZEJyYW5jaH0tPnskQnJhbmNofSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPcHRpb25SZWYtPntEaXNhYmxlZEJyYW5jaH0tPnsgJFBhcmFte0Rpc2FibGVkQnJhbmNofSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgTWF4IG9wdGlvbgogICAgJE9wdGlvblJlZi0+e01heH0gPSAkUGFyYW17TWF4fSB8fCAxMDA7CgogICAgIyBzZXQgSFRNTFF1b3RlIG9wdGlvbgogICAgJE9wdGlvblJlZi0+e0hUTUxRdW90ZX0gPSAxOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtIVE1MUXVvdGV9ICkgewogICAgICAgICRPcHRpb25SZWYtPntIVE1MUXVvdGV9ID0gJFBhcmFte0hUTUxRdW90ZX07CiAgICB9CgogICAgcmV0dXJuICRPcHRpb25SZWY7Cn0KCj1oZWFkMiBfQnVpbGRTZWxlY3Rpb25BdHRyaWJ1dGVSZWZDcmVhdGUoKQoKY3JlYXRlIHRoZSBhdHRyaWJ1dGUgaGFzaAoKICAgIG15ICRBdHRyaWJ1dGVSZWYgPSAkTGF5b3V0T2JqZWN0LT5fQnVpbGRTZWxlY3Rpb25BdHRyaWJ1dGVSZWZDcmVhdGUoCiAgICAgICAgJVBhcmFtLAogICAgKTsKClRoZSByZXN1bHQgbG9va3MgbGlrZToKCiAgICBteSAkQXR0cmlidXRlUmVmID0gewogICAgICAgIG5hbWUgICAgID0+ICdUaGVOYW1lJywKICAgICAgICBtdWx0aXBsZSA9PiB1bmRlZiwKICAgICAgICBzaXplICAgICA9PiA1LAogICAgfQoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbkF0dHJpYnV0ZVJlZkNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBdHRyaWJ1dGVSZWYgPSB7fTsKCiAgICAjIGNoZWNrIHBhcmFtcyB3aXRoIGtleSBhbmQgdmFsdWUKICAgIGZvciAocXcoTmFtZSBJRCBTaXplIENsYXNzIE9uQ2hhbmdlIE9uQ2xpY2sgQXV0b0NvbXBsZXRlKSkgewogICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZVJlZi0+eyBsYygkXykgfSA9ICRQYXJhbXskX307CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGlkIGF0dHJpdWJ1dAogICAgaWYgKCAhJEF0dHJpYnV0ZVJlZi0+e2lkfSApIHsKICAgICAgICAkQXR0cmlidXRlUmVmLT57aWR9ID0gJEF0dHJpYnV0ZVJlZi0+e25hbWV9OwogICAgfQoKICAgICMgY2hlY2sgcGFyYW1zIHdpdGgga2V5IGFuZCB2YWx1ZSB0aGF0IG5lZWQgdG8gYmUgSFRNTC1RdW90ZWQKICAgIGZvciAocXcoVGl0bGUpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkQXR0cmlidXRlUmVmLT57IGxjKCRfKSB9ID0gJFNlbGYtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFteyRffSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIEhUTUwgcGFyYW1zCiAgICBmb3IgKHF3KE11bHRpcGxlIERpc2FibGVkKSkgewogICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZVJlZi0+eyBsYygkXykgfSA9IGxjKCRfKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRBdHRyaWJ1dGVSZWY7Cn0KCj1oZWFkMiBfQnVpbGRTZWxlY3Rpb25EYXRhUmVmQ3JlYXRlKCkKCmNyZWF0ZSB0aGUgZGF0YSBoYXNoCgogICAgbXkgJERhdGFSZWYgPSAkTGF5b3V0T2JqZWN0LT5fQnVpbGRTZWxlY3Rpb25EYXRhUmVmQ3JlYXRlKAogICAgICAgIERhdGEgPT4gJEFycmF5UmVmLCAgICAgICAgICAgICAgIyB1c2UgJEhhc2hSZWYsICRBcnJheVJlZiBvciAkQXJyYXlIYXNoUmVmCiAgICAgICAgQXR0cmlidXRlUmVmID0+ICRBdHRyaWJ1dGVSZWYsCiAgICAgICAgT3B0aW9uUmVmID0+ICRPcHRpb25SZWYsCiAgICApOwoKICAgIG15ICREYXRhUmVmICA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAxMSwKICAgICAgICAgICAgVmFsdWUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ2FiYycsCiAgICAgICAgICAgIFZhbHVlID0+ICcmbmJzcDsmbmJzcDtUZXh0JywKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBfQnVpbGRTZWxlY3Rpb25EYXRhUmVmQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE9wdGlvblJlZiA9ICRQYXJhbXtPcHRpb25SZWZ9OwogICAgbXkgJERhdGFSZWYgICA9IFtdOwoKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIGZvciBIYXNoUmVmIGFuZCBBcnJheVJlZiBvbmx5CiAgICBteSAlRGlzYWJsZWRFbGVtZW50czsKCiAgICAjIGRjbG9uZSAkUGFyYW17RGF0YX0gYmVjYXVzZSB0aGUgc3Vicm91dGluZSB1bmZvcnR1bmF0ZWx5IG1vZGlmaWVzCiAgICAjIHRoZSBvcmlnaW5hbCBkYXRhIHJlZgogICAgbXkgJERhdGFMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5DbG9uZSggRGF0YSA9PiAkUGFyYW17RGF0YX0gKTsKCiAgICAjIGlmIEhhc2hSZWYgd2FzIGdpdmVuCiAgICBpZiAoIHJlZiAkRGF0YUxvY2FsIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgbWlzc2luZyBwYXJlbnRzIGFuZCBtYXJrIHRoZW0gZm9yIGRpc2FibGUgbGF0ZXIKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBEZWxldGUgZW50cmllcyBpbiBoYXNoIHdpdGggdmFsdWUgPSB1bmRlZiwKICAgICAgICAgICAgIyAgIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSByZXZlcnNlIHN0YXRlbWVudCB3aWxsIGNhdXNlIHdhcm5pbmdzLgogICAgICAgICAgICAjIFJldmVyc2UgaGFzaCwgc2tpcHBpbmcgdW5kZWZpbmVkIHZhbHVlcy4KICAgICAgICAgICAgbXkgJUxpc3QgPSBtYXAgeyAkRGF0YUxvY2FsLT57JF99ID0+ICRfIH0gZ3JlcCB7IGRlZmluZWQgJERhdGFMb2NhbC0+eyRffSB9IGtleXMgJXskRGF0YUxvY2FsfTsKCiAgICAgICAgICAgICMgZ2V0IGVhY2ggZGF0YSB2YWx1ZQogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTGlzdCApIHsKICAgICAgICAgICAgICAgIG15ICRQYXJlbnRzID0gJyc7CgogICAgICAgICAgICAgICAgIyB0cnkgdG8gc3BsaXQgaXRzIHBhcmVudHMgKGUuZy4gUXVldWUgb3IgU2VydmljZSkgR3JhbmRQYXJlbnQ6OlBhcmVudDo6U29uCiAgICAgICAgICAgICAgICBteSBARWxlbWVudHMgPSBzcGxpdCAvOjovLCAkS2V5OwoKICAgICAgICAgICAgICAgICMgZ2V0IGVhY2ggZWxlbWVudCBpbiB0aGUgaGllcmFyY2h5CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKEBFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBpdHMgb3duIHBhcmVudHMgZm9yIHRoZSBjb21wbGV0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgbXkgJEVsZW1lbnRMb25nTmFtZSA9ICRQYXJlbnRzIC4gJEVsZW1lbnQ7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZWxlbWVudCBleGlzdHMgaW4gdGhlIG9yaWdpbmFsIGRhdGEgb3IgaWYgaXQgaXMgYWxyZWFkeSBtYXJrZWQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGlzdHskRWxlbWVudExvbmdOYW1lfSAmJiAhJERpc2FibGVkRWxlbWVudHN7JEVsZW1lbnRMb25nTmFtZX0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIG1hcmsgZWxlbWVudCBhcyBkaXNhYmxlZAogICAgICAgICAgICAgICAgICAgICAgICAkRGlzYWJsZWRFbGVtZW50c3skRWxlbWVudExvbmdOYW1lfSA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgb3JpZ2luYWwgZGF0YSB0byBiZSBkaXNhYmxlZCBsYXRlcgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YUxvY2FsLT57ICRFbGVtZW50TG9uZ05hbWUgLiAnX0Rpc2FibGVkJyB9ID0gJEVsZW1lbnRMb25nTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmVudHMgLj0gJEVsZW1lbnQgLiAnOjonOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvcnQgaGFzaCAoYmVmb3JlIHRoZSB0cmFuc2xhdGlvbikKICAgICAgICBteSBAU29ydEtleXM7CiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0luZGl2aWR1YWxWYWx1ZScgJiYgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSApIHsKICAgICAgICAgICAgbXkgJUxpc3QgPSByZXZlcnNlICV7JERhdGFMb2NhbH07CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggQHsgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTGlzdHskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBTb3J0S2V5cywgJExpc3R7JEtleX07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRMaXN0eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQFNvcnRLZXlzLCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0gKCB2YWx1ZXMgJUxpc3QgKTsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIHNvcnQga2V5cyAleyREYXRhTG9jYWx9ICkgewogICAgICAgICAgICAgICAgJERhdGFMb2NhbC0+eyRSb3d9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJERhdGFMb2NhbC0+eyRSb3d9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29ydCBoYXNoIChhZnRlciB0aGUgdHJhbnNsYXRpb24pCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNLZXknICkgewogICAgICAgICAgICBAU29ydEtleXMgPSBzb3J0IHsgJGEgPD0+ICRiIH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNWYWx1ZScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgeyAkRGF0YUxvY2FsLT57JGF9IDw9PiAkRGF0YUxvY2FsLT57JGJ9IH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0FscGhhbnVtZXJpY0tleScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQoIGtleXMgJXskRGF0YUxvY2FsfSApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgICAgICAgICAgbXkgJVNvcnRIYXNoOwogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkRGF0YUxvY2FsLT57JEtleX07CiAgICAgICAgICAgICAgICAkU29ydEhhc2h7JEtleX0gPSAkRGF0YUxvY2FsLT57JEtleX0gLiAnOjonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgeyBsYyAkU29ydEhhc2h7JGF9IGNtcCBsYyAkU29ydEhhc2h7JGJ9IH0gKCBrZXlzICVTb3J0SGFzaCApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbEtleScgJiYgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSApIHsKICAgICAgICAgICAgbXkgJUxpc3QgPSAleyREYXRhTG9jYWx9OwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIEB7ICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gfSApIHsKICAgICAgICAgICAgICAgIGlmICggJExpc3R7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU29ydEtleXMsICRLZXk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRMaXN0eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQFNvcnRLZXlzLCBzb3J0IHsgbGMgJExpc3R7JGF9IGNtcCBsYyAkTGlzdHskYn0gfSAoIGtleXMgJUxpc3QgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0luZGl2aWR1YWxWYWx1ZScgJiYgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSApIHsKCiAgICAgICAgICAgICMgYWxyZWFkeSBkb25lIGJlZm9yZSB0aGUgdHJhbnNsYXRpb24KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgewogICAgICAgICAgICAgICAgbGMoICREYXRhTG9jYWwtPnskYX0gLy8gJycgKQogICAgICAgICAgICAgICAgICAgIGNtcCBsYyggJERhdGFMb2NhbC0+eyRifSAvLyAnJyApCiAgICAgICAgICAgIH0gKCBrZXlzICV7JERhdGFMb2NhbH0gKTsKICAgICAgICAgICAgJE9wdGlvblJlZi0+e1NvcnR9ID0gJ0FscGhhbnVtZXJpY1ZhbHVlJzsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIERhdGFSZWYKICAgICAgICBmb3IgbXkgJFJvdyAoQFNvcnRLZXlzKSB7CiAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57S2V5fSAgID0gJFJvdzsKICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkRGF0YUxvY2FsLT57JFJvd307CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgQXJyYXlIYXNoUmVmIHdhcyBnaXZlbgogICAgZWxzaWYgKCByZWYgJERhdGFMb2NhbCBlcSAnQVJSQVknICYmIHJlZiAkRGF0YUxvY2FsLT5bMF0gZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBtaXNzaW5nIHBhcmVudHMgYW5kIG1hcmsgdGhlbSBmb3IgZGlzYWJsZSBsYXRlcgogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1NvcnR9IGVxICdUcmVlVmlldycgKSB7CgogICAgICAgICAgICAjIGJ1aWxkIGEgbGlzdCBvZiBlbGVtZW50IGxvbmduYW1lcwogICAgICAgICAgICBteSBATmV3RGF0YUxvY2FsOwoKICAgICAgICAgICAgbXkgJUxpc3Q7CiAgICAgICAgICAgIGZvciBteSAkVmFsdWVIYXNoICggQHskRGF0YUxvY2FsfSApIHsKICAgICAgICAgICAgICAgICRMaXN0eyAkVmFsdWVIYXNoLT57VmFsdWV9IH0gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBlYWNoIGRhdGEgdmFsdWUgaGFzaAogICAgICAgICAgICBmb3IgbXkgJFZhbHVlSGFzaCAoIEB7JERhdGFMb2NhbH0gKSB7CgogICAgICAgICAgICAgICAgbXkgJFBhcmVudHMgPSAnJzsKCiAgICAgICAgICAgICAgICAjIHRyeSB0byBzcGxpdCBpdHMgcGFyZW50cyAoZS5nLiBRdWV1ZSBvciBTZXJ2aWNlKSBHcmFuZFBhcmVudDo6UGFyZW50OjpTb24KICAgICAgICAgICAgICAgIG15IEBFbGVtZW50cyA9IHNwbGl0IC86Oi8sICRWYWx1ZUhhc2gtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgIyBnZXQgZWFjaCBlbGVtZW50IGluIHRoZSBoaWVyYXJjaHkKICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoQEVsZW1lbnRzKSB7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGl0cyBvd24gcGFyZW50cyBmb3IgdGhlIGNvbXBsZXRlIG5hbWUKICAgICAgICAgICAgICAgICAgICBteSAkRWxlbWVudExvbmdOYW1lID0gJFBhcmVudHMgLiAkRWxlbWVudDsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBlbGVtZW50IGV4aXN0cyBpbiB0aGUgb3JpZ2luYWwgZGF0YSBvciBpZiBpdCBpcyBhbHJlYWR5IG1hcmtlZAogICAgICAgICAgICAgICAgICAgIGlmICggISRMaXN0eyRFbGVtZW50TG9uZ05hbWV9ICYmICEkRGlzYWJsZWRFbGVtZW50c3skRWxlbWVudExvbmdOYW1lfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbWFyayBlbGVtZW50IGFzIGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgICAgICREaXNhYmxlZEVsZW1lbnRzeyRFbGVtZW50TG9uZ05hbWV9ID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcHVzaCB0aGUgbWlzc2luZyBlbGVtZW50IHRvIHRoZSBkYXRhIGxvY2FsIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQE5ld0RhdGFMb2NhbCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEVsZW1lbnRMb25nTmFtZSAuICdfRGlzYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEVsZW1lbnRMb25nTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRQYXJlbnRzIC49ICRFbGVtZW50IC4gJzo6JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHB1c2ggdGhlIGVsZW1lbnQgdG8gdGhlIGRhdGEgbG9jYWwgYXJyYXkKICAgICAgICAgICAgICAgIHB1c2ggQE5ld0RhdGFMb2NhbCwgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRWYWx1ZUhhc2gtPntLZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRWYWx1ZUhhc2gtPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQgPT4gJFZhbHVlSGFzaC0+e1NlbGVjdGVkfSA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgIERpc2FibGVkID0+ICRWYWx1ZUhhc2gtPntEaXNhYmxlZH0gPyAxIDogMCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIGRhdGEgbG9jYWwgd2l0aCB0aGUgbmV3IG9uZQogICAgICAgICAgICBAeyREYXRhTG9jYWx9ID0gQE5ld0RhdGFMb2NhbDsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIERhdGFSZWYKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgIGlmICggcmVmICRSb3cgZXEgJ0hBU0gnICYmIGRlZmluZWQgJFJvdy0+e0tleX0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e0tleX0gICA9ICRSb3ctPntLZXl9OwogICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkUm93LT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICMgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgICAgICAgICBpZiAoICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e1ZhbHVlfSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2V0IFNlbGVjdGVkIGFuZCBEaXNhYmxlZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoICRSb3ctPntTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntTZWxlY3RlZH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUm93LT57RGlzYWJsZWR9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57RGlzYWJsZWR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBpZiBBcnJheVJlZiB3YXMgZ2l2ZW4KICAgIGVsc2lmICggcmVmICREYXRhTG9jYWwgZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgIyBnZXQgbWlzc2luZyBwYXJlbnRzIGFuZCBtYXJrIHRoZW0gZm9yIGRpc2FibGUgbGF0ZXIKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewogICAgICAgICAgICBteSAlTGlzdCA9IG1hcCB7ICRfID0+IDEgfSBAeyREYXRhTG9jYWx9OwoKICAgICAgICAgICAgIyBnZXQgZWFjaCBkYXRhIHZhbHVlCiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVMaXN0ICkgewogICAgICAgICAgICAgICAgbXkgJFBhcmVudHMgPSAnJzsKCiAgICAgICAgICAgICAgICAjIHRyeSB0byBzcGxpdCBpdHMgcGFyZW50cyAoZS5nLiBRdWV1ZSBvciBTZXJ2aWNlKSBHcmFuZFBhcmVudDo6UGFyZW50OjpTb24KICAgICAgICAgICAgICAgIG15IEBFbGVtZW50cyA9IHNwbGl0IC86Oi8sICRLZXk7CgogICAgICAgICAgICAgICAgIyBnZXQgZWFjaCBlbGVtZW50IGluIHRoZSBoaWVyYXJjaHkKICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoQEVsZW1lbnRzKSB7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGl0cyBvd24gcGFyZW50cyBmb3IgdGhlIGNvbXBsZXRlIG5hbWUKICAgICAgICAgICAgICAgICAgICBteSAkRWxlbWVudExvbmdOYW1lID0gJFBhcmVudHMgLiAkRWxlbWVudDsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBlbGVtZW50IGV4aXN0cyBpbiB0aGUgb3JpZ2luYWwgZGF0YSBvciBpZiBpdCBpcyBhbHJlYWR5IG1hcmtlZAogICAgICAgICAgICAgICAgICAgIGlmICggISRMaXN0eyRFbGVtZW50TG9uZ05hbWV9ICYmICEkRGlzYWJsZWRFbGVtZW50c3skRWxlbWVudExvbmdOYW1lfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbWFyayBlbGVtZW50IGFzIGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgICAgICREaXNhYmxlZEVsZW1lbnRzeyRFbGVtZW50TG9uZ05hbWV9ID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhIHRvIGJlIGRpc2FibGVkIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskRGF0YUxvY2FsfSwgJEVsZW1lbnRMb25nTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmVudHMgLj0gJEVsZW1lbnQgLiAnOjonOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbFZhbHVlJyAmJiAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9ICkgewogICAgICAgICAgICBteSAlTGlzdCA9IG1hcCB7ICRfID0+IDEgfSBAeyREYXRhTG9jYWx9OwogICAgICAgICAgICAkRGF0YUxvY2FsID0gW107CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggQHsgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTGlzdHskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JERhdGFMb2NhbH0sICRLZXk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRMaXN0eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQHskRGF0YUxvY2FsfSwgc29ydCB7ICRhIGNtcCAkYiB9ICgga2V5cyAlTGlzdCApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVJldmVyc2VIYXNoOwoKICAgICAgICAjIHRyYW5zbGF0ZSB2YWx1ZQogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgbXkgQFRyYW5zbGF0ZUFycmF5OwogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFMb2NhbH0gKSB7CiAgICAgICAgICAgICAgICBteSAkVHJhbnNsYXRlU3RyaW5nID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkUm93KTsKICAgICAgICAgICAgICAgIHB1c2ggQFRyYW5zbGF0ZUFycmF5LCAkVHJhbnNsYXRlU3RyaW5nOwogICAgICAgICAgICAgICAgJFJldmVyc2VIYXNoeyRUcmFuc2xhdGVTdHJpbmd9ID0gJFJvdzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YUxvY2FsID0gXEBUcmFuc2xhdGVBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YUxvY2FsfSApIHsKICAgICAgICAgICAgICAgICRSZXZlcnNlSGFzaHskUm93fSA9ICRSb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29ydCBhcnJheQogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1NvcnR9IGVxICdBbHBoYW51bWVyaWNLZXknIHx8ICRPcHRpb25SZWYtPntTb3J0fSBlcSAnQWxwaGFudW1lcmljVmFsdWUnICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBTb3J0QXJyYXkgPSBzb3J0KCBAeyREYXRhTG9jYWx9ICk7CiAgICAgICAgICAgICREYXRhTG9jYWwgPSBcQFNvcnRBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNLZXknIHx8ICRPcHRpb25SZWYtPntTb3J0fSBlcSAnTnVtZXJpY1ZhbHVlJyApIHsKICAgICAgICAgICAgbXkgQFNvcnRBcnJheSA9IHNvcnQgeyAkYSA8PT4gJGIgfSAoIEB7JERhdGFMb2NhbH0gKTsKICAgICAgICAgICAgJERhdGFMb2NhbCA9IFxAU29ydEFycmF5OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnVHJlZVZpZXcnICkgewoKICAgICAgICAgICAgIyBzb3J0IGFycmF5LCBhZGQgJzo6JyBpbiB0aGUgY29tcGFyaXNvbiwgZm9yIHByb3BlciBzb3J0IG9mIEl0ZW1zIHdpdGggSXRlbXM6OlN1Ykl0ZW1zCiAgICAgICAgICAgIG15IEBTb3J0QXJyYXkgPSBzb3J0IHsgJGEgLiAnOjonIGNtcCAkYiAuICc6OicgfSBAeyREYXRhTG9jYWx9OwogICAgICAgICAgICAkRGF0YUxvY2FsID0gXEBTb3J0QXJyYXk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBEYXRhUmVmCiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhTG9jYWx9ICkgewogICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e0tleX0gICA9ICRSZXZlcnNlSGFzaHskUm93fTsKICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkUm93OwogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGRpc2FibGVkIGl0ZW1zIG9uIEFycmF5UmVmIG9yIEhhc2hSZWYgb25seQogICAgaWYgKAogICAgICAgIHJlZiAkRGF0YUxvY2FsIGVxICdIQVNIJwogICAgICAgIHx8ICggcmVmICREYXRhTG9jYWwgZXEgJ0FSUkFZJyAmJiByZWYgJERhdGFMb2NhbC0+WzBdIG5lICdIQVNIJyApCiAgICAgICAgKQogICAgewogICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YVJlZn0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUm93LT57VmFsdWV9ICYmICREaXNhYmxlZEVsZW1lbnRzeyAkUm93LT57VmFsdWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkUm93LT57S2V5fSAgICAgID0gJy0nOwogICAgICAgICAgICAgICAgJFJvdy0+e0Rpc2FibGVkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBEaXNhYmxlZEJyYW5jaCBvcHRpb24KICAgIGlmICggJE9wdGlvblJlZi0+e0Rpc2FibGVkQnJhbmNofSApIHsKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFSZWZ9ICkgewogICAgICAgICAgICBmb3IgbXkgJEJyYW5jaCAoIHNvcnQga2V5cyAleyAkT3B0aW9uUmVmLT57RGlzYWJsZWRCcmFuY2h9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRSb3ctPntWYWx1ZX0gPX4gL14oXFEkQnJhbmNoXEUpJC8gfHwgJFJvdy0+e1ZhbHVlfSA9fiAvXihcUSRCcmFuY2hcRSk6Oi8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFJvdy0+e0Rpc2FibGVkfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBTZWxlY3RlZElEIGFuZCBTZWxlY3RlZFZhbHVlIG9wdGlvbgogICAgaWYgKCBkZWZpbmVkICRPcHRpb25SZWYtPntTZWxlY3RlZElEfSB8fCAkT3B0aW9uUmVmLT57U2VsZWN0ZWRWYWx1ZX0gKSB7CiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUm93LT57S2V5fQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkT3B0aW9uUmVmLT57U2VsZWN0ZWRJRH0tPnsgJFJvdy0+e0tleX0gfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUm93LT57VmFsdWV9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfS0+eyAkUm93LT57VmFsdWV9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJFJvdy0+e1ZhbHVlfQogICAgICAgICAgICAgICAgICAgICYmICEkRGlzYWJsZWRFbGVtZW50c3sgJFJvdy0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRSb3ctPntTZWxlY3RlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgU29ydFJldmVyc2Ugb3B0aW9uCiAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0UmV2ZXJzZX0gKSB7CiAgICAgICAgQHskRGF0YVJlZn0gPSByZXZlcnNlKCBAeyREYXRhUmVmfSApOwogICAgfQoKICAgICMgYWRkIGFuIGVtcHR5IG9wdGlvbiBhcyBmaXJzdCBvcHRpb24gd2hlbiBQb3NzaWJsZU5vbmUgaXMgZ2l2ZW4KICAgIGlmICggJE9wdGlvblJlZi0+e1Bvc3NpYmxlTm9uZX0gKSB7CiAgICAgICAgbXkgJU5vbmU7CiAgICAgICAgJE5vbmV7S2V5fSAgID0gJyc7CiAgICAgICAgJE5vbmV7VmFsdWV9ID0gJy0nOwoKICAgICAgICB1bnNoaWZ0KCBAeyREYXRhUmVmfSwgXCVOb25lICk7CiAgICB9CgogICAgIyBUcmVlVmlldyBvcHRpb24KICAgIGlmICggJE9wdGlvblJlZi0+e1RyZWVWaWV3fSApIHsKCiAgICAgICAgUk9XOgogICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YVJlZn0gKSB7CgogICAgICAgICAgICBuZXh0IFJPVyBpZiAhJFJvdy0+e1ZhbHVlfTsKCiAgICAgICAgICAgIG15IEBGcmFnbWVudCA9IHNwbGl0IC86Oi8sICRSb3ctPntWYWx1ZX07CiAgICAgICAgICAgICRSb3ctPntWYWx1ZX0gPSBwb3AgQEZyYWdtZW50OwoKICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIGluZGl2aWR1YWwgdHJlZSBvcHRpb25zCiAgICAgICAgICAgIGlmICggJE9wdGlvblJlZi0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgICAgICRSb3ctPntWYWx1ZX0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUm93LT57VmFsdWV9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgVE9ETzogSGVyZSB3ZSBhcmUgY29tYmluaW5nIE1heCB3aXRoIEhUTUxRdW90ZSwgY2hlY2sgYmVsb3cgZm9yIHRoZSBSRU1BUks6CiAgICAgICAgICAgICMgTWF4IGFuZCBIVE1MUXVvdGUgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgc3BhY2VzIGluc2VydCBidXQgYWZ0ZXIgdGhlIHNwbGl0IG9mIHRoZQogICAgICAgICAgICAjIHBhcmVudHMsIHRoZW4gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRvIGl0IG91dHNpZGUKICAgICAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57SFRNTFF1b3RlfSApIHsKICAgICAgICAgICAgICAgICRSb3ctPntWYWx1ZX0gPSAkU2VsZi0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRSb3ctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgTWF4ICA9PiAkT3B0aW9uUmVmLT57TWF4fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57TWF4fSApIHsKICAgICAgICAgICAgICAgIGlmICggbGVuZ3RoICRSb3ctPntWYWx1ZX0gPiAkT3B0aW9uUmVmLT57TWF4fSApIHsKICAgICAgICAgICAgICAgICAgICAkUm93LT57VmFsdWV9ID0gc3Vic3RyKCAkUm93LT57VmFsdWV9LCAwLCAkT3B0aW9uUmVmLT57TWF4fSAtIDUgKSAuICdbLi4uXSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgVXNlIHVuaWNvZGUgJ05PLUJSRUFLIFNQQUNFJyBzaW5jZSB1bmljb2RlIGNoYXJhY3RlcnMgZG9lc24ndCBuZWVkIHRvIGJlIGVzY2FwZWQuCiAgICAgICAgICAgICMgUHJldmlvdXNseSwgd2UgdXNlZCAnJm5ic3A7JyBhbmQgd2UgaGFkIGlzc3VlIHRoYXQgT3B0aW9uIG5lZWRzIHRvIGJlIGh0bWwgZW5jb2RlZAogICAgICAgICAgICAjIGluIEFKQVgsIGFuZCBpdCB3YXMgY2F1c2luZyBpc3N1ZXMuCiAgICAgICAgICAgIG15ICRTcGFjZSA9ICJceEEwXHhBMCIgeCBzY2FsYXIgQEZyYWdtZW50OwogICAgICAgICAgICAkU3BhY2UgfHw9ICcnOwoKICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9ICRTcGFjZSAuICRSb3ctPntWYWx1ZX07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSFRNTFF1b3RlIG9wdGlvbgogICAgICAgIGlmICggJE9wdGlvblJlZi0+e0hUTUxRdW90ZX0gKSB7CiAgICAgICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YVJlZn0gKSB7CiAgICAgICAgICAgICAgICAkUm93LT57S2V5fSAgID0gJFNlbGYtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFJvdy0+e0tleX0gKTsKICAgICAgICAgICAgICAgICRSb3ctPntWYWx1ZX0gPSAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkUm93LT57VmFsdWV9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgVE9ETzogQ2hlY2sgdGhpcyBjb21tZW50IQogICAgICAgICMgTWF4IG9wdGlvbgogICAgICAgICMgUkVNQVJLOiBEb24ndCBtZXJnZSB0aGUgTWF4IGhhbmRsaW5nIHdpdGggQXNjaWkySHRtbCBmdW5jdGlvbiBjYWxsIG9mCiAgICAgICAgIyB0aGUgSFRNTFF1b3RlIGhhbmRsaW5nLiBJbiB0aGlzIGNhc2UgeW91IGxvc2UgdGhlIG1heCBoYW5kbGluZyBpZiB5b3UKICAgICAgICAjIGRlYWN0aXZhdGUgSFRNTFF1b3RlCiAgICAgICAgaWYgKCAkT3B0aW9uUmVmLT57TWF4fSApIHsKCiAgICAgICAgICAgICMgUkVNQVJLOiBUaGlzIGlzIHRoZSBzYW1lIHNvbHV0aW9uIGFzIGluIEFzY2lpMkh0bWwKICAgICAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKCiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkUm93IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGxlbmd0aCAkUm93LT57VmFsdWV9ID4gJE9wdGlvblJlZi0+e01heH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSb3ctPntWYWx1ZX0gPSBzdWJzdHIoICRSb3ctPntWYWx1ZX0sIDAsICRPcHRpb25SZWYtPntNYXh9IC0gNSApIC4gJ1suLi5dJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGxlbmd0aCAkUm93ID4gJE9wdGlvblJlZi0+e01heH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSb3cgPSBzdWJzdHIoICRSb3csIDAsICRPcHRpb25SZWYtPntNYXh9IC0gNSApIC4gJ1suLi5dJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICREYXRhUmVmOwp9Cgo9aGVhZDIgX0J1aWxkU2VsZWN0aW9uT3V0cHV0KCkKCmNyZWF0ZSB0aGUgSFRNTCBzdHJpbmcgZm9yIGEgc2VsZWN0aW9uOgoKICAgIG15ICRIVE1MU3RyaW5nID0gJExheW91dE9iamVjdC0+X0J1aWxkU2VsZWN0aW9uT3V0cHV0KAogICAgICAgIEF0dHJpYnV0ZVJlZiAgICAgICA9PiAkQXR0cmlidXRlUmVmLAogICAgICAgIERhdGFSZWYgICAgICAgICAgICA9PiAkRGF0YVJlZiwKICAgICAgICBUcmVlVmlldyAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICMgb3B0aW9uYWwsIHNlZSBCdWlsZFNlbGVjdGlvbigpCiAgICAgICAgRmlsdGVyc1JlZiAgICAgICAgID0+IFxARmlsdGVycywgICAgICAjIG9wdGlvbmFsLCBzZWUgQnVpbGRTZWxlY3Rpb24oKQogICAgICAgIEZpbHRlckFjdGl2ZSAgICAgICA9PiAkRmlsdGVyQWN0aXZlLCAgIyBvcHRpb25hbCwgc2VlIEJ1aWxkU2VsZWN0aW9uKCkKICAgICAgICBFeHBhbmRGaWx0ZXJzICAgICAgPT4gMSwgICAgICAgICAgICAgICMgb3B0aW9uYWwsIHNlZSBCdWlsZFNlbGVjdGlvbigpCiAgICAgICAgVmFsaWRhdGVEYXRlQWZ0ZXIgID0+ICcyMDE2LTAxLTAxJywgICAjIG9wdGlvbmFsLCBzZWUgQnVpbGRTZWxlY3Rpb24oKQogICAgICAgIFZhbGlkYXRlRGF0ZUJlZm9yZSA9PiAnMjAxNi0wMS0wMScsICAgIyBvcHRpb25hbCwgc2VlIEJ1aWxkU2VsZWN0aW9uKCkKICAgICk7CgogICAgbXkgJEF0dHJpYnV0ZVJlZiA9IHsKICAgICAgICBuYW1lID0+ICdUaGVOYW1lJywKICAgICAgICBtdWx0aXBsZSA9PiB1bmRlZiwKICAgICAgICBzaXplID0+IDUsCiAgICB9CgogICAgbXkgJERhdGFSZWYgID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+IDExLAogICAgICAgICAgICBWYWx1ZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnYWJjJywKICAgICAgICAgICAgVmFsdWUgPT4gJyZuYnNwOyZuYnNwO1RleHQnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbk91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc3RhcnQgZ2VuZXJhdGlvbiwgaWYgQXR0cmlidXRlUmVmIGFuZCBEYXRhUmVmIHdhcyBmb3VuZAogICAgbXkgJFN0cmluZzsKICAgIGlmICggJFBhcmFte0F0dHJpYnV0ZVJlZn0gJiYgJFBhcmFte0RhdGFSZWZ9ICkgewoKICAgICAgICAjIGdlbmVyYXRlIDxzZWxlY3Q+IHJvdwogICAgICAgICRTdHJpbmcgPSAnPHNlbGVjdCc7CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0F0dHJpYnV0ZVJlZn0gfSApIHsKICAgICAgICAgICAgaWYgKCAkS2V5ICYmIGRlZmluZWQgJFBhcmFte0F0dHJpYnV0ZVJlZn0tPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTdHJpbmcgLj0gIiAkS2V5PVwiJFBhcmFte0F0dHJpYnV0ZVJlZn0tPnskS2V5fVwiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEtleSkgewogICAgICAgICAgICAgICAgJFN0cmluZyAuPSAiICRLZXkiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBmaWx0ZXJzIGlmIGRlZmluZWQKICAgICAgICBpZiAoICRQYXJhbXtGaWx0ZXJzUmVmfSAmJiBzY2FsYXIgQHsgJFBhcmFte0ZpbHRlcnNSZWZ9IH0gPiAwICkgewogICAgICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRmlsdGVycyA9PiAkUGFyYW17RmlsdGVyc1JlZn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgTm9RdW90ZXMgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEpTT05Fc2NhcGVkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEpTT04sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdHJpbmcgLj0gIiBkYXRhLWZpbHRlcnM9XCIkSlNPTkVzY2FwZWRcIiI7CiAgICAgICAgICAgIGlmICggJFBhcmFte0ZpbHRlckFjdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICAkU3RyaW5nIC49ICcgZGF0YS1maWx0ZXJlZD0iJyAuIGludCggJFBhcmFte0ZpbHRlckFjdGl2ZX0gKSAuICciJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtFeHBhbmRGaWx0ZXJzfSApIHsKICAgICAgICAgICAgICAgICRTdHJpbmcgLj0gJyBkYXRhLWV4cGFuZC1maWx0ZXJzPSInIC4gaW50KCAkUGFyYW17RXhwYW5kRmlsdGVyc30gKSAuICciJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0cmVlIGZsYWcgZm9yIElucHV0IEZpZWxkcwogICAgICAgIGlmICggJFBhcmFte1RyZWVWaWV3fSApIHsKICAgICAgICAgICAgJFN0cmluZyAuPSAnIGRhdGEtdHJlZT0idHJ1ZSInOwogICAgICAgIH0KCiAgICAgICAgIyBkYXRlIHZhbGlkYXRpb24gdmFsdWVzCiAgICAgICAgaWYgKCAkUGFyYW17VmFsaWRhdGVEYXRlQWZ0ZXJ9ICkgewogICAgICAgICAgICAkU3RyaW5nIC49ICcgZGF0YS12YWxpZGF0ZS1kYXRlLWFmdGVyPSInIC4gJFBhcmFte1ZhbGlkYXRlRGF0ZUFmdGVyfSAuICciJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17VmFsaWRhdGVEYXRlQmVmb3JlfSApIHsKICAgICAgICAgICAgJFN0cmluZyAuPSAnIGRhdGEtdmFsaWRhdGUtZGF0ZS1iZWZvcmU9IicgLiAkUGFyYW17VmFsaWRhdGVEYXRlQmVmb3JlfSAuICciJzsKICAgICAgICB9CgogICAgICAgICRTdHJpbmcgLj0gIj5cbiI7CgogICAgICAgICMgZ2VuZXJhdGUgPG9wdGlvbj4gcm93cwogICAgICAgIGZvciBteSAkUm93ICggQHsgJFBhcmFte0RhdGFSZWZ9IH0gKSB7CiAgICAgICAgICAgIG15ICRLZXkgPSAnJzsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRSb3ctPntLZXl9ICkgewogICAgICAgICAgICAgICAgJEtleSA9ICRSb3ctPntLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICcnOwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFJvdy0+e1ZhbHVlfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRSb3ctPntWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJFNlbGVjdGVkRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgaWYgKCAkUm93LT57U2VsZWN0ZWR9ICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkRGlzYWJsZWQgPSAnIHNlbGVjdGVkPSJzZWxlY3RlZCInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFJvdy0+e0Rpc2FibGVkfSApIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZERpc2FibGVkID0gJyBkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT3B0aW9uVGl0bGUgPSAnJzsKICAgICAgICAgICAgaWYgKCAkUGFyYW17T3B0aW9uVGl0bGV9ICkgewogICAgICAgICAgICAgICAgJE9wdGlvblRpdGxlID0gJyB0aXRsZT0iJyAuICRWYWx1ZSAuICciJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU3RyaW5nIC49ICIgIDxvcHRpb24gdmFsdWU9XCIkS2V5XCIkU2VsZWN0ZWREaXNhYmxlZCRPcHRpb25UaXRsZT4kVmFsdWU8L29wdGlvbj5cbiI7CiAgICAgICAgfQogICAgICAgICRTdHJpbmcgLj0gJzwvc2VsZWN0Pic7CgogICAgICAgIGlmICggJFBhcmFte1RyZWVWaWV3fSApIHsKICAgICAgICAgICAgbXkgJFRyZWVTZWxlY3Rpb25NZXNzYWdlID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2hvdyBUcmVlIFNlbGVjdGlvbiIpOwogICAgICAgICAgICAkU3RyaW5nCiAgICAgICAgICAgICAgICAuPSAnIDxhIGhyZWY9IiMiIHRpdGxlPSInCiAgICAgICAgICAgICAgICAuICRUcmVlU2VsZWN0aW9uTWVzc2FnZQogICAgICAgICAgICAgICAgLiAnIiBjbGFzcz0iU2hvd1RyZWVTZWxlY3Rpb24iPjxzcGFuPicKICAgICAgICAgICAgICAgIC4gJFRyZWVTZWxlY3Rpb25NZXNzYWdlIC4gJzwvc3Bhbj48aSBjbGFzcz0iZmEgZmEtc2l0ZW1hcCI+PC9pPjwvYT4nOwogICAgICAgIH0KCiAgICB9CiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWVuZCBJbnRlcm5hbDoKCj1oZWFkMiBXcmFwUGxhaW5UZXh0KCkKClRoaXMgc3ViIGhhcyB0d28gbWFpbiBmdW5jdGlvbmFsaXRpZXM6CjEuIENoZWNrIGV2ZXJ5IGxpbmUgYW5kIG1ha2Ugc3VyZSB0aGF0ICJcbiIgaXMgdGhlIGVuZGluZyBvZiB0aGUgbGluZS4KMi4gSWYgdGhlIGxpbmUgZG9lcyBfbm90XyBzdGFydCB3aXRoICI+IiAoZS5nLiBub3QgY2l0ZWQgdGV4dCkKd3JhcCBpdCBhZnRlciB0aGUgbnVtYmVyIG9mICJNYXhDaGFyYWN0ZXJzIiAoZS5nLiBpZiBNYXhDaGFyYWN0ZXJzIGlzICI4MCIgd3JhcCBhZnRlciA4MCBjaGFyYWN0ZXJzKS4KRG8gdGhpcyBfanVzdF8gaWYgdGhlIGxpbmUsIHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQsIGNvbnRhaW5zIHNwYWNlIGNoYXJhY3RlcnMgYXQgd2hpY2ggdGhlIGxpbmUgY2FuIGJlIHdyYXBwZWQuCgpJZiB5b3UgbmVlZCBtb3JlIGluZm8gdG8gdW5kZXJzdGFuZCB3aGF0IGl0IGRvZXMsIHRha2UgYSBsb29rIGF0IHRoZSBVbml0VGVzdCBXcmFwUGxhaW5UZXh0LnQgdG8gc2VlCnVzZSBjYXNlcyB0aGVyZS4KCiAgICBteSAkV3JhcHBlZFBsYWluVGV4dCA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAiU29tZSBQbGFpbiB0ZXh0IHRoYXQgaXMgbG9uZ2VyIHRoYW4gdGhlIGFtb3VudCBzdG9yZWQgaW4gTWF4Q2hhcmFjdGVycyIsCiAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiA4MCwKICAgICk7Cgo9Y3V0CgpzdWIgV3JhcFBsYWluVGV4dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgUmV0dXJuIGlmIHdlIGRpZCBub3QgZ2V0IE1heENoYXJhY3RlcnMKICAgICMgb3IgTWF4Q2hhcmFjdGVycyBkb2Vzbid0IGNvbnRhaW4ganVzdCBhbiBpbnQKICAgIGlmICggIUlzUG9zaXRpdmVJbnRlZ2VyKCAkUGFyYW17TWF4Q2hhcmFjdGVyc30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdvdCBubyBvciBpbnZhbGlkIE1heENoYXJhY3RlcnMhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBSZXR1cm4gaWYgd2UgZGlkbid0IGdldCBQbGFpblRleHQKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkUGFyYW17UGxhaW5UZXh0fTsKCiAgICAjIFJldHVybiBpZiB3ZSBnb3Qgbm8gU2NhbGFyCiAgICBpZiAoIHJlZiAkUGFyYW17UGxhaW5UZXh0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkhhZCBubyBzdHJpbmcgaW4gUGxhaW5UZXh0ISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgUmV0dXJuIFBsYWluVGV4dCBpZiB3ZSBoYXZlIGxlc3MgdGhhbiBNYXhDaGFyYWN0ZXJzCiAgICByZXR1cm4gJFBhcmFte1BsYWluVGV4dH0gaWYgbGVuZ3RoICRQYXJhbXtQbGFpblRleHR9IDwgJFBhcmFte01heENoYXJhY3RlcnN9OwoKICAgIG15ICRXb3JrU3RyaW5nID0gJFBhcmFte1BsYWluVGV4dH07CgogICAgIyBOb3JtYWxpemUgbGluZSBlbmRpbmdzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggXHJcbiAoYnVnIzExMDc4KS4KICAgICRXb3JrU3RyaW5nID1+IHMvXHJcbj8vXG4vZzsKICAgICRXb3JrU3RyaW5nID1+IHMvKF4+Lit8Lns0LCRQYXJhbXtNYXhDaGFyYWN0ZXJzfX0pKD86XHN8XHopLyQxXG4vZ207CgogICAgcmV0dXJuICRXb3JrU3RyaW5nOwp9Cgo9aGVhZDIgU2V0UmljaFRleHRQYXJhbWV0ZXJzKCkKCnNldCBwcm9wZXJ0aWVzIGZvciByaWNoIHRleHQgZWRpdG9yIGFuZCBzZW5kIHRoZW0gdG8gSmF2YVNjcmlwdCB2aWEgQWRkSlNEYXRhKCkKCiRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgIERhdGEgPT4gXCVQYXJhbSwKKTsKCj1jdXQKCnN1YiBTZXRSaWNoVGV4dFBhcmFtZXRlcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17RGF0YX0gfHw9IHt9OwoKICAgICMgZ2V0IGFuZCBjaGVjayBwYXJhbSBEYXRhCiAgICBpZiAoIHJlZiAkUGFyYW17RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBIYXNoUmVmIGluIFBhcmFtIERhdGEhIEdvdDogJyIgLiByZWYoICRQYXJhbXtEYXRhfSApIC4gIichIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcjsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBuZWVkZWQgdmFyaWFibGVzCiAgICBteSAkU2NyZWVuUmljaFRleHRIZWlnaHQgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dEhlaWdodH0gICAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0SGVpZ2h0Iik7CiAgICBteSAkU2NyZWVuUmljaFRleHRXaWR0aCAgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dFdpZHRofSAgICAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0V2lkdGgiKTsKICAgIG15ICRSaWNoVGV4dFR5cGUgICAgICAgICA9ICRQYXJhbXtEYXRhfS0+e1JpY2hUZXh0VHlwZX0gICAgICAgICAgICAgICAgfHwgJyc7CiAgICBteSAkUGljdHVyZVVwbG9hZEFjdGlvbiAgPSAkUGFyYW17RGF0YX0tPntSaWNoVGV4dFBpY3R1cmVVcGxvYWRBY3Rpb259IHx8ICcnOwogICAgbXkgJFRleHREaXIgICAgICAgICAgICAgID0gJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAgICAgICAgICAgICAgICAgICAgICB8fCAnJzsKICAgIG15ICRFZGl0aW5nQXJlYUNTUyAgICAgICA9ICdib2R5LmNrZV9lZGl0YWJsZSB7ICcgLiAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dDo6RGVmYXVsdENTUyIpIC4gJyB9JzsKCiAgICAjIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHVzZSB0aGUgZW5oYW5jZWQgbW9kZSAod2l0aCB0YWJsZXMpCiAgICBteSBAVG9vbGJhcjsKICAgIG15IEBUb29sYmFyV2l0aG91dEltYWdlOwoKICAgIGlmICggJFJpY2hUZXh0VHlwZSBlcSAnQ29kZU1pcnJvcicgKSB7CiAgICAgICAgQFRvb2xiYXIgPSBAVG9vbGJhcldpdGhvdXRJbWFnZSA9IFsKICAgICAgICAgICAgWyAnYXV0b0Zvcm1hdCcsICdDb21tZW50U2VsZWN0ZWRSYW5nZScsICdVbmNvbW1lbnRTZWxlY3RlZFJhbmdlJywgJ0F1dG9Db21wbGV0ZScgXSwKICAgICAgICAgICAgWyAnRmluZCcsICAgICAgICdSZXBsYWNlJywgICAgICAgICAgICAgICctJywgICAgICAgICAgICAgICAgICAgICAgJ1NlbGVjdEFsbCcgXSwKICAgICAgICAgICAgWydNYXhpbWl6ZSddLAogICAgICAgIF07CiAgICB9CiAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0OjpFbmhhbmNlZE1vZGUiKSA9PSAxICkgewogICAgICAgIEBUb29sYmFyID0gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnQm9sZCcsICAgJ0l0YWxpYycsICAgICAgICdVbmRlcmxpbmUnLCAgICAnU3RyaWtlJywgICAgICAgICdTdWJzY3JpcHQnLCAgICAnU3VwZXJzY3JpcHQnLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICdOdW1iZXJlZExpc3QnLCAnQnVsbGV0ZWRMaXN0JywgJ1RhYmxlJywgICAgICAgICAnLScsICAgICAgICAgICAgJ091dGRlbnQnLAogICAgICAgICAgICAgICAgJ0luZGVudCcsICctJywgICAgICAgICAgICAnSnVzdGlmeUxlZnQnLCAgJ0p1c3RpZnlDZW50ZXInLCAnSnVzdGlmeVJpZ2h0JywgJ0p1c3RpZnlCbG9jaycsCiAgICAgICAgICAgICAgICAnLScsICAgICAgJ0xpbmsnLCAgICAgICAgICdVbmxpbmsnLCAgICAgICAnVW5kbycsICAgICAgICAgICdSZWRvJywgICAgICAgICAnU2VsZWN0QWxsJwogICAgICAgICAgICBdLAogICAgICAgICAgICAnLycsCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdJbWFnZScsICAgJ0hvcml6b250YWxSdWxlJywgJ1Bhc3RlVGV4dCcsICdQYXN0ZUZyb21Xb3JkJywgJ1NwbGl0UXVvdGUnLCAnUmVtb3ZlUXVvdGUnLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICAnLScsICAgICAgICAgICAgJ0ZpbmQnLCAnUmVwbGFjZScsICAgICdUZXh0Q29sb3InLAogICAgICAgICAgICAgICAgJ0JHQ29sb3InLCAnUmVtb3ZlRm9ybWF0JywgJy0nLCAgICAnU2hvd0Jsb2NrcycsICdTb3VyY2UnLCAnU3BlY2lhbENoYXInLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICAnTWF4aW1pemUnCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsgJ0Zvcm1hdCcsICdGb250JywgJ0ZvbnRTaXplJyBdCiAgICAgICAgXTsKICAgICAgICBAVG9vbGJhcldpdGhvdXRJbWFnZSA9IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJ0JvbGQnLCAgICdJdGFsaWMnLCAgICAgICAnVW5kZXJsaW5lJywgICAgJ1N0cmlrZScsICAgICAgICAnU3Vic2NyaXB0JywgICAgJ1N1cGVyc2NyaXB0JywKICAgICAgICAgICAgICAgICctJywgICAgICAnTnVtYmVyZWRMaXN0JywgJ0J1bGxldGVkTGlzdCcsICdUYWJsZScsICAgICAgICAgJy0nLCAgICAgICAgICAgICdPdXRkZW50JywKICAgICAgICAgICAgICAgICdJbmRlbnQnLCAnLScsICAgICAgICAgICAgJ0p1c3RpZnlMZWZ0JywgICdKdXN0aWZ5Q2VudGVyJywgJ0p1c3RpZnlSaWdodCcsICdKdXN0aWZ5QmxvY2snLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICdMaW5rJywgICAgICAgICAnVW5saW5rJywgICAgICAgJ1VuZG8nLCAgICAgICAgICAnUmVkbycsICAgICAgICAgJ1NlbGVjdEFsbCcKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJy8nLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnSG9yaXpvbnRhbFJ1bGUnLCAnUGFzdGVUZXh0JywgJ1Bhc3RlRnJvbVdvcmQnLCAnU3BsaXRRdW90ZScsICdSZW1vdmVRdW90ZScsICctJywKICAgICAgICAgICAgICAgICctJywgICAgICAgICAgICAnRmluZCcsICdSZXBsYWNlJywgICAgJ1RleHRDb2xvcicsICdCR0NvbG9yJywKICAgICAgICAgICAgICAgICdSZW1vdmVGb3JtYXQnLCAnLScsICAgICdTaG93QmxvY2tzJywgJ1NvdXJjZScsICAgICdTcGVjaWFsQ2hhcicsICctJywKICAgICAgICAgICAgICAgICdNYXhpbWl6ZScKICAgICAgICAgICAgXSwKICAgICAgICAgICAgWyAnRm9ybWF0JywgJ0ZvbnQnLCAnRm9udFNpemUnIF0KICAgICAgICBdOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFRvb2xiYXIgPSBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdCb2xkJywgICAgICAgICAgJ0l0YWxpYycsICAgICAgICdVbmRlcmxpbmUnLCAgICAgICdTdHJpa2UnLCAnLScsICAgICdOdW1iZXJlZExpc3QnLAogICAgICAgICAgICAgICAgJ0J1bGxldGVkTGlzdCcsICAnLScsICAgICAgICAgICAgJ091dGRlbnQnLCAgICAgICAgJ0luZGVudCcsICctJywgICAgJ0p1c3RpZnlMZWZ0JywKICAgICAgICAgICAgICAgICdKdXN0aWZ5Q2VudGVyJywgJ0p1c3RpZnlSaWdodCcsICdKdXN0aWZ5QmxvY2snLCAgICctJywgICAgICAnTGluaycsICdVbmxpbmsnLAojIFJvdGhlciBPU1MgLyBUaW1lc3RhbXAgaW4gQ0tFCiMgICAgICAgICAgICAgICAgJy0nLCAgICAgICAgICAgICAnSW1hZ2UnLCAgICAgICAgJ0hvcml6b250YWxSdWxlJywgJy0nLCAgICAgICdVbmRvJywgJ1JlZG8nLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICAgICAgICAnSW1hZ2UnLCAgICAgICAgJ0hvcml6b250YWxSdWxlJywgJ1RpbWVzdGFtcCcsICctJywgJ1VuZG8nLCAnUmVkbycsCiMgRU8gVGltZXN0YW1wIGluIENLRQogICAgICAgICAgICAgICAgJy0nLCAgICAgICAgICAgICAnRmluZCcKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJy8nLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnRm9ybWF0JywgICAgICAgJ0ZvbnQnLCAnRm9udFNpemUnLCAnLScsICAgICAgICAgICAnVGV4dENvbG9yJywgICdCR0NvbG9yJywKICAgICAgICAgICAgICAgICdSZW1vdmVGb3JtYXQnLCAnLScsICAgICdTb3VyY2UnLCAgICdTcGVjaWFsQ2hhcicsICdTcGxpdFF1b3RlJywgJ1JlbW92ZVF1b3RlJywKICAgICAgICAgICAgICAgICctJywgICAgICAgICAgICAnTWF4aW1pemUnCiAgICAgICAgICAgIF0KICAgICAgICBdOwogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnQm9sZCcsICAgICAgICAgICdJdGFsaWMnLCAgICAgICAnVW5kZXJsaW5lJywgICAgJ1N0cmlrZScsCiAgICAgICAgICAgICAgICAnLScsICAgICAgICAgICAgICdOdW1iZXJlZExpc3QnLCAnQnVsbGV0ZWRMaXN0JywgJy0nLAogICAgICAgICAgICAgICAgJ091dGRlbnQnLCAgICAgICAnSW5kZW50JywgICAgICAgJy0nLCAgICAgICAgICAgICdKdXN0aWZ5TGVmdCcsCiAgICAgICAgICAgICAgICAnSnVzdGlmeUNlbnRlcicsICdKdXN0aWZ5UmlnaHQnLCAnSnVzdGlmeUJsb2NrJywgJy0nLAogICAgICAgICAgICAgICAgJ0xpbmsnLCAgICAgICAgICAnVW5saW5rJywgICAgICAgJy0nLCAgICAgICAgICAgICdIb3Jpem9udGFsUnVsZScsCiAgICAgICAgICAgICAgICAnLScsICAgICAgICAgICAgICdVbmRvJywgICAgICAgICAnUmVkbycsICAgICAgICAgJy0nLAogICAgICAgICAgICAgICAgJ0ZpbmQnCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICcvJywKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJ0Zvcm1hdCcsICAgICAgICdGb250JywgJ0ZvbnRTaXplJywgJy0nLCAgICAgICAgICAgJ1RleHRDb2xvcicsICAnQkdDb2xvcicsCiAgICAgICAgICAgICAgICAnUmVtb3ZlRm9ybWF0JywgJy0nLCAgICAnU291cmNlJywgICAnU3BlY2lhbENoYXInLCAnU3BsaXRRdW90ZScsICdSZW1vdmVRdW90ZScsCiAgICAgICAgICAgICAgICAnLScsICAgICAgICAgICAgJ01heGltaXplJwogICAgICAgICAgICBdCiAgICAgICAgXTsKICAgIH0KCiAgICAjIHNldCBkYXRhIHdpdGggQWRkSlNEYXRhKCkKICAgICRTZWxmLT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ1JpY2hUZXh0JywKICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgIEhlaWdodCAgICAgICAgID0+ICRTY3JlZW5SaWNoVGV4dEhlaWdodCwKICAgICAgICAgICAgV2lkdGggICAgICAgICAgPT4gJFNjcmVlblJpY2hUZXh0V2lkdGgsCiAgICAgICAgICAgIFRleHREaXIgICAgICAgID0+ICRUZXh0RGlyLAogICAgICAgICAgICBFZGl0aW5nQXJlYUNTUyA9PiAkRWRpdGluZ0FyZWFDU1MsCiAgICAgICAgICAgIExhbmcgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFNwbGl0UXVvdGUgID0+ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdTcGxpdCBRdW90ZScpLAogICAgICAgICAgICAgICAgUmVtb3ZlUXVvdGUgPT4gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ1JlbW92ZSBRdW90ZScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBUb29sYmFyICAgICAgICAgICAgID0+ICRUb29sYmFyWzBdLAogICAgICAgICAgICBUb29sYmFyV2l0aG91dEltYWdlID0+ICRUb29sYmFyV2l0aG91dEltYWdlWzBdLAogICAgICAgICAgICBQaWN0dXJlVXBsb2FkQWN0aW9uID0+ICRQaWN0dXJlVXBsb2FkQWN0aW9uLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgID0+ICRSaWNoVGV4dFR5cGUsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycygpCgpzZXQgcHJvcGVydGllcyBmb3IgY3VzdG9tZXIgcmljaCB0ZXh0IGVkaXRvciBhbmQgc2VuZCB0aGVtIHRvIEphdmFTY3JpcHQgdmlhIEFkZEpTRGF0YSgpCgokTGF5b3V0T2JqZWN0LT5DdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgIERhdGEgPT4gXCVQYXJhbSwKKTsKCj1jdXQKCnN1YiBDdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtEYXRhfSB8fD0ge307CgogICAgIyBnZXQgYW5kIGNoZWNrIHBhcmFtIERhdGEKICAgIGlmICggcmVmICRQYXJhbXtEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEhhc2hSZWYgaW4gUGFyYW0gRGF0YSEgR290OiAnIiAuIHJlZiggJFBhcmFte0RhdGF9ICkgLiAiJyEiLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5GYXRhbEVycm9yOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRTY3JlZW5SaWNoVGV4dEhlaWdodCA9ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0SGVpZ2h0Iik7CiAgICBteSAkU2NyZWVuUmljaFRleHRXaWR0aCAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dFdpZHRoIik7CiAgICBteSAkVGV4dERpciAgICAgICAgICAgICAgPSAkU2VsZi0+e1RleHREaXJlY3Rpb259ICAgICAgICAgICAgICAgICAgICAgIHx8ICcnOwogICAgbXkgJFBpY3R1cmVVcGxvYWRBY3Rpb24gID0gJFBhcmFte0RhdGF9LT57UmljaFRleHRQaWN0dXJlVXBsb2FkQWN0aW9ufSB8fCAnJzsKICAgIG15ICRFZGl0aW5nQXJlYUNTUyAgICAgICA9ICdib2R5IHsgJyAuICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OlJpY2hUZXh0OjpEZWZhdWx0Q1NTIikgLiAnIH0nOwoKICAgICMgZGVjaWRlIGlmIHdlIG5lZWQgdG8gdXNlIHRoZSBlbmhhbmNlZCBtb2RlICh3aXRoIHRhYmxlcykKICAgIG15IEBUb29sYmFyOwogICAgbXkgQFRvb2xiYXJXaXRob3V0SW1hZ2U7CiAgICBteSBAVG9vbGJhck1pZGk7CiAgICBteSBAVG9vbGJhck1pbmk7CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoIkZyb250ZW5kOjpSaWNoVGV4dDo6RW5oYW5jZWRNb2RlOjpDdXN0b21lciIpID09IDEgKSB7CiAgICAgICAgQFRvb2xiYXIgPSBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdCb2xkJywgICAnSXRhbGljJywgICAgICAgJ1VuZGVybGluZScsICAgICdTdHJpa2UnLCAgICAgICAgJ1N1YnNjcmlwdCcsICAgICdTdXBlcnNjcmlwdCcsCiAgICAgICAgICAgICAgICAnLScsICAgICAgJ051bWJlcmVkTGlzdCcsICdCdWxsZXRlZExpc3QnLCAnVGFibGUnLCAgICAgICAgICctJywgICAgICAgICAgICAnT3V0ZGVudCcsCiAgICAgICAgICAgICAgICAnSW5kZW50JywgJy0nLCAgICAgICAgICAgICdKdXN0aWZ5TGVmdCcsICAnSnVzdGlmeUNlbnRlcicsICdKdXN0aWZ5UmlnaHQnLCAnSnVzdGlmeUJsb2NrJywKICAgICAgICAgICAgICAgICctJywgICAgICAnTGluaycsICAgICAgICAgJ1VubGluaycsICAgICAgICdVbmRvJywgICAgICAgICAgJ1JlZG8nLCAgICAgICAgICdTZWxlY3RBbGwnCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICcvJywKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJ0ltYWdlJywgICAnSG9yaXpvbnRhbFJ1bGUnLCAnUGFzdGVUZXh0JywgJ1Bhc3RlRnJvbVdvcmQnLCAnU3BsaXRRdW90ZScsICdSZW1vdmVRdW90ZScsCiAgICAgICAgICAgICAgICAnLScsICAgICAgICctJywgICAgICAgICAgICAnRmluZCcsICdSZXBsYWNlJywgICAgJ1RleHRDb2xvcicsCiAgICAgICAgICAgICAgICAnQkdDb2xvcicsICdSZW1vdmVGb3JtYXQnLCAnLScsICAgICdTaG93QmxvY2tzJywgJ1NvdXJjZScsICdTcGVjaWFsQ2hhcicsCiAgICAgICAgICAgICAgICAnLScsICAgICAgICdNYXhpbWl6ZScKICAgICAgICAgICAgXSwKICAgICAgICAgICAgWyAnRm9ybWF0JywgJ0ZvbnQnLCAnRm9udFNpemUnIF0KICAgICAgICBdOwogICAgICAgIEBUb29sYmFyV2l0aG91dEltYWdlID0gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnQm9sZCcsICAgJ0l0YWxpYycsICAgICAgICdVbmRlcmxpbmUnLCAgICAnU3RyaWtlJywgICAgICAgICdTdWJzY3JpcHQnLCAgICAnU3VwZXJzY3JpcHQnLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICdOdW1iZXJlZExpc3QnLCAnQnVsbGV0ZWRMaXN0JywgJ1RhYmxlJywgICAgICAgICAnLScsICAgICAgICAgICAgJ091dGRlbnQnLAogICAgICAgICAgICAgICAgJ0luZGVudCcsICctJywgICAgICAgICAgICAnSnVzdGlmeUxlZnQnLCAgJ0p1c3RpZnlDZW50ZXInLCAnSnVzdGlmeVJpZ2h0JywgJ0p1c3RpZnlCbG9jaycsCiAgICAgICAgICAgICAgICAnLScsICAgICAgJ0xpbmsnLCAgICAgICAgICdVbmxpbmsnLCAgICAgICAnVW5kbycsICAgICAgICAgICdSZWRvJywgICAgICAgICAnU2VsZWN0QWxsJwogICAgICAgICAgICBdLAogICAgICAgICAgICAnLycsCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdIb3Jpem9udGFsUnVsZScsICdQYXN0ZVRleHQnLCAnUGFzdGVGcm9tV29yZCcsICdTcGxpdFF1b3RlJywgJ1JlbW92ZVF1b3RlJywgJy0nLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICAgICAgICdGaW5kJywgJ1JlcGxhY2UnLCAgICAnVGV4dENvbG9yJywgJ0JHQ29sb3InLAogICAgICAgICAgICAgICAgJ1JlbW92ZUZvcm1hdCcsICctJywgICAgJ1Nob3dCbG9ja3MnLCAnU291cmNlJywgICAgJ1NwZWNpYWxDaGFyJywgJy0nLAogICAgICAgICAgICAgICAgJ01heGltaXplJwogICAgICAgICAgICBdLAogICAgICAgICAgICBbICdGb3JtYXQnLCAnRm9udCcsICdGb250U2l6ZScgXQogICAgICAgIF07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAVG9vbGJhciA9IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJ0JvbGQnLCAgICAgICAgICAnSXRhbGljJywgICAgICAgJ1VuZGVybGluZScsICAgICAgJ1N0cmlrZScsICctJywgICAgJ051bWJlcmVkTGlzdCcsCiAgICAgICAgICAgICAgICAnQnVsbGV0ZWRMaXN0JywgICctJywgICAgICAgICAgICAnT3V0ZGVudCcsICAgICAgICAnSW5kZW50JywgJy0nLCAgICAnSnVzdGlmeUxlZnQnLAogICAgICAgICAgICAgICAgJ0p1c3RpZnlDZW50ZXInLCAnSnVzdGlmeVJpZ2h0JywgJ0p1c3RpZnlCbG9jaycsICAgJy0nLCAgICAgICdMaW5rJywgJ1VubGluaycsCiAgICAgICAgICAgICAgICAnLScsICAgICAgICAgICAgICdJbWFnZScsICAgICAgICAnSG9yaXpvbnRhbFJ1bGUnLCAnLScsICAgICAgJ1VuZG8nLCAnUmVkbycsCiAgICAgICAgICAgICAgICAnLScsICAgICAgICAgICAgICdGaW5kJwogICAgICAgICAgICBdLAogICAgICAgICAgICAnLycsCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdGb3JtYXQnLCAgICAgICAnRm9udCcsICdGb250U2l6ZScsICctJywgICAgICAgICAgICdUZXh0Q29sb3InLCAgJ0JHQ29sb3InLAogICAgICAgICAgICAgICAgJ1JlbW92ZUZvcm1hdCcsICctJywgICAgJ1NvdXJjZScsICAgJ1NwZWNpYWxDaGFyJywgJ1NwbGl0UXVvdGUnLCAnUmVtb3ZlUXVvdGUnLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICAgICAgICdNYXhpbWl6ZScKICAgICAgICAgICAgXQogICAgICAgIF07CiAgICAgICAgQFRvb2xiYXJXaXRob3V0SW1hZ2UgPSBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdCb2xkJywgICAgICAgICAgJ0l0YWxpYycsICAgICAgICdVbmRlcmxpbmUnLCAgICAnU3RyaWtlJywKICAgICAgICAgICAgICAgICctJywgICAgICAgICAgICAgJ051bWJlcmVkTGlzdCcsICdCdWxsZXRlZExpc3QnLCAnLScsCiAgICAgICAgICAgICAgICAnT3V0ZGVudCcsICAgICAgICdJbmRlbnQnLCAgICAgICAnLScsICAgICAgICAgICAgJ0p1c3RpZnlMZWZ0JywKICAgICAgICAgICAgICAgICdKdXN0aWZ5Q2VudGVyJywgJ0p1c3RpZnlSaWdodCcsICdKdXN0aWZ5QmxvY2snLCAnLScsCiAgICAgICAgICAgICAgICAnTGluaycsICAgICAgICAgICdVbmxpbmsnLCAgICAgICAnLScsICAgICAgICAgICAgJ0hvcml6b250YWxSdWxlJywKICAgICAgICAgICAgICAgICctJywgICAgICAgICAgICAgJ1VuZG8nLCAgICAgICAgICdSZWRvJywgICAgICAgICAnLScsCiAgICAgICAgICAgICAgICAnRmluZCcKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJy8nLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnRm9ybWF0JywgICAgICAgJ0ZvbnQnLCAnRm9udFNpemUnLCAnLScsICAgICAgICAgICAnVGV4dENvbG9yJywgICdCR0NvbG9yJywKICAgICAgICAgICAgICAgICdSZW1vdmVGb3JtYXQnLCAnLScsICAgICdTb3VyY2UnLCAgICdTcGVjaWFsQ2hhcicsICdTcGxpdFF1b3RlJywgJ1JlbW92ZVF1b3RlJywKICAgICAgICAgICAgICAgICctJywgICAgICAgICAgICAnTWF4aW1pemUnCiAgICAgICAgICAgIF0KICAgICAgICBdOwogICAgICAgIEBUb29sYmFyTWlkaSA9IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJ0JvbGQnLCAgICAgICAgICdJdGFsaWMnLCAnVW5kZXJsaW5lJywgJ1N0cmlrZScsICctJywgJ051bWJlcmVkTGlzdCcsCiAgICAgICAgICAgICAgICAnQnVsbGV0ZWRMaXN0JywgJy0nLCAgICAgICdMaW5rJywgICAgICAnVW5saW5rJywgJy0nLCAnSG9yaXpvbnRhbFJ1bGUnLAogICAgICAgICAgICAgICAgJy0nLCAgICAgICAgICAgICdVbmRvJywgICAnUmVkbycsICAgICAgJy0nLCAgICAgICdNYXhpbWl6ZScKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJy8nLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnRm9udFNpemUnLCAnLScsICAgICAgICAgICAnVGV4dENvbG9yJywgICdCR0NvbG9yJywgJ1JlbW92ZUZvcm1hdCcsCiAgICAgICAgICAgICAgICAnLScsICAgICAgICAnU3BlY2lhbENoYXInLCAnU3BsaXRRdW90ZScsICdSZW1vdmVRdW90ZScsCiAgICAgICAgICAgIF0KICAgICAgICBdOwogICAgICAgIEBUb29sYmFyTWluaSA9IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJ0JvbGQnLCAnSXRhbGljJywgJ1VuZGVybGluZScsICdTdHJpa2UnLCAnLScsICAgICdCdWxsZXRlZExpc3QnLAogICAgICAgICAgICAgICAgJy0nLCAgICAnTGluaycsICAgJ1VubGluaycsICAgICctJywgICAgICAnVW5kbycsICdSZWRvJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJy8nLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnRm9udFNpemUnLCAnLScsICdUZXh0Q29sb3InLCAnUmVtb3ZlRm9ybWF0JywgJy0nLCAnU3BsaXRRdW90ZScsICdSZW1vdmVRdW90ZScsCiAgICAgICAgICAgIF0KICAgICAgICBdOwogICAgfQoKICAgICMgc2V0IGRhdGEgd2l0aCBBZGRKU0RhdGEoKQogICAgJFNlbGYtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmljaFRleHQnLAogICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgSGVpZ2h0ICAgICAgICAgPT4gJFNjcmVlblJpY2hUZXh0SGVpZ2h0LAogICAgICAgICAgICBXaWR0aCAgICAgICAgICA9PiAkU2NyZWVuUmljaFRleHRXaWR0aCwKICAgICAgICAgICAgVGV4dERpciAgICAgICAgPT4gJFRleHREaXIsCiAgICAgICAgICAgIEVkaXRpbmdBcmVhQ1NTID0+ICRFZGl0aW5nQXJlYUNTUywKICAgICAgICAgICAgTGFuZyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgU3BsaXRRdW90ZSA9PiAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgnU3BsaXQgUXVvdGUnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVG9vbGJhciAgICAgICAgICAgICA9PiAkVG9vbGJhclswXSwKICAgICAgICAgICAgVG9vbGJhcldpdGhvdXRJbWFnZSA9PiAkVG9vbGJhcldpdGhvdXRJbWFnZVswXSwKICAgICAgICAgICAgVG9vbGJhck1pZGkgICAgICAgICA9PiAkVG9vbGJhck1pZGlbMF0sCiAgICAgICAgICAgIFRvb2xiYXJNaW5pICAgICAgICAgPT4gJFRvb2xiYXJNaW5pWzBdLAogICAgICAgICAgICBQaWN0dXJlVXBsb2FkQWN0aW9uID0+ICRQaWN0dXJlVXBsb2FkQWN0aW9uLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVXNlckluaXRpYWxzR2V0KCkKCkdldCBpbml0aWFscyBmcm9tIGEgZnVsbCBuYW1lIG9mIGEgdXNlci4KCiAgICBteSAkVXNlckluaXRpYWxzID0gJExheW91dE9iamVjdC0+VXNlckluaXRpYWxzR2V0KAogICAgICAgIEZ1bGxuYW1lID0+ICdKb2huIERvZScsCiAgICApOwoKUmV0dXJucyBzdHJpbmcgb2YgZXhhY3RseSB0d28gdXBwZXJjYXNlIGNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnQgdXNlciBpbml0aWFsczoKCiAgICAkVXNlckluaXRpYWxzID0gJ0pEJzsKClBsZWFzZSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAnTycgaWYgaW52YWxpZCBuYW1lICh3aXRob3V0IGFueSB3b3JkIGNoYXJhY3RlcnMpIHdhcyBzdXBwbGllZC4KCj1jdXQKCnN1YiBVc2VySW5pdGlhbHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEZhbGxiYWNrIGluIGNhc2UgbmFtZSBpcyBpbnZhbGlkLgogICAgbXkgJFVzZXJJbml0aWFscyA9ICdPJzsKICAgIHJldHVybiAkVXNlckluaXRpYWxzIGlmICEkUGFyYW17RnVsbG5hbWV9OwoKICAgICMgUmVtb3ZlIGFueXRoaW5nIGZvdW5kIGluIGJyYWNrZXRzIChlbWFpbCBhZGRyZXNzLCBldGMpLgogICAgbXkgJEZ1bGxuYW1lID0gJFBhcmFte0Z1bGxuYW1lfSA9fiBzL1s8W3soXS4qWz5cXX0pXS8vcjsKCiAgICAjIFRyaW0gd2hpdGVzcGFjZXMuCiAgICAkRnVsbG5hbWUgPX4gcy9eXHMrfFxzKyQvL2c7CgogICAgIyBTcGxpdCBmdWxsIG5hbWUgYnkgd2hpdGVzcGFjZS4KICAgIG15IEBVc2VyTmFtZXMgPSBzcGxpdCAvXHMrLywgJEZ1bGxuYW1lOwogICAgaWYgKEBVc2VyTmFtZXMpIHsKCiAgICAgICAgIyBDbGVhbnVwIHVubmVjZXNzYXJ5IGNoYXJhY3RlcnMuCiAgICAgICAgbXkgJEZpcnN0TmFtZSA9ICRVc2VyTmFtZXNbMF0gPX4gcy9cVy8vZ3I7CiAgICAgICAgcmV0dXJuICRVc2VySW5pdGlhbHMgaWYgISRGaXJzdE5hbWU7CgogICAgICAgICMgR2V0IGZpcnN0IGNoYXJhY3RlciBvZiBmaXJzdCBuYW1lLgogICAgICAgICRVc2VySW5pdGlhbHMgPSB1YyBzdWJzdHIgJEZpcnN0TmFtZSwgMCwgMTsKCiAgICAgICAgaWYgKCBAVXNlck5hbWVzID4gMSApIHsKCiAgICAgICAgICAgICMgQ2xlYW51cCB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzLgogICAgICAgICAgICBteSAkTGFzdE5hbWUgPSAkVXNlck5hbWVzWy0xXSA9fiBzL1xXLy9ncjsKICAgICAgICAgICAgcmV0dXJuICRVc2VySW5pdGlhbHMgaWYgISRMYXN0TmFtZTsKCiAgICAgICAgICAgICMgR2V0IGZpcnN0IGNoYXJhY3RlciBvZiBsYXN0IG5hbWUuCiAgICAgICAgICAgICRVc2VySW5pdGlhbHMgLj0gdWMgc3Vic3RyICRMYXN0TmFtZSwgMCwgMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRVc2VySW5pdGlhbHM7Cn0KCj1oZWFkMiBTZXRDb29raWUoKQoKU2V0IGEgY29va2llIHVzaW5nIHRoZSBzeW50YXggb2YgS2VybmVsL1N5c3RlbS9SZXF1ZXN0LnBtCgogICAgJFJlc3BvbnNlT2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgS2V5ICAgICAgPT4gJ0lEJywgICAgICAgICMgbmFtZQogICAgICAgIFZhbHVlICAgID0+IDEyMzQ1NiwgICAgICAjIHZhbHVlCiAgICAgICAgRXhwaXJlcyAgPT4gJyszNjYwcycsICAgICMgZXhwaXJlcwogICAgICAgIFBhdGggICAgID0+ICdvdG9iby8nLCAgICAjIHBhdGggb3B0aW9uYWwsIG9ubHkgYWxsb3cgY29va2llIGZvciBnaXZlbiBwYXRoLCAnLycgd2lsbCBiZSBwcmVwZW5kZWQKICAgICAgICBTZWN1cmUgICA9PiAxLCAgICAgICAgICAgIyBzZWN1cmUgb3B0aW9uYWwsIHNldCBzZWN1cmUgYXR0cmlidXRlIHRvIGRpc2FibGUgY29va2llIG9uIEhUVFAgKEhUVFBTIG9ubHkpLCBkZWZhdWx0IGlzIG9mZgogICAgICAgIEhUVFBPbmx5ID0+IDEsICAgICAgICAgICAjIGh0dHBvbmx5IG9wdGlvbmFsLCBzZXRzIEh0dHBPbmx5IGF0dHJpYnV0ZSBvZiBjb29raWUgdG8gcHJldmVudCBhY2Nlc3MgdmlhIEphdmFTY3JpcHQsIGRlZmF1bHQgaXMgb2ZmCiAgICApOwoKPWN1dAoKc3ViIFNldENvb2tpZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdy9LZXkvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntTZXRDb29raWVzfS0+eyAkUGFyYW17S2V5fSB9ID0gewogICAgICAgIG5hbWUgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgIHZhbHVlICAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgZXhwaXJlcyAgPT4gJFBhcmFte0V4cGlyZXN9LAogICAgICAgIHNlY3VyZSAgID0+ICRQYXJhbXtTZWN1cmV9ICAgfHwgJycsCiAgICAgICAgaHR0cG9ubHkgPT4gJFBhcmFte0hUVFBPbmx5fSB8fCAnJywKICAgICAgICBwYXRoICAgICA9PiAnLycgLiAoICRQYXJhbXtQYXRofSAvLyAnJyApLAogICAgfTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9IYXNPbmx5T0lEQ0F1dGhNb2R1bGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJExvZ2luVHlwZSA9ICRQYXJhbXtMb2dpblR5cGV9IHx8ICdBZ2VudCc7CgogICAgbXkgJExvZ2luTW9kdWxlID0gJExvZ2luVHlwZSBlcSAnQ3VzdG9tZXInCiAgICAgICAgPyAnQ3VzdG9tZXI6OkF1dGhNb2R1bGUnCiAgICAgICAgOiAnQXV0aE1vZHVsZSc7CgogICAgbXkgJE9JRENBdXRoTW9kdWxlID0gJExvZ2luVHlwZSBlcSAnQ3VzdG9tZXInCiAgICAgICAgPyAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6T3BlbklEQ29ubmVjdCcKICAgICAgICA6ICdLZXJuZWw6OlN5c3RlbTo6QXV0aDo6T3BlbklEQ29ubmVjdCc7CgogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG15ICRNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIiRMb2dpbk1vZHVsZSRDb3VudCIpOwoKICAgICAgICBpZiAoICRNb2R1bGUgJiYgJE1vZHVsZSBuZSAkT0lEQ0F1dGhNb2R1bGUgKSB7CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="var/httpd/htdocs/js/Core.UI.RichTextEditor.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMjEtMjAyNCBabnVueSBHbWJILCBodHRwczovL3pudW55Lm9yZy8KLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwovLyAtLQovLyAkb3JpZ2luOiBvdG9ibyAtIGZmOWUyOTdiYWYyODdlMTYwNzFkM2FjNmFkN2Y2YzEzZjExYWM3ZmEgLSB2YXIvaHR0cGQvaHRkb2NzL2pzL0NvcmUuVUkuUmljaFRleHRFZGl0b3IuanMKLy8gLS0KLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLy8gRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi8vIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgovLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQovLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5VSSA9IENvcmUuVUkgfHwge307CgovKioKICogQG5hbWVzcGFjZSBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAqIEBtZW1iZXJvZiBDb3JlLlVJCiAqIEBhdXRob3IKICogQGRlc2NyaXB0aW9uCiAqICAgICAgUmljaHRleHQgRWRpdG9yLgogKi8KQ29yZS5VSS5SaWNoVGV4dEVkaXRvciA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lICRGb3JtSUQKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAbWVtYmVyIHtqUXVlcnlPYmplY3R9CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSGlkZGVuIGlucHV0IGZpZWxkIHdpdGggbmFtZSBGb3JtSUQuCiAgICAgKi8KICAgIHZhciAkRm9ybUlELAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFRpbWVPdXRSVEVPbkNoYW5nZQogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBtZW1iZXIge09iamVjdH0KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBPYmplY3QgdG8gaGFuZGxlIHRpbWVvdXQuCiAgICAgKi8KICAgICAgICBUaW1lT3V0UlRFT25DaGFuZ2U7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tGb3JtSUQKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtqUXVlcnlPYmplY3R9IEZvcm1JRCBlbGVtZW50LgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFZGl0b3JBcmVhIC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgdGhhdCBoYXMgYmVjb21lIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBDaGVjayBpbiB0aGUgd2luZG93IHdoaWNoIGhpZGRlbiBlbGVtZW50IGhhcyBhIG5hbWUgc2FtZSB0byAnRm9ybUlEJyBhbmQgcmV0dXJuIGl0IGxpa2UgYSBKUXVlcnkgb2JqZWN0LgogICAgICovCiAgICBmdW5jdGlvbiBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkgewogICAgICAgIGlmICh0eXBlb2YgJEZvcm1JRCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJEZvcm1JRCA9ICRFZGl0b3JBcmVhLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dDpoaWRkZW5bbmFtZT1Gb3JtSURdJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkRm9ybUlEOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdEVkaXRvcgogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgZmFsc2Ugb24gZXJyb3IuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVkaXRvckFyZWEgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBleGVjdXRlcyB0aGUgbmVlZGVkIGZ1bmN0aW9ucy4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdEVkaXRvciA9IGZ1bmN0aW9uICgkRWRpdG9yQXJlYSkgewogICAgICAgIHZhciBFZGl0b3JJRCA9ICcnLAogICAgICAgICAgICBFZGl0b3IsCiAgICAgICAgICAgIFVzZXJMYW5ndWFnZSwKICAgICAgICAgICAgVXBsb2FkVVJMID0gJycsCiAgICAgICAgICAgIEVkaXRvckNvbmZpZywKICAgICAgICAgICAgUmVtb3ZlZENLRWRpdG9yUGx1Z2lucyA9ICcnLAogICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSA9ICggQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uTmFtZScpID09PSBDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpICk7CgogICAgICAgIGlmICh0eXBlb2YgQ0tFRElUT1IgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEuaGFzQ2xhc3MoJ0hhc0NLRUluc3RhbmNlJykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFZGl0b3JBcmVhKSAmJiAkRWRpdG9yQXJlYS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgRWRpdG9ySUQgPSAkRWRpdG9yQXJlYS5hdHRyKCdpZCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEVkaXRvcklEID09PSAnJykgewogICAgICAgICAgICBDb3JlLkV4Y2VwdGlvbi5UaHJvdygnUmljaFRleHRFZGl0b3I6IE5lZWQgZXhhY3RseSBvbmUgRWRpdG9yQXJlYSEnLCAnVHlwZUVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBtYXJrIHRoZSBlZGl0b3IgdGV4dGFyZWEgYXMgbGlua2VkIHdpdGggYW4gUlRFIGluc3RhbmNlIHRvIGF2b2lkIG11bHRpcGxlIGluc3RhbmNlcwogICAgICAgICRFZGl0b3JBcmVhLmFkZENsYXNzKCdIYXNDS0VJbnN0YW5jZScpOwoKICAgICAgICBDS0VESVRPUi5vbignaW5zdGFuY2VDcmVhdGVkJywgZnVuY3Rpb24gKEVkaXRvcikgewogICAgICAgICAgICBDS0VESVRPUi5hZGRDc3MoQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5FZGl0aW5nQXJlYUNTUycpKTsKCiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdmFsaWRhdGlvbiBlcnJvciB0b29sdGlwIGlmIGNvbnRlbnQgaXMgYWRkZWQgdG8gdGhlIGVkaXRvcgogICAgICAgICAgICBFZGl0b3IuZWRpdG9yLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoVGltZU91dFJURU9uQ2hhbmdlKTsKICAgICAgICAgICAgICAgIFRpbWVPdXRSVEVPbkNoYW5nZSA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuVmFsaWRhdGVFbGVtZW50KCQoRWRpdG9yLmVkaXRvci5lbGVtZW50LiQpKTsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFwcC5QdWJsaXNoKCdFdmVudC5VSS5SaWNoVGV4dEVkaXRvci5DaGFuZ2VWYWxpZGF0aW9uQ29tcGxldGUnLCBbRWRpdG9yXSk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIENvcmUuQXBwLlB1Ymxpc2goJ0V2ZW50LlVJLlJpY2hUZXh0RWRpdG9yLkluc3RhbmNlQ3JlYXRlZCcsIFtFZGl0b3JdKTsKICAgICAgICB9KTsKCiAgICAgICAgQ0tFRElUT1Iub24oJ2luc3RhbmNlUmVhZHknLCBmdW5jdGlvbiAoRWRpdG9yKSB7CgogICAgICAgICAgICAvLyBzcGVjaWZpYyBjb25maWcgZm9yIENvZGVNaXJyb3IgaW5zdGFuY2VzIChlLmcuIFhTTFQgZWRpdG9yKQogICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5UeXBlJykgPT0gJ0NvZGVNaXJyb3InKSB7CgogICAgICAgICAgICAgICAgLy8gVGhlIHdpZHRoIG9mIGEgdGFiIGNoYXJhY3Rlci4gRGVmYXVsdHMgdG8gNC4KICAgICAgICAgICAgICAgIHdpbmRvd1sgJ2NvZGVtaXJyb3JfJyArIEVkaXRvci5lZGl0b3IuaWQgXS5zZXRPcHRpb24oInRhYlNpemUiLCA0KTsKCiAgICAgICAgICAgICAgICAvLyBIb3cgbWFueSBzcGFjZXMgYSBibG9jayAod2hhdGV2ZXIgdGhhdCBtZWFucyBpbiB0aGUgZWRpdGVkIGxhbmd1YWdlKSBzaG91bGQgYmUgaW5kZW50ZWQuIFRoZSBkZWZhdWx0IGlzIDIuCiAgICAgICAgICAgICAgICB3aW5kb3dbICdjb2RlbWlycm9yXycgKyBFZGl0b3IuZWRpdG9yLmlkIF0uc2V0T3B0aW9uKCJpbmRlbnRVbml0IiwgNCk7CgogICAgICAgICAgICAgICAgLy8gV2hldGhlciB0byB1c2UgdGhlIGNvbnRleHQtc2Vuc2l0aXZlIGluZGVudGF0aW9uIHRoYXQgdGhlIG1vZGUgcHJvdmlkZXMgKG9yIGp1c3QgaW5kZW50IHRoZSBzYW1lIGFzIHRoZSBsaW5lIGJlZm9yZSkuIERlZmF1bHRzIHRvIHRydWUuCiAgICAgICAgICAgICAgICB3aW5kb3dbICdjb2RlbWlycm9yXycgKyBFZGl0b3IuZWRpdG9yLmlkIF0uc2V0T3B0aW9uKCJ0YWJNb2RlIiwgJ3NwYWNlcycpOwogICAgICAgICAgICAgICAgd2luZG93WyAnY29kZW1pcnJvcl8nICsgRWRpdG9yLmVkaXRvci5pZCBdLnNldE9wdGlvbigic21hcnRJbmRlbnQiLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzCiAgICAgICAgICAgICAgICB3aW5kb3dbICdjb2RlbWlycm9yXycgKyBFZGl0b3IuZWRpdG9yLmlkIF0uc2V0T3B0aW9uKCJleHRyYUtleXMiLCB7CiAgICAgICAgICAgICAgICAgICAgVGFiOiBmdW5jdGlvbihjbSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3BhY2VzID0gQXJyYXkoY20uZ2V0T3B0aW9uKCJpbmRlbnRVbml0IikgKyAxKS5qb2luKCIgIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oc3BhY2VzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ29yZS5BcHAuUHVibGlzaCgnRXZlbnQuVUkuUmljaFRleHRFZGl0b3IuSW5zdGFuY2VSZWFkeScsIFtFZGl0b3JdKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gVGhlIGZvcm1hdCBmb3IgdGhlIGxhbmd1YWdlIGlzIGRpZmZlcmVudCBiZXR3ZWVuIE9UT0JPIGFuZCBDS0VkaXRvciAoc2VlIGJ1ZyM4MDI0KQogICAgICAgIC8vIFRvIGNvcnJlY3QgdGhpcywgd2UgcmVwbGFjZSAiXyIgd2l0aCAiLSIgaW4gdGhlIGxhbmd1YWdlIChlLmcuIHpoX0NOIGJlY29tZXMgemgtY24pCiAgICAgICAgVXNlckxhbmd1YWdlID0gQ29yZS5Db25maWcuR2V0KCdVc2VyTGFuZ3VhZ2UnKS5yZXBsYWNlKC9fLywgIi0iKTsKCiAgICAgICAgLy8gYnVpbGQgVVJMIGZvciBpbWFnZSB1cGxvYWQKICAgICAgICBpZiAoQ2hlY2tGb3JtSUQoJEVkaXRvckFyZWEpLmxlbmd0aCkgewoKICAgICAgICAgICAgVXBsb2FkVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpCiAgICAgICAgICAgICAgICAgICAgKyAnQWN0aW9uPScKICAgICAgICAgICAgICAgICAgICArIENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuUGljdHVyZVVwbG9hZEFjdGlvbicsICdQaWN0dXJlVXBsb2FkJykKICAgICAgICAgICAgICAgICAgICArICcmRm9ybUlEPScKICAgICAgICAgICAgICAgICAgICArIENoZWNrRm9ybUlEKCRFZGl0b3JBcmVhKS52YWwoKQogICAgICAgICAgICAgICAgICAgICsgJyYnICsgQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uTmFtZScpCiAgICAgICAgICAgICAgICAgICAgKyAnPScgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRCcpOwogICAgICAgIH0KCiAgICAgICAgdmFyIFRvb2xiYXJDb25maWc7CiAgICAgICAgaWYgKCBDdXN0b21lckludGVyZmFjZSApIHsKICAgICAgICAgICAgVG9vbGJhckNvbmZpZyA9ICRFZGl0b3JBcmVhLndpZHRoKCkgPCA0NTQgPyBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJNaW5pJykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVkaXRvckFyZWEud2lkdGgoKSA8IDYyMiA/IENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuVG9vbGJhck1pZGknKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkubGVuZ3RoID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyJykgOiBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJXaXRob3V0SW1hZ2UnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFRvb2xiYXJDb25maWcgPSBDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkubGVuZ3RoID8gQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5Ub29sYmFyJykgOiBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRvb2xiYXJXaXRob3V0SW1hZ2UnKTsKICAgICAgICB9CgogICAgICAgIC8vIHNldCBkZWZhdWx0IGVkaXRvciBjb25maWcsIGJ1dCBhbGxvdyBjdXN0b20gY29uZmlnIGZvciBvdGhlciB0eXBlcyBmb3IgZWRpdG9ycwogICAgICAgIC8qZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovCiAgICAgICAgUmVtb3ZlZENLRWRpdG9yUGx1Z2lucyA9ICdkZXZ0b29scyxpbWFnZSxtYXRoamF4LGVtYmVkLGVtYmVkc2VtYW50aWMsZXhwb3J0cGRmLHNvdXJjZWRpYWxvZyxiYmNvZGUsZGl2YXJlYSxlbGVtZW50c3BhdGgsc3R5bGVzaGVldHBhcnNlcixhdXRvZ3Jvdyc7CiAgICAgICAgaWYgKCFDaGVja0Zvcm1JRCgkRWRpdG9yQXJlYSkubGVuZ3RoKSB7CiAgICAgICAgICAgIFJlbW92ZWRDS0VkaXRvclBsdWdpbnMgKz0gJyxpbWFnZTIsdXBsb2FkaW1hZ2UnOwogICAgICAgIH0KICAgICAgICBFZGl0b3JDb25maWcgPSB7CiAgICAgICAgICAgIGN1c3RvbUNvbmZpZzogICAgICAgICAgICAgICcnLCAgICAgICAgLy8gYXZvaWQgbG9hZGluZyBleHRlcm5hbCBjb25maWcgZmlsZXMgbGlrZSBjb25maWcuanMKICAgICAgICAgICAgdmVyc2lvbkNoZWNrOiAgICAgICAgICAgICAgZmFsc2UsICAgICAvLyBkb24ndCBib3RoZXIgdXNlcnMgd2l0aCBhbm5veWluZyBtZXNzYWdlcwogICAgICAgICAgICBkaXNhYmxlTmF0aXZlU3BlbGxDaGVja2VyOiBmYWxzZSwKICAgICAgICAgICAgZGVmYXVsdExhbmd1YWdlOiAgICAgICAgICAgVXNlckxhbmd1YWdlLAogICAgICAgICAgICBsYW5ndWFnZTogICAgICAgICAgICAgICAgICBVc2VyTGFuZ3VhZ2UsCiAgICAgICAgICAgIHdpZHRoOiAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnUmljaFRleHQuV2lkdGgnLCA2MjApLAogICAgICAgICAgICByZXNpemVfbWluV2lkdGg6ICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LldpZHRoJywgNjIwKSwKICAgICAgICAgICAgaGVpZ2h0OiAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5IZWlnaHQnLCAzMjApLAogICAgICAgICAgICByZW1vdmVQbHVnaW5zOiAgICAgICAgICAgICBSZW1vdmVkQ0tFZGl0b3JQbHVnaW5zLAogICAgICAgICAgICBmb3JjZVBhc3RlQXNQbGFpblRleHQ6ICAgICBmYWxzZSwKICAgICAgICAgICAgZm9ybWF0X3RhZ3M6ICAgICAgICAgICAgICAgJ3A7aDE7aDI7aDM7aDQ7aDU7aDY7cHJlJywKICAgICAgICAgICAgZm9udFNpemVfc2l6ZXM6ICAgICAgICAgICAgJzhweDsxMHB4OzEycHg7MTZweDsxOHB4OzIwcHg7MjJweDsyNHB4OzI2cHg7MjhweDszMHB4OycsCiAgICAgICAgICAgIGV4dHJhQWxsb3dlZENvbnRlbnQ6ICAgICAgICdkaXZbdHlwZV17Kn07IGltZ1sqXXsqfTsgY29sW3dpZHRoXTsgc3R5bGVbKl17Kn07ICpbaWRdKCopJywKICAgICAgICAgICAgZW50ZXJNb2RlOiAgICAgICAgICAgICAgICAgQ0tFRElUT1IuRU5URVJfQlIsCiAgICAgICAgICAgIHNoaWZ0RW50ZXJNb2RlOiAgICAgICAgICAgIENLRURJVE9SLkVOVEVSX0JSLAogICAgICAgICAgICBjb250ZW50c0xhbmdEaXJlY3Rpb246ICAgICBDb3JlLkNvbmZpZy5HZXQoJ1JpY2hUZXh0LlRleHREaXInLCAnbHRyJyksCiAgICAgICAgICAgIHRvb2xiYXI6ICAgICAgICAgICAgICAgICAgIFRvb2xiYXJDb25maWcsCiAgICAgICAgICAgIGZpbGVicm93c2VyQnJvd3NlVXJsOiAgICAgICcnLAogICAgICAgICAgICBmaWxlYnJvd3NlclVwbG9hZFVybDogICAgICBVcGxvYWRVUkwsCiAgICAgICAgICAgIHVwbG9hZFVybDogICAgICAgICAgICAgICAgIFVwbG9hZFVSTCwKICAgICAgICAgICAgY2xpcGJvYXJkX2hhbmRsZUltYWdlczogICAgZmFsc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBtZXNzYWdlIGFib3V0IGF1dG9tYXRpYyBkZWFjdGl2YXRpb24KLy8gUm90aGVyIE9TUyAvIFRpbWVzdGFtcCBpbiBDS0UKLy8gICAgICAgICAgICBleHRyYVBsdWdpbnM6ICdzcGxpdHF1b3RlLGNvbnRleHRtZW51X2xpbmtvcGVuJywKICAgICAgICAgICAgZXh0cmFQbHVnaW5zOiAnc3BsaXRxdW90ZSxjb250ZXh0bWVudV9saW5rb3Blbix0aW1lc3RhbXAnLAovLyBFTyBUaW1lc3RhbXAgaW4gQ0tFCiAgICAgICAgICAgIGVudGl0aWVzOiAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICBza2luOiAgICAgICAgICAgICAgICAgICAgICAnbW9vbm8tbGlzYScKICAgICAgICB9OwogICAgICAgIC8qZXNsaW50LWVuYWJsZSBjYW1lbGNhc2UgKi8KCiAgICAgICAgLy8gc3BlY2lmaWMgY29uZmlnIGZvciBDb2RlTWlycm9yIGluc3RhbmNlcyAoZS5nLiBYU0xUIGVkaXRvcikKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dC5UeXBlJykgPT0gJ0NvZGVNaXJyb3InKSB7CiAgICAgICAgICAgICQuZXh0ZW5kKEVkaXRvckNvbmZpZywgewoKICAgICAgICAgICAgICAgIC8qZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovCiAgICAgICAgICAgICAgICBzdGFydHVwTW9kZTogICAgJ3NvdXJjZScsCiAgICAgICAgICAgICAgICBhbGxvd2VkQ29udGVudDogdHJ1ZSwKICAgICAgICAgICAgICAgIGV4dHJhUGx1Z2luczogICAnY29kZW1pcnJvcicsCiAgICAgICAgICAgICAgICBjb2RlbWlycm9yOiAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZW1lOiAgICAgICAgICAgICAgICAgICdkZWZhdWx0JywKICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyczogICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxpbmVXcmFwcGluZzogICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hCcmFja2V0czogICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBhdXRvQ2xvc2VUYWdzOiAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGF1dG9DbG9zZUJyYWNrZXRzOiAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgZW5hYmxlU2VhcmNoVG9vbHM6ICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBlbmFibGVDb2RlRm9sZGluZzogICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGVuYWJsZUNvZGVGb3JtYXR0aW5nOiAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgYXV0b0Zvcm1hdE9uU3RhcnQ6ICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgYXV0b0Zvcm1hdE9uTW9kZUNoYW5nZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgYXV0b0Zvcm1hdE9uVW5jb21tZW50OiAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbW9kZTogICAgICAgICAgICAgICAgICAgJ2h0bWxtaXhlZCcsCiAgICAgICAgICAgICAgICAgICAgc2hvd1RyYWlsaW5nU3BhY2U6ICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRNYXRjaGVzOiAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIHN0eWxlQWN0aXZlTGluZTogICAgICAgIHRydWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovCgogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIEVkaXRvciA9IENLRURJVE9SLnJlcGxhY2UoRWRpdG9ySUQsIEVkaXRvckNvbmZpZyk7CgogICAgICAgIC8vIGNoZWNrIGlmIGNyZWF0aW5nIENLRWRpdG9yIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgLy8gbWlnaHQgYmUgYSBwcm9ibGVtIG9uIG1vYmlsZSBkZXZpY2VzIGUuZy4KICAgICAgICBpZiAodHlwZW9mIEVkaXRvciAhPT0gJ3VuZGVmaW5lZCcpIHsKCiAgICAgICAgICAgIC8vIEhhY2sgZm9yIHVwZGF0aW5nIHRoZSB0ZXh0YXJlYSB3aXRoIHRoZSBSVEUgY29udGVudCAoYnVnIzU4NTcpCiAgICAgICAgICAgIC8vIFJlbmFtZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gdG8gYW5vdGhlciBuYW1lLCB0aGFuIG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgb25lCiAgICAgICAgICAgIENLRURJVE9SLmluc3RhbmNlc1tFZGl0b3JJRF0udXBkYXRlRWxlbWVudE9yaWdpbmFsID0gQ0tFRElUT1IuaW5zdGFuY2VzW0VkaXRvcklEXS51cGRhdGVFbGVtZW50OwogICAgICAgICAgICBDS0VESVRPUi5pbnN0YW5jZXNbRWRpdG9ySURdLnVwZGF0ZUVsZW1lbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhOwoKICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNhbGwgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICBDS0VESVRPUi5pbnN0YW5jZXNbRWRpdG9ySURdLnVwZGF0ZUVsZW1lbnRPcmlnaW5hbCgpOwoKICAgICAgICAgICAgICAgIC8vIE5vdyBjaGVjayBpZiB0aGVyZSBpcyBhY3R1YWxseSBhbnkgbm9uLXdoaXRlc3BhY2UgY29udGVudCBpbiB0aGUKICAgICAgICAgICAgICAgIC8vICB0ZXh0YXJlYSBmaWVsZC4gSWYgbm90LCBzZXQgaXQgdG8gYW4gZW1wdHkgdmFsdWUgdG8gbWFrZSBzdXJlCiAgICAgICAgICAgICAgICAvLyAgdGhlIHNlcnZlciBzaWRlIHZhbGlkYXRpb24gd29ya3MgY29ycmVjdGx5IGFuZCB0aGVyZSBpcyBubyB0cmFzaAogICAgICAgICAgICAgICAgLy8gIGxpa2UgJzxici8+JyBzdG9yZWQgaW4gdGhlIERCLgogICAgICAgICAgICAgICAgRGF0YSA9IHRoaXMuZWxlbWVudC5nZXRWYWx1ZSgpOyAvLyBnZXQgdGV4dGFyZWEgY29udGVudAoKICAgICAgICAgICAgICAgIC8vIG9ubHkgaWYgY29kZW1pcnJvciBwbHVnaW4gaXMgbm90IHVzZWQgKGZvciBYU0xUIGVkaXRvcikKICAgICAgICAgICAgICAgIC8vIG9yCiAgICAgICAgICAgICAgICAvLyBpZiBkYXRhIGNvbnRhaW5zIG5vIGltYWdlIHRhZywKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IGZvciBpbmxpbmUgaW1hZ2VzLCB3ZSBkb24ndCB3YW50IHRvIHJlbW92ZSB0aGVtIQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBDS0VESVRPUi5pbnN0YW5jZXNbRWRpdG9ySURdLmNvbmZpZy5jb2RlbWlycm9yID09PSAndW5kZWZpbmVkJyAmJiAhRGF0YS5tYXRjaCgvPGltZy8pKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0YWdzIGFuZCB3aGl0ZXNwYWNlIGZvciBjaGVja2luZwogICAgICAgICAgICAgICAgICAgIERhdGEgPSBEYXRhLnJlcGxhY2UoL1xzK3wmbmJzcDt8PFwvP1x3K1tePl0qXC8/Pi9nLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFEYXRhLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0VmFsdWUoJycpOyAvLyByZXNldCB0ZXh0YXJlYQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIFJlZGVmaW5lICd3cml0ZUNzc1RleHQnIGZ1bmN0aW9uIGJlY2F1c2Ugb2YgdW5uZWNlc3Nhcnkgc29ydGluZyBvZiBDU1MgcHJvcGVydGllcyAoYnVnIzEyODQ4KS4KICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgICAgICAgICAgQ0tFRElUT1IudG9vbHMud3JpdGVDc3NUZXh0ID0gZnVuY3Rpb24gKHN0eWxlcywgc29ydCkgewogICAgICAgICAgICAgICAgdmFyIG5hbWUsCiAgICAgICAgICAgICAgICBzdHlsZXNBcnIgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKG5hbWUgaW4gc3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHN0eWxlc0Fyci5wdXNoKG5hbWUgKyAnOicgKyBzdHlsZXNbbmFtZV0pOwoKICAgICAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgc29ydHMgQ1NTIHByb3BlcnRpZXMgd2hpY2ggY2FuIG1ha2UgYSB3cm9uZyBDU1Mgc3R5bGUgc2VudCB0byBDS0VkaXRvci4KICAgICAgICAgICAgICAgIC8vIGlmICggc29ydCApCiAgICAgICAgICAgICAgICAvLyAgICAgc3R5bGVzQXJyLnNvcnQoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzQXJyLmpvaW4oJzsgJyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi8KCiAgICAgICAgICAgIHZhciAkUlRIb2xkZXIgPSAkRWRpdG9yQXJlYS5jbG9zZXN0KCcuUmljaFRleHRIb2xkZXInKTsKICAgICAgICAgICAgdmFyICRSVEVMYWJlbCA9ICRSVEhvbGRlci5jaGlsZHJlbignbGFiZWwnKS5maXJzdCgpOwoKICAgICAgICAgICAgLy8gTmVlZGVkIGZvciBjbGllbnRzaWRlIHZhbGlkYXRpb24gb2YgUlRFCiAgICAgICAgICAgIENLRURJVE9SLmluc3RhbmNlc1tFZGl0b3JJRF0ub24oJ2JsdXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBDS0VESVRPUi5pbnN0YW5jZXNbRWRpdG9ySURdLnVwZGF0ZUVsZW1lbnQoKTsKICAgICAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5WYWxpZGF0ZUVsZW1lbnQoJEVkaXRvckFyZWEpOwogICAgICAgICAgICAgICAgaWYgKCBDdXN0b21lckludGVyZmFjZSAmJiAkUlRFTGFiZWwuaGFzQ2xhc3MoJ0xhYmVsRXJyb3InKSApIHsKICAgICAgICAgICAgICAgICAgICAkUlRFTGFiZWwuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIG5lZWRlZCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbgogICAgICAgICAgICBDS0VESVRPUi5pbnN0YW5jZXNbRWRpdG9ySURdLm9uKCdmb2N1cycsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICBpZiAoIEN1c3RvbWVySW50ZXJmYWNlICkgewogICAgICAgICAgICAgICAgICAgICRSVEVMYWJlbC5oaWRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBDb3JlLkFwcC5QdWJsaXNoKCdFdmVudC5VSS5SaWNoVGV4dEVkaXRvci5Gb2N1cycsIFtFZGl0b3JdKTsKCiAgICAgICAgICAgICAgICBpZiAoJEVkaXRvckFyZWEuYXR0cignY2xhc3MnKS5tYXRjaCgvRXJyb3IvKSkgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ0tFRElUT1IuaW5zdGFuY2VzW0VkaXRvcklEXS51cGRhdGVFbGVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5WYWxpZGF0ZUVsZW1lbnQoJEVkaXRvckFyZWEpOwogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFwcC5QdWJsaXNoKCdFdmVudC5VSS5SaWNoVGV4dEVkaXRvci5Gb2N1c1ZhbGlkYXRpb25Db21wbGV0ZScsIFtFZGl0b3JdKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtb3ZlIHRoZSBsYWJlbCBpZiBuZWVkZWQKICAgICAgICAgICAgaWYgKCBDdXN0b21lckludGVyZmFjZSApIHsKICAgICAgICAgICAgICAgIHZhciBUb29sQmFySGVpZ2h0ID0gJCgnLmNrZV90b3AnLCAkUlRIb2xkZXIpLm91dGVySGVpZ2h0KHRydWUpICsgMzI7CiAgICAgICAgICAgICAgICAkUlRFTGFiZWwuY3NzKCAndG9wJywgVG9vbEJhckhlaWdodCArICdweCcgKTsKCiAgICAgICAgICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBUb29sQmFySGVpZ2h0ID0gJCgnLmNrZV90b3AnLCAkUlRIb2xkZXIpLm91dGVySGVpZ2h0KHRydWUpICsgMzI7CiAgICAgICAgICAgICAgICAgICAgJFJURUxhYmVsLmNzcyggJ3RvcCcsIFRvb2xCYXJIZWlnaHQgKyAncHgnICk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEVkaXRvckFyZWEuZm9jdXMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuRm9jdXMoJEVkaXRvckFyZWEpOwogICAgICAgICAgICAgICAgQ29yZS5VSS5TY3JvbGxUbyggJFJUSG9sZGVyICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0QWxsRWRpdG9ycwogICAgICogQG1lbWJlcm9mIENvcmUuVUkuUmljaFRleHRFZGl0b3IKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYXMgYSByaWNoIHRleHQgZWRpdG9yIGV2ZXJ5IHRleHRhcmVhIGVsZW1lbnQgdGhhdCBjb250YWluaW5nIHRoZSBSaWNoVGV4dCBjbGFzcy4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdEFsbEVkaXRvcnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBDS0VESVRPUiA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJCgndGV4dGFyZWEuUmljaFRleHQnKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuSW5pdEVkaXRvcigkKHRoaXMpKTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBKUyBmdW5jdGlvbmFsaXR5LgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0eXBlb2YgQ0tFRElUT1IgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFRhcmdldE5TLkluaXRBbGxFZGl0b3JzKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0UlRFCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7alF1ZXJ5T2JqZWN0fSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBjb3JyZXNwb25zaW5nIFJURSBlbGVtZW50LgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFZGl0b3JBcmVhIC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBhIHJpY2ggdGV4dCBlZGl0b3IuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgR2V0IFJURSBqUXVlcnkgZWxlbWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuR2V0UlRFID0gZnVuY3Rpb24gKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgdmFyICRSVEU7CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkpIHsKICAgICAgICAgICAgJFJURSA9ICQoJyNja2VfJyArICRFZGl0b3JBcmVhLmF0dHIoJ2lkJykpOwogICAgICAgICAgICByZXR1cm4gKCRSVEUubGVuZ3RoID8gJFJURSA6IHVuZGVmaW5lZCk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFVwZGF0ZUxpbmtlZEZpZWxkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVkaXRvckFyZWEgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGxpbmtlZCBmaWVsZCBmb3IgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICovCiAgICBUYXJnZXROUy5VcGRhdGVMaW5rZWRGaWVsZCA9IGZ1bmN0aW9uICgkRWRpdG9yQXJlYSkgewogICAgICAgIHZhciBFZGl0b3JJRCA9ICcnLAogICAgICAgICAgICBEYXRhLAogICAgICAgICAgICBTdHJpcHBlZENvbnRlbnQ7CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIEVkaXRvcklEID0gJEVkaXRvckFyZWEuYXR0cignaWQnKTsKICAgICAgICB9CgogICAgICAgIGlmIChFZGl0b3JJRCA9PT0gJycpIHsKICAgICAgICAgICAgQ29yZS5FeGNlcHRpb24uVGhyb3coJ1JpY2hUZXh0RWRpdG9yOiBOZWVkIGV4YWN0bHkgb25lIEVkaXRvckFyZWEhJywgJ1R5cGVFcnJvcicpOwogICAgICAgIH0KCiAgICAgICAgRGF0YSA9IENLRURJVE9SLmluc3RhbmNlc1tFZGl0b3JJRF0uZ2V0RGF0YSgpOwogICAgICAgIFN0cmlwcGVkQ29udGVudCA9IERhdGEucmVwbGFjZSgvXHMrfCZuYnNwO3w8XC8/XHcrW14+XSpcLz8+L2csICcnKTsKCiAgICAgICAgaWYgKFN0cmlwcGVkQ29udGVudC5sZW5ndGggPT09IDAgJiYgIURhdGEubWF0Y2goLzxpbWcvKSkgewogICAgICAgICAgICAkRWRpdG9yQXJlYS52YWwoJycpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEVkaXRvckFyZWEudmFsKERhdGEpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJc0VuYWJsZWQKICAgICAqIEBtZW1iZXJvZiBDb3JlLlVJLlJpY2hUZXh0RWRpdG9yCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIFJURSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWRpdG9yQXJlYSAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgYSByaWNoIHRleHQgZWRpdG9yLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYSByaWNoIHRleHQgZWRpdG9yIGlzIGVuYWJsZSBpbiB0aGlzIG1vbWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuSXNFbmFibGVkID0gZnVuY3Rpb24gKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgaWYgKHR5cGVvZiBDS0VESVRPUiA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFZGl0b3JBcmVhKSAmJiAkRWRpdG9yQXJlYS5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIChDS0VESVRPUi5pbnN0YW5jZXNbJEVkaXRvckFyZWFbMF0uaWRdID8gdHJ1ZSA6IGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEZvY3VzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5VSS5SaWNoVGV4dEVkaXRvcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVkaXRvckFyZWEgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIGEgcmljaCB0ZXh0IGVkaXRvci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGZvY3Vzc2VzIHRoZSBnaXZlbiBSVEUuCiAgICAgKi8KICAgIFRhcmdldE5TLkZvY3VzID0gZnVuY3Rpb24gKCRFZGl0b3JBcmVhKSB7CiAgICAgICAgdmFyIEVkaXRvcklEID0gJyc7CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWRpdG9yQXJlYSkgJiYgJEVkaXRvckFyZWEubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIEVkaXRvcklEID0gJEVkaXRvckFyZWEuYXR0cignaWQnKTsKICAgICAgICB9CgogICAgICAgIGlmIChFZGl0b3JJRCA9PT0gJycpIHsKICAgICAgICAgICAgQ29yZS5FeGNlcHRpb24uVGhyb3coJ1JpY2hUZXh0RWRpdG9yOiBOZWVkIGV4YWN0bHkgb25lIEVkaXRvckFyZWEhJywgJ1R5cGVFcnJvcicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR5cGVvZiBDS0VESVRPUiA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgQ0tFRElUT1IuaW5zdGFuY2VzW0VkaXRvcklEXS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEVkaXRvckFyZWEuZm9jdXMoKTsKICAgICAgICB9CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5VSS5SaWNoVGV4dEVkaXRvciB8fCB7fSkpOwo=</File>
        <File Location="var/httpd/htdocs/js/thirdparty/ckeditor-4.16.0/plugins/timestamp/LICENSE.md" Permission="660" Encode="Base64">U29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQKPT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBSb3RoZXIgT1NTIC8gQWRkIGhvbGUgTW9kdWxlCkNvcHlyaWdodCAoYykgMjAxNC0yMDE2LCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKQWxsIHNhbXBsZSBwbHVnaW5zIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBMaWNlbnNlIChzZWUgQXBwZW5kaXggQSk6CgoJaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZQoKVHJhZGVtYXJrcwotLS0tLS0tLS0tCgpDS0VkaXRvciBpcyBhIHRyYWRlbWFyayBvZiBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgb3RoZXIgYnJhbmQKYW5kIHByb2R1Y3QgbmFtZXMgYXJlIHRyYWRlbWFya3MsIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvciBzZXJ2aWNlCm1hcmtzIG9mIHRoZWlyIHJlc3BlY3RpdmUgaG9sZGVycy4KCi0tLQoKQXBwZW5kaXggQTogVGhlIE1JVCBMaWNlbnNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgQ0tTb3VyY2UgLSBGcmVkZXJpY28gS25hYmJlbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCg==</File>
        <File Location="var/httpd/htdocs/js/thirdparty/ckeditor-4.16.0/plugins/timestamp/icons/timestamp.png" Permission="660" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTFH80I3AAACfUlEQVQ4T12Sz0vacRzGvyxECoXCZPZjqewQZVCEREaT1inQDtmhQ9BBkF0SgiCEXGQgwYYXO3Ty7CXoD4jAxggaTFgwmJfooIeNSbKwNsyePe/38kvtCy/8/Hie5/35vP0YAIz5+flnZJt8IZ+IVdYfw7XnD/tnZLC1bszOzlrIu1QqVS6VStja2vrO+UdSINUHZPxhd3f3Zy6Xk/kZeaEBU1NTm8lkslIsFrGxsXHF+fXi4iKi0SjW1tYUGUciEXCvvre3V89kMj84/kwsxvj4+NtsNluNx+NXfr+/sby8jEQioaaZmRlMT09jaWkJ6+vrkOC5ubnmycnJXSgUKtE7aAwPD7/y+Xwl/tbD4TBWV1fVTBEqlYpyfHys5pWVFQSDQQQCgd/UF8mgNsLr9b5nGqS6iORrGR9/rK5Bo6OjoCfNJUMD+vr6CmNjY+CxcHR0pOKbmxuwAi4vL9FoNLQHbCAmJiYgWvGYAd3d3dWhoSHIKWq1Gm5vbzWkq6tL+9DZ2Qn2COfn53C73RCteMwACqoDAwNasVwua8jFxQVcLpead3Z29BSnp6fo7e2FaMVjBthstoLT6cTIyIgeUwIkSJopVcUsPUmn0/B4PBCteMyA9vb2bbvdrpuTk5Ncgpoef81mE/y3tLpoxcPlfwFWq9VPvjJV7yghh4eH2gtppoz5RqRxUhmiFY8ZIFgsljcOh6Pe0dEhDUJ/f78id+7p6QH3tKmkLtqWzwzgM369v7+PWCx2x3Sp8gQJ5rO+54u8pzb4JGBhYcFJrg8ODsDXWG1ra0uRApGxIONt7v3K5/OgtkFemgG8n418I3+Ir5X+P9zzkBqpEBcA4y+HYRtqPRhYeAAAAABJRU5ErkJggg==</File>
        <File Location="var/httpd/htdocs/js/thirdparty/ckeditor-4.16.0/plugins/timestamp/plugin.js" Permission="660" Encode="Base64">LyoqCiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2LCBDS1NvdXJjZSAtIEZyZWRlcmljbyBLbmFiYmVuLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBMaWNlbnNlIChzZWUgTElDRU5TRS5tZCkuCiAqCiAqIEJhc2ljIHNhbXBsZSBwbHVnaW4gaW5zZXJ0aW5nIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbnRvIHRoZSBDS0VkaXRvciBlZGl0aW5nIGFyZWEuCiAqCiAqIENyZWF0ZWQgb3V0IG9mIHRoZSBDS0VkaXRvciBQbHVnaW4gU0RLOgogKiBodHRwOi8vZG9jcy5ja2VkaXRvci5jb20vIyEvZ3VpZGUvcGx1Z2luX3Nka19pbnRybwogKi8KLy8gUm90aGVyIE9TUyAtIFRpbWVzdGFtcCBtb2R1bGUKLy8gUmVnaXN0ZXIgdGhlIHBsdWdpbiB3aXRoaW4gdGhlIGVkaXRvci4KQ0tFRElUT1IucGx1Z2lucy5hZGQoICd0aW1lc3RhbXAnLCB7CgoJLy8gUmVnaXN0ZXIgdGhlIGljb25zLiBUaGV5IG11c3QgbWF0Y2ggY29tbWFuZCBuYW1lcy4KCWljb25zOiAndGltZXN0YW1wJywKCgkvLyBUaGUgcGx1Z2luIGluaXRpYWxpemF0aW9uIGxvZ2ljIGdvZXMgaW5zaWRlIHRoaXMgbWV0aG9kLgoJaW5pdDogZnVuY3Rpb24oIGVkaXRvciApIHsKCgkJLy8gRGVmaW5lIHRoZSBlZGl0b3IgY29tbWFuZCB0aGF0IGluc2VydHMgYSB0aW1lc3RhbXAuCgkJZWRpdG9yLmFkZENvbW1hbmQoICdpbnNlcnRUaW1lc3RhbXAnLCB7CgoJCQkvLyBEZWZpbmUgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGVkLgoJCQlleGVjOiBmdW5jdGlvbiggZWRpdG9yICkgewoJCQkJdmFyIG5vdyA9IG5ldyBEYXRlKCk7CgoJCQl2YXIgb3B0aW9ucyA9IHsKCQkJICAgIHdlZWtkYXk6ICJsb25nIiwKCQkJICAgIHllYXI6ICJudW1lcmljIiwKCQkJICAgIG1vbnRoOiAibG9uZyIsCgkJCSAgICBkYXk6ICIyLWRpZ2l0IiwKCQkJICAgIHRpbWVab25lTmFtZTogInNob3J0IiwKCQkJICAgIGhvdXI6ICIyLWRpZ2l0IiwKCQkJICAgIG1pbnV0ZTogIjItZGlnaXQiLAoJCQkgICAgc2Vjb25kOiAiMi1kaWdpdCIsCgkJCX07CgoJCQkJLy8gSW5zZXJ0IHRoZSB0aW1lc3RhbXAgaW50byB0aGUgZG9jdW1lbnQuCgkJCQllZGl0b3IuaW5zZXJ0SHRtbCggJzxiciAvPjxiciAvPjx1PjxzdHJvbmc+JyArIG5vdy50b0xvY2FsZURhdGVTdHJpbmcoImRlLURFIiwgb3B0aW9ucykgKyAnPC9zdHJvbmc+PHU+PGJyIC8+JyApOwoJCQl9CgkJfSk7CgoJCS8vIENyZWF0ZSB0aGUgdG9vbGJhciBidXR0b24gdGhhdCBleGVjdXRlcyB0aGUgYWJvdmUgY29tbWFuZC4KCQllZGl0b3IudWkuYWRkQnV0dG9uKCAnVGltZXN0YW1wJywgewoJCQlsYWJlbDogJ0luc2VydCBUaW1lc3RhbXAnLAoJCQljb21tYW5kOiAnaW5zZXJ0VGltZXN0YW1wJywKCQkJdG9vbGJhcjogJ2luc2VydCcKCQl9KTsKCX0KfSk7Cg==</File>
        <File Location="var/httpd/htdocs/js/thirdparty/ckeditor-4.16.0/plugins/timestamp/samples/timestamp.html" Permission="660" Encode="Base64">PCFET0NUWVBFIGh0bWw+CjwhLS0KQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIENLU291cmNlIC0gRnJlZGVyaWNvIEtuYWJiZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIExpY2Vuc2UgKHNlZSBMSUNFTlNFLm1kKS4KLS0+CjxodG1sPgo8aGVhZD4KCTx0aXRsZT5UdXRvcmlhbCAmbWRhc2g7IFRpbWVzdGFtcCBQbHVnaW48L3RpdGxlPgoJPG1ldGEgY2hhcnNldD0idXRmLTgiPgoJPHNjcmlwdCBzcmM9Ii4uLy4uLy4uL2NrZWRpdG9yLmpzIj48L3NjcmlwdD4KCTxsaW5rIGhyZWY9Ii4uLy4uLy4uL3NhbXBsZXMvc2FtcGxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KPC9oZWFkPgo8Ym9keT4KCTxoMSBjbGFzcz0ic2FtcGxlcyI+CgkJQ0tFZGl0b3IgVHV0b3JpYWwgJm1kYXNoOyBUaW1lc3RhbXAgUGx1Z2luCgk8L2gxPgoKCTxwPgoJCVRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyB0aGUgPHN0cm9uZz5UaW1lc3RhbXA8L3N0cm9uZz4gcGx1Z2luIHRoYXQgd2FzIGJ1aWx0IGluIHRoZQoJCTxhIGhyZWY9Imh0dHA6Ly9kb2NzLmNrZWRpdG9yLmNvbS8jIS9ndWlkZS9wbHVnaW5fc2RrX3NhbXBsZSI+Q3JlYXRpbmcgYSBDS0VkaXRvciBQbHVnaW4gaW4gMjAgTGluZXMgb2YgQ29kZTwvYT4KCQl0dXRvcmlhbCBmcm9tIHRoZSBQbHVnaW4gU0RLIHNlY3Rpb24gb2YgdGhlIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLmNrZWRpdG9yLmNvbS8jIS9ndWlkZSI+Q0tFZGl0b3IgRGV2ZWxvcGVyJ3MgR3VpZGU8L2E+LgoJPC9wPgoKCTxwPgoJCVRoZSBjdXN0b20gVGltZXN0YW1wIHBsdWdpbiBjcmVhdGVkIGluIHRoZSB0dXRvcmlhbCBsZXRzIHRoZSB1c2VycyBpbnNlcnQgY3VycmVudCBkYXRlIGFuZCB0aW1lIGludG8gdGhlIGVkaXRpbmcgYXJlYSBvZiBDS0VkaXRvcgoJCWF0IHRoZSBjYXJldCBwb3NpdGlvbi4gVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbW9zdCBiYXNpYyBDS0VkaXRvciBwbHVnaW4gdGhhdCB5b3UgY2FuIGNyZWF0ZSBpbiAyMCBsaW5lcyBvZiBjb2RlLgoJPC9wPgoKCTx0ZXh0YXJlYSBpZD0iZWRpdG9yMSIgY29scz0iMTAiIHJvd3M9IjEwIj4KCQkmbHQ7cCZndDtUaGlzIGlzIHNvbWUgc2FtcGxlIHRleHQuIFlvdSBhcmUgdXNpbmcgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vY2tlZGl0b3IuY29tJnF1b3Q7Jmd0O0NLRWRpdG9yJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7Cgk8L3RleHRhcmVhPgoKCTxzY3JpcHQ+CgoJCUNLRURJVE9SLnJlcGxhY2UoICdlZGl0b3IxJywgewoJCQkvLyBMb2FkIHRoZSB0aW1lc3RhbXAgcGx1Z2luLgoJCQlleHRyYVBsdWdpbnM6ICd0aW1lc3RhbXAnLAoKCQkJLy8gUmVhcnJhbmdlIHRvb2xiYXIgZ3JvdXBzIGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgcGx1Z2lucy4KCQkJdG9vbGJhckdyb3VwczogWwoJCQkJeyBuYW1lOiAnY2xpcGJvYXJkJywgICBncm91cHM6IFsgJ2NsaXBib2FyZCcsICd1bmRvJyBdIH0sCgkJCQl7IG5hbWU6ICdsaW5rcycgfSwKCQkJCXsgbmFtZTogJ2luc2VydCcgfSwKCQkJCXsgbmFtZTogJ2RvY3VtZW50JywJICAgZ3JvdXBzOiBbICdtb2RlJyBdIH0sCgkJCQknLycsCgkJCQl7IG5hbWU6ICdiYXNpY3N0eWxlcycsIGdyb3VwczogWyAnYmFzaWNzdHlsZXMnLCAnY2xlYW51cCcgXSB9LAoJCQkJeyBuYW1lOiAncGFyYWdyYXBoJywgICBncm91cHM6IFsgJ2xpc3QnLCAnaW5kZW50JyBdIH0sCgkJCQl7IG5hbWU6ICdzdHlsZXMnIH0sCgkJCQl7IG5hbWU6ICdhYm91dCcgfQoJCQldLAoJCQlyZW1vdmVQbHVnaW5zOiAnZm9udCxpZnJhbWUscGFnZWJyZWFrLGZsYXNoLHN0eWxlc2NvbWJvLHByaW50LHByZXZpZXcsc2F2ZSxzbWlsZXkscGFzdGV0ZXh0LHBhc3RlZnJvbXdvcmQnLAoJCQlyZW1vdmVCdXR0b25zOiAnQW5jaG9yLEZvbnQsU3RyaWtlLFN1YnNjcmlwdCxTdXBlcnNjcmlwdCcKCQl9ICk7CgoJPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4K</File>
    </Filelist>
</otrs_package>