<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerMultitenancy</Name>
    <Version>11.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-10-26 12:40:54" Version="11.1.2">Update to OTOBO 11.1.1.</ChangeLog>
    <ChangeLog Date="2026-06-26 16:02:23" Version="11.1.1">Initial release for OTOBO 11.1.</ChangeLog>
    <Description Lang="en">Group-based multitenancy for customer and customer user.</Description>
    <Description Lang="de">Gruppenbasierte Mandantenfähigkeit für Kunden und Kundenbenutzer.</Description>
    <Framework>11.1.x</Framework>
    <BuildCommitID>f05d1252a4529d6a5cada16ced78e210c1d9472c</BuildCommitID>
    <BuildDate>2026-10-26 12:40:58</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AdminCustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJDb21wYW55OwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICAjIHNldCBwcmVmIGZvciBjb2x1bW5zIGtleQogICAgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9ID0gJ0luY2x1ZGVJbnZhbGlkJyAuICctJyAuICRTZWxmLT57QWN0aW9ufTsKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRQcmVmZXJlbmNlc3sgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9IH07CgogICAgJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9ID0geyBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc30gfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJE5hdiAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hdicgKSB8fCAwOwogICAgbXkgJE5hdmlnYXRpb25CYXJUeXBlID0gJE5hdiBlcSAnQWdlbnQnID8gJ0N1c3RvbWVycycgOiAnQWRtaW4nOwogICAgbXkgJFNlYXJjaCAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlYXJjaCcgKTsKICAgICRTZWFyY2gKICAgICAgICB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdBZG1pbkN1c3RvbWVyQ29tcGFueTo6UnVuSW5pdGlhbFdpbGRjYXJkU2VhcmNoJykgPyAnKicgOiAnJzsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwoKICAgIG15ICVHZXRQYXJhbTsKICAgICRHZXRQYXJhbXtTb3VyY2V9ICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU291cmNlJyApIHx8ICdDdXN0b21lckNvbXBhbnknOwogICAgJEdldFBhcmFte0luY2x1ZGVJbnZhbGlkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbmNsdWRlSW52YWxpZCcgKTsKCiAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte0luY2x1ZGVJbnZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRHZXRQYXJhbXtJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPSAkR2V0UGFyYW17SW5jbHVkZUludmFsaWR9OwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gc2V0IG11bHRpdGVuYW5jeS4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICAgICAgbXkgJE11bHRpdGVuYW5jeUdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwID0+ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSwKICAgICAgICApOwoKICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cHN7JE11bHRpdGVuYW5jeUdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeVBlcm1pc3Npb259ID0gMTsKICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgIG15ICVEYXRhICAgICAgICAgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtDdXN0b21lckNvbXBhbnlJRH0gPSAkQ3VzdG9tZXJJRDsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgY29tcGFueSB1cGRhdGVkIScpICkKICAgICAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb24gZXEgJ1VwZGF0ZScgKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICVEYXRhLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUVycm9yczsKICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJDb21wYW55SUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyQ29tcGFueUlEJyApOwoKICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55TWFwID0gJENvbmZpZ09iamVjdC0+R2V0KCAkR2V0UGFyYW17U291cmNlfSApLT57TWFwfS0+QCo7CgogICAgICAgICMgVGhlIHJlYWRvbmx5IGZpZWxkcyBzaG91bGQgbm90IGJlIHNldHRhYmxlIGZyb20gdGhlIFdlYkFwcC4KICAgICAgICAjIFNvIHVwZGF0ZSB3aXRoIHRoZSBvbGQgdmFsdWVzLCByZWdhcmRsZXNzIHdoYXQgd2FzIHBhc3NlZCBmcm9tIHRoZSBjbGllbnQuCiAgICAgICAgIyBUaGUgb2xkIGRhdGEgaXMgb25seSBuZWVkZWQgd2hlbiB0aGVyZSBhcmUgYW55IHJlYWRvbmx5IGZpZWxkcy4KICAgICAgICBteSAlT2xkRGF0YTsKICAgICAgICBpZiAoIGFueSB7ICRfLT5bN10gfSBAQ3VzdG9tZXJDb21wYW55TWFwICkgewogICAgICAgICAgICAlT2xkRGF0YSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckNvbXBhbnlNYXApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmV1c2UgdGhlIG9sZCBkYXRhIGZvciByZWFkb25seSBmaWVsZAogICAgICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzddICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJE9sZERhdGF7ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGUgZW50cmllcwogICAgICAgIGlmICggJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSBuZSAkR2V0UGFyYW17Q3VzdG9tZXJJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBDdXN0b21lckNvbXBhbnkgbGlzdAogICAgICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgICAgIGlmICggJUxpc3QgJiYgJExpc3R7ICRHZXRQYXJhbXtDdXN0b21lcklEfSB9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tEdXBsaWNhdGV9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgZ3JvdXAKICAgICAgICAgICAgbXkgJFVwZGF0ZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSggJUdldFBhcmFtLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9ICk7CgogICAgICAgICAgICBpZiAoJFVwZGF0ZSkgewoKICAgICAgICAgICAgICAgIG15ICRTZXRERkVycm9yOwoKICAgICAgICAgICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckNvbXBhbnlNYXApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNldERGRXJyb3IgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWMgZmllbGQgJXMgbm90IGZvdW5kIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlU2V0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2V0REZFcnJvciAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDb250aW51ZUFmdGVyU2F2ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSB8fCAwOwoKICAgICAgICAgICAgICAgICMgaWYgc2V0IERGIGVycm9yIGV4aXN0cywgY3JlYXRlIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgaWYgKCRTZXRERkVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgd291bGQgbGlrZSB0byBjb250aW51ZSBlZGl0aW5nIHRoZSBjdXN0b21lciBjb21wYW55LCBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICAgICAgICAgICAgIGlmICggJENvbnRpbnVlQWZ0ZXJTYXZlIGVxICcxJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMgPT4gXCVFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIGNvbXBhbnkgdXBkYXRlZCEnKSApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNldERGRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIGN1c3RvbWVyIGNvbXBhbnksIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICBpZiAoICRDb250aW51ZUFmdGVyU2F2ZSBlcSAnMScgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249Q2hhbmdlO0N1c3RvbWVySUQ9IiAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJEN1c3RvbWVySUQpIC4gIjtOYXY9JE5hdjtOb3RpZmljYXRpb249VXBkYXRlIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKCiAgICAgICAgIyBzZXQgbm90aWZpY2F0aW9uIGZvciBkdXBsaWNhdGUgZW50cnkKICAgICAgICBpZiAoICRFcnJvcnN7RHVwbGljYXRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciBDb21wYW55ICVzIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgJEdldFBhcmFte05hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWRkJywKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVFcnJvcnM7CgogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlLZXkgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRHZXRQYXJhbXtTb3VyY2V9ICktPntDdXN0b21lckNvbXBhbnlLZXl9OwogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlJRDsKCiAgICAgICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgY3VzdG9tZXIgY29tcGFueSBrZXkgZm9yIGNoZWNraW5nIGR1cGxpY2F0ZQogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzJdIGVxICRDdXN0b21lckNvbXBhbnlLZXkgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55SUQgPSAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IEN1c3RvbWVyQ29tcGFueSBsaXN0CiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgaWYgKCAlTGlzdCAmJiAkTGlzdHskQ3VzdG9tZXJDb21wYW55SUR9ICkgewogICAgICAgICAgICAkRXJyb3Jze0R1cGxpY2F0ZX0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgY29tcGFueQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlBZGQoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gam9pbiAnJywKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciBjb21wYW55IGFkZGVkIScpLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pYyBmaWVsZCAlcyBub3QgZm91bmQhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU2V0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRHZXRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWVTZXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKCiAgICAgICAgIyBzZXQgbm90aWZpY2F0aW9uIGZvciBkdXBsaWNhdGUgZW50cnkKICAgICAgICBpZiAoICRFcnJvcnN7RHVwbGljYXRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciBDb21wYW55ICVzIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgbXkgJE91dHB1dCAgICAgICA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIGNvbXBhbnkgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9FZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBzZW5kIHBhcmFtZXRlciBSZWFkT25seSB0byBKUyBvYmplY3QKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmVhZE9ubHknLAogICAgICAgIFZhbHVlID0+ICRDb25maWdPYmplY3QtPnsgJFBhcmFte1NvdXJjZX0gfS0+e1JlYWRPbmx5fSwKICAgICk7CgogICAgIyBHZXQgdmFsaWQgb2JqZWN0LgogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgJFBhcmFteydWYWxpZE9wdGlvbid9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSwKICAgICk7CgogICAgIyBHZXQgbmVlZGVkIG9iamVjdHMuCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzBdICkgewoKICAgICAgICAgICAgIyBIYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICMgR2V0IEhUTUwgZm9yIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9ID8gJFBhcmFteyAkRW50cnktPlswXSB9IDogdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAgICAgICAgICMgU2VydmVyIGVycm9yLCBpZiBhbnkKICAgICAgICAgICAgICAgICAgICAleyAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSB9IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgZm9yIHdoaWNoIEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZEhUTUwpOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzR2VuZXJpYycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEJsb2NrID0gJ0lucHV0JzsKCiAgICAgICAgICAgICMgYnVpbGQgc2VsZWN0aW9ucyBvciBpbnB1dCBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25SZXF1aXJlZCA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBidWlsZCBWYWxpZElEIHN0cmluZwogICAgICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57U2VsZWN0aW9uc30KICAgICAgICAgICAgICAgICAgICAgICAgLT57ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY0tleScsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDM1LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiBtL15DdXN0b21lckNvbXBhbnlDb3VudHJ5L2kgKSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCBDb3VudHJ5IHNlbGVjdGlvbiB3aXRoIEVuZ2xpc2ggbmFtZXMKICAgICAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJEVudHJ5LT5bNF0gPyAnVmFsaWRhdGVfUmVxdWlyZWQnIDogJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRyeUxpc3Q7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnUmVmZXJlbmNlRGF0YTo6VHJhbnNsYXRlZENvdW50cnlOYW1lcycpICkgewoKICAgICAgICAgICAgICAgICAgICAjIEZsYWcrTmFtZSA9PiBjb2RlCiAgICAgICAgICAgICAgICAgICAgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q0xEUkNvdW50cnlMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcmV2aW91cyB2YWx1ZSBleGlzdHMgaW4gdGhlIHNlbGVjdGlvbiBsaXN0IGV2ZW4gaWYgaXQgaXNuJ3QgYSBjb3VudHJ5IGNvZGUuCiAgICAgICAgICAgICAgICAgICAgbXkgJFByZXZpb3VzQ291bnRyeSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgICAgICAgICBpZiAoJFByZXZpb3VzQ291bnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRyeUxpc3QtPnskUHJldmlvdXNDb3VudHJ5fSAvLz0gJFByZXZpb3VzQ291bnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBFbmdsaXNoIG5hbWUgPT4gRW5nbGlzaCBuYW1lCiAgICAgICAgICAgICAgICAgICAgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q291bnRyeUxpc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvdW50cnlMaXN0LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gLy8gMSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzBdID1+IG0vXlZhbGlkSUQvaSApIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgIG15ICRPcHRpb25SZXF1aXJlZCA9ICRFbnRyeS0+WzRdID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJyA6ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gZGVmaW5lZCggJFBhcmFteyAkRW50cnktPlswXSB9ICkgPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICAgICAjIEJ1aWxkIHRoZSBncm91cCBmaWVsZC4KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJHcm91cElEJC9pICkgewogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgdGhlIHBlcm1pc3Npb24gdG8gc2VlL2NoYW5nZSB0aGUgbXVsdGl0ZW5hbmN5IGZpZWxkLgogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNdWx0aXRlbmFuY3lQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAjIEJ1aWxkIHRoZSBmaWVsZC4KICAgICAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyByZXF1aXJlZCBmbGFnCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWFuZGF0b3J5Q2xhc3N9ID0gJ2NsYXNzPSJNYW5kYXRvcnkiJzsKICAgICAgICAgICAgICAgICRQYXJhbXtTdGFyTGFiZWx9ICAgICAgPSAnPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4nOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWFuZGF0b3J5Q2xhc3N9ID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17U3RhckxhYmVsfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyByZWFkb25seSBmbGFnCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bN10gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICdyZWFkb25seSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBmb3JtIG9wdGlvbgogICAgICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSAmJiAkUGFyYW17VHlwZX0gZXEgJ2hpZGRlbicgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9IC49ICRQYXJhbXtWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc0dlbmVyaWMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJdGVtID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpYyRCbG9jayIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRGaWVsZCA9PiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljJHtCbG9ja31SZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvblNlYXJjaCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwoKICAgICMgZ2V0IHdyaXRhYmxlIGRhdGEgc291cmNlcwogICAgbXkgJUN1c3RvbWVyQ29tcGFueVNvdXJjZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCwKICAgICk7CgogICAgIyBvbmx5IHNob3cgQWRkIG9wdGlvbiBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB3cml0YWJsZSBiYWNrZW5kCiAgICBpZiAoIHNjYWxhciBrZXlzICVDdXN0b21lckNvbXBhbnlTb3VyY2UgKSB7CiAgICAgICAgJFBhcmFte1NvdXJjZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICVDdXN0b21lckNvbXBhbnlTb3VyY2UsIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NvdXJjZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NvdXJjZX0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgYXJlIGFueSByZWdpc3RyaWVzIHRvIHNlYXJjaCwgdGhlIHRhYmxlIGlzIGZpbGxlZCBhbmQgc2hvd24KICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBzYW1lIExpbWl0IGFzICRTZWxmLT57Q3VzdG9tZXJDb21wYW55fS0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH0KICAgICAgICAjIHNtYWxsZXN0IExpbWl0IGZyb20gYWxsIHNvdXJjZXMKICAgICAgICBteSAkTGltaXQ7CiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJNYXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpOwogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJExpbWl0IHx8ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0TGltaXR9IDwgJExpbWl0ICkgewogICAgICAgICAgICAgICAgJExpbWl0ID0gJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXMgZmFsbGJhY2sgdGFrZSB0aGUgaGFyZGNvZGVkIGxpbWl0IG9mIEtlcm5lbC9TeXN0ZW0vQ3VzdG9tZXJDb21wYW55L0RCLnBtCiAgICAgICAgJExpbWl0IC8vPSA1MDAwMDsKCiAgICAgICAgbXkgJUxpc3RBbGxJdGVtcyA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCArIDEsCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zIDw9ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyA9IGtleXMgJUxpc3RBbGxJdGVtczsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsID0+ICRMaXN0QWxsSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/IDAgOiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zID4gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zICAgPSBrZXlzICVMaXN0QWxsSXRlbXM7CiAgICAgICAgICAgIG15ICRTZWFyY2hMaXN0U2l6ZSA9IGtleXMgJUxpc3Q7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNlYXJjaExpc3RTaXplID0+ICRTZWFyY2hMaXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsICAgICAgICA9PiAkTGlzdEFsbEl0ZW1zLAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CgogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1BhcmFtc30tPntGb3JlaWduREJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTG9jYWxEQicgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgICAgIGlmICglTGlzdCkgewogICAgICAgICAgICBmb3IgbXkgJExpc3RLZXkgKCBzb3J0IHsgJExpc3R7JGF9IGNtcCAkTGlzdHskYn0gfSBrZXlzICVMaXN0ICkgewoKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRMaXN0S2V5ICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hdiAgICA9PiAkUGFyYW17TmF2fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntQYXJhbXN9LT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9jYWxEQlJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBzZWFyY2ggaXQgc2hvd3MgYSBtZXNzYWdlCiAgICBlbHNlCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VhcmNoVGVybXMnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AdminCustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAyNDY0OTA3N2NkZjQwMTAxYzM3NTI3ZTljZmE1OTIwYjk2ZjhhOWI2IC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJVc2VyOwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IHByZWYgZm9yIGNvbHVtbnMga2V5CiAgICAkU2VsZi0+e1ByZWZLZXlJbmNsdWRlSW52YWxpZH0gPSAnSW5jbHVkZUludmFsaWQnIC4gJy0nIC4gJFNlbGYtPntBY3Rpb259OwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID0gJFByZWZlcmVuY2VzeyAkU2VsZi0+e1ByZWZLZXlJbmNsdWRlSW52YWxpZH0gfTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgKTsKCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0gPSB7IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfSB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkTmF2ICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmF2JyApICAgIHx8ICcnOwogICAgbXkgJFNvdXJjZSAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvdXJjZScgKSB8fCAnQ3VzdG9tZXJVc2VyJzsKICAgIG15ICRTZWFyY2ggICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWFyY2gnICk7CiAgICBteSAkSW5jbHVkZUludmFsaWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSW5jbHVkZUludmFsaWQnICk7CgogICAgaWYgKCBkZWZpbmVkICRJbmNsdWRlSW52YWxpZCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRJbmNsdWRlSW52YWxpZCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRJbmNsdWRlSW52YWxpZDsKICAgIH0KICAgICRTZWFyY2gKICAgICAgICB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdBZG1pbkN1c3RvbWVyVXNlcjo6UnVuSW5pdGlhbFdpbGRjYXJkU2VhcmNoJykgPyAnKicgOiAnJzsKCiAgICAjIGNyZWF0ZSBsb2NhbCBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgbXkgJE5hdkJhciAgICAgICA9ICcnOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgJE5hdkJhciA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTmF2QmFyID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE5hdkJhciAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXYgZXEgJ0FnZW50JyA/ICdDdXN0b21lcnMnIDogJ0FkbWluJywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IGxpc3Qgb2YgdmFsaWQgSURzLgogICAgbXkgQFZhbGlkSURMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgIyBjaGVjayB0aGUgcGVybWlzc2lvbiBmb3IgdGhlIFN3aXRjaFRvQ3VzdG9tZXIgZmVhdHVyZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKSApIHsKCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICMgZ2V0IHRoZSBncm91cCBpZCB3aGljaCBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgc3dpdGNoIHRvIGN1c3RvbWVyIGZlYXR1cmUKICAgICAgICBteSAkU3dpdGNoVG9DdXN0b21lckdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwTG9va3VwKAogICAgICAgICAgICBHcm91cCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXI6OlBlcm1pc3Npb25Hcm91cCcpLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHVzZXIgZ3JvdXBzLCB3aGVyZSB0aGUgdXNlciBoYXMgdGhlIHJ3IHByaXZpbGVnZQogICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICAjIGlmIHRoZSB1c2VyIGlzIGEgbWVtYmVyIGluIHRoaXMgZ3JvdXAgaGUgY2FuIGFjY2VzcyB0aGUgZmVhdHVyZQogICAgICAgIGlmICggJEdyb3Vwc3skU3dpdGNoVG9DdXN0b21lckdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNldCBtdWx0aXRlbmFuY3kuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgIG15ICRNdWx0aXRlbmFuY3lHcm91cElEID0gJEdyb3VwT2JqZWN0LT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgR3JvdXAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpLAogICAgICAgICk7CgogICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cHN7JE11bHRpdGVuYW5jeUdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeVBlcm1pc3Npb259ID0gMTsKICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICBzd2l0Y2ggdG8gY3VzdG9tZXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N3aXRjaCcKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKQogICAgICAgICYmICRTZWxmLT57U3dpdGNoVG9DdXN0b21lclBlcm1pc3Npb259CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAkVXNlcklEICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgc2Vzc2lvbiBpZAogICAgICAgIG15ICROZXdTZXNzaW9uSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+Q3JlYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgIFVzZXJMYXN0UmVxdWVzdCA9PiAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpLAogICAgICAgICAgICBVc2VyVHlwZSAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgU2Vzc2lvblNvdXJjZSAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgaW50ZXJmYWNlIHNlc3Npb24gbmFtZQogICAgICAgIG15ICRTZXNzaW9uTmFtZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJykgfHwgJ0NTSUQnOwoKICAgICAgICAjIGNyZWF0ZSBhIG5ldyBMYXlvdXRPYmplY3QKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgU2Vzc2lvbklEICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgU2Vzc2lvbk5hbWUgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTmFtZScpLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRoZSBzZXNzaW9uIGNvb2tpZQogICAgICAgIG15ICRFeHBpcmVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKQogICAgICAgICAgICA/CiAgICAgICAgICAgICcrJyAuICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvbk1heFRpbWUnKSAuICdzJwogICAgICAgICAgICA6CiAgICAgICAgICAgICcnOwogICAgICAgICRMYXlvdXRPYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgS2V5ICAgICA9PiAnU2Vzc2lvbklEQ29va2llJywKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2Vzc2lvbk5hbWUsCiAgICAgICAgICAgIFZhbHVlICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgRXhwaXJlcyA9PiAkRXhwaXJlcywKICAgICAgICApOwoKICAgICAgICAjIGxvZyBldmVudAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICJTd2l0Y2hlZCBmcm9tIEFnZW50IHRvIEN1c3RvbWVyICgkU2VsZi0+e1VzZXJMb2dpbn0gLT0+ICRVc2VyRGF0YXtVc2VyTG9naW59KSIsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB0byBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBteSAkRXh0VVJMID0gam9pbiAnJywKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpLAogICAgICAgICAgICAnOi8vJywKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGUUROJyksCiAgICAgICAgICAgICcvJywKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpLAogICAgICAgICAgICAnY3VzdG9tZXIucGwnOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIEV4dFVSTCA9PiAkRXh0VVJMICk7CiAgICB9CgogICAgIyBzZWFyY2ggdXNlciBsaXN0CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VhcmNoJyApIHsKICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgKTsKICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhcjsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRvd25sb2FkIGZpbGUgcHJlZmVyZW5jZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZCcgKSB7CiAgICAgICAgbXkgJEdyb3VwID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0dyb3VwJyApIHx8ICcnOwogICAgICAgIG15ICRVc2VyICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSAgICB8fCAnJzsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhICAgID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkVXNlciApOwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQcmVmZXJlbmNlc0dyb3VwcycpIH07CiAgICAgICAgbXkgJE1vZHVsZSAgICAgID0gJFByZWZlcmVuY2VzeyRHcm91cH0tPntNb2R1bGV9OwogICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEdyb3VwfSwKICAgICAgICAgICAgVXNlck9iamVjdCA9PiAkQ3VzdG9tZXJVc2VyT2JqZWN0LAogICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICk7CiAgICAgICAgbXkgJUZpbGUgPSAkT2JqZWN0LT5Eb3dubG9hZCggVXNlckRhdGEgPT4gXCVVc2VyRGF0YSApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCglRmlsZSk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2UnICkgewogICAgICAgIG15ICRVc2VyICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRVc2VyICk7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlLAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgSUQgICAgID0+ICRVc2VyLAogICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZUFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgdXBkYXRlIG9ubHkgdGhlIHByZWZlcmVuY2VzIGFuZCBkeW5hbWljIGZpZWxkcywgaWYgdGhlIHNvdXJjZSBpcyByZWFkb25seSBvciBhIGxkYXAgYmFja2VuZAogICAgICAgIG15ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXM7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCRTb3VyY2UpLT57UmVhZE9ubHl9IHx8ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01vZHVsZX0gPX4gL0xEQVAvaSApIHsKICAgICAgICAgICAgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkTm90ZSA9ICcnOwogICAgICAgIG15ICggJUdldFBhcmFtLCAlRXJyb3JzICk7CgogICAgICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnICkgewoKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkR5bmFtaWNGaWVsZCAkRW50cnktPlsyXSBub3QgZm91bmQhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkRW50cnktPls0XSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3JzeyAkRW50cnktPlswXSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0ZSBzdG9yYWJsZSB2YWx1ZSBvZiBkeW5hbWljIGZpZWxkIGVkaXQgZmllbGQKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHJlbWFpbmluZyBub24tZHluYW1pYy1maWVsZCBtYW5kYXRvcnkgZmllbGRzCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEVudHJ5LT5bMF0gKSAvLyAnJzsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRVcGRhdGVPbmx5UHJlZmVyZW5jZXM7CgogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXtJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGlmICgKICAgICAgICAgICAgISRVcGRhdGVPbmx5UHJlZmVyZW5jZXMKICAgICAgICAgICAgJiYgJEdldFBhcmFte1VzZXJFbWFpbH0KICAgICAgICAgICAgJiYgISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEdldFBhcmFte1VzZXJFbWFpbH0gKQogICAgICAgICAgICAmJiBncmVwIHsgJF8gZXEgJEdldFBhcmFte1ZhbGlkSUR9IH0gQFZhbGlkSURMaXN0CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnN7VXNlckVtYWlsSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze0Vycm9yVHlwZX0gICAgICAgID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgfQoKICAgICAgICAjIEdldCB0aGUgY3VycmVudCB1c2VyIGRhdGEgZm9yIHNvbWUgY2hlY2tzLgogICAgICAgIG15ICVDdXJyZW50VXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRHZXRQYXJhbXtJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBDdXN0b21lcklELCBpZiBDdXN0b21lckNvbXBhbnlTdXBwb3J0IGlzIGVuYWJsZWQgYW5kIHRoZSBVc2VyQ3VzdG9tZXJJRCB3YXMgY2hhbmdlZC4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9CiAgICAgICAgICAgICYmICRHZXRQYXJhbXtVc2VyQ3VzdG9tZXJJRH0KICAgICAgICAgICAgJiYgJEN1cnJlbnRVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gbmUgJEdldFBhcmFte1VzZXJDdXN0b21lcklEfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte1VzZXJDdXN0b21lcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tVc2VyQ3VzdG9tZXJJREludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgbXkgJFVwZGF0ZVN1Y2Nlc3M7CiAgICAgICAgICAgIGlmICggISRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjY2VzcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlclVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1VzZXJQYXNzd29yZH0gJiYgKCAkQ3VycmVudFVzZXJEYXRhe1VzZXJQYXNzd29yZH0gLy8gJycgKSBuZSAkR2V0UGFyYW17VXNlclBhc3N3b3JkfSApIHsKCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjY2VzcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkRlbGV0ZU9uZVByZWZlcmVuY2UoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTGFzdFB3Q2hhbmdlVGltZScsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRHZXRQYXJhbXtJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkVXBkYXRlU3VjY2VzcyB8fCAkVXBkYXRlT25seVByZWZlcmVuY2VzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBuZSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljIGZpZWxkICVzIG5vdCBmb3VuZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWVTZXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBkeW5hbWljIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAkR3JvdXAgZXEgJ1Bhc3N3b3JkJzsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkR2V0UGFyYW17VXNlckxvZ2lufQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skR3JvdXB9LT57TW9kdWxlfTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRHcm91cH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGEgPT4gXCVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbUl0ZW0tPntOYW1lfSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhID0+IFwlVXNlckRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+ICRPYmplY3QtPkVycm9yKCkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNsZWFyIGN1c3RvbWVyIHVzZXIgY2FjaGUKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckNhY2hlQ2xlYXIoCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRHZXRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEgYW5kIHNob3cgc2NyZWVuIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICEkTm90ZSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHByaW9yaXR5LCBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICkgZXEgJzEnICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1DaGFuZ2U7SUQ9JElEO1NlYXJjaD0kU2VhcmNoO05hdj0kTmF2O05vdGlmaWNhdGlvbj1VcGRhdGUiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07Tm90aWZpY2F0aW9uPVVwZGF0ZSIgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcKICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhcjsKICAgICAgICAkT3V0cHV0IC49ICROb3RlOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZSwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgIEVycm9ycyA9PiBcJUVycm9ycywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICRHZXRQYXJhbXtVc2VyTG9naW59ICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdVc2VyTG9naW4nICkgIHx8ICcnOwogICAgICAgICRHZXRQYXJhbXtDdXN0b21lcklEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApIHx8ICcnOwogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZSwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJE5vdGUgPSAnJzsKICAgICAgICBteSAoICVHZXRQYXJhbSwgJUVycm9ycyApOwoKICAgICAgICBteSAkQXV0b0xvZ2luQ3JlYXRpb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntBdXRvTG9naW5DcmVhdGlvbn07CgogICAgICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CgogICAgICAgICAgICAjIGRvbid0IHZhbGlkYXRlIFVzZXJMb2dpbiBpZiBBdXRvTG9naW5DcmVhdGlvbiBpcyBjb25maWd1cmVkCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgKCAkQXV0b0xvZ2luQ3JlYXRpb24gJiYgJEVudHJ5LT5bMF0gZXEgJ1VzZXJMb2dpbicgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgICAgICYmICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRHZXRQYXJhbXtVc2VyRW1haWx9ICkKICAgICAgICAgICAgJiYgZ3JlcCB7ICRfIGVxICRHZXRQYXJhbXtWYWxpZElEfSB9IEBWYWxpZElETGlzdAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3Jze1VzZXJFbWFpbEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tFcnJvclR5cGV9ICAgICAgICA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBDdXN0b21lcklELCBpZiBDdXN0b21lckNvbXBhbnlTdXBwb3J0IGlzIGVuYWJsZWQuCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSAmJiAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9ICkgewoKICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte1VzZXJDdXN0b21lcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tVc2VyQ3VzdG9tZXJJREludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgdXNlcgogICAgICAgICAgICBteSAkVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFVzZXIpIHsKCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWSB1bmxlc3MgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9LT57ICRFbnRyeS0+WzJdIH07CgogICAgICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pYyBmaWVsZCAlcyBub3QgZm91bmQhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU2V0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEdldFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRWYWx1ZVNldCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAkR3JvdXAgZXEgJ1Bhc3N3b3JkJzsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkVXNlciwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXN7JEdyb3VwfS0+e01vZHVsZX07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skR3JvdXB9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyT2JqZWN0ID0+ICRDdXN0b21lclVzZXJPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRQcmVmZXJlbmNlc3skR3JvdXB9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhID0+IFwlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSBAQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1JdGVtLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFBhcmFtSXRlbS0+e05hbWV9IH0gPSBcQEFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YSA9PiBcJVVzZXJEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhIGFuZCBzaG93IHNjcmVlbiBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAhJE5vdGUgKSB7CgogICAgICAgICAgICAgICAgICAgICMgaW4gYm9ycm93ZWQgdmlldywgdGFrZSB0aGUgbmV3IGNyZWF0ZWQgY3VzdG9tZXIgb3ZlciBpbnRvIHRoZSBuZXcgdGlja2V0CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICROYXZCYXI7CgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdOYXYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJE5hdiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9PdmVydmlldygKICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgICAgICAgID0gJE5hdkJhciAuICROb3RlOwogICAgICAgICAgICAgICAgICAgIG15ICRVUkwgICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgbXkgJFVzZXJIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRVc2VyKTsKICAgICAgICAgICAgICAgICAgICBteSAkVXNlclF1b3RlICAgICA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFVzZXIgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQaG9uZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVUkwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICI8YSBocmVmPVwiJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfUFjdGlvbj1BZ2VudFRpY2tldFBob25lO1N1YmFjdGlvbj1TdG9yZU5ldztFeHBhbmRDdXN0b21lck5hbWU9MjtDdXN0b21lclVzZXI9JFVzZXJIVE1MUXVvdGU7JExheW91dE9iamVjdC0+e0NoYWxsZW5nZVRva2VuUGFyYW19XCI+IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05ldyBwaG9uZSB0aWNrZXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiPC9hPiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldEVtYWlsfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRVUkwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVUkwgLj0gIiAtICI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJFVSTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gIjxhIGhyZWY9XCIkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9QWN0aW9uPUFnZW50VGlja2V0RW1haWw7U3ViYWN0aW9uPVN0b3JlTmV3O0V4cGFuZEN1c3RvbWVyTmFtZT0yO0N1c3RvbWVyVXNlcj0kVXNlckhUTUxRdW90ZTskTGF5b3V0T2JqZWN0LT57Q2hhbGxlbmdlVG9rZW5QYXJhbX1cIj4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTmV3IGVtYWlsIHRpY2tldCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8L2E+IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRVUkwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tZXIgJXMgYWRkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlclF1b3RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgKCAkVVJMICkhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDdXN0b21lciAlcyBhZGRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyUXVvdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcKICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhciAuICROb3RlOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZSwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgIEVycm9ycyA9PiBcJUVycm9ycywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CiAgICAgICAgbXkgJE91dHB1dCAgICAgICA9ICROYXZCYXI7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciB1c2VyIHVwZGF0ZWQhJykgKQogICAgICAgICAgICBpZiAoICROb3RpZmljYXRpb24gJiYgJE5vdGlmaWNhdGlvbiBlcSAnVXBkYXRlJyApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9PdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnSW5jbHVkZUludmFsaWQnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBJbmNsdWRlSW52YWxpZCAgICAgICAgPT4gJFNlbGYtPntJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkQ2hlY2tlZCA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/ICdjaGVja2VkJyA6ICcnLAogICAgICAgIH0sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25TZWFyY2gnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIGdldCB3cml0YWJsZSBkYXRhIHNvdXJjZXMKICAgIG15ICVDdXN0b21lclNvdXJjZSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU291cmNlTGlzdCgKICAgICAgICBSZWFkT25seSA9PiAwLAogICAgKTsKCiAgICAjIG9ubHkgc2hvdyBBZGQgb3B0aW9uIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHdyaXRhYmxlIGJhY2tlbmQKICAgIGlmICggc2NhbGFyIGtleXMgJUN1c3RvbWVyU291cmNlICkgewogICAgICAgICRQYXJhbXtTb3VyY2VPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4geyAlQ3VzdG9tZXJTb3VyY2UsIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NvdXJjZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NvdXJjZX0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2hvdywgYSBtZXNzYWdlIGlzIGRpc3BsYXllZCBvbiB0aGUgdGFibGUgd2l0aCB0aGlzIGNvbHNwYW4KICAgICAgICBteSAkQ29sU3BhbiA9IDY7CgogICAgICAgICMgc2FtZSBMaW1pdCBhcyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9CiAgICAgICAgIyBzbWFsbGVzdCBMaW1pdCBmcm9tIGFsbCBzb3VyY2VzCiAgICAgICAgbXkgJExpbWl0OwogICAgICAgIFNPVVJDRToKICAgICAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VyTWFwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKTsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9OwogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRMaW1pdCB8fCAkQ3VzdG9tZXJVc2VyTWFwLT57Q3VzdG9tZXJVc2VyU2VhcmNoTGlzdExpbWl0fSA8ICRMaW1pdCApIHsKICAgICAgICAgICAgICAgICRMaW1pdCA9ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFzIGZhbGxiYWNrIHRha2UgdGhlIGhhcmRjb2RlZCBsaW1pdCBvZiBLZXJuZWwvU3lzdGVtL0N1c3RvbWVyVXNlci9EQi5wbQogICAgICAgICRMaW1pdCAvLz0gMjUwOwoKICAgICAgICBteSAlTGlzdEFsbEl0ZW1zID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCArIDEsCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zIDw9ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyA9IGtleXMgJUxpc3RBbGxJdGVtczsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsID0+ICRMaXN0QWxsSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICBWYWxpZCAgPT4gJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPyAwIDogMSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGtleXMgJUxpc3RBbGxJdGVtcyA+ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyAgID0ga2V5cyAlTGlzdEFsbEl0ZW1zOwogICAgICAgICAgICBteSAkU2VhcmNoTGlzdFNpemUgPSBrZXlzICVMaXN0OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTZWFyY2hMaXN0U2l6ZSA9PiAkU2VhcmNoTGlzdFNpemUsCiAgICAgICAgICAgICAgICAgICAgTGlzdEFsbCAgICAgICAgPT4gJExpc3RBbGxJdGVtcywKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdTd2l0Y2hUb0N1c3RvbWVyJykgJiYgJFNlbGYtPntTd2l0Y2hUb0N1c3RvbWVyUGVybWlzc2lvbn0gJiYgJFBhcmFte05hdn0gbmUgJ05vbmUnICkKICAgICAgICB7CiAgICAgICAgICAgICRDb2xTcGFuID0gNzsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFN3aXRjaFRvQ3VzdG9tZXInLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgcmVzdWx0cyB0byBzaG93CiAgICAgICAgaWYgKCVMaXN0KSB7CgogICAgICAgICAgICAjIGdldCB2YWxpZCBsaXN0CiAgICAgICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAgICAgICAgIGZvciBteSAkTGlzdEtleSAoIHNvcnQgeyBsYygkYSkgY21wIGxjKCRiKSB9IGtleXMgJUxpc3QgKSB7CgogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkTGlzdEtleSApOwogICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX0gPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyRGF0YXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+ICRWYWxpZExpc3R7ICRVc2VyRGF0YXtWYWxpZElEfSB8fCAnJyB9IHx8ICctJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRMaXN0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtOYXZ9IGVxICdOb25lJyApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3dMaW5rTm9uZScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSA9PiAkTGlzdEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXYgICAgICAgICA9PiAkUGFyYW17TmF2fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRMaXN0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnU3dpdGNoVG9DdXN0b21lcicpCiAgICAgICAgICAgICAgICAgICAgJiYgJFNlbGYtPntTd2l0Y2hUb0N1c3RvbWVyUGVybWlzc2lvbn0KICAgICAgICAgICAgICAgICAgICAmJiAkUGFyYW17TmF2fSBuZSAnTm9uZScKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93U3dpdGNoVG9DdXN0b21lcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3RoZXJ3aXNlIGl0IGRpc3BsYXlzIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29sU3BhbiA9PiAkQ29sU3BhbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBzZWFyY2ggaXQgc2hvd3MgYSBtZXNzYWdlCiAgICBlbHNlCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VhcmNoVGVybXMnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXYnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtOYXZ9LAogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBfRWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGxheW91dCBvYmplY3QuCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKCiAgICAgICAgIyBzaG93cyBlZGl0IGhlYWRlcgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdIZWFkZXJFZGl0JyApOwoKICAgICAgICAjIHNob3dzIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBtYXRyaXgKICAgICAgICAkU2VsZi0+X0VmZmVjdGl2ZVBlcm1pc3Npb25zKCVQYXJhbSk7CiAgICB9CgogICAgIyBzaG93cyBhZGQgaGVhZGVyCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSGVhZGVyQWRkJyApOwogICAgfQoKICAgIG15ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXM7CgogICAgIyBHZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyB1cGRhdGUgdXNlcgogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1JlYWRPbmx5fQogICAgICAgIHx8CiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57TW9kdWxlfSA9fiAvTERBUC9pCiAgICAgICAgKQogICAgewogICAgICAgICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPSAxOwogICAgfQoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEVOVFJZIGlmICEkRW50cnktPlswXTsKCiAgICAgICAgIyBIYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBpZiAoICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBHZXQgSFRNTCBmb3IgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0gPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiB1bmRlZiwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkRW50cnktPls0XSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICAgICAjIFNlcnZlciBlcnJvciwgaWYgYW55CiAgICAgICAgICAgICAgICAleyAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSB9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZmllbGRzIGZvciB3aGljaCBIVE1MIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZEhUTUwpOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICB9CgogICAgICAgIG15ICRCbG9jayA9ICdJbnB1dCc7CgogICAgICAgICMgY2hlY2sgaW5wdXQgdHlwZQogICAgICAgIGlmICggJEVudHJ5LT5bMF0gPX4gL15Vc2VyUGFzc3dvci9pICkgewogICAgICAgICAgICAkQmxvY2sgPSAnUGFzc3dvcmQnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBsb2dpbiBhdXRvIGNyZWF0aW9uCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntBdXRvTG9naW5DcmVhdGlvbn0gJiYgJEVudHJ5LT5bMF0gZXEgJ1VzZXJMb2dpbicgKSB7CiAgICAgICAgICAgICRCbG9jayA9ICdJbnB1dEhpZGRlbic7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFbnRyeS0+WzddIHx8ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZWFkT25seX0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5fSA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcmVxdWlyZWQgZmxhZwogICAgICAgIGlmICggJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSAgICAgICAgICA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZExhYmVsQ2xhc3N9ICAgICA9ICdNYW5kYXRvcnknOwogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRMYWJlbENoYXJhY3Rlcn0gPSAnKic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gICAgICAgICAgPSAnJzsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkTGFiZWxDbGFzc30gICAgID0gJyc7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZExhYmVsQ2hhcmFjdGVyfSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZW1wdHkgc3RyaW5nCiAgICAgICAgJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fD0gJyc7CgogICAgICAgICMgYWRkIGNsYXNzIHRvIHZhbGlkYXRlIGVtYWlscwogICAgICAgIGlmICggJEVudHJ5LT5bMF0gZXEgJ1VzZXJFbWFpbCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSAuPSAnIFZhbGlkYXRlX0VtYWlsJzsKICAgICAgICB9CgogICAgICAgICMgQnVpbGQgc2VsZWN0aW9ucyBvciBpbnB1dCBmaWVsZHMuCiAgICAgICAgIyBBbiBleHBsaWNpdCBzZWxlY3Rpb24gaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57U2VsZWN0aW9uc30tPnsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CgogICAgICAgICAgICAjIENoYW5nZSB0aGUgdmFsaWRhdGlvbiBjbGFzcwogICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZENsYXNzfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSBkYXRhIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkU2VsZWN0aW9uc0RhdGEgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9OwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldAogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRTZWxlY3Rpb25zRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0aW9uc0RhdGEtPnskS2V5fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlSW5wdXQoICRTZWxlY3Rpb25zRGF0YS0+eyRLZXl9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgb3B0aW9uIHN0cmluZwogICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJFNlbGVjdGlvbnNEYXRhLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gIiRQYXJhbXtSZXF1aXJlZENsYXNzfSBNb2Rlcm5pemUgIiAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0sCiAgICAgICAgICAgICAgICBEaXNhYmxlZCAgICA9PiAkVXBkYXRlT25seVByZWZlcmVuY2VzID8gMSA6IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJEVudHJ5LT5bMF0gPX4gbS9eVXNlckNvdW50cnkvaQogICAgICAgICAgICAmJgogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1JlZmVyZW5jZURhdGE6OlRyYW5zbGF0ZWRDb3VudHJ5TmFtZXMnKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKCiAgICAgICAgICAgIG15ICRDb3VudHJ5TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZWZlcmVuY2VEYXRhJyktPkNMRFJDb3VudHJ5TGlzdCgKICAgICAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgcHJldmlvdXMgdmFsdWUgZXhpc3RzIGluIHRoZSBzZWxlY3Rpb24gbGlzdCBldmVuIGlmIGlzbid0IGEgY291bnRyeSBjb2RlLgogICAgICAgICAgICBteSAkUHJldmlvdXNDb3VudHJ5ID0gJFBhcmFteyAkRW50cnktPlswXSB9OwogICAgICAgICAgICBpZiAoJFByZXZpb3VzQ291bnRyeSkgewogICAgICAgICAgICAgICAgJENvdW50cnlMaXN0LT57JFByZXZpb3VzQ291bnRyeX0gLy89ICRQcmV2aW91c0NvdW50cnk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvdW50cnlMaXN0LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSAvLyAxICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVudHJ5LT5bMF0gPX4gbS9eVmFsaWRJRC9pICkgewoKICAgICAgICAgICAgIyBDaGFuZ2UgdGhlIHZhbGlkYXRpb24gY2xhc3MKICAgICAgICAgICAgaWYgKCAkUGFyYW17UmVxdWlyZWRDbGFzc30gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwogICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKSwgfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApID8gJFBhcmFteyAkRW50cnktPlswXSB9IDogMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gIiRQYXJhbXtSZXF1aXJlZENsYXNzfSBNb2Rlcm5pemUgIiAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0sCiAgICAgICAgICAgICAgICBEaXNhYmxlZCAgID0+ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPyAxIDogMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkRW50cnktPlswXSA9fiBtL15Vc2VyQ3VzdG9tZXJJRCQvaQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwogICAgICAgICAgICBteSAlQ29tcGFueUxpc3QgICAgICAgICAgID0gKAogICAgICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55TGlzdCggTGltaXQgPT4gMCApLAogICAgICAgICAgICAgICAgJycgPT4gJy0nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgIG15ICVDb21wYW55ID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICAgICAgICAgICAgICRDb21wYW55TGlzdHsgJFBhcmFteyAkRW50cnktPlswXSB9IH0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gLiAnICgtKSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CgogICAgICAgICAgICAjIENoYW5nZSB0aGUgdmFsaWRhdGlvbiBjbGFzcwogICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZENsYXNzfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRVc2VBdXRvQ29tcGxldGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FkbWluQ3VzdG9tZXJVc2VyOjpVc2VBdXRvQ29tcGxldGUnKTsKCiAgICAgICAgICAgIGlmICgkVXNlQXV0b0NvbXBsZXRlKSB7CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICRQYXJhbXtDdXN0b21lcklEfTsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAiWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJVc2VyQ3VzdG9tZXJJRCIgbmFtZT0iVXNlckN1c3RvbWVySUQiIHZhbHVlPSInIC4gJFZhbHVlIC4gJyIKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iVzUwcGMgQ3VzdG9tZXJBdXRvQ29tcGxldGVTaW1wbGUgJwogICAgICAgICAgICAgICAgICAgIC4gJFBhcmFte1JlcXVpcmVkQ2xhc3N9IC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9CiAgICAgICAgICAgICAgICAgICAgLiAnIiBkYXRhLWN1c3RvbWVyLXNlYXJjaC10eXBlPSJDdXN0b21lcklEIiAvPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVDb21wYW55TGlzdCwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgPT4gODAsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gIiRQYXJhbXtSZXF1aXJlZENsYXNzfSBNb2Rlcm5pemUgIiAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0sCiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgICA9PiAkVXBkYXRlT25seVByZWZlcmVuY2VzID8gMSA6IDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0FjdGlvbn0gZXEgJ0FkZCcgJiYgJEVudHJ5LT5bMF0gPX4gL15Vc2VyQ3VzdG9tZXJJRCQvaSApIHsKCiAgICAgICAgICAgICMgVXNlIEN1c3RvbWVySUQgcGFyYW0gaWYgY2FsbGVkIGZyb20gQ0lDLgogICAgICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICRQYXJhbXtDdXN0b21lcklEfSB8fCAnJzsKICAgICAgICB9CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBCdWlsZCB0aGUgZ3JvdXAgZmllbGQuCiAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJHcm91cElEJC9pICkgewogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyB0aGUgcGVybWlzc2lvbiB0byBzZWUvY2hhbmdlIHRoZSBtdWx0aXRlbmFuY3kgZmllbGQuCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TXVsdGl0ZW5hbmN5UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIyBCdWlsZCB0aGUgZmllbGQuCiAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgICAgID0+ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPyAxIDogMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSAvLyAnJzsKICAgICAgICB9CgogICAgICAgICMgYWRkIGZvcm0gb3B0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17VHlwZX0gJiYgJFBhcmFte1R5cGV9IGVxICdoaWRkZW4nICkgewogICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9IC49ICRQYXJhbXtWYWx1ZX07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzR2VuZXJpYycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBJdGVtID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICVQYXJhbQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICJQcmVmZXJlbmNlc0dlbmVyaWMkQmxvY2siLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBJbnZhbGlkRmllbGQgPT4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIGNvcnJlY3QgY2xpZW50IHNpZGUgZXJyb3IgbXNnCiAgICAgICAgICAgIGlmICggJEJsb2NrIGVxICdJbnB1dCcgJiYgJEVudHJ5LT5bMF0gZXEgJ1VzZXJFbWFpbCcgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc1VzZXJFbWFpbEVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgTmFtZSA9PiAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpY0Vycm9yTXNnIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgTmFtZSA9PiAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgdGhlIGNvcnJlY3Qgc2VydmVyIGVycm9yIG1zZwogICAgICAgICAgICBpZiAoICRCbG9jayBlcSAnSW5wdXQnICYmICRQYXJhbXtVc2VyRW1haWx9ICYmICRFbnRyeS0+WzBdIGVxICdVc2VyRW1haWwnICkgewoKICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZXJ2ZXIgZXJyb3IgbXNnIGFjY29yZGluZyB3aXRoIHRoZSBvY2N1cnJlZCBlbWFpbCBlcnJvciB0eXBlCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc1VzZXJFbWFpbCcgLiAoICRQYXJhbXtFcnJvcnN9LT57RXJyb3JUeXBlfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBOYW1lID0+ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljU2VydmVyRXJyb3JNc2ciLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBOYW1lID0+ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRQcmVmZXJlbmNlc1VzZWQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntBZG1pblNldFByZWZlcmVuY2VzfTsKICAgIGlmICggKCBkZWZpbmVkICRQcmVmZXJlbmNlc1VzZWQgJiYgJFByZWZlcmVuY2VzVXNlZCAhPSAwICkgfHwgIWRlZmluZWQgJFByZWZlcmVuY2VzVXNlZCApIHsKCiAgICAgICAgbXkgJURhdGE7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKCiAgICAgICAgR1JPVVA6CiAgICAgICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CgogICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkR3JvdXA7CgogICAgICAgICAgICBteSAkUHJlZmVyZW5jZXNHcm91cCA9ICRQcmVmZXJlbmNlc3skR3JvdXB9OwoKICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJFByZWZlcmVuY2VzR3JvdXA7CiAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgcmVmICRQcmVmZXJlbmNlc0dyb3VwIG5lICdIQVNIJzsKCiAgICAgICAgICAgIGlmICggJERhdGF7ICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30gfSApIHsKCiAgICAgICAgICAgICAgICBDT1VOVDoKICAgICAgICAgICAgICAgIGZvciAoIDEgLi4gMTUxICkgewoKICAgICAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99Kys7CgogICAgICAgICAgICAgICAgICAgIGlmICggISREYXRheyAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99IH0gPSAkR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQ09VTlQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRGF0YXsgJFByZWZlcmVuY2VzR3JvdXAtPntQcmlvfSB9ID0gJEdyb3VwOwogICAgICAgIH0KCiAgICAgICAgIyBzb3J0CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgICREYXRheyBzcHJpbnRmICIlMDdkIiwgJEtleSB9ID0gJERhdGF7JEtleX07CiAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskS2V5fTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBlYWNoIHByZWZlcmVuY2VzIHNldHRpbmcKICAgICAgICBQUklPOgogICAgICAgIGZvciBteSAkUHJpbyAoIHNvcnQga2V5cyAlRGF0YSApIHsKCiAgICAgICAgICAgIG15ICRHcm91cCA9ICREYXRheyRQcmlvfTsKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHN9LT57JEdyb3VwfSApIHsKICAgICAgICAgICAgICAgIG5leHQgUFJJTzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJVByZWZlcmVuY2UgPSAleyAkQ29uZmlnT2JqZWN0LT57Q3VzdG9tZXJQcmVmZXJlbmNlc0dyb3Vwc30tPnskR3JvdXB9IH07CiAgICAgICAgICAgIGlmICggJEdyb3VwIGVxICdQYXNzd29yZCcgKSB7CiAgICAgICAgICAgICAgICBuZXh0IFBSSU87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXtNb2R1bGV9IHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Q3VzdG9tZXJQcmVmZXJlbmNlc0dlbmVyaWMnOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gXCVQcmVmZXJlbmNlLAogICAgICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLAogICAgICAgICAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKAogICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYgJFBhcmFtSXRlbS0+e0RhdGF9IGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmVmICRQcmVmZXJlbmNle0RhdGF9IGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlQnVpbGRTZWxlY3Rpb25QYXJhbXMgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVByZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskUGFyYW1JdGVtfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQnVpbGRTZWxlY3Rpb25QYXJhbXN7Q2xhc3N9ID0gam9pbiggJyAnLCAkQnVpbGRTZWxlY3Rpb25QYXJhbXN7Q2xhc3N9IC8vICcnLCAnTW9kZXJuaXplJyApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbUl0ZW0tPntPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJUJ1aWxkU2VsZWN0aW9uUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbUl0ZW0tPntCbG9ja30gfHwgJFByZWZlcmVuY2V7QmxvY2t9IHx8ICdPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHJlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnTmF2JywKICAgICAgICBWYWx1ZSA9PiAkUGFyYW17TmF2fSwKICAgICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBfRWZmZWN0aXZlUGVybWlzc2lvbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG9ubHkgaWYgY3VzdG9tZXIgZ3JvdXAgZmVhdHVyZSBpcyBhY3RpdmUKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKSApIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ3VzdG9tZXJHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyk7CgogICAgIyBzaG93IHRhYmxlcwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRWZmZWN0aXZlUGVybWlzc2lvbnMnLAogICAgKTsKCiAgICBteSAlR3JvdXBzOwogICAgbXkgJVBlcm1pc3Npb25zOwoKICAgICMgZ28gdGhyb3VnaCBwZXJtaXNzaW9uIHR5cGVzCiAgICBteSBAVHlwZXMgPSBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbTo6Q3VzdG9tZXI6OlBlcm1pc3Npb24nKSB9OwogICAgZm9yIG15ICRUeXBlIChAVHlwZXMpIHsKCiAgICAgICAgIyBzaG93IGhlYWRlcgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICJIZWFkZXJHcm91cFBlcm1pc3Npb25UeXBlIiwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGdyb3VwcyBvZiB0aGUgdXNlcgogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFBhcmFte0lEfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgUmF3UGVybWlzc2lvbnMgPT4gMCwgICAgICAgICAgICAjIGdldCBlZmZlY3RpdmUgcGVybWlzc2lvbnMKICAgICAgICApOwoKICAgICAgICAjIHN0b3JlIGRhdGEgaW4gbG9va3VwIGhhc2hlcwogICAgICAgIGZvciBteSAkR3JvdXBJRCAoIHNvcnQga2V5cyAlVXNlckdyb3VwcyApIHsKICAgICAgICAgICAgJEdyb3Vwc3skR3JvdXBJRH0gPSAkVXNlckdyb3Vwc3skR3JvdXBJRH07CiAgICAgICAgICAgICRQZXJtaXNzaW9uc3skR3JvdXBJRH17JFR5cGV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IG1lc3NhZ2UgaWYgbm8gcGVybWlzc2lvbnMgZm91bmQKICAgIGlmICggISVQZXJtaXNzaW9ucyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9Hcm91cFBlcm1pc3Npb25zRm91bmRNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnbyB0aHJvdWdoIGdyb3Vwcywgc29ydCBieSBuYW1lCiAgICBlbHNlIHsKICAgICAgICBmb3IgbXkgJEdyb3VwSUQgKCBzb3J0IHsgdWMoICRHcm91cHN7JGF9ICkgY21wIHVjKCAkR3JvdXBzeyRifSApIH0ga2V5cyAlR3JvdXBzICkgewoKICAgICAgICAgICAgIyBzaG93IHRhYmxlIHJvd3MKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdHcm91cFBlcm1pc3Npb25UYWJsZVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEdyb3Vwc3skR3JvdXBJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IHBlcm1pc3Npb24gbWFya3MKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChAVHlwZXMpIHsKICAgICAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uTWFyayA9ICRQZXJtaXNzaW9uc3skR3JvdXBJRH17JFR5cGV9ID8gJ09uJyAgICAgICAgOiAnT2ZmJzsKICAgICAgICAgICAgICAgIG15ICRIaWdobGlnaHRNYXJrICA9ICRUeXBlIGVxICdydycgICAgICAgICAgICAgICAgID8gJ0hpZ2hsaWdodCcgOiAnJzsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwUGVybWlzc2lvbk1hcmsnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwUGVybWlzc2lvbk1hcmsnIC4gJFBlcm1pc3Npb25NYXJrLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIaWdobGlnaHQgPT4gJEhpZ2hsaWdodE1hcmssCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxsIGFjY2Vzc2libGUgY3VzdG9tZXJzIG9mIHRoZSB1c2VyCiAgICBteSAlQ3VzdG9tZXJzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ29udGV4dEN1c3RvbWVycygKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17SUR9LAogICAgKTsKCiAgICAjIHNob3cgbWVzc2FnZSBpZiBubyBjdXN0b21lcnMgZm91bmQKICAgIGlmICggISVDdXN0b21lcnMgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vQ3VzdG9tZXJBY2Nlc3NGb3VuZE1zZycsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGdldCBwZXJtaXNzaW9uIGNvbnRleHRzCiAgICBteSAkQ29udGV4dENvbmZpZyAgICAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckdyb3VwUGVybWlzc2lvbkNvbnRleHQnKTsKICAgIG15ICREaXJlY3RBY2Nlc3NDb250ZXh0S2V5ICAgPSAnMDAxLUN1c3RvbWVySUQtc2FtZSc7CiAgICBteSAkSW5kaXJlY3RBY2Nlc3NDb250ZXh0S2V5ID0gJzEwMC1DdXN0b21lcklELW90aGVyJzsKCiAgICAjIHVzZSBkZWZhdWx0IGNvbnRleHQgaWYgbm9uZSBhcmUgZm91bmQKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRDb250ZXh0Q29uZmlnKSApIHsKICAgICAgICAkQ29udGV4dENvbmZpZyA9IHsKICAgICAgICAgICAgJERpcmVjdEFjY2Vzc0NvbnRleHRLZXkgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ1NhbWUgQ3VzdG9tZXInKSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgc2hvdyBkZWZhdWx0IGFuZCBleHRyYSBjb250ZXh0IGhlYWRlcnMgaWYgYXZhaWxhYmxlCiAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JERpcmVjdEFjY2Vzc0NvbnRleHRLZXl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJDdXN0b21lckFjY2Vzc0NvbnRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdEaXJlY3QnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkQ29udGV4dENvbmZpZy0+eyRJbmRpcmVjdEFjY2Vzc0NvbnRleHRLZXl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJDdXN0b21lckFjY2Vzc0NvbnRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdJbmRpcmVjdCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZXRlcm1pbmUgY3VzdG9tZXJzIGZvciBkaXJlY3QgYW5kIGluZGlyZWN0IGFjY2VzcwogICAgbXkgQFVzZXJDdXN0b21lcklEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJJRHMoCiAgICAgICAgVXNlciA9PiAkUGFyYW17SUR9LAogICAgKTsKICAgIG15ICVFeHRyYUN1c3RvbWVySURzOwogICAgaWYgKCAkQ29udGV4dENvbmZpZy0+eyRJbmRpcmVjdEFjY2Vzc0NvbnRleHRLZXl9ICkgewogICAgICAgIG15ICRFeHRyYUNvbnRleHROYW1lID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ29udGV4dE5hbWVHZXQoCiAgICAgICAgICAgIFN5c0NvbmZpZ05hbWUgPT4gJEluZGlyZWN0QWNjZXNzQ29udGV4dEtleSwKICAgICAgICApOwoKICAgICAgICAjIGZvciBhbGwgQ3VzdG9tZXJJRHMgZ2V0IGdyb3VwcyB3aXRoIGV4dHJhIGFjY2VzcwogICAgICAgIG15ICVFeHRyYVBlcm1pc3Npb25Hcm91cHM7CiAgICAgICAgQ1VTVE9NRVJJRDoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVySUQgKEBVc2VyQ3VzdG9tZXJJRHMpIHsKICAgICAgICAgICAgbXkgJUdyb3VwTGlzdCA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cEN1c3RvbWVyTGlzdCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBDb250ZXh0ICAgID0+ICRFeHRyYUNvbnRleHROYW1lLAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJJRCBpZiAhJUdyb3VwTGlzdDsKCiAgICAgICAgICAgICMgYWRkIHRvIGdyb3VwcwogICAgICAgICAgICAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzID0gKAogICAgICAgICAgICAgICAgJUV4dHJhUGVybWlzc2lvbkdyb3VwcywKICAgICAgICAgICAgICAgICVHcm91cExpc3QsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhbGwgdW5pcXVlIGFjY2Vzc2libGUgR3JvdXA8LT5DdXN0b21lciBjb21iaW5hdGlvbnMKICAgICAgICBHUk9VUElEOgogICAgICAgIGZvciBteSAkR3JvdXBJRCAoIHNvcnQga2V5cyAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzICkgewogICAgICAgICAgICBteSBAR3JvdXBDdXN0b21lcklEcyA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cEN1c3RvbWVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdJRCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgR1JPVVBJRCBpZiAhQEdyb3VwQ3VzdG9tZXJJRHM7CgogICAgICAgICAgICAjIGFkZCB0byBFeHRyYUN1c3RvbWVySURzCiAgICAgICAgICAgICVFeHRyYUN1c3RvbWVySURzID0gKAogICAgICAgICAgICAgICAgJUV4dHJhQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICBtYXAgeyAkXyA9PiAxIH0gQEdyb3VwQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ28gdGhyb3VnaCBjdXN0b21lcnMKICAgIENVU1RPTUVSSUQ6CiAgICBmb3IgbXkgJEN1c3RvbWVySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVycyApIHsKCiAgICAgICAgIyBzaG93IHRhYmxlIHJvd3MKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJBY2Nlc3NUYWJsZVJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEN1c3RvbWVyc3skQ3VzdG9tZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyAnU2FtZSBDdXN0b21lcicKICAgICAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JERpcmVjdEFjY2Vzc0NvbnRleHRLZXl9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBzaG91bGQgc2hvdyBjaGVjayBtYXJrIGZvciAnU2FtZSBDdXN0b21lcicKICAgICAgICAgICAgbXkgJEFjY2Vzc01hcmsgPSAoIGdyZXAgeyAkXyBlcSAkQ3VzdG9tZXJJRCB9IEBVc2VyQ3VzdG9tZXJJRHMgKSA/ICdPbicgOiAnT2ZmJzsKCiAgICAgICAgICAgICMgc2hvdyBibG9ja3MKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckFjY2Vzc01hcmsnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycgLiAkQWNjZXNzTWFyaywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgJ090aGVyIEN1c3RvbWVycycKICAgICAgICBuZXh0IENVU1RPTUVSSUQgaWYgISRDb250ZXh0Q29uZmlnLT57JEluZGlyZWN0QWNjZXNzQ29udGV4dEtleX07CgogICAgICAgICMgY2hlY2sgaWYgd2Ugc2hvdWxkIHNob3cgY2hlY2sgbWFyayBmb3IgJ090aGVyIEN1c3RvbWVycycKICAgICAgICBteSAkQWNjZXNzTWFyayA9ICRFeHRyYUN1c3RvbWVySURzeyRDdXN0b21lcklEfSA/ICdPbicgOiAnT2ZmJzsKCiAgICAgICAgIyBzaG93IGJsb2NrcwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckFjY2Vzc01hcmsnLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycgLiAkQWNjZXNzTWFyaywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerCompany/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhYjc4ZTcwMDdjMzI3Y2I3MDcwMmVmZjJmYTNiNjY1YWQ5ZTcxZmMyIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OjpEQjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OkNvbmZpZycsCiMgRU8gUm90aGVyIE9TUwogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IGN1c3RvbWVyIGNvbXBhbnkgbWFwCiAgICAjIGFjdHVhbGx5IHRoZSBwYXJhbWV0ZXIgQ3VzdG9tZXJDb21wYW55TWFwIGluY2x1ZGVzIHRoZSBjb21wbGV0ZSBjb25maWcgb2YgdGhlIGJhY2tlbmQKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfSA9ICRQYXJhbXtDdXN0b21lckNvbXBhbnlNYXB9IHx8IGRpZSAiR290IG5vIEN1c3RvbWVyQ29tcGFueU1hcCEiOwoKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e1RhYmxlfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPlBhcmFtcy0+VGFibGUgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPkN1c3RvbWVyQ29tcGFueUtleSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVZhbGlkfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlWYWxpZCd9OwogICAgJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9ICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPnsnQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdExpbWl0J30gfHwgNTAwMDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hQcmVmaXgnfTsKCiAgICBpZiAoICFkZWZpbmVkKCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gPSAnJzsKICAgIH0KICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hTdWZmaXgnfTsKICAgIGlmICggIWRlZmluZWQoICRTZWxmLT57U2VhcmNoU3VmZml4fSApICkgewogICAgICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICcqJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgJFNlbGYtPntDYWNoZVR5cGV9ICAgPSAnQ3VzdG9tZXJDb21wYW55JyAuICRQYXJhbXtDb3VudH07CiAgICAgICAgJFNlbGYtPntDYWNoZVRUTH0gICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0gfHwgMDsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgZGIgY29ubmVjdCBpZiBEU04gaXMgZ2l2ZW4KICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e0RTTn0gKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICAgICAgRGF0YWJhc2VEU04gICAgICAgICAgICAgPT4gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e0RTTn0sCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntBdHRyaWJ1dGV9LAogICAgICAgICAgICBEYXRhYmFzZVVzZXIgICAgICAgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57VXNlcn0sCiAgICAgICAgICAgIERhdGFiYXNlUHcgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntQYXNzd29yZH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntUeXBlfSB8fCAnJywKICAgICAgICAgICAgRGlzY29ubmVjdE9uRGVzdHJ1Y3Rpb24gPT4gMSwKICAgICAgICApIHx8IGRpZSgnQ2FuXCd0IGNvbm5lY3QgdG8gZGF0YWJhc2UhJyk7CgogICAgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHRoZSBEQk9iamVjdCBub3QgZnJvbSBwYXJlbnQgY2FsbAogICAgICAgICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ID0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICB9CgogICAgIyB0aGlzIHNldHRpbmcgc3BlY2lmaWVzIGlmIHRoZSB0YWJsZSBoYXMgdGhlIGNyZWF0ZV90aW1lLAogICAgIyBjcmVhdGVfYnksIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkgZmllbGRzIG9mIE9UT0JPCiAgICAkU2VsZi0+e0ZvcmVpZ25EQn0gPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57Rm9yZWlnbkRCfSA/IDEgOiAwOwoKICAgICMgZGVmaW5lcyBpZiB0aGUgZGF0YWJhc2Ugc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVuZCBjYXNlIHNlbnNpdGl2ZSAoMSkgb3Igbm90ICgwKQogICAgJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntTZWFyY2hDYXNlU2Vuc2l0aXZlfQogICAgICAgIC8vICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntDYXNlU2Vuc2l0aXZlfSB8fCAwOwoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIHNvcnQga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoICEkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQoICRQYXJhbXtWYWxpZH0gKSApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gLy8gJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9OwoKICAgIG15ICRDYWNoZVR5cGU7CiAgICBteSAkQ2FjaGVLZXk7CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgJENhY2hlVHlwZSA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJDb21wYW55TGlzdCc7CiAgICAgICAgJENhY2hlS2V5ICA9ICJDdXN0b21lckNvbXBhbnlMaXN0Ojoke1ZhbGlkfTo6JHtMaW1pdH06OiIgLiAoICRQYXJhbXtTZWFyY2h9IHx8ICcnICk7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBVc2UgY2FjaGUgZm9yIG11bHRpdGVuYW5jeS4KICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JERhdGF9IGlmIHJlZiAkRGF0YSBlcSAnSEFTSCc7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHMgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkcykgKSB7CiAgICAgICAgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHMgPSBbICdjdXN0b21lcl9pZCcsICduYW1lJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKCiAgICAjIHdoYXQgaXMgdGhlIHJlc3VsdAogICAgbXkgJFdoYXQgPSBqb2luKAogICAgICAgICcsICcsCiAgICAgICAgQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcwogICAgKTsKCiAgICAjIGFkZCB2YWxpZCBvcHRpb24gaWYgcmVxdWlyZWQKICAgIG15ICRTUUw7CiAgICBteSBAQmluZDsKICAgIG15IEBDb25kaXRpb25zOwoKICAgIGlmICggJFZhbGlkICYmICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VmFsaWR9ICkgewoKICAgICAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55VmFsaWR9IElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSI7CiAgICB9CgogICAgIyB3aGVyZQogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcwogICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBteSAlUXVlcnlDb25kaXRpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gXEBDdXN0b21lckNvbXBhbnlTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFNlYXJjaFByZWZpeCAgPT4gJFNlbGYtPntTZWFyY2hQcmVmaXh9LAogICAgICAgICAgICBTZWFyY2hTdWZmaXggID0+ICRTZWxmLT57U2VhcmNoU3VmZml4fSwKICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZSA9PiAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9LAogICAgICAgICAgICBCaW5kTW9kZSAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUXVlcnlDb25kaXRpb257U1FMfSApIHsKICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAkUXVlcnlDb25kaXRpb257U1FMfSI7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsICAgICAgIEB7ICRRdWVyeUNvbmRpdGlvbntWYWx1ZXN9IH07CiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIERvbid0IHNlYXJjaCBmb3IgY3VzdG9tZXIgd2l0aG91dCBncm91cCBwZXJtaXNzaW9uLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICAgICAjIEdldCB0aGUgY29sdW1uIG5hbWUgd2hlcmUgdGhlIGdyb3VwIElEIGlzIHN0b3JlZC4KICAgICAgICAgICAgbXkgJEdyb3VwSURDb2w7CiAgICAgICAgICAgIGZvciBteSAkTWFwICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTWFwLT5bMF0gZXEgJ1VzZXJHcm91cElEJyApIHsKICAgICAgICAgICAgICAgICAgICAkR3JvdXBJRENvbCA9ICRNYXAtPlsyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRHcm91cElEQ29sKSB7CiAgICAgICAgICAgICAgICBteSBAVXNlckdyb3VwSURzID0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07ICAjIE5vdCBzYXZpbmcgdGhpcyBpbiBhbiBhcnJheSBjYW4gY2F1c2UgYW4gdW5rb3duIGVycm9yIGluIGEgbGF0ZXIgaXRlcmF0aW9uLgogICAgICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSURzIG9yIG5hbWVzIHNob3VsZCBiZSBjaGVja2VkLgogICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cE5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkVXNlckdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJHcm91cElEID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb2NhbEdyb3VwID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSUQgZXEgJExvY2FsR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlckdyb3VwSUQgPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEluQ29uZGl0aW9uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdyb3VwSURDb2wsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVzICAgPT4gXEBVc2VyR3JvdXBJRHMsCiAgICAgICAgICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEluQ29uZGl0aW9uIC49ICIgT1IgKCRHcm91cElEQ29sIElTIE5VTEwgT1IgJEdyb3VwSURDb2wgPSAnJykiOwogICAgICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAoJEluQ29uZGl0aW9uKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFuZGxpbmcKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwogICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgbXkgQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNEeW5hbWljRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKCiAgICAjIHNxbAogICAgbXkgJENvbXBsZXRlU1FMID0gIlNFTEVDVCAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0sICRXaGF0IEZST00gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0iOwoKICAgIGlmIChAQ29uZGl0aW9ucykgewogICAgICAgICRTUUwgPSBqb2luKCAnIEFORCAnLCBAQ29uZGl0aW9ucyApOwogICAgICAgICRDb21wbGV0ZVNRTCAuPSAiIFdIRVJFICRTUUwiOwogICAgfQoKICAgICMgZ2V0IGRhdGEgZnJvbSBjdXN0b21lciBjb21wYW55IHRhYmxlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkQ29tcGxldGVTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+ICRMaW1pdCwKICAgICk7CgogICAgbXkgQEN1c3RvbWVyQ29tcGFueURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVyQ29tcGFueURhdGEsIFtAUm93XTsKICAgIH0KCiAgICBteSAlTGlzdDsKCiAgICBDVVNUT01FUkNPTVBBTllEQVRBOgogICAgZm9yIG15ICRDdXN0b21lckNvbXBhbnlEYXRhIChAQ3VzdG9tZXJDb21wYW55RGF0YSkgewogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlJRCA9IHNoaWZ0IEB7JEN1c3RvbWVyQ29tcGFueURhdGF9OwogICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZREFUQSBpZiAkTGlzdHskQ3VzdG9tZXJDb21wYW55SUR9OwoKICAgICAgICBteSAlQ29tcGFueVN0cmluZ1BhcnRzOwoKICAgICAgICBteSAkRmllbGRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJDb21wYW55RGF0YX0gKSB7CiAgICAgICAgICAgICRDb21wYW55U3RyaW5nUGFydHN7ICRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHNbJEZpZWxkQ291bnRlcl0gfSA9ICRGaWVsZDsKICAgICAgICAgICAgJEZpZWxkQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgICAgIGlmIChAQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxETkFNRToKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lIChAQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhZXhpc3RzICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgICAgICAgICAgVkFMVUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBteSAkUmVhZGFibGVWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkUmVhZGFibGVWYWx1ZSkgfHwgIWRlZmluZWQgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9ID0gJFBvc3NpYmxlVmFsdWVzLT57ICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJENvbXBhbnlTdHJpbmdQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhc3NlbWJsZSBjb21wYW55IHN0cmluZwogICAgICAgIG15IEBDb21wYW55U3RyaW5nUGFydHM7CiAgICAgICAgQ1VTVE9NRVJDT01QQU5ZTElTVEZJRUxEOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkICggQHskQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc30gKSB7CiAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZTElTVEZJRUxECiAgICAgICAgICAgICAgICBpZiAhZXhpc3RzICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFkZWZpbmVkICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFsZW5ndGggJENvbXBhbnlTdHJpbmdQYXJ0c3skQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkfTsKICAgICAgICAgICAgcHVzaCBAQ29tcGFueVN0cmluZ1BhcnRzLCAkQ29tcGFueVN0cmluZ1BhcnRzeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGR9OwogICAgICAgIH0KCiAgICAgICAgJExpc3R7JEN1c3RvbWVyQ29tcGFueUlEfSA9IGpvaW4gJyAnLCBAQ29tcGFueVN0cmluZ1BhcnRzOwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlTGlzdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJUxpc3Q7Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRmllbGRzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFZhbGlkID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CgogICAgJFBhcmFte0xpbWl0fSAvLz0gJyc7CgogICAgIyBTcGxpdCB0aGUgc2VhcmNoIGZpZWxkcyBpbiBzY2FsYXIgYW5kIGFycmF5IGZpZWxkcy4KICAgIG15IEBTY2FsYXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgJ0lucHV0JyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKICAgIG15IEBBcnJheVNlYXJjaEZpZWxkcyAgPSBncmVwIHsgJ1NlbGVjdGlvbicgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgIyBWZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZi4KICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQtPntOYW1lfSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgbXkgJFJlc3VsdCA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CgogICAgIyBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgICMgSWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICcnOwoKICAgICAgICAjIERlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbXTsKICAgIH0KCiAgICAjIERlZmluZSBvcmRlciB0YWJsZSBmcm9tIHRoZSBzZWFyY2ggZmllbGRzLgogICAgbXkgJU9yZGVyQnlUYWJsZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntEYXRhYmFzZUZpZWxkfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgZm9yIG15ICRGaWVsZCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CgogICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRGaWVsZC0+e1NlbGVjdGlvbnNEYXRhfTsKCiAgICAgICAgZm9yIG15ICRTZWxlY3RlZFZhbHVlICggQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBzZWxlY3RlZCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICAgIGlmICggISRTZWxlY3Rpb25zRGF0YS0+eyRTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzZWxlY3RlZCB2YWx1ZSAkRmllbGQtPntOYW1lfSBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJFNlbGYtPntEQk9iamVjdH07CgogICAgIyBBc3NlbWJsZSB0aGUgY29uZGl0aW9ucyB1c2VkIGluIHRoZSBXSEVSRSBjbGF1c2UuCiAgICBteSBAU1FMV2hlcmU7CgogICAgZm9yIG15ICRGaWVsZCAoQFNjYWxhclNlYXJjaEZpZWxkcykgewoKICAgICAgICAjIFNlYXJjaCBmb3Igc2NhbGFyIGZpZWxkcyAod2lsZGNhcmRzIGFyZSBhbGxvd2VkKS4KICAgICAgICBpZiAoICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICMgR2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkuCiAgICAgICAgICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0sICdMaWtlJyApOwoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICAgICAgICAgICMgSWYgdGhlIGZpZWxkIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmx5ICclJy4KICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gIX4gbXsgXEEgJSogXHogfXhtcyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgICAgICJMT1dFUigkRmllbGQtPntEYXRhYmFzZUZpZWxkfSkgTElLRSBMT1dFUignJFBhcmFteyAkRmllbGQtPntOYW1lfSB9JykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZHluYW1pYyBmaWVsZCBoYW5kbGluZwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICBteSAkU1FMRHluYW1pY0ZpZWxkRnJvbSAgICAgPSAnJzsKICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZSAgICA9ICcnOwogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyID0gMTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9ICkgewoKICAgICAgICBteSAkU2VhcmNoUGFyYW0gPSAkUGFyYW17ICJEeW5hbWljRmllbGRfIiAuICREeW5hbWljRmllbGQtPntOYW1lfSB9OwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoIHJlZiAkU2VhcmNoUGFyYW0gbmUgJ0hBU0gnICk7CgogICAgICAgIG15ICROZWVkSm9pbjsKCiAgICAgICAgZm9yIG15ICRPcGVyYXRvciAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbX0gKSB7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyc7CiAgICAgICAgICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgQU5EICgnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyAoJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBURVhUOgogICAgICAgICAgICBmb3IgbXkgJFRleHQgKEBTZWFyY2hQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0IGVxICcnICk7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAnKicuCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0gfHwgMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsaWRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB2YWx1ZSAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkVGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyBvbiBmaWVsZCAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVGFibGVBbGlhcyAgICAgICAgID0+ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybSAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnKSAnOwoKICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgLj0gJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkRnJvbSAuPSAiCiAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGRmX29ial9pZF9uYW1lLm9iamVjdF9pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIKICAgICAgICAgICAgICAgIC4gJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKQogICAgICAgICAgICAiOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgRXhlY3V0ZSBhIGR5bmFtaWMgZmllbGQgc2VhcmNoLCBpZiBhIGR5bmFtaWMgZmllbGQgd2hlcmUgc3RhdGVtZW50IGV4aXN0cy4KICAgIGlmICggJFNRTER5bmFtaWNGaWVsZEZyb20gJiYgJFNRTER5bmFtaWNGaWVsZFdoZXJlICkgewoKICAgICAgICBteSBARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHM7CgogICAgICAgICMgU3FsIHVlcnkgZm9yIHRoZSBkeW5hbWljIGZpZWxkcy4KICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkID0gIlNFTEVDVCBESVNUSU5DVChkZl9vYmpfaWRfbmFtZS5vYmplY3RfbmFtZSkgRlJPTSBkeW5hbWljX2ZpZWxkX29ial9pZF9uYW1lIGRmX29ial9pZF9uYW1lICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkRnJvbQogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKCiAgICAgICAgbXkgJFVzZWRDYWNoZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMgPSBAeyREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGF9OwoKICAgICAgICAgICAgICAgICAgICAjIFNldCB0aGUgdXNlZCBjYWNoZSBmbGFnLgogICAgICAgICAgICAgICAgICAgICRVc2VkQ2FjaGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBkYXRhIG9ubHkgZnJvbSBkYXRhYmFzZSwgaWYgbm8gY2FjaGUgZW50cnkgZXhpc3RzLgogICAgICAgIGlmICggISRVc2VkQ2FjaGUgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRDdXN0b21lcklEcywgJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBEeW5hbWljRmllbGRDdXN0b21lcklEcywKICAgICAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFkZCB0aGUgdXNlciBsb2dpbnMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZHMsIGlmIGEgc2VhcmNoIHJlc3VsdCBleGlzdHMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZCBzZWFyY2gKICAgICAgICAjICAgb3Igc2tpcCB0aGUgc2VhcmNoIGFuZCByZXR1cm4gYSBlbXB0cnkgYXJyYXkgcmVmIChvciB6ZXJvIGZvciB0aGUgcmVzdWx0ICdDT1VOVCcsIGlmIG5vIHVzZXIgbG9naW5zIGV4aXN0cwogICAgICAgICMgICBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaC4KICAgICAgICBpZiAoQER5bmFtaWNGaWVsZEN1c3RvbWVySURzKSB7CgogICAgICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlcyAgID0+IFxARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRSZXN1bHQgZXEgJ0NPVU5UJyA/IDAgOiBbXTsKICAgICAgICB9CiAgICB9CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH07CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICA9PiAkRmllbGQtPntEYXRhYmFzZUZpZWxkfSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFteyAkRmllbGQtPntOYW1lfSB9LAogICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAkU1FMUXVlcnlJbkNvbmRpdGlvbjsKICAgIH0KCiAgICAjIEFkZCB0aGUgdmFsaWQgb3B0aW9uIGlmIG5lZWRlZC4KICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJWYWxpZH0gJiYgJFZhbGlkICkgewoKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICIkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lclZhbGlkfSBJTiAoIiAuIGpvaW4oICcsICcsICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKSApIC4gIikgIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnkgY29udGFpbnMgb25seSB1bmlxdWUgdmFsaWQgdmFsdWVzLgogICAgbXkgJU9yZGVyQnlTZWVuOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIGlmICggISRPcmRlckJ5IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeSBjb250YWlucyBpbnZhbGlkIHZhbHVlICckT3JkZXJCeScgIgogICAgICAgICAgICAgICAgICAgIC4gJ29yIHRoZSB2YWx1ZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgUmVtZW1iZXIgdGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0IGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UuCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBDaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicuCiAgICBESVJFQ1RJT046CiAgICBmb3IgbXkgJERpcmVjdGlvbiAoIEB7ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAjIE9ubHkgJ1VwJyBvciAnRG93bicgYWxsb3dlZC4KICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQnVpbGQgdGhlIHNxbCBzdGF0ZW1lbnQgZm9yIHRoZSBzZWFyY2guCiAgICBteSAkU1FMID0gIlNFTEVDVCBESVNUSU5DVCgkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0pIjsKCiAgICAjIE1vZGlmeSBTUUwgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRTUUwgPSAiU0VMRUNUIENPVU5UKERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSkpIjsKICAgIH0KCiAgICBteSBAU1FMT3JkZXJCeTsKCiAgICAjIFRoZSBPcmRlciBieSBjbGF1c2UgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHJlc3VsdCB0eXBlICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgbmUgJ0NPVU5UJyApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKCiAgICAgICAgT1JERVJCWToKICAgICAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgICAgICMgU2V0IHRoZSBkZWZhdWx0IG9yZGVyIGRpcmVjdGlvbi4KICAgICAgICAgICAgbXkgJERpcmVjdGlvbiA9ICdERVNDJzsKCiAgICAgICAgICAgICMgQWRkIHRoZSBnaXZlbiBvcmRlciBkaXJlY3Rpb24uCiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnQVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdERVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENvdW50Kys7CgogICAgICAgICAgICBuZXh0IE9SREVSQlkgaWYgISRPcmRlckJ5VGFibGV7JE9yZGVyQnl9OwoKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7JE9yZGVyQnl9ICREaXJlY3Rpb24iOwoKICAgICAgICAgICAgbmV4dCBPUkRFUkJZIGlmICRPcmRlckJ5IGVxICdDdXN0b21lcklEJzsKCiAgICAgICAgICAgICRTUUwgLj0gIiwgJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0iOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAgICAgIyAgIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkLgogICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAnQ3VzdG9tZXJJRCcgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0gREVTQyI7CiAgICAgICAgfQogICAgfQoKICAgICMgQWRkIGZvcm0gdG8gdGhlIFNRTCBhZnRlciB0aGUgb3JkZXIgYnkgY3JlYXRpb24uCiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSAiOwoKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICBteSAkU1FMV2hlcmVTdHJpbmcgPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxXaGVyZTsKICAgICAgICAkU1FMIC49ICJXSEVSRSAkU1FMV2hlcmVTdHJpbmcgIjsKICAgIH0KCiAgICBpZiAoQFNRTE9yZGVyQnkpIHsKICAgICAgICBteSAkT3JkZXJCeVN0cmluZyA9IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAiT1JERVIgQlkgJE9yZGVyQnlTdHJpbmciOwogICAgfQoKICAgICMgQ2hlY2sgaWYgYSBjYWNoZSBleGlzdHMgYmVmb3JlIHdlIGFzayB0aGUgZGF0YWJhc2UuCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICBteSAkQ2FjaGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgIEtleSAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZURhdGEgKSB7CiAgICAgICAgICAgIGlmICggcmVmICRDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRDYWNoZURhdGEgZXEgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIEhhbmRsZSB0aGUgZGlmZnJlbnQgcmVzdWx0IHR5cGVzLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRJRHNbMF0sCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkSURzWzBdOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQElEcywKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9CgpzdWIgQ3VzdG9tZXJDb21wYW55R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskRGF0YX0gaWYgcmVmICREYXRhIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGJ1aWxkIHNlbGVjdAogICAgbXkgQEZpZWxkczsKICAgIG15ICVGaWVsZHNNYXA7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgIHB1c2ggQEZpZWxkcywgJEVudHJ5LT5bMl07CiAgICAgICAgJEZpZWxkc01hcHsgJEVudHJ5LT5bMl0gfSA9ICRFbnRyeS0+WzBdOwogICAgfQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgJyAuIGpvaW4oICcsICcsIEBGaWVsZHMgKTsKCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAiLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IjsKICAgIH0KCiAgICAjIHRoaXMgc2VlbXMgdG8gYmUgbGVnYWN5LCBpZiBOYW1lIGlzIHBhc3NlZCBpdCBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgQ3VzdG9tZXJJRAogICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW17TmFtZX0gfHwgJFBhcmFte0N1c3RvbWVySUR9OwoKICAgICRTUUwgLj0gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9IFdIRVJFICI7CgogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSA9IExPV0VSKCA/ICkiOwogICAgfQoKICAgICMgZ2V0IGluaXRpYWwgZGF0YQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkQ3VzdG9tZXJJRCBdCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkTWFwQ291bnRlciA9IDA7CgogICAgICAgIGZvciBteSAkRmllbGQgKEBGaWVsZHMpIHsKICAgICAgICAgICAgJERhdGF7ICRGaWVsZHNNYXB7JEZpZWxkfSB9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBuZXh0IFJPVyBpZiAkU2VsZi0+e0ZvcmVpZ25EQn07CgogICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpKSB7CiAgICAgICAgICAgICREYXRheyRLZXl9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICAgICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJldHVybiBkYXRhCiAgICByZXR1cm4gKCVEYXRhKTsKfQoKc3ViIEN1c3RvbWVyQ29tcGFueUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lckNvbXBhbnkgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBGaWVsZHM7CiAgICBteSBAUGxhY2Vob2xkZXJzOwogICAgbXkgQFZhbHVlczsKCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgICMgaWdub3JlIGR5bmFtaWMgZmllbGRzIGhlcmUKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgcHVzaCBARmllbGRzLCAgICAgICAkRW50cnktPlsyXTsKICAgICAgICBwdXNoIEBQbGFjZWhvbGRlcnMsICc/JzsKICAgICAgICBwdXNoIEBWYWx1ZXMsICAgICAgIFwkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICB9CiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgcHVzaCBARmllbGRzLCAgICAgICBxdyhjcmVhdGVfdGltZSBjcmVhdGVfYnkgY2hhbmdlX3RpbWUgY2hhbmdlX2J5KTsKICAgICAgICBwdXNoIEBQbGFjZWhvbGRlcnMsIHF3KGN1cnJlbnRfdGltZXN0YW1wID8gY3VycmVudF90aW1lc3RhbXAgPyk7CiAgICAgICAgcHVzaCBAVmFsdWVzLCAoIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9ICk7CiAgICB9CgogICAgIyBidWlsZCBpbnNlcnQKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0gKCI7CiAgICAkU1FMIC49IGpvaW4oICcsICcsIEBGaWVsZHMgKSAuICIgKSBWQUxVRVMgKCAiIC4gam9pbiggJywgJywgQFBsYWNlaG9sZGVycyApIC4gIiApIjsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQFZhbHVlcywKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgIkN1c3RvbWVyQ29tcGFueTogJyRQYXJhbXtDdXN0b21lckNvbXBhbnlOYW1lfS8kUGFyYW17Q3VzdG9tZXJJRH0nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgJFNlbGYtPl9DdXN0b21lckNvbXBhbnlDYWNoZUNsZWFyKCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lcklEfSApOwoKICAgIHJldHVybiAkUGFyYW17Q3VzdG9tZXJJRH07Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBGSUVMRDoKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkUGFyYW17ICRFbnRyeS0+WzBdIH07ICAgICAgICAgICAgICMgd29ycnkgb25seSBhYm91dCBlbXB0eSBmaWVsZHMsICcwJyBpcyBjb25zaWRlcmVkIGFzIGJlaW5nIGVtcHR5CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7ICAgICMgZG8gbm90IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZHluYW1pYyBmaWVsZHMKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRW50cnktPls0XTsgICAgICAgICAgICAgICAgICAgICAgIyBjb21wbGFpbiBvbmx5IGFib3V0IG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPlswXSBlcSAnVXNlclBhc3N3b3JkJzsgICAgICMgZG8gbm90IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgcGFzc3dvcmQgZmllbGQKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRFbnRyeS0+WzBdISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDb2xsZWN0IHRoZSBpbmZvIG5lZWRlZCBmb3IgdGhlIFNRTCBVUERBVEUgc3RhdGVtZW50CiAgICAjIFRoZSByZWFkb25seSBmbGFnIGlzIG5vdCBob25vcmVkIGhlcmUuCiAgICBteSAoIEBGaWVsZHMsIEBWYWx1ZXMgKTsKICAgIEZJRUxEOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICRFbnRyeS0+WzBdID1+IG0vXlVzZXJQYXNzd29yZCQvaTsgICAgIyBza2lwIHRoZSBwYXNzd29yZCBmaWVsZAogICAgICAgIG5leHQgRklFTEQgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAjIHNraXAgZHluYW1pYyBmaWVsZHMKICAgICAgICBwdXNoIEBGaWVsZHMsICRFbnRyeS0+WzJdIC4gJyA9ID8nOwogICAgICAgIHB1c2ggQFZhbHVlcywgXCRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgIH0KICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICBwdXNoIEBGaWVsZHMsICggJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAnLCAnY2hhbmdlX2J5ID0gPycgKTsKICAgICAgICBwdXNoIEBWYWx1ZXMsIFwkUGFyYW17VXNlcklEfTsKICAgIH0KCiAgICAjIGNyZWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gIlVQREFURSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSBTRVQgIjsKICAgICRTUUwgLj0gam9pbiggJywgJywgQEZpZWxkcyApOwoKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIgV0hFUkUgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICIgV0hFUkUgTE9XRVIoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSA9IExPV0VSKCA/ICkiOwogICAgfQogICAgcHVzaCBAVmFsdWVzLCBcJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfTsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQFZhbHVlcywKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgIkN1c3RvbWVyQ29tcGFueTogJyRQYXJhbXtDdXN0b21lckNvbXBhbnlOYW1lfS8kUGFyYW17Q3VzdG9tZXJJRH0nIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgJFNlbGYtPl9DdXN0b21lckNvbXBhbnlDYWNoZUNsZWFyKCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lcklEfSApOwogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9IG5lICRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkU2VsZi0+X0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIoIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q2FjaGVPYmplY3R9OwoKICAgIGlmICggISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggY2FjaGUgZW50cmllcwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueUxpc3QnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uIChxdyhDdXN0b21lckNvbXBhbnlMaXN0KSkgewogICAgICAgIGZvciBteSAkVmFsaWQgKCAwIC4uIDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gIiR7RnVuY3Rpb259Ojoke1ZhbGlkfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGlzY29ubmVjdCBpZiBpdCdzIG5vdCBhIHBhcmVudCBEQk9iamVjdAogICAgaWYgKCAkU2VsZi0+e05vdFBhcmVudERCT2JqZWN0fSApIHsKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RGlzY29ubmVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/CustomerUser/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAyNDY0OTA3N2NkZjQwMTAxYzM3NTI3ZTljZmE1OTIwYjk2ZjhhOWI2IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOjpEQjsKCnVzZSB2NS4yNjsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgbmFtZXNwYWNlOjphdXRvY2xlYW47CnVzZSB1dGY4OwoKIyBjb3JlIG1vZHVsZXMKdXNlIERpZ2VzdDo6U0hBICgpOwoKIyBDUEFOIG1vZHVsZXMKdXNlIENyeXB0OjpQYXNzd2RNRDUgcXcoYXBhY2hlX21kNV9jcnlwdCB1bml4X21kNV9jcnlwdCk7CgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6TGFuZ3VhZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiMgRU8gUm90aGVyIE9TUwogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZU9iamVjdE5hbWUnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgZm9yIG15ICROZWVkZWQgKHF3KCBQcmVmZXJlbmNlc09iamVjdCBDdXN0b21lclVzZXJNYXAgKSkgewogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH0gfHwgZGllICJHb3Qgbm8gJE5lZWRlZCEiOwogICAgfQoKICAgICMgbWF4IHNob3duIHVzZXIgcGVyIHNlYXJjaCBsaXN0CiAgICAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoTGlzdExpbWl0fSB8fCAyNTA7CgogICAgIyBjb25maWcgb3B0aW9ucwogICAgJFNlbGYtPntDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntUYWJsZX0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPlRhYmxlIGluIEtlcm5lbC9Db25maWcucG0hIjsKICAgICRTZWxmLT57Q3VzdG9tZXJLZXl9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJLZXl9CiAgICAgICAgfHwgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57S2V5fQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVyS2V5IGluIEtlcm5lbC9Db25maWcucG0hIjsKICAgICRTZWxmLT57Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lcklEfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVySUQgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntSZWFkT25seX0gICAgICAgICAgICAgICAgID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UmVhZE9ubHl9OwogICAgJFNlbGYtPntFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyRXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSB8fCAwOwogICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ICAgICAgICAgICAgID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoUHJlZml4fTsKCiAgICBpZiAoICFkZWZpbmVkICRTZWxmLT57U2VhcmNoUHJlZml4fSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gPSAnJzsKICAgIH0KICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaFN1ZmZpeH07CiAgICBpZiAoICFkZWZpbmVkICRTZWxmLT57U2VhcmNoU3VmZml4fSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gPSAnKic7CiAgICB9CgogICAgIyBjaGVjayBpZiBDdXN0b21lcktleSBpcyB2YXIgb3IgaW50CiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyAmJiAkRW50cnktPls1XSA9fiAvXmludCQvaSApIHsKICAgICAgICAgICAgJFNlbGYtPntDdXN0b21lcktleUludGVnZXJ9ID0gMTsKICAgICAgICAgICAgbGFzdCBFTlRSWTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgY2FjaGUgdHlwZQogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0N1c3RvbWVyVXNlcicgLiAkUGFyYW17Q291bnR9OwoKICAgICMgY3JlYXRlIGNhY2hlIG9iamVjdCwgYnV0IG9ubHkgaWYgQ2FjaGVUVEwgaXMgc2V0IGluIGN1c3RvbWVyIGNvbmZpZwogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgZGIgY29ubmVjdCBpZiBEU04gaXMgZ2l2ZW4KICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0RTTn0gKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICAgICAgRGF0YWJhc2VEU04gID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntEU059LAogICAgICAgICAgICBEYXRhYmFzZVVzZXIgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1VzZXJ9LAogICAgICAgICAgICBEYXRhYmFzZVB3ICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1Bhc3N3b3JkfSwKICAgICAgICAgICAgJXsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfSB9LAogICAgICAgICAgICBEaXNjb25uZWN0T25EZXN0cnVjdGlvbiA9PiAxLAogICAgICAgICkgfHwgZGllKCdDYW5cJ3QgY29ubmVjdCB0byBkYXRhYmFzZSEnKTsKCiAgICAgICAgIyByZW1lbWJlciB0aGF0IHdlIGhhdmUgdGhlIERCT2JqZWN0IG5vdCBmcm9tIHBhcmVudCBjYWxsCiAgICAgICAgJFNlbGYtPntOb3RQYXJlbnREQk9iamVjdH0gPSAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIH0KCiAgICAjIHRoaXMgc2V0dGluZyBzcGVjaWZpZXMgaWYgdGhlIHRhYmxlIGhhcyB0aGUgY3JlYXRlX3RpbWUsCiAgICAjIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUgYW5kIGNoYW5nZV9ieSBmaWVsZHMgb2YgT1RPQk8KICAgICRTZWxmLT57Rm9yZWlnbkRCfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntGb3JlaWduREJ9ID8gMSA6IDA7CgogICAgIyBkZWZpbmVzIGlmIHRoZSBkYXRhYmFzZSBzZWFyY2ggd2lsbCBiZSBwZXJmb3JtZW5kIGNhc2Ugc2Vuc2l0aXZlICgxKSBvciBub3QgKDApCiAgICAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1NlYXJjaENhc2VTZW5zaXRpdmV9CiAgICAgICAgLy8gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Nhc2VTZW5zaXRpdmV9IHx8IDA7CgogICAgIyBmZXRjaCBuYW1lcyBvZiBjb25maWd1cmVkIGR5bmFtaWMgZmllbGRzCiAgICBteSBARHluYW1pY0ZpZWxkTWFwRW50cmllcyA9IGdyZXAgeyAkXy0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyB9IEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfTsKICAgICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfSA9IHsgbWFwIHsgJF8tPlsyXSA9PiAxIH0gQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgfTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICBteSAkTGF5b3V0UGFyYW0gPSAkS2VybmVsOjpPTS0+e1BhcmFtfS0+eydLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0J307CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIENoZWNrIGlmIG11bHRpdGVuYW5jeSBpcyBlbmFibGVkIGFuZCB0aGUgcmVxdWVzdCBpcyBjb21pbmcgZnJvbSBhIHVzZXIuCiAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSAmJiAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gZXEgJ1VzZXInICYmICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CgogICAgICAgICMgU2F2ZSB0aGUgVXNlcklEIGFuZCBhbGwgZ3JvdXBzIHRoZSB1c2VyIGhhcyAncm8nIHBlcm1pc3Npb24gb24uCiAgICAgICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VySUR9ICkgewogICAgICAgICAgICAjIE9ubHkgZ2V0IHRoZSBncm91cCBsaXN0IG9uY2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgICAgICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJExheW91dFBhcmFtLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBUaGUgbGltaXQgZG9lcyBub3QgY291bnQgZm9yIG1lbWJlcnMgb2YgYSBzcGVjaWZpYyBncm91cC4KICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25Hcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSB8fCAnJzsKICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgICA9IHJldmVyc2UgJUdyb3VwczsKCiAgICAgICAgICAgIGlmICggISRHcm91cHNSZXZlcnNleyRQZXJtaXNzaW9uR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3l9ID0gJExheW91dFBhcmFtLT57VXNlcklEfTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3VwSURzfSA9IFsgc29ydCBrZXlzICVHcm91cHMgXTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3Vwc30gICA9IFsgdmFsdWVzICVHcm91cHMgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEN1c3RvbWVyTmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlckxvZ2luIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lck5hbWU6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTmFtZSBpZiBkZWZpbmVkICROYW1lOwogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJOYW1lRmllbGRzID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTmFtZUZpZWxkc307CiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpICkgewogICAgICAgICRDdXN0b21lclVzZXJOYW1lRmllbGRzID0gWyAnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCBdOwogICAgfQoKICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJOYW1lRmllbGRzCiAgICAjIGFzIHRoZXkgY2Fubm90IGJlIGhhbmRsZWQgaGVyZQogICAgbXkgQEN1c3RvbWVyVXNlck5hbWVGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyA9IGdyZXAgeyAhZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlck5hbWVGaWVsZHN9OwoKICAgICMgYnVpbGQgU1FMIHN0cmluZyAxLzIKICAgIG15ICRTUUwgPSAiU0VMRUNUICI7CgogICAgJFNRTCAuPSBqb2luKCAiLCAiLCBAQ3VzdG9tZXJVc2VyTmFtZUZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzICk7CiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9IFdIRVJFICI7CgogICAgIyBjaGVjayBDdXN0b21lcktleSB0eXBlCiAgICBteSAkVXNlckxvZ2luID0gJFBhcmFte1VzZXJMb2dpbn07CiAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcktleX0gPSA/IjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gIkxPV0VSKCRTZWxmLT57Q3VzdG9tZXJLZXl9KSA9IExPV0VSKD8pIjsKICAgIH0KCiAgICBteSAlTmFtZVBhcnRzOwoKICAgICMgZ2V0IGRhdGEgZnJvbSBjdXN0b21lciB1c2VyIHRhYmxlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VzZXJMb2dpbn0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkRmllbGRDb3VudGVyID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoQFJvdykgewogICAgICAgICAgICAkTmFtZVBhcnRzeyAkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzWyRGaWVsZENvdW50ZXJdIH0gPSAkRmllbGQ7CiAgICAgICAgICAgICRGaWVsZENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgbXkgQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlck5hbWVGaWVsZHN9OwogICAgaWYgKEBEeW5hbWljRmllbGRDdXN0b21lclVzZXJOYW1lRmllbGRzKSB7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIERZTkFNSUNGSUVMRE5BTUU6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRWYWx1ZSkgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSBbJFZhbHVlXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQFJlbmRlcmVkVmFsdWVzOwoKICAgICAgICAgICAgVkFMVUU6CiAgICAgICAgICAgIGZvciBteSAkQ3VycmVudFZhbHVlICggQHskVmFsdWV9ICkgewogICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhZGVmaW5lZCAkQ3VycmVudFZhbHVlIHx8ICFsZW5ndGggJEN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgICAgICBteSAkUmVuZGVyZWRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkQ3VycmVudFZhbHVlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkUmVuZGVyZWRWYWx1ZSkgfHwgIWRlZmluZWQgJFJlbmRlcmVkVmFsdWUtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgcHVzaCBAUmVuZGVyZWRWYWx1ZXMsICRSZW5kZXJlZFZhbHVlLT57VmFsdWV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTmFtZVBhcnRzeyREeW5hbWljRmllbGROYW1lfSA9IGpvaW4gJyAnLCBAUmVuZGVyZWRWYWx1ZXM7CiAgICAgICAgfQogICAgfQoKICAgICMgYXNzZW1ibGUgbmFtZQogICAgbXkgQE5hbWVQYXJ0czsKICAgIENVU1RPTUVSVVNFUk5BTUVGSUVMRDoKICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkICggQHskQ3VzdG9tZXJVc2VyTmFtZUZpZWxkc30gKSB7CiAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJOQU1FRklFTEQKICAgICAgICAgICAgaWYgIWV4aXN0cyAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFkZWZpbmVkICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH0KICAgICAgICAgICAgfHwgIWxlbmd0aCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9OwogICAgICAgIHB1c2ggQE5hbWVQYXJ0cywgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgIH0KCiAgICBteSAkSm9pbkNoYXJhY3RlciA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHNKb2lufSAvLyAnICc7CiAgICBteSAkTmFtZSAgICAgICAgICA9IGpvaW4gJEpvaW5DaGFyYWN0ZXIsIEBOYW1lUGFydHM7CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gIkN1c3RvbWVyTmFtZTo6JFBhcmFte1VzZXJMb2dpbn0iLAogICAgICAgICAgICBWYWx1ZSA9PiAkTmFtZSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJE5hbWU7Cn0KCnN1YiBDdXN0b21lclNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVVc2VyczsKICAgIG15ICRWYWxpZCA9ICRQYXJhbXtWYWxpZH0gLy8gMTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKAogICAgICAgICEkUGFyYW17U2VhcmNofQogICAgICAgICYmICEkUGFyYW17VXNlckxvZ2lufQogICAgICAgICYmICEkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0KICAgICAgICAmJiAhJFBhcmFte0N1c3RvbWVySUR9CiAgICAgICAgJiYgISRQYXJhbXtDdXN0b21lcklEUmF3fQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2VhcmNoLCBVc2VyTG9naW4sIFBvc3RNYXN0ZXJTZWFyY2gsIEN1c3RvbWVySURSYXcgb3IgQ3VzdG9tZXJJRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSBqb2luICc6OicsIG1hcCB7ICRfIC4gJz0nIC4gJFBhcmFteyRffSB9IHNvcnQga2V5cyAlUGFyYW07CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIFVzZSBjYWNoZSBmb3IgbXVsdGl0ZW5hbmN5LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JFVzZXJzfSBpZiByZWYgJFVzZXJzIGVxICdIQVNIJzsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRDdXN0b21lclVzZXJMaXN0RmllbGRzKSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyA9IFsgJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2VtYWlsJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKCiAgICAjIGJ1aWxkIFNRTCBzdHJpbmcgMS8yCiAgICBteSAkU1FMID0gIlNFTEVDVCAkU2VsZi0+e0N1c3RvbWVyS2V5fSAiOwogICAgbXkgQEJpbmQ7CiAgICAkU1FMIC49ICcsICcgLiAoIGpvaW4gJywgJywgQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyApOwoKICAgICMgZ2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkKICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJFNlbGYtPntEQk9iamVjdH0tPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICAjIGJ1aWxkIFNRTCBzdHJpbmcgMi8yCiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9IFdIRVJFICI7CiAgICBpZiAoICRQYXJhbXtTZWFyY2h9ICkgewogICAgICAgIGlmICggISRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIk5lZWQgQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzIGluIEN1c3RvbWVyVXNlciBjb25maWcsIHVuYWJsZSB0byBzZWFyY2ggZm9yICckUGFyYW17U2VhcmNofSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFNlYXJjaCA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeVN0cmluZ0VzY2FwZSggUXVlcnlTdHJpbmcgPT4gJFBhcmFte1NlYXJjaH0gKTsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcwogICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICBteSBAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJPbmx5fSApIHsKICAgICAgICAgICAgQEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAkXyBuZSAnY3VzdG9tZXJfaWQnIH0gQEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkczsKICAgICAgICB9CgogICAgICAgIG15ICVRdWVyeUNvbmRpdGlvbiA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiBcQEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcywgICAgIyRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc30sCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJFNlYXJjaCwKICAgICAgICAgICAgU2VhcmNoUHJlZml4ICA9PiAkU2VsZi0+e1NlYXJjaFByZWZpeH0sCiAgICAgICAgICAgIFNlYXJjaFN1ZmZpeCAgPT4gJFNlbGYtPntTZWFyY2hTdWZmaXh9LAogICAgICAgICAgICBDYXNlU2Vuc2l0aXZlID0+ICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0sCiAgICAgICAgICAgIEJpbmRNb2RlICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU1FMIC49ICRRdWVyeUNvbmRpdGlvbntTUUx9OwogICAgICAgIHB1c2ggQEJpbmQsIEB7ICRRdWVyeUNvbmRpdGlvbntWYWx1ZXN9IH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgRG9uJ3Qgc2VhcmNoIGZvciBjdXN0b21lciB1c2VycyB3aXRob3V0IGdyb3VwIHBlcm1pc3Npb24uCiAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0gKSB7CiAgICAgICAgICAgICAgICAjIFRPRE86IFdvcmthcm91bmQgdW50aWwgdGhlIHNlYXJjaCBnZXRzIGNoYW5nZWQuCiAgICAgICAgICAgICAgICAkUGFyYW17TGltaXR9ID0gMTAwMDAwOwogICAgICAgICAgICAgICAgIyBOb3JtYWxseSwgd2Ugc2hvdWxkIGlubmVyIGpvaW4gYWxsIGN1c3RvbWVyIGNvbXBhbmllcyB0byBzZWUgaWYgdGhlIGFnZW50IGhhcyBwZXJtaXNzaW9uIHRvIHNlZSB0aGUgY3VzdG9tZXIgKGN1cnJlbnRseSB3b3JraW5nKSBvciB0aGUgY3VzdG9tZXIgY29tcGFueSAoaXRlcmF0ZSB0aHJvdWdoIGFsbCBEQiBiYWNrLWVuZHMpLgogICAgICAgICAgICAgICAgIyBJZiB0aGUgYWdlbnQgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIG9uIHRoZSBjdXN0b21lciBjb21wYW55IGJ1dCB0aGUgY3VzdG9tZXIgdXNlciwgdGhlIHF1ZXJ5IHNob3VsZG4ndCByZXR1cm4gdGhlIGN1c3RvbWVyIHVzZXIuCiAgICAgICAgICAgICAgICAjIEN1cnJlbnRseSwgd2UgYXJlIGxvb2tpbmcgZm9yIGV2ZXJ5dGhpbmcgYW5kIGZpbHRlcmluZyB0aGUgcmVzdWx0LCB3aGljaCBpcyBub3Qgb3B0aW1hbC4gVGhlIHJlYWwgbGltaXQgc2hvdWxkIHN0aWxsIGJlIGFwcGxpZWQgaW4gdGhlIFN5c3RlbS9DdXN0b21lclVzZXIucG0uCiAgICAgICAgICAgICAgICAjIFRoZSBzYW1lIGFwcGxpZXMgZm9yIHRoZSBDdXN0b21lclVzZXIvTERBUC5wbQogICAgICAgICAgICAgICAgIyBTRUxFQ1QgKiBGUk9NIGN1c3RvbWVyX3VzZXIgY3UKICAgICAgICAgICAgICAgICMgSk9JTiBjdXN0b21lcl9jb21wYW55IGNwIE9OIGN1LmN1c3RvbWVyX2lkID0gY3AuY3VzdG9tZXJfaWQKICAgICAgICAgICAgICAgICMgV0hFUkUgKChjcC5ncm91cF9pZCBJTiAoMSkgT1IgY3AuZ3JvdXBfaWQgSVMgTlVMTCBPUiBjcC5ncm91cF9pZCA9ICcnKQogICAgICAgICAgICAgICAgIyAgICAgQU5EIChjdS5ncm91cF9pZCBJUyBOVUxMIE9SIGN1Lmdyb3VwX2lkID0gJycpKQogICAgICAgICAgICAgICAgIyBPUiAoY3UuZ3JvdXBfaWQgSU4gKDEpKQogICAgICAgICAgICAgICAgIyBVTklPTgogICAgICAgICAgICAgICAgIyBTRUxFQ1QgKiBGUk9NIGN1c3RvbWVyX3VzZXIgY3UKICAgICAgICAgICAgICAgICMgSk9JTiBjdXN0b21lcl9jb21wYW55XzIgY3AgT04gY3UuY3VzdG9tZXJfaWQgPSBjcC5jdXN0b21lcl9pZAogICAgICAgICAgICAgICAgIyBXSEVSRSAoKGNwLmdyb3VwX2lkIElOICgxKSBPUiBjcC5ncm91cF9pZCBJUyBOVUxMIE9SIGNwLmdyb3VwX2lkID0gJycpCiAgICAgICAgICAgICAgICAjICAgICBBTkQgKGN1Lmdyb3VwX2lkIElTIE5VTEwgT1IgY3UuZ3JvdXBfaWQgPSAnJykpCiAgICAgICAgICAgICAgICAjIE9SIChjdS5ncm91cF9pZCBJTiAoMSkpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IHRoZSBjb2x1bW4gbmFtZSB3aGVyZSB0aGUgZ3JvdXAgSUQgaXMgc3RvcmVkLgogICAgICAgICAgICBteSAkR3JvdXBJRENvbDsKICAgICAgICAgICAgZm9yIG15ICRNYXAgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRNYXAtPlswXSBlcSAnVXNlckdyb3VwSUQnICkgewogICAgICAgICAgICAgICAgICAgICRHcm91cElEQ29sID0gJE1hcC0+WzJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFRoZSBzb3VyY2Ugc3VwcG9ydHMgbXVsdGl0ZW5hbmN5LgogICAgICAgICAgICBpZiAoJEdyb3VwSURDb2wpIHsKICAgICAgICAgICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBtYXRjaCBmb3IgZ3JvdXAgSURzIG9yIGdyb3VwIG5hbWVzLgogICAgICAgICAgICAgICAgbXkgQFVzZXJHcm91cHMgPSAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gPyBAeyAkU2VsZi0+e1VzZXJHcm91cHN9IH0gOiBAeyAkU2VsZi0+e1VzZXJHcm91cElEc30gfTsKCiAgICAgICAgICAgICAgICAjIFJlbWFwIGxvY2FsIGdyb3VwcyB0byByZW1vdGUgZ3JvdXBzLgogICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb2NhbEdyb3VwID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBAVXNlckdyb3VwcyA9IG1hcCB7ICRfIGVxICRMb2NhbEdyb3VwID8gJFJlbW90ZUdyb3VwIDogJF8gfSBAVXNlckdyb3VwczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkSW5Db25kaXRpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR3JvdXBJRENvbCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgICA9PiBcQFVzZXJHcm91cHMsCiAgICAgICAgICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBJZiB0aGUgZmllbGQgaXMgZW1wdHksIHdlIGhhdmUgYWNjZXNzIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgICAgICAkSW5Db25kaXRpb24gLj0gIiBPUiAoJEdyb3VwSURDb2wgSVMgTlVMTCBPUiAkR3JvdXBJRENvbCA9ICcnKSI7CiAgICAgICAgICAgICAgICAkU1FMIC49ICIgQU5EICgkSW5Db25kaXRpb24pIjsKICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICAgICAkU1FMIC49ICcgJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkc30gKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcwogICAgICAgICAgICAjIGFzIHRoZXkgY2Fubm90IGJlIHJldHJpZXZlZCBoZXJlCiAgICAgICAgICAgIG15IEBDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHN9IH07CgogICAgICAgICAgICBteSAkU1FMRXh0ID0gJyc7CgogICAgICAgICAgICAjIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcykgewogICAgICAgICAgICAgICAgaWYgKCRTUUxFeHQpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRQb3N0TWFzdGVyU2VhcmNoID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gKTsKICAgICAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkUG9zdE1hc3RlclNlYXJjaDsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTEV4dCAuPSAiICRGaWVsZCA9ID8gIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gIiBMT1dFUigkRmllbGQpID0gTE9XRVIoPykgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkU1FMIC49ICRTUUxFeHQ7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKCiAgICAgICAgbXkgJFVzZXJMb2dpbiA9ICRQYXJhbXtVc2VyTG9naW59OwoKICAgICAgICAjIGNoZWNrIEN1c3RvbWVyS2V5IHR5cGUKICAgICAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJLZXlJbnRlZ2VyfSApIHsKCiAgICAgICAgICAgICMgcmV0dXJuIGlmIGxvZ2luIGlzIG5vIGludGVnZXIKICAgICAgICAgICAgcmV0dXJuIGlmICRQYXJhbXtVc2VyTG9naW59ICF+IC9eKFwrfFwtfClcZHsxLDE2fSQvOwoKICAgICAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcktleX0gPSA/IjsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRVc2VyTG9naW47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVXNlckxvZ2luID0gJyUnIC4gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkVXNlckxvZ2luLCAnTGlrZScgKSAuICclJzsKICAgICAgICAgICAgJFVzZXJMb2dpbiA9fiBzL1wqLyUvZzsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRVc2VyTG9naW47CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAgICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJLZXl9IExJS0UgPyAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVyS2V5fSkgTElLRSBMT1dFUig/KSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtDdXN0b21lcklEfSApIHsKCiAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtDdXN0b21lcklEfSwgJ0xpa2UnICk7CiAgICAgICAgJEN1c3RvbWVySUQgPX4gcy9cKi8lL2c7CiAgICAgICAgcHVzaCBAQmluZCwgXCRDdXN0b21lcklEOwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJJRH0gTElLRSA/ICRMaWtlRXNjYXBlU3RyaW5nIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTUUwgLj0gIkxPV0VSKCRTZWxmLT57Q3VzdG9tZXJJRH0pIExJS0UgTE9XRVIoPykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVySURSYXd9ICkgewoKICAgICAgICAjIHRoZXJlIGlzIG5vICcqJyB3aWxkY2FyZCBleHBhbnNpb24gd2hlbiBzZWFyY2hpbmcgZm9yIEN1c3RvbWVySURSYXcKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0N1c3RvbWVySURSYXd9OwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJJRH0gPSA/ICI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVySUR9KSA9IExPV0VSKD8pICI7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHZhbGlkIG9wdGlvbgogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfSAmJiAkVmFsaWQgKSB7CgogICAgICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICAgICAkU1FMIC49ICcgQU5EICcKICAgICAgICAgICAgLiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfQogICAgICAgICAgICAuICcgSU4gKCcgLiBqb2luKCAnLCAnLCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKSAuICcpICc7CiAgICB9CgogICAgIyBkeW5hbWljIGZpZWxkIGhhbmRsaW5nCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CiAgICBteSAlRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfTsKCiAgICBteSBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwoKICAgICMgZ2V0IGRhdGEgZnJvbSBjdXN0b21lciB1c2VyIHRhYmxlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0gfHwgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICk7CgogICAgbXkgQEN1c3RvbWVyVXNlckRhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVyVXNlckRhdGEsIFtAUm93XTsKICAgIH0KCiAgICBDVVNUT01FUlVTRVJEQVRBOgogICAgZm9yIG15ICRDdXN0b21lclVzZXJEYXRhIChAQ3VzdG9tZXJVc2VyRGF0YSkgewogICAgICAgIG15ICRDdXN0b21lcktleSA9IHNoaWZ0IEB7JEN1c3RvbWVyVXNlckRhdGF9OwogICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSREFUQSBpZiAkVXNlcnN7JEN1c3RvbWVyS2V5fTsKCiAgICAgICAgbXkgJVVzZXJTdHJpbmdQYXJ0czsKCiAgICAgICAgbXkgJEZpZWxkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckRhdGF9ICkgewogICAgICAgICAgICAkVXNlclN0cmluZ1BhcnRzeyAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzWyRGaWVsZENvdW50ZXJdIH0gPSAkRmllbGQ7CiAgICAgICAgICAgICRGaWVsZENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgICAgICBpZiAoQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzKSB7CiAgICAgICAgICAgIERZTkFNSUNGSUVMRE5BTUU6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWV4aXN0cyAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX07CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSBbJFZhbHVlXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBAVmFsdWVzOwoKICAgICAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50VmFsdWUgKCBAeyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhZGVmaW5lZCAkQ3VycmVudFZhbHVlIHx8ICFsZW5ndGggJEN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlYWRhYmxlVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRDdXJyZW50VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlYWRhYmxlVmFsdWUpIHx8ICFkZWZpbmVkICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUG9zc2libGVWYWx1ZXMtPnsgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSA9ICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWx1ZXMsICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRVc2VyU3RyaW5nUGFydHN7JER5bmFtaWNGaWVsZE5hbWV9ID0gam9pbiAnICcsIEBWYWx1ZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXNzZW1ibGUgdXNlciBzdHJpbmcKICAgICAgICBteSBAVXNlclN0cmluZ1BhcnRzOwogICAgICAgIENVU1RPTUVSVVNFUkxJU1RGSUVMRDoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9ICkgewogICAgICAgICAgICBuZXh0IENVU1RPTUVSVVNFUkxJU1RGSUVMRAogICAgICAgICAgICAgICAgaWYgIWV4aXN0cyAkVXNlclN0cmluZ1BhcnRzeyRDdXN0b21lclVzZXJMaXN0RmllbGR9CiAgICAgICAgICAgICAgICB8fCAhZGVmaW5lZCAkVXNlclN0cmluZ1BhcnRzeyRDdXN0b21lclVzZXJMaXN0RmllbGR9CiAgICAgICAgICAgICAgICB8fCAhbGVuZ3RoICRVc2VyU3RyaW5nUGFydHN7JEN1c3RvbWVyVXNlckxpc3RGaWVsZH07CiAgICAgICAgICAgIHB1c2ggQFVzZXJTdHJpbmdQYXJ0cywgJFVzZXJTdHJpbmdQYXJ0c3skQ3VzdG9tZXJVc2VyTGlzdEZpZWxkfTsKICAgICAgICB9CgogICAgICAgICRVc2Vyc3skQ3VzdG9tZXJLZXl9ID0gam9pbiAnICcsIEBVc2VyU3RyaW5nUGFydHM7CiAgICAgICAgJFVzZXJzeyRDdXN0b21lcktleX0gPX4gcy9eKC4qKVxzKC4rP1xALis/XC4uKz8pKFxzfCkkLyIkMSIgPCQyPi87CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlVXNlcnMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICVVc2VyczsKfQoKc3ViIEN1c3RvbWVyU2VhcmNoRGV0YWlsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCByZWYgJFBhcmFte1NlYXJjaEZpZWxkc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlYXJjaEZpZWxkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgUmV0dXJuIG9ubHkgdmFsaWQgdXNlcnMgcGVyIGRlZmF1bHQKICAgIG15ICRWYWxpZCA9ICRQYXJhbXtWYWxpZH0gLy8gMTsKCiAgICAkUGFyYW17TGltaXR9IC8vPSAnJzsKCiAgICAjIFNwbGl0IHRoZSBzZWFyY2ggZmllbGRzIGluIHNjYWxhciBhbmQgYXJyYXkgZmllbGRzLCBiZWZvcmUgdGhlIGRpZmZyZW50IGhhbmRsaW5nLgogICAgbXkgQFNjYWxhclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAnSW5wdXQnIGVxICRfLT57VHlwZX0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwogICAgbXkgQEFycmF5U2VhcmNoRmllbGRzICA9IGdyZXAgeyAnU2VsZWN0aW9uJyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKCiAgICAjIFZlcmlmeSB0aGF0IGFsbCBwYXNzZWQgYXJyYXkgcGFyYW1ldGVycyBjb250YWluIGFuIGFycmF5cmVmLgogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50IChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSApIHsKICAgICAgICAgICAgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IHx8PSBbXTsKCiAgICAgICAgICAgIG5leHQgQVJHVU1FTlQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRBcmd1bWVudC0+e05hbWV9IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciB0aGUgcmV0dXJuIHR5cGUuCiAgICBteSAkUmVzdWx0ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKCiAgICAjIFNwZWNpYWwgaGFuZGxpbmcgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgIyBJZ25vcmUgdGhlIHBhcmFtZXRlciAnTGltaXQnIHdoZW4gcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17TGltaXR9ID0gJyc7CgogICAgICAgICMgRGVsZXRlIHRoZSBPcmRlckJ5IHBhcmFtZXRlciB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgICAgICRQYXJhbXtPcmRlckJ5fSA9IFtdOwogICAgfQoKICAgICMgRGVmaW5lIG9yZGVyIHRhYmxlIGZyb20gdGhlIHNlYXJjaCBmaWVsZHMuCiAgICBteSAlT3JkZXJCeVRhYmxlID0gbWFwIHsgJF8tPntOYW1lfSA9PiAkXy0+e0RhdGFiYXNlRmllbGR9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKCiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgbXkgJFNlbGVjdGlvbnNEYXRhID0gJEZpZWxkLT57U2VsZWN0aW9uc0RhdGF9OwoKICAgICAgICBmb3IgbXkgJFNlbGVjdGVkVmFsdWUgKCBAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfSApIHsKCiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHZhbHVlIGZvciB0aGUgY3VycmVudCBmaWVsZCBpcyB2YWxpZC4KICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGlvbnNEYXRhLT57JFNlbGVjdGVkVmFsdWV9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHNlbGVjdGVkIHZhbHVlICRGaWVsZC0+e05hbWV9IGlzIG5vdCB2YWxpZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkU2VsZi0+e0RCT2JqZWN0fTsKCiAgICAjIEFzc2VtYmxlIHRoZSBjb25kaXRpb25zIHVzZWQgaW4gdGhlIFdIRVJFIGNsYXVzZS4KICAgIG15IEBTUUxXaGVyZTsKCiAgICBmb3IgbXkgJEZpZWxkIChAU2NhbGFyU2VhcmNoRmllbGRzKSB7CgogICAgICAgICMgU2VhcmNoIGZvciBzY2FsYXIgZmllbGRzICh3aWxkY2FyZHMgYXJlIGFsbG93ZWQpLgogICAgICAgIGlmICggJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ICkgewoKICAgICAgICAgICAgIyBHZXQgbGlrZSBlc2NhcGUgc3RyaW5nIG5lZWRlZCBmb3Igc29tZSBkYXRhYmFzZXMgKGUuZy4gb3JhY2xlKS4KICAgICAgICAgICAgbXkgJExpa2VFc2NhcGVTdHJpbmcgPSAkREJPYmplY3QtPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICAgICAgICAgICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSwgJ0xpa2UnICk7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPX4gc3sgXCorIH17JX14bXNnOwoKICAgICAgICAgICAgIyBJZiB0aGUgZmllbGQgY29udGFpbnMgbW9yZSB0aGFuIG9ubHkgJS4KICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gIX4gbXsgXEEgJSogXHogfXhtcyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgICAgICJMT1dFUigkRmllbGQtPntEYXRhYmFzZUZpZWxkfSkgTElLRSBMT1dFUignJFBhcmFteyAkRmllbGQtPntOYW1lfSB9JykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBDaGVjayBhbGwgY29uZmlndXJlZCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMsIGJ1aWxkIGxvb2t1cCBoYXNoIGJ5IG5hbWUuCiAgICBteSAlQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkTmFtZTJDb25maWc7CiAgICBteSAkQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICk7CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgICRDdXN0b21lclVzZXJEeW5hbWljRmllbGROYW1lMkNvbmZpZ3sgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgIG15ICRTUUxEeW5hbWljRmllbGRGcm9tICAgICA9ICcnOwogICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlICAgID0gJyc7CiAgICBteSAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIgPSAxOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkc30gKSB7CgogICAgICAgIG15ICRTZWFyY2hQYXJhbSA9ICRQYXJhbXsgIkR5bmFtaWNGaWVsZF8iIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH07CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggISRTZWFyY2hQYXJhbSApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggcmVmICRTZWFyY2hQYXJhbSBuZSAnSEFTSCcgKTsKCiAgICAgICAgbXkgJE5lZWRKb2luOwoKICAgICAgICBmb3IgbXkgJE9wZXJhdG9yICggc29ydCBrZXlzICV7JFNlYXJjaFBhcmFtfSApIHsKCiAgICAgICAgICAgIG15IEBTZWFyY2hQYXJhbXMgPSAoIHJlZiAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IGVxICdBUlJBWScgKQogICAgICAgICAgICAgICAgPyBAeyAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IH0KICAgICAgICAgICAgICAgIDogKCAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9ICk7CgogICAgICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnJzsKICAgICAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyBBTkQgKCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnICgnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIFRFWFQ6CiAgICAgICAgICAgIGZvciBteSAkVGV4dCAoQFNlYXJjaFBhcmFtcykgewogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICggIWRlZmluZWQgJFRleHQgfHwgJFRleHQgZXEgJycgKTsKCiAgICAgICAgICAgICAgICAkVGV4dCA9fiBzL1wqLyUvZ2k7CgogICAgICAgICAgICAgICAgIyBDaGVjayBzZWFyY2ggYXR0cmlidXRlLCB3ZSBkbyBub3QgbmVlZCB0byBzZWFyY2ggZm9yICcqJy4KICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAkVGV4dCA9fiAvXlwlezEsM30kLzsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGVTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSB8fCAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRWYWxpZGF0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHZhbHVlICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRUZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICInIG9uIGZpZWxkICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGQtPntOYW1lfSAuICInISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoU1FMR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIiwKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciAgICAgICAgICAgPT4gJE9wZXJhdG9yLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFRlcm0gICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJykgJzsKCiAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlIC49ICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YjsKICAgICAgICAgICAgICAgICROZWVkSm9pbiA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkTmVlZEpvaW4pIHsKICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZEZyb20gLj0gIgogICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBkeW5hbWljX2ZpZWxkX3ZhbHVlIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlcgogICAgICAgICAgICAgICAgICAgIE9OIChkZl9vYmpfaWRfbmFtZS5vYmplY3RfaWQgPSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIub2JqZWN0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIuZmllbGRfaWQgPSAiCiAgICAgICAgICAgICAgICAuICREQk9iamVjdC0+UXVvdGUoICREeW5hbWljRmllbGQtPntJRH0sICdJbnRlZ2VyJyApIC4gIikKICAgICAgICAgICAgIjsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRKb2luQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIEV4ZWN1dGUgYSBkeW5hbWljIGZpZWxkIHNlYXJjaCwgaWYgYSBkeW5hbWljIGZpZWxkIHdoZXJlIHN0YXRlbWVudCBleGlzdHMuCiAgICBpZiAoJFNRTER5bmFtaWNGaWVsZFdoZXJlKSB7CgogICAgICAgIG15IEBEeW5hbWljRmllbGRVc2VyTG9naW5zOwoKICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkID0gIlNFTEVDVCBESVNUSU5DVChkZl9vYmpfaWRfbmFtZS5vYmplY3RfbmFtZSkgRlJPTSBkeW5hbWljX2ZpZWxkX29ial9pZF9uYW1lIGRmX29ial9pZF9uYW1lICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkRnJvbQogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKCiAgICAgICAgbXkgJFVzZWRDYWNoZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkVXNlckxvZ2lucyA9IEB7JER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YX07CgogICAgICAgICAgICAgICAgICAgICRVc2VkQ2FjaGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBkYXRhIG9ubHkgZnJvbSBkYXRhYmFzZSwgaWYgbm8gY2FjaGUgZW50cnkgZXhpc3RzLgogICAgICAgIGlmICggISRVc2VkQ2FjaGUgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRVc2VyTG9naW5zLCAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMsCiAgICAgICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBBZGQgdGhlIHVzZXIgbG9naW5zIGZyb20gdGhlIGR5bmFtaWMgZmllbGRzLCBpZiBhIHNlYXJjaCByZXN1bHQgZXhpc3RzIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoCiAgICAgICAgIyAgIG9yIHNraXAgdGhlIHNlYXJjaCBhbmQgcmV0dXJuIGEgZW1wdHJ5IGFycmF5IHJlZiwgaWYgbm8gdXNlciBsb2dpbnMgZXhpc3RzIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoLgogICAgICAgIGlmIChARHluYW1pY0ZpZWxkVXNlckxvZ2lucykgewoKICAgICAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkREJPYmplY3QtPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyS2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlcyAgID0+IFxARHluYW1pY0ZpZWxkVXNlckxvZ2lucywKICAgICAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFNRTFF1ZXJ5SW5Db25kaXRpb247CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFJlc3VsdCBlcSAnQ09VTlQnID8gMCA6IFtdOwogICAgICAgIH0KICAgIH0KCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICBuZXh0IEZJRUxEIGlmICFAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfTsKCiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkREJPYmplY3QtPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgID0+ICRGaWVsZC0+e0RhdGFiYXNlRmllbGR9LAogICAgICAgICAgICBWYWx1ZXMgICA9PiAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0sCiAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgfQoKICAgICMgU3BlY2lhbCBwYXJhbWV0ZXIgZm9yIEN1c3RvbWVySURzIGZyb20gYSBjdXN0b21lciBjb21wYW55IHNlYXJjaCByZXN1bHQuCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0N1c3RvbWVyQ29tcGFueVNlYXJjaEN1c3RvbWVySURzfSApICkgewoKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntDdXN0b21lcklEfSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFte0N1c3RvbWVyQ29tcGFueVNlYXJjaEN1c3RvbWVySURzfSwKICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFNRTFF1ZXJ5SW5Db25kaXRpb247CiAgICB9CgogICAgIyBTcGVjaWFsIHBhcmFtZXRlciB0byBleGNsdWRlIHNvbWUgdXNlciBsb2dpbnMgZnJvbSB0aGUgc2VhcmNoIHJlc3VsdC4KICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RXhjbHVkZVVzZXJMb2dpbnN9ICkgKSB7CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyS2V5fSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFte0V4Y2x1ZGVVc2VyTG9naW5zfSwKICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgTmVnYXRlICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFNRTFF1ZXJ5SW5Db25kaXRpb247CiAgICB9CgogICAgIyBBZGQgdGhlIHZhbGlkIG9wdGlvbiBpZiBuZWVkZWQuCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVmFsaWR9ICYmICRWYWxpZCApIHsKCiAgICAgICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAiJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJWYWxpZH0gSU4gKCIgLiBqb2luKCAnLCAnLCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKSAuICIpICI7CiAgICB9CgogICAgIyBDaGVjayBpZiBPcmRlckJ5IGNvbnRhaW5zIG9ubHkgdW5pcXVlIHZhbGlkIHZhbHVlcy4KICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICBpZiAoICEkT3JkZXJCeSB8fCAkT3JkZXJCeVNlZW57JE9yZGVyQnl9ICkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnkgY29udGFpbnMgaW52YWxpZCB2YWx1ZSAnJE9yZGVyQnknIG9yIHRoZSB2YWx1ZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgUmVtZW1iZXIgdGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0IGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UuCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBDaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicuCiAgICBESVJFQ1RJT046CiAgICBmb3IgbXkgJERpcmVjdGlvbiAoIEB7ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAjIE9ubHkgJ1VwJyBvciAnRG93bicgYWxsb3dlZC4KICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeURpcmVjdGlvbiBjYW4gb25seSBjb250YWluICdVcCcgb3IgJ0Rvd24nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBCdWlsZCB0aGUgc3FsIHN0YXRlbWVudCBmb3IgdGhlIHNlYXJjaC4KICAgIG15ICRTUUwgPSAiU0VMRUNUIERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJLZXl9KSI7CgogICAgIyBNb2RpZnkgU1FMIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKICAgICAgICAkU1FMID0gIlNFTEVDVCBDT1VOVChESVNUSU5DVCgkU2VsZi0+e0N1c3RvbWVyS2V5fSkpIjsKICAgIH0KCiAgICAjIEFzc2VtYmxlIHRoZSBPUkRFUiBCWSBjbGF1c2UuCiAgICBteSBAU1FMT3JkZXJCeTsKCiAgICAjIFRoZSBPcmRlciBieSBjbGF1c2UgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHJlc3VsdCB0eXBlICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgbmUgJ0NPVU5UJyApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKCiAgICAgICAgT1JERVJCWToKICAgICAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgICAgIG15ICREaXJlY3Rpb24gPSAnREVTQyc7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ1VwJyApIHsKICAgICAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0FTQyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ0Rvd24nICkgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnREVTQyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDb3VudCsrOwoKICAgICAgICAgICAgbmV4dCBPUkRFUkJZIGlmICEkT3JkZXJCeVRhYmxleyRPcmRlckJ5fTsKCiAgICAgICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSAkRGlyZWN0aW9uIjsKCiAgICAgICAgICAgIG5leHQgT1JERVJCWSBpZiAkT3JkZXJCeSBlcSAnVXNlckxvZ2luJzsKCiAgICAgICAgICAgICRTUUwgLj0gIiwgJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0iOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAgICAgIyAgIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkLgogICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAnVXNlckxvZ2luJyB9ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSApIHsKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRTZWxmLT57Q3VzdG9tZXJLZXl9IERFU0MiOwogICAgICAgIH0KICAgIH0KCiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9ICI7CgogICAgaWYgKEBTUUxXaGVyZSkgewogICAgICAgIG15ICRTUUxXaGVyZVN0cmluZyA9IGpvaW4gJyBBTkQgJywgbWFwIHsiKCAkXyApIn0gQFNRTFdoZXJlOwogICAgICAgICRTUUwgLj0gIldIRVJFICRTUUxXaGVyZVN0cmluZyAiOwogICAgfQogICAgaWYgKEBTUUxPcmRlckJ5KSB7CiAgICAgICAgbXkgJE9yZGVyQnlTdHJpbmcgPSBqb2luICcsICcsIEBTUUxPcmRlckJ5OwogICAgICAgICRTUUwgLj0gIk9SREVSIEJZICRPcmRlckJ5U3RyaW5nIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIGEgY2FjaGUgZXhpc3RzIGJlZm9yZSB3ZSBhc2sgdGhlIGRhdGFiYXNlLgogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgbXkgJENhY2hlRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbCcsCiAgICAgICAgICAgIEtleSAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZURhdGEgKSB7CiAgICAgICAgICAgIGlmICggcmVmICRDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRDYWNoZURhdGEgZXEgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIEhhbmRsZSB0aGUgZGlmZnJlbnQgcmVzdWx0IHR5cGVzLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsJywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUwgLiAkUGFyYW17TGltaXR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJElEc1swXSwKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkSURzWzBdOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsJywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUwgLiAkUGFyYW17TGltaXR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBJRHMsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gXEBJRHM7CiAgICB9Cn0KCnN1YiBDdXN0b21lcklETGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZCAgICAgID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CiAgICBteSAkU2VhcmNoVGVybSA9ICRQYXJhbXtTZWFyY2hUZXJtfSB8fCAnJzsKCiAgICBteSAkQ2FjaGVUeXBlID0gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lcklETGlzdCc7CiAgICBteSAkQ2FjaGVLZXkgID0gIkN1c3RvbWVySURMaXN0Ojoke1ZhbGlkfTo6JFNlYXJjaFRlcm0iOwoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskUmVzdWx0fSBpZiByZWYgJFJlc3VsdCBlcSAnQVJSQVknOwogICAgfQoKICAgIG15ICRTUUwgPSAiCiAgICAgICAgU0VMRUNUIERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJJRH0pCiAgICAgICAgRlJPTSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9CiAgICAgICAgV0hFUkUgMSA9IDEgIjsKICAgIG15IEBCaW5kOwoKICAgICMgYWRkIHZhbGlkIG9wdGlvbgogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfSAmJiAkVmFsaWQgKSB7CgogICAgICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICAgICBteSAkVmFsaWRJRHMgPSBqb2luKCAnLCAnLCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKTsKICAgICAgICAkU1FMIC49ICIKICAgICAgICAgICAgQU5EICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVmFsaWR9IElOICgkVmFsaWRJRHMpICI7CiAgICB9CgogICAgIyBhZGQgc2VhcmNoIHRlcm0KICAgIGlmICgkU2VhcmNoVGVybSkgewogICAgICAgIG15ICRTZWFyY2hUZXJtRXNjYXBlZCA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeVN0cmluZ0VzY2FwZSggUXVlcnlTdHJpbmcgPT4gJFNlYXJjaFRlcm0gKTsKCiAgICAgICAgJFNRTCAuPSAnIEFORCAnOwogICAgICAgIG15ICVRdWVyeUNvbmRpdGlvbiA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVySUR9LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICRTZWFyY2hUZXJtRXNjYXBlZCwKICAgICAgICAgICAgU2VhcmNoUHJlZml4ICA9PiAkU2VsZi0+e1NlYXJjaFByZWZpeH0sCiAgICAgICAgICAgIFNlYXJjaFN1ZmZpeCAgPT4gJFNlbGYtPntTZWFyY2hTdWZmaXh9LAogICAgICAgICAgICBDYXNlU2Vuc2l0aXZlID0+ICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0sCiAgICAgICAgICAgIEJpbmRNb2RlICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTUUwgLj0gJFF1ZXJ5Q29uZGl0aW9ue1NRTH07CiAgICAgICAgcHVzaCBAQmluZCwgQHsgJFF1ZXJ5Q29uZGl0aW9ue1ZhbHVlc30gfTsKCiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15IEBSZXN1bHQ7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBSZXN1bHQsICRSb3dbMF07CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIEBSZXN1bHQ7Cn0KCnN1YiBDdXN0b21lcklEcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySURzID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVySURzOjokUGFyYW17VXNlcn0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JEN1c3RvbWVySURzfSBpZiByZWYgJEN1c3RvbWVySURzIGVxICdBUlJBWSc7CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgZGF0YQogICAgbXkgJURhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRQYXJhbXtVc2VyfSwKICAgICk7CgogICAgIyB0aGVyZSBhcmUgbXVsdGkgY3VzdG9tZXIgaWRzCiAgICBteSBAQ3VzdG9tZXJJRHM7CiAgICBpZiAoICREYXRhe1VzZXJDdXN0b21lcklEc30gKSB7CgogICAgICAgICMgdXNlZCBzZXBhcmF0b3JzCiAgICAgICAgU0VQQVJBVE9SOgogICAgICAgIGZvciBteSAkU2VwYXJhdG9yICggJzsnLCAnLCcsICd8JyApIHsKCiAgICAgICAgICAgIG5leHQgU0VQQVJBVE9SIGlmICREYXRhe1VzZXJDdXN0b21lcklEc30gIX4gL1xRJFNlcGFyYXRvclxFLzsKCiAgICAgICAgICAgICMgc3BsaXQgaXQKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC9cUSRTZXBhcmF0b3JcRS8sICREYXRhe1VzZXJDdXN0b21lcklEc307CgogICAgICAgICAgICBmb3IgbXkgJElEIChASURzKSB7CiAgICAgICAgICAgICAgICAkSUQgPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgJElEID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhc3QgU0VQQVJBVE9SOwogICAgICAgIH0KCiAgICAgICAgIyBmYWxsYmFjayBpZiBubyBzZXBhcmF0b3IgZ290IGZvdW5kCiAgICAgICAgaWYgKCAhQEN1c3RvbWVySURzICkgewogICAgICAgICAgICAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgJERhdGF7VXNlckN1c3RvbWVySURzfSA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHVzZSBhbHNvIHRoZSBwcmltYXJ5IGN1c3RvbWVyIGlkCiAgICBpZiAoICREYXRhe1VzZXJDdXN0b21lcklEfSAmJiAhJFNlbGYtPntFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9ICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVySURzOjonIC4gJFBhcmFte1VzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gQEN1c3RvbWVySURzOwp9CgpzdWIgQ3VzdG9tZXJVc2VyRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGJ1aWxkIHNlbGVjdAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgJzsKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICRTUUwgLj0gIiAkRW50cnktPlsyXSwgIjsKICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAiY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgIjsKICAgIH0KCiAgICAkU1FMIC49ICRTZWxmLT57Q3VzdG9tZXJLZXl9IC4gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gV0hFUkUgIjsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICREYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVyVXNlckRhdGFHZXQ6OiRQYXJhbXtVc2VyfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskRGF0YX0gaWYgcmVmICREYXRhIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGNoZWNrIGN1c3RvbWVyIGtleSB0eXBlCiAgICBteSAkVXNlciA9ICRQYXJhbXtVc2VyfTsKCiAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcktleX0gPSA/IjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gIkxPV0VSKCRTZWxmLT57Q3VzdG9tZXJLZXl9KSA9IExPV0VSKD8pIjsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBbIFwkVXNlciBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkTWFwQ291bnRlciA9IDA7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICREYXRheyAkRW50cnktPlswXSB9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBuZXh0IFJPVyBpZiAkU2VsZi0+e0ZvcmVpZ25EQn07CgogICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpKSB7CiAgICAgICAgICAgICREYXRheyRLZXl9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZGF0YQogICAgaWYgKCAhJERhdGF7VXNlckxvZ2lufSApIHsKCiAgICAgICAgIyBjYWNoZSByZXF1ZXN0CiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlcn0iLAogICAgICAgICAgICAgICAgVmFsdWUgPT4ge30sCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGJ1aWxkIHRoZSBVc2VyTWFpbFN0cmluZywgZS5nIHF7IlRyb3kgQW5kcmV3cyBDb2xkIFJvb20gXCJUaGUgRnJpZGdlXCIgICAg8J+ltiIgPHVuaXR0ZXN0QGV4YW1wbGUub3JnPn0KICAgIHsKICAgICAgICBteSAkRmllbGRzID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CiAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRGaWVsZHMpICkgewogICAgICAgICAgICAkRmllbGRzID0gWyAnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnZW1haWwnLCBdOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdGhlIGtleXMgb2YgdGhlICVEYXRhIGhhc2ggdGhhdCBjb3JyZXNwb25kIHRvIHRoZSB0YWJsZSBhdHRyaWJ1dGVzCiAgICAgICAgbXkgQEN1c3RvbWVyVXNlckxpc3RGaWVsZHM7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoICRGaWVsZHMtPkAqICkgewogICAgICAgICAgICBteSBARmllbGROYW1lcyA9IG1hcCB7ICRfLT5bMF0gfSBncmVwIHsgJF8tPlsyXSBlcSAkRmllbGQgfSBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH07CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVyVXNlckxpc3RGaWVsZHMsICRGaWVsZE5hbWVzWzBdOwogICAgICAgIH0KCiAgICAgICAgbXkgQFZhbHVlczsKCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoQEN1c3RvbWVyVXNlckxpc3RGaWVsZHMpIHsKICAgICAgICAgICAgbmV4dCBGSUVMRCB1bmxlc3MgJERhdGF7JEZpZWxkfTsKCiAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgJERhdGF7JEZpZWxkfTsKICAgICAgICB9CgogICAgICAgIGlmIChAVmFsdWVzKSB7CgogICAgICAgICAgICAjIEZvcm1hdCBjb21wbGlhbnQgdG8gUkZDIDUzMjIuIFRoaXMgaXMgcmVsZXZhbnQgd2hlbiB0aGUgcmVhbCBuYW1lCiAgICAgICAgICAgICMgY29udGFpbiBjb21tYXMsIGRvdWJsZSBxdW90ZXMsIG9yIG90aGVyIHNwZWNpYWwgc3ltYm9scy4KICAgICAgICAgICAgIwogICAgICAgICAgICAjIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGxhc3QgcGFydCBpcyB0aGUgYWRkcmVzcy4KICAgICAgICAgICAgbXkgJEFkZHJlc3MgPSBwb3AgQFZhbHVlczsKICAgICAgICAgICAgbXkgJFBocmFzZSAgPSBqb2luICcgJywgQFZhbHVlczsKICAgICAgICAgICAgJERhdGF7VXNlck1haWxTdHJpbmd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpLT5Gb3JtYXQoCiAgICAgICAgICAgICAgICBSZWFsTmFtZSA9PiAkUGhyYXNlLAogICAgICAgICAgICAgICAgQWRkcmVzcyAgPT4gJEFkZHJlc3MsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YXtVc2VyTWFpbFN0cmluZ30gPSAnJzsKICAgICAgICB9CiAgICB9CgogICAgIyBjb21wYXQhCiAgICAkRGF0YXtVc2VySUR9ID0gJERhdGF7VXNlckxvZ2lufTsKCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPkdldFByZWZlcmVuY2VzKCBVc2VySUQgPT4gJERhdGF7VXNlcklEfSApOwoKICAgICMgYWRkIGxhc3QgbG9naW4gdGltZXN0YW1wCiAgICBpZiAoICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2lufSApIHsKCiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBFcG9jaCA9PiAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpbn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW5UaW1lc3RhbXB9ID0gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwoKICAgIH0KCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJVc2VyRGF0YUdldDo6JyAuICRQYXJhbXtVc2VyfSwKICAgICAgICAgICAgVmFsdWUgPT4geyAlRGF0YSwgJVByZWZlcmVuY2VzIH0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAoICVEYXRhLCAlUHJlZmVyZW5jZXMgKTsKfQoKc3ViIEN1c3RvbWVyVXNlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewoKICAgICAgICAgICAgIyBza2lwIFVzZXJMb2dpbiwgd2lsbCBiZSBjaGVja2VkIGxhdGVyCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgKCAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyApOwoKICAgICAgICAgICAgIyBpZ25vcmUgZHluYW1pYyBmaWVsZHMgaGVyZQogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRFbnRyeS0+WzBdISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiBubyBVc2VyTG9naW4gaXMgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICYmICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0F1dG9Mb2dpbkNyZWF0aW9ufSApIHsKCiAgICAgICAgIyBnZXQgdGltZSBvYmplY3QKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICBteSAkRGF0ZVRpbWVTdHJpbmcgPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCggRm9ybWF0ID0+ICclWSVtJWQlSCVNJyApOwoKICAgICAgICBteSAkUHJlZml4ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57QXV0b0xvZ2luQ3JlYXRpb25QcmVmaXh9IHx8ICdhdXRvJzsKICAgICAgICAkUGFyYW17VXNlckxvZ2lufSA9ICIkUHJlZml4LSREYXRlVGltZVN0cmluZyIgLiBpbnQoIHJhbmQoOTkpICk7CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGxvZ2luIGV4aXN0cwogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcyBpZiBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCAkUGFyYW17VXNlckVtYWlsfSAmJiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFbWFpbFVuaXFDaGVja30gKSB7CiAgICAgICAgbXkgJVJlc3VsdCA9ICRTZWxmLT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRQYXJhbXtVc2VyRW1haWx9LAogICAgICAgICk7CiAgICAgICAgaWYgKCVSZXN1bHQpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoJ1RoaXMgZW1haWwgYWRkcmVzcyBpcyBhbHJlYWR5IGluIHVzZSBmb3IgYW5vdGhlciBjdXN0b21lciB1c2VyLicpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcyBteAogICAgaWYgKAogICAgICAgICRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgJiYgISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJFBhcmFte1VzZXJFbWFpbH0gKQogICAgICAgICYmIGdyZXAgeyAkXyBlcSAkUGFyYW17VmFsaWRJRH0gfSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVtYWlsIGFkZHJlc3MgKCRQYXJhbXtVc2VyRW1haWx9KSBub3QgdmFsaWQgKCIKICAgICAgICAgICAgICAgIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvcigpIC4gIikhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHF1b3RlIHZhbHVlcwogICAgbXkgJVZhbHVlOwogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzVdID1+IC9eaW50JC9pICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSAvLyAnJzsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBpbnNlcnQKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gJFNlbGYtPntDdXN0b21lclRhYmxlfSAoIjsKICAgIG15IEBCaW5kOwogICAgbXkgJVNlZW5LZXk7ICAgICMgSWYgdGhlIG1hcCBjb250YWlucyBkdXBsaWNhdGVkIGZpZWxkIG5hbWVzLCBpbnNlcnQgb25seSBvbmNlLgogICAgbXkgQENvbHVtbk5hbWVzOwoKICAgIE1BUEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IE1BUEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsgICAgICAgICAgICAjIHNraXAgZHluYW1pYyBmaWVsZHMKICAgICAgICBuZXh0IE1BUEVOVFJZIGlmICggbGMoICRFbnRyeS0+WzBdICkgZXEgInVzZXJwYXNzd29yZCIgKTsKICAgICAgICBuZXh0IE1BUEVOVFJZIGlmICRTZWVuS2V5eyAkRW50cnktPlsyXSB9Kys7CiAgICAgICAgcHVzaCBAQ29sdW1uTmFtZXMsICRFbnRyeS0+WzJdOwogICAgfQoKICAgICRTUUwgLj0gam9pbiAnLCAnLCBAQ29sdW1uTmFtZXM7CgogICAgaWYgKCAhJFNlbGYtPntGb3JlaWduREJ9ICkgewogICAgICAgICRTUUwgLj0gJywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSc7CiAgICB9CgogICAgJFNRTCAuPSAnKSBWQUxVRVMgKCc7CgogICAgbXkgJVNlZW5WYWx1ZTsKICAgIG15ICRCaW5kQ29sdW1ucyA9IDA7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAgICAgICMgc2tpcCBkeW5hbWljIGZpZWxkcwogICAgICAgIG5leHQgRU5UUlkgaWYgKCBsYyggJEVudHJ5LT5bMF0gKSBlcSAidXNlcnBhc3N3b3JkIiApOwogICAgICAgIG5leHQgRU5UUlkgaWYgJFNlZW5WYWx1ZXsgJEVudHJ5LT5bMl0gfSsrOwogICAgICAgICRCaW5kQ29sdW1ucysrOwogICAgICAgIHB1c2ggQEJpbmQsIFwkVmFsdWV7ICRFbnRyeS0+WzBdIH07CiAgICB9CgogICAgJFNRTCAuPSBqb2luICcsICcsICgnPycpIHggJEJpbmRDb2x1bW5zOwoKICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAkU1FMIC49ICcsIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtVc2VySUR9OwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VXNlcklEfTsKICAgIH0KCiAgICAkU1FMIC49ICcpJzsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlcjogJyRQYXJhbXtVc2VyTG9naW59JyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSAoJFBhcmFte1VzZXJJRH0pISIsCiAgICApOwoKICAgICMgc2V0IHBhc3N3b3JkCiAgICBpZiAoICRQYXJhbXtVc2VyUGFzc3dvcmR9ICkgewogICAgICAgICRTZWxmLT5TZXRQYXNzd29yZCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBQVyAgICAgICAgPT4gJFBhcmFte1VzZXJQYXNzd29yZH0KICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT5fQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CgogICAgcmV0dXJuICRQYXJhbXtVc2VyTG9naW59Owp9CgpzdWIgQ3VzdG9tZXJVc2VyVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFteyAkRW50cnktPlswXSB9CiAgICAgICAgICAgICYmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJyAgICAjIGlnbm9yZSBkeW5hbWljIGZpZWxkcyBoZXJlCiAgICAgICAgICAgICYmICRFbnRyeS0+WzRdICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgY2hlY2sgcmVxdWlyZWQgZmllbGRzCiAgICAgICAgICAgICYmICRFbnRyeS0+WzBdIG5lICdVc2VyUGFzc3dvcmQnICAgICAjIGlnbm9yZSBVc2VyUGFzc3dvcmQgZmllbGQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEVudHJ5LT5bMF0hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgIGlmICgKICAgICAgICAkUGFyYW17VXNlckVtYWlsfQogICAgICAgICYmICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRQYXJhbXtVc2VyRW1haWx9ICkKICAgICAgICAmJiBncmVwIHsgJF8gZXEgJFBhcmFte1ZhbGlkSUR9IH0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbWFpbCBhZGRyZXNzICgkUGFyYW17VXNlckVtYWlsfSkgbm90IHZhbGlkICgiCiAgICAgICAgICAgICAgICAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3IoKSAuICIpISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2xkIHVzZXIgZGF0YSAocHcpCiAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17SUR9ICk7CgogICAgIyBpZiB3ZSB1cGRhdGUgdGhlIGVtYWlsIGFkZHJlc3MsIGNoZWNrIGlmIGl0IGFscmVhZHkgZXhpc3RzCiAgICBpZiAoCiAgICAgICAgJFBhcmFte1VzZXJFbWFpbH0KICAgICAgICAmJiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFbWFpbFVuaXFDaGVja30KICAgICAgICAmJiBsYyAkUGFyYW17VXNlckVtYWlsfSBuZSBsYyAkVXNlckRhdGF7VXNlckVtYWlsfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAlUmVzdWx0ID0gJFNlbGYtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJFBhcmFte1VzZXJFbWFpbH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJVJlc3VsdCkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgnVGhpcyBlbWFpbCBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlIGZvciBhbm90aGVyIGN1c3RvbWVyIHVzZXIuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZSB2YWx1ZXMKICAgIG15ICVWYWx1ZTsKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAkRW50cnktPls1XSA9fiAvXmludCQvaSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gLy8gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgdXBkYXRlIGRiCiAgICBteSAkU1FMID0gIlVQREFURSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9IFNFVCAiOwogICAgbXkgQEJpbmQ7CgogICAgbXkgJVNlZW5LZXk7ICAgICMgSWYgdGhlIG1hcCBjb250YWlucyBkdXBsaWNhdGVkIGZpZWxkIG5hbWVzLCBpbnNlcnQgb25seSBvbmNlLgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAgICAgICMgc2tpcCBkeW5hbWljIGZpZWxkcwogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCByZWFkb25seSBmaWVsZHMKICAgICAgICBuZXh0IEVOVFJZIGlmICggbGMoICRFbnRyeS0+WzBdICkgZXEgInVzZXJwYXNzd29yZCIgKTsKICAgICAgICBuZXh0IEVOVFJZIGlmICRTZWVuS2V5eyAkRW50cnktPlsyXSB9Kys7CiAgICAgICAgJFNRTCAuPSAiICRFbnRyeS0+WzJdID0gPywgIjsKICAgICAgICBwdXNoIEBCaW5kLCBcJFZhbHVleyAkRW50cnktPlswXSB9OwogICAgfQoKICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAkU1FMIC49ICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/JzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjaG9wICRTUUw7CiAgICAgICAgY2hvcCAkU1FMOwogICAgfQoKICAgICRTUUwgLj0gJyBXSEVSRSAnOwoKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lcktleX0pID0gTE9XRVIoPykiOwogICAgfQogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtJRH07CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kCiAgICApOwoKICAgICMgY2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgQ3VzdG9tZXIgUHJlZmVyZW5jZXMKICAgIGlmICggJFBhcmFte1VzZXJMb2dpbn0gbmUgJFVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CgogICAgICAgICMgdXBkYXRlIHRoZSBwcmVmZXJlbmNlcwogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5SZW5hbWVQcmVmZXJlbmNlcygKICAgICAgICAgICAgTmV3VXNlcklEID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBPbGRVc2VySUQgPT4gJFVzZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvZyBub3RpY2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFBhcmFte1VzZXJMb2dpbn0nIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgIyBjaGVjayBwdwogICAgaWYgKCAkUGFyYW17VXNlclBhc3N3b3JkfSApIHsKICAgICAgICAkU2VsZi0+U2V0UGFzc3dvcmQoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgUFcgICAgICAgID0+ICRQYXJhbXtVc2VyUGFzc3dvcmR9CiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSApOwogICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSBuZSAkVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkVXNlckRhdGF7VXNlckxvZ2lufSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgU2V0UGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gS2VybmVsOjpTeXN0ZW06OlVzZXI6OlNldFBhc3N3b3JkKCkKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJExvZ2luID0gJFBhcmFte1VzZXJMb2dpbn07CiAgICBteSAkUHcgICAgPSAkUGFyYW17UFd9IHx8ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkTG9naW4gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFRPRE86IGFkZCBjaGVjayB3aGV0aGVyIHRoZSBDdXN0b21lclVzZXIgZXhpc3RzCgogICAgbXkgJENyeXB0ZWRQdyA9ICcnOwoKICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDb25maWdTZWN0aW9uID0gJ0N1c3RvbWVyOjpBdXRoTW9kdWxlOjpEQic7CgogICAgbXkgJENyeXB0VHlwZSA9ICRDb25maWdPYmplY3QtPkdldCgiJHtDb25maWdTZWN0aW9ufTo6Q3J5cHRUeXBlIikgfHwgJ3NoYTInOwoKICAgIG15ICRFbmNvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyk7CgogICAgIyBjcnlwdCBwbGFpbiAobm8gY3J5cHQgYXQgYWxsKQogICAgaWYgKCAkQ3J5cHRUeXBlIGVxICdwbGFpbicgKSB7CiAgICAgICAgJENyeXB0ZWRQdyA9ICRQdzsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggVU5JWCBjcnlwdAogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdjcnlwdCcgKSB7CgogICAgICAgICMgZW5jb2RlIG91dHB1dCwgbmVlZGVkIGJ5IGNyeXB0KCkgb25seSBub24gdXRmOCBzaWducwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRMb2dpbiApOwoKICAgICAgICAkQ3J5cHRlZFB3ID0gY3J5cHQoICRQdywgJExvZ2luICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlSW5wdXQoIFwkQ3J5cHRlZFB3ICk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIHVuaXhfbWQ1X2NyeXB0CiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ21kNScgKSB7CgogICAgICAgICMgZW5jb2RlIG91dHB1dCwgbmVlZGVkIGJ5IHVuaXhfbWQ1X2NyeXB0KCkgb25seSBub24gdXRmOCBzaWducwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRMb2dpbiApOwoKICAgICAgICAkQ3J5cHRlZFB3ID0gdW5peF9tZDVfY3J5cHQoICRQdywgJExvZ2luICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlSW5wdXQoIFwkQ3J5cHRlZFB3ICk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIG1kNSAoY29tcGF0aWJsZSB3aXRoIEFwYWNoZSdzIC5odHBhc3N3ZCBmaWxlcykKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnYXByMScgKSB7CgogICAgICAgICMgZW5jb2RlIG91dHB1dCwgbmVlZGVkIGJ5IGFwYWNoZV9tZDVfY3J5cHQoKSBvbmx5IG5vbiB1dGY4IHNpZ25zCiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJExvZ2luICk7CgogICAgICAgICRDcnlwdGVkUHcgPSBhcGFjaGVfbWQ1X2NyeXB0KCAkUHcsICRMb2dpbiApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZUlucHV0KCBcJENyeXB0ZWRQdyApOwogICAgfQoKICAgICMgY3J5cHQgd2l0aCBzaGExCiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ3NoYTEnICkgewoKICAgICAgICBteSAkU0hBT2JqZWN0ID0gRGlnZXN0OjpTSEEtPm5ldygnc2hhMScpOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRTSEFPYmplY3QtPmFkZCgkUHcpOwogICAgICAgICRDcnlwdGVkUHcgPSAkU0hBT2JqZWN0LT5oZXhkaWdlc3QoKTsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggc2hhNTEyCiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ3NoYTUxMicgKSB7CgogICAgICAgIG15ICRTSEFPYmplY3QgPSBEaWdlc3Q6OlNIQS0+bmV3KCdzaGE1MTInKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKICAgICAgICAkU0hBT2JqZWN0LT5hZGQoJFB3KTsKICAgICAgICAkQ3J5cHRlZFB3ID0gJFNIQU9iamVjdC0+aGV4ZGlnZXN0KCk7CiAgICB9CgogICAgIyBiY3J5cHQKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnYmNyeXB0JyApIHsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgnQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQnKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlcjogJyRMb2dpbicgdHJpZWQgdG8gc3RvcmUgcGFzc3dvcmQgd2l0aCBiY3J5cHQgYnV0ICdDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdCcgaXMgbm90IGluc3RhbGxlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkQ29zdCA9ICRDb25maWdPYmplY3QtPkdldCgiJHtDb25maWdTZWN0aW9ufTo6YmNyeXB0Q29zdCIpIC8vIDEyOwoKICAgICAgICAjIERvbid0IGFsbG93IHZhbHVlcyBzbWFsbGVyIHRoYW4gOSBmb3Igc2VjdXJpdHkuCiAgICAgICAgJENvc3QgPSA5IGlmICRDb3N0IDwgOTsKCiAgICAgICAgIyBDdXJyZW50IENyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0IGxpbWl0IGlzIDMxLgogICAgICAgICRDb3N0ID0gMzEgaWYgJENvc3QgPiAzMTsKCiAgICAgICAgbXkgJFNhbHQgPSAkTWFpbk9iamVjdC0+R2VuZXJhdGVSYW5kb21TdHJpbmcoIExlbmd0aCA9PiAxNiApOwoKICAgICAgICAjIHJlbW92ZSBVVEY4IGZsYWcsIHJlcXVpcmVkIGJ5IENyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CgogICAgICAgICMgY2FsY3VsYXRlIHBhc3N3b3JkIGhhc2gKICAgICAgICBteSAkT2N0ZXRzID0gQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQ6OmJjcnlwdF9oYXNoKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlfbnVsID0+IDEsCiAgICAgICAgICAgICAgICBjb3N0ICAgID0+ICRDb3N0LAogICAgICAgICAgICAgICAgc2FsdCAgICA9PiAkU2FsdCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJFB3CiAgICAgICAgKTsKCiAgICAgICAgIyBXZSB3aWxsIHN0b3JlIGNvc3QgYW5kIHNhbHQgaW4gdGhlIHBhc3N3b3JkIHN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSBkZWNvZGVkCiAgICAgICAgIyAgIGluIGZ1dHVyZSBldmVuIGlmIHdlIHVzZSBhIGhpZ2hlciBjb3N0IGJ5IGRlZmF1bHQuCiAgICAgICAgJENyeXB0ZWRQdyA9ICJCQ1JZUFQ6JENvc3Q6JFNhbHQ6IiAuIENyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0Ojplbl9iYXNlNjQoJE9jdGV0cyk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIHNoYTI1NiBhcyBmYWxsYmFjawogICAgZWxzZSB7CgogICAgICAgIG15ICRTSEFPYmplY3QgPSBEaWdlc3Q6OlNIQS0+bmV3KCdzaGEyNTYnKTsKCiAgICAgICAgIyBlbmNvZGUgb3V0cHV0LCBuZWVkZWQgYnkgc2hhMjU2X2hleCgpIG9ubHkgbm9uIHV0Zjggc2lnbnMKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKCiAgICAgICAgJFNIQU9iamVjdC0+YWRkKCRQdyk7CiAgICAgICAgJENyeXB0ZWRQdyA9ICRTSEFPYmplY3QtPmhleGRpZ2VzdCgpOwogICAgfQoKICAgICMgdXBkYXRlIGRiCiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICggJEVudHJ5LT5bMF0gPX4gL15Vc2VyUGFzc3dvcmQkL2kgKSB7CiAgICAgICAgICAgICRQYXJhbXtQYXNzd29yZENvbH0gPSAkRW50cnktPlsyXTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJMb2dpbiQvaSApIHsKICAgICAgICAgICAgJFBhcmFte0xvZ2luQ29sfSA9ICRFbnRyeS0+WzJdOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG5lZWRlZCBwdyBjb2wuIGV4aXN0cyAoZWxzZSB0aGVyZSBpcyBubyBwdyBjb2wuKQogICAgaWYgKCAkUGFyYW17UGFzc3dvcmRDb2x9ICYmICRQYXJhbXtMb2dpbkNvbH0gKSB7CiAgICAgICAgbXkgJFNRTCA9ICJVUERBVEUgJFNlbGYtPntDdXN0b21lclRhYmxlfSBTRVQgIgogICAgICAgICAgICAuICIgJFBhcmFte1Bhc3N3b3JkQ29sfSA9ID8gIgogICAgICAgICAgICAuICIgV0hFUkUgIjsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICAgICAkU1FMIC49ICIkUGFyYW17TG9naW5Db2x9ID0gPyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU1FMIC49ICJMT1dFUigkUGFyYW17TG9naW5Db2x9KSA9IExPV0VSKD8pIjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJENyeXB0ZWRQdywgXCRQYXJhbXtVc2VyTG9naW59IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb2cgbm90aWNlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFBhcmFte1VzZXJMb2dpbn0nIGNoYW5nZWQgcGFzc3dvcmQgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPl9DdXN0b21lclVzZXJDYWNoZUNsZWFyKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBuZWVkIG5vIHB3IHRvIHNldAogICAgcmV0dXJuIDE7Cn0KCnN1YiBHZW5lcmF0ZVJhbmRvbVBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZW5lcmF0ZWQgcGFzc3dvcmRzIGFyZSBlaWdodCBjaGFyYWN0ZXJzIGxvbmcgYnkgZGVmYXVsdAogICAgbXkgJFNpemUgPSAkUGFyYW17U2l6ZX0gfHwgODsKCiAgICBteSAkUGFzc3dvcmQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggPT4gJFNpemUsCiAgICApOwoKICAgIHJldHVybiAkUGFzc3dvcmQ7Cn0KCnN1YiBTZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRTZWxmLT5fQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VySUR9ICk7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgR2V0UHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBTZWFyY2hQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2VhcmNoUHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKc3ViIF9DdXN0b21lclVzZXJDYWNoZUNsZWFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0NhY2hlT2JqZWN0fTsKCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlckxvZ2luIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlckxvZ2lufSIsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lck5hbWU6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICk7CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gIkN1c3RvbWVySURzOjokUGFyYW17VXNlckxvZ2lufSIsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggY2FjaGUgZW50cmllcwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVySURMaXN0JywKICAgICk7CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2gnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbCcsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICApOwoKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyR3JvdXAnLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uIChxdyhDdXN0b21lclVzZXJMaXN0KSkgewogICAgICAgIGZvciBteSAkVmFsaWQgKCAwIC4uIDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gIiR7RnVuY3Rpb259Ojoke1ZhbGlkfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGlzY29ubmVjdCBpZiBpdCdzIG5vdCBhIHBhcmVudCBEQk9iamVjdAogICAgaWYgKCAkU2VsZi0+e05vdFBhcmVudERCT2JqZWN0fSApIHsKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RGlzY29ubmVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/CustomerUser/LDAP.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhZWIzZWJkNzVlMThmMjgzNmJkN2M4MmViZWFjZmE0YjIzMzBmYmQ5IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvTERBUC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OkxEQVA7Cgp1c2UgdjUuMjY7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwp1c2UgTmV0OjpMREFQOwp1c2UgTmV0OjpMREFQOjpVdGlsIHF3KGVzY2FwZV9maWx0ZXJfdmFsdWUpOwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIFJvdGhlciBPU1MKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgZm9yIG15ICROZWVkZWQgKHF3KCBQcmVmZXJlbmNlc09iamVjdCBDdXN0b21lclVzZXJNYXAgKSkgewogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH0gfHwgZGllICJHb3Qgbm8gJE5lZWRlZCEiOwogICAgfQoKICAgICMgbWF4IHNob3duIHVzZXIgYSBzZWFyY2ggbGlzdAogICAgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0gfHwgMjAwOwoKICAgICMgZ2V0IGxkYXAgcHJlZmVyZW5jZXMKICAgICRTZWxmLT57RGllfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntEaWV9IC8vIDA7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBwYXJhbXMKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1BhcmFtc30gKSB7CiAgICAgICAgJFNlbGYtPntQYXJhbXN9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1BhcmFtc307CiAgICB9CgogICAgIyBOZXQ6OkxEQVAgbmV3IHBhcmFtcwogICAgZWxzaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICdBdXRoTW9kdWxlOjpMREFQOjpQYXJhbXMnIC4gJFBhcmFte0NvdW50fSApICkgewogICAgICAgICRTZWxmLT57UGFyYW1zfSA9ICRDb25maWdPYmplY3QtPkdldCggJ0F1dGhNb2R1bGU6OkxEQVA6OlBhcmFtcycgLiAkUGFyYW17Q291bnR9ICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e1BhcmFtc30gPSB7fTsKICAgIH0KCiAgICAkU2VsZi0+e1N0YXJ0VExTfSA9ICRDb25maWdPYmplY3QtPkdldCggJ0F1dGhNb2R1bGU6OkxEQVA6OlN0YXJ0VExTJyAuICRQYXJhbXtDb3VudH0gKSB8fCAnJzsKCiAgICAjIGhvc3QKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0hvc3R9ICkgewogICAgICAgICRTZWxmLT57SG9zdH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57SG9zdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPkhvc3QgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBiYXNlIGRuCiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Jhc2VETn0gKSB7CiAgICAgICAgJFNlbGYtPntCYXNlRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Jhc2VETn07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPkJhc2VETiBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNjb3BlCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTU0NPUEV9ICkgewogICAgICAgICRTZWxmLT57U1Njb3BlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTU0NPUEV9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5TU0NPUEUgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZWFyY2ggdXNlcgogICAgJFNlbGYtPntTZWFyY2hVc2VyRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1VzZXJETn0gfHwgJyc7CiAgICAkU2VsZi0+e1NlYXJjaFVzZXJQd30gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57VXNlclB3fSB8fCAnJzsKCiAgICAjIGdyb3VwIGRuCiAgICAkU2VsZi0+e0dyb3VwRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0dyb3VwRE59IHx8ICcnOwoKICAgICMgY3VzdG9tZXIga2V5CiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fSApIHsKICAgICAgICAkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVyS2V5IGluIEtlcm5lbC9Db25maWcucG0nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3VzdG9tZXIgaWQKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntDdXN0b21lcklEfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVySUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+Q3VzdG9tZXJJRCBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxkYXAgZmlsdGVyIGFsd2F5cyB1c2VkCiAgICAkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57QWx3YXlzRmlsdGVyfSB8fCAnJzsKCiAgICAkU2VsZi0+e0V4Y2x1ZGVQcmltYXJ5Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9IHx8IDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hQcmVmaXh9IC8vICcnOwogICAgJFNlbGYtPntTZWFyY2hTdWZmaXh9ICAgICAgICAgICAgID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoU3VmZml4fSAvLyAnKic7CgogICAgIyBjaGFyc2V0IHNldHRpbmdzCiAgICAkU2VsZi0+e1NvdXJjZUNoYXJzZXR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1NvdXJjZUNoYXJzZXR9IHx8ICcnOwoKICAgICMgc2V0IGNhY2hlIHR5cGUKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdDdXN0b21lclVzZXInIC4gJFBhcmFte0NvdW50fTsKCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICB9CgogICAgIyBnZXQgdmFsaWQgZmlsdGVyIGlmIHVzZWQKICAgICRTZWxmLT57VmFsaWRGaWx0ZXJ9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyVmFsaWRGaWx0ZXJ9IHx8ICcnOwoKICAgICMgY29ubmVjdCBmaXJzdCBpZiBEaWUgaXMgZW5hYmxlZCwgbWFrZSBzdXJlIHRoYXQgY29ubmVjdGlvbiBpcyBwb3NzaWJsZSwgZWxzZSBkaWUKICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9Db25uZWN0KCk7CiAgICB9CgogICAgIyBmZXRjaCBuYW1lcyBvZiBjb25maWd1cmVkIGR5bmFtaWMgZmllbGRzCiAgICBteSBARHluYW1pY0ZpZWxkTWFwRW50cmllcyA9IGdyZXAgeyAkXy0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyB9IEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfTsKICAgICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfSA9IHsgbWFwIHsgJF8tPlsyXSA9PiAxIH0gQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgfTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICBteSAkTGF5b3V0UGFyYW0gPSAkS2VybmVsOjpPTS0+e1BhcmFtfS0+eydLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0J307CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIHNvcnQga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBfQ29ubmVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcmV0dXJuIGlmIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBvcGVuCiAgICByZXR1cm4gMSBpZiAkU2VsZi0+e0xEQVB9OwoKICAgICMgbGRhcCBjb25uZWN0IGFuZCBiaW5kIChtYXliZSB3aXRoIFNlYXJjaFVzZXJETiBhbmQgU2VhcmNoVXNlclB3KQogICAgJFNlbGYtPntMREFQfSA9IE5ldDo6TERBUC0+bmV3KAogICAgICAgICRTZWxmLT57SG9zdH0sCiAgICAgICAgJFNlbGYtPntQYXJhbXN9LT4lKgogICAgKTsKCiAgICBpZiAoICEkU2VsZi0+e0xEQVB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgICAgICBkaWUgIkNhbid0IGNvbm5lY3QgdG8gJFNlbGYtPntIb3N0fTogJEAiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbm5lY3QgdG8gJFNlbGYtPntIb3N0fTogJEAiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkU2VsZi0+e1N0YXJ0VExTfSApIHsKICAgICAgICBteSAkU3RhcnRlZCA9ICRTZWxmLT57TERBUH0tPnN0YXJ0X3RscyggdmVyaWZ5ID0+ICRTZWxmLT57U3RhcnRUTFN9ICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0ZWQgKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgICAgICAgICAgZGllICJzdGFydF90bHMgb24gJFNlbGYtPntIb3N0fSBmYWlsZWQ6ICRAIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gInN0YXJ0X3RsczogJyRTZWxmLT57U3RhcnRUTFN9JyBvbiAkU2VsZi0+e0hvc3R9IGZhaWxlZDogJEAiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TERBUH0tPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUmVzdWx0OwogICAgaWYgKCAkU2VsZi0+e1NlYXJjaFVzZXJETn0gJiYgJFNlbGYtPntTZWFyY2hVc2VyUHd9ICkgewogICAgICAgICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5iaW5kKAogICAgICAgICAgICBkbiAgICAgICA9PiAkU2VsZi0+e1NlYXJjaFVzZXJETn0sCiAgICAgICAgICAgIHBhc3N3b3JkID0+ICRTZWxmLT57U2VhcmNoVXNlclB3fSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPmJpbmQoKTsKICAgIH0KCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ZpcnN0IGJpbmQgZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TERBUH0tPmRpc2Nvbm5lY3QoKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBDdXN0b21lck5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBidWlsZCBmaWx0ZXIKICAgIG15ICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkUGFyYW17VXNlckxvZ2lufSApIC4gJyknOwoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdDdXN0b21lck5hbWU6OicgLiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTmFtZSBpZiBkZWZpbmVkICROYW1lOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciAgICA9PiAkRmlsdGVyLAogICAgICAgIHNpemVsaW1pdCA9PiAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSwKICAgICk7CgogICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgKSB7CiAgICAgICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgPT0gNCApIHsKCiAgICAgICAgICAgICMgUmVzdWx0IGNvZGUgNCAoTERBUF9TSVpFTElNSVRfRVhDRUVERUQpIGlzIG5vcm1hbCBpZiB0aGVyZQogICAgICAgICAgICAjIGFyZSBtb3JlIGl0ZW1zIGluIExEQVAgdGhhbiBzZWFyY2ggbGltaXQgZGVmaW5lZCBpbiBPVE9CTyBvcgogICAgICAgICAgICAjIGluIExEQVAgc2VydmVyLiBBdm9pZCBzcGFtbWluZyBsb2dzIHdpdGggc3VjaCBlcnJvcnMuCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMREFQIHNpemUgbGltaXQgZXhjZWVkZWQgKCcgLiAkUmVzdWx0LT5lcnJvcigpIC4gJykuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2ggZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVOYW1lUGFydHM7CgogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHQtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRFbnRyeS0+Z2V0X3ZhbHVlKCRGaWVsZCkgKSB7CiAgICAgICAgICAgICAgICAkTmFtZVBhcnRzeyRGaWVsZH0gPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkRW50cnktPmdldF92YWx1ZSgkRmllbGQpICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgbXkgQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9CiAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTmFtZUZpZWxkc30gfTsKICAgIGlmIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgewogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBEWU5BTUlDRklFTEROQU1FOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gWyRWYWx1ZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBSZW5kZXJlZFZhbHVlczsKCiAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIWRlZmluZWQgJEN1cnJlbnRWYWx1ZSB8fCAhbGVuZ3RoICRDdXJyZW50VmFsdWU7CgogICAgICAgICAgICAgICAgbXkgJFJlbmRlcmVkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlbmRlcmVkVmFsdWUpIHx8ICFkZWZpbmVkICRSZW5kZXJlZFZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlbmRlcmVkVmFsdWVzLCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE5hbWVQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFJlbmRlcmVkVmFsdWVzOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzc2VtYmxlIG5hbWUKICAgIG15IEBOYW1lUGFydHM7CiAgICBDVVNUT01FUlVTRVJOQU1FRklFTEQ6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlck5hbWVGaWVsZCAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHN9IH0gKSB7CiAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJOQU1FRklFTEQKICAgICAgICAgICAgaWYgIWV4aXN0cyAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFkZWZpbmVkICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH0KICAgICAgICAgICAgfHwgIWxlbmd0aCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9OwogICAgICAgIHB1c2ggQE5hbWVQYXJ0cywgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgIH0KCiAgICBteSAkSm9pbkNoYXJhY3RlciA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHNKb2lufSAvLyAnICc7CiAgICBteSAkTmFtZSAgICAgICAgICA9IGpvaW4gJEpvaW5DaGFyYWN0ZXIsIEBOYW1lUGFydHM7CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVyTmFtZTo6JyAuICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBWYWx1ZSA9PiAkTmFtZSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICROYW1lOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRQYXJhbXtDdXN0b21lcklEUmF3fSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJJRH0gPSAkUGFyYW17Q3VzdG9tZXJJRFJhd307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte1NlYXJjaH0KICAgICAgICAmJiAhJFBhcmFte1VzZXJMb2dpbn0KICAgICAgICAmJiAhJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9CiAgICAgICAgJiYgISRQYXJhbXtDdXN0b21lcklEfQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2VhcmNoLCBVc2VyTG9naW4sIFBvc3RNYXN0ZXJTZWFyY2gsIEN1c3RvbWVySURSYXcgb3IgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYnVpbGQgZmlsdGVyCiAgICBteSAkRmlsdGVyID0gJyc7CiAgICBpZiAoICRQYXJhbXtTZWFyY2h9ICkgewoKICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgIG15IEBQYXJ0cyA9IHNwbGl0KCAvXCsvLCAkUGFyYW17U2VhcmNofSwgNiApOwogICAgICAgIGZvciBteSAkUGFydCAoQFBhcnRzKSB7CgogICAgICAgICAgICAkUGFydCA9ICRTZWxmLT57U2VhcmNoUHJlZml4fSAuICRQYXJ0IC4gJFNlbGYtPntTZWFyY2hTdWZmaXh9OwogICAgICAgICAgICAkUGFydCA9fiBzLyhcJSspL1wlL2c7CiAgICAgICAgICAgICRQYXJ0ID1+IHMvKFwqKylcKi8qL2c7CiAgICAgICAgICAgICRDb3VudCsrOwoKICAgICAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcwogICAgICAgICAgICAjIGFzIHRoZXkgY2Fubm90IGJlIHJldHJpZXZlZCBoZXJlCiAgICAgICAgICAgIG15IEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfQogICAgICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzfSB9OwoKICAgICAgICAgICAgaWYgKEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgICAgICAgICAjIHF1b3RlIExEQVAgZmlsdGVyIHZhbHVlIGJ1dCBrZWVwIGFzdGVyaXNrcyB1bmVzY2FwZWQgKHdpbGRjYXJkKQogICAgICAgICAgICAgICAgJFBhcnQgPX4gcy9cKi9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC9nOwogICAgICAgICAgICAgICAgJFBhcnQgPSBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkU2VsZi0+X0NvbnZlcnRUbygkUGFydCkgKTsKICAgICAgICAgICAgICAgICRQYXJ0ID1+IHMvZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvKi9nOwoKICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gJyh8JzsKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMpIHsKICAgICAgICAgICAgICAgICAgICAkRmlsdGVyIC49ICIoJEZpZWxkPSIgLiAkUGFydCAuICcpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gJyknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgcXVvdGUgTERBUCBmaWx0ZXIgdmFsdWUgYnV0IGtlZXAgYXN0ZXJpc2tzIHVuZXNjYXBlZCAod2lsZGNhcmQpCiAgICAgICAgICAgICAgICAkUGFydCA9fiBzL1wqL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwL2c7CiAgICAgICAgICAgICAgICAkUGFydCA9IGVzY2FwZV9maWx0ZXJfdmFsdWUoJFBhcnQpOwogICAgICAgICAgICAgICAgJFBhcnQgPX4gcy9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC8qL2c7CgogICAgICAgICAgICAgICAgJEZpbHRlciAuPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiAkUGFydCAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ291bnQgPiAxICkgewogICAgICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlcikiOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICkgewoKICAgICAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcwogICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICBteSBAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAhZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9CiAgICAgICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHN9IH07CgogICAgICAgIGlmIChAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcykgewoKICAgICAgICAgICAgIyBxdW90ZSBMREFQIGZpbHRlciB2YWx1ZSBidXQga2VlcCBhc3Rlcmlza3MgdW5lc2NhcGVkICh3aWxkY2FyZCkKICAgICAgICAgICAgJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ID1+IHMvXCovZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvZzsKICAgICAgICAgICAgJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ID0gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICk7CiAgICAgICAgICAgICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSA9fiBzL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwLyovZzsKCiAgICAgICAgICAgICRGaWx0ZXIgPSAnKHwnOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcykgewogICAgICAgICAgICAgICAgJEZpbHRlciAuPSAiKCRGaWVsZD0kUGFyYW17UG9zdE1hc3RlclNlYXJjaH0pIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRmlsdGVyIC49ICcpJzsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkUGFyYW17VXNlckxvZ2lufSApIC4gJyknOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJJRH0gKSB7CgogICAgICAgICMgJFBhcmFte0N1c3RvbWVySURSYXd9IGlzIGFsc28gaGFuZGxlZCBpbiB0aGUgdGhpcyBibG9jawogICAgICAgICMgdGhlcmUgaXMgbm8gJyonIHdpbGRjYXJkIGV4cGFuc2lvbiB3aGVuIHNlYXJjaGluZyBmb3IgQ3VzdG9tZXJJRAogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09IiAuIGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtDdXN0b21lcklEfSApIC4gJyknOwogICAgfQoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBhZGQgdmFsaWQgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57VmFsaWRGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntWYWxpZEZpbHRlcn0pIjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSBqb2luICc6OicsIG1hcCB7ICRfIC4gJz0nIC4gJFBhcmFteyRffSB9IHNvcnQga2V5cyAlUGFyYW07CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIFVzZSBjYWNoZSBmb3IgbXVsdGl0ZW5hbmN5LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JFVzZXJzfSBpZiByZWYgJFVzZXJzIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBsZGFwIGNvbm5lY3QKICAgIHJldHVybiBpZiAhJFNlbGYtPl9Db25uZWN0KCk7CgogICAgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHMgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKCiAgICAjIGNvbWJpbmUgbmVlZGVkIGF0dHJzCiAgICBteSBAQXR0cmlidXRlcyA9ICggQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcywgJFNlbGYtPntDdXN0b21lcktleX0gKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIERvbid0IHNlYXJjaCBmb3IgY3VzdG9tZXIgdXNlcnMgd2l0aG91dCBncm91cCBwZXJtaXNzaW9uLgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgbXkgJEdyb3VwSURBdHRyOwogICAgICAgIGZvciBteSAkTWFwICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICBpZiAoICRNYXAtPlswXSBlcSAnVXNlckdyb3VwSUQnICkgewogICAgICAgICAgICAgICAgJEdyb3VwSURBdHRyID0gJE1hcC0+WzJdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFRoZSBzb3VyY2Ugc3VwcG9ydHMgbXVsdGl0ZW5hbmN5LgogICAgICAgIGlmICgkR3JvdXBJREF0dHIpIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICAgICAgICAgICMgVE9ETzogV29ya2Fyb3VuZCB1bnRpbCB0aGUgc2VhcmNoIGdldHMgY2hhbmdlZC4gU2VlIEN1c3RvbWVyVXNlci9MREFQLnBtIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgJFBhcmFte0xpbWl0fSA9IDEwMDAwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UgbWF0Y2ggZm9yIGdyb3VwIElEcyBvciBncm91cCBuYW1lcy4KICAgICAgICAgICAgbXkgQFVzZXJHcm91cHMgPSAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gPyBAeyAkU2VsZi0+e1VzZXJHcm91cHN9IH0gOiBAeyAkU2VsZi0+e1VzZXJHcm91cElEc30gfTsKCiAgICAgICAgICAgICMgUmVtYXAgbG9jYWwgZ3JvdXBzIHRvIHJlbW90ZSBncm91cHMuCiAgICAgICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NhbEdyb3VwID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgIEBVc2VyR3JvdXBzID0gbWFwIHsgJF8gZXEgJExvY2FsR3JvdXAgPyAkUmVtb3RlR3JvdXAgOiAkXyB9IEBVc2VyR3JvdXBzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEJ1aWxkIGZpbHRlciBzdHJpbmcuIElmIHRoZSBmaWVsZCBpcyBlbXB0eSwgd2UgaGF2ZSBhY2Nlc3MgYnkgZGVmYXVsdC4KICAgICAgICAgICAgbXkgJEFkZGl0aW9uYWxGaWx0ZXIgPSAiKHwoISgkR3JvdXBJREF0dHI9KikpIjsKICAgICAgICAgICAgZm9yIG15ICRVc2VyR3JvdXAgKEBVc2VyR3JvdXBzKSB7CiAgICAgICAgICAgICAgICAkQWRkaXRpb25hbEZpbHRlciAuPSAiKCRHcm91cElEQXR0cj0kVXNlckdyb3VwKSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEFkZGl0aW9uYWxGaWx0ZXIgLj0gJykpJzsKCiAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBsYXN0IGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGFkZCB0aGUgY3VzdG9tIGZpbHRlciB0byB0aGUgc2VhcmNoLgogICAgICAgICAgICAkRmlsdGVyID0gc3Vic3RyICRGaWx0ZXIsIDAsIC0xOwogICAgICAgICAgICAkRmlsdGVyIC49ICRBZGRpdGlvbmFsRmlsdGVyOwogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgcGVyZm9ybSB1c2VyIHNlYXJjaAogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntCYXNlRE59LAogICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgZmlsdGVyICAgID0+ICRGaWx0ZXIsCiAgICAgICAgc2l6ZWxpbWl0ID0+ICRQYXJhbXtMaW1pdH0gfHwgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICBhdHRycyAgICAgPT4gXEBBdHRyaWJ1dGVzLAogICAgKTsKCiAgICAjIGxvZyBsZGFwIGVycm9ycwogICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgKSB7CiAgICAgICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgPT0gNCApIHsKCiAgICAgICAgICAgICMgUmVzdWx0IGNvZGUgNCAoTERBUF9TSVpFTElNSVRfRVhDRUVERUQpIGlzIG5vcm1hbCBpZiB0aGVyZQogICAgICAgICAgICAjIGFyZSBtb3JlIGl0ZW1zIGluIExEQVAgdGhhbiBzZWFyY2ggbGltaXQgZGVmaW5lZCBpbiBPVE9CTyBvcgogICAgICAgICAgICAjIGluIExEQVAgc2VydmVyLiBBdm9pZCBzcGFtbWluZyBsb2dzIHdpdGggc3VjaCBlcnJvcnMuCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMREFQIHNpemUgbGltaXQgZXhjZWVkZWQgKCcgLiAkUmVzdWx0LT5lcnJvcigpIC4gJykuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2ggZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBkeW5hbWljIGZpZWxkIGhhbmRsaW5nCiAgICBteSBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwogICAgbXkgJUN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzID0gbWFwICB7ICRfID0+IDEgfSBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHM7CgogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwogICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgbXkgJVVzZXJzOwogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHQtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIG15ICRDdXN0b21lclN0cmluZyA9ICcnOwoKICAgICAgICBteSAkQ3VzdG9tZXJLZXk7CiAgICAgICAgaWYgKCBkZWZpbmVkICRFbnRyeS0+Z2V0X3ZhbHVlKCAkU2VsZi0+e0N1c3RvbWVyS2V5fSApICkgewogICAgICAgICAgICAkQ3VzdG9tZXJLZXkgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkRW50cnktPmdldF92YWx1ZSggJFNlbGYtPntDdXN0b21lcktleX0gKSApOwogICAgICAgIH0KCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyBkeW5hbWljIGZpZWxkIHZhbHVlCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzeyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICFkZWZpbmVkICRDdXN0b21lcktleTsKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgIWV4aXN0cyAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRmllbGR9OwoKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSBbJFZhbHVlXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBAVmFsdWVzOwoKICAgICAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50VmFsdWUgKCBAeyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhZGVmaW5lZCAkQ3VycmVudFZhbHVlIHx8ICFsZW5ndGggJEN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlYWRhYmxlVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkQ3VycmVudFZhbHVlLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRSZWFkYWJsZVZhbHVlKSB8fCAhZGVmaW5lZCAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUG9zc2libGVWYWx1ZXMtPnsgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSA9ICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWx1ZXMsICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDdXN0b21lclN0cmluZyAuPSAoIGpvaW4gJyAnLCBAVmFsdWVzICkgLiAnICc7CgogICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPl9Db252ZXJ0RnJvbSggJEVudHJ5LT5nZXRfdmFsdWUoJEZpZWxkKSApOwoKICAgICAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgPX4gL150YXJnZXRhZGRyZXNzJC9pICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9fiBzL1NNVFA6KC4qKS8kMS87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJTdHJpbmcgLj0gJFZhbHVlIC4gJyAnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkQ3VzdG9tZXJTdHJpbmcgPX4gcy9eKC4qKVxzKC4rP1xALis/XC4uKz8pKFxzfCkkLyIkMSIgPCQyPi87CgogICAgICAgIGlmICggZGVmaW5lZCAkQ3VzdG9tZXJLZXkgKSB7CiAgICAgICAgICAgICRVc2Vyc3skQ3VzdG9tZXJLZXl9ID0gJEN1c3RvbWVyU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgbmVlZCB0byBiZSBpbiBhIGdyb3VwIQogICAgaWYgKCAkU2VsZi0+e0dyb3VwRE59ICkgewoKICAgICAgICBmb3IgbXkgJEZpbHRlcjIgKCBzb3J0IGtleXMgJVVzZXJzICkgewoKICAgICAgICAgICAgbXkgJFJlc3VsdDIgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntHcm91cEROfSwKICAgICAgICAgICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgICAgICAgICBmaWx0ZXIgICAgPT4gJ21lbWJlclVpZD0nIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSgkRmlsdGVyMiksCiAgICAgICAgICAgICAgICBzaXplbGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgICAgICAgICAgYXR0cnMgICAgID0+IFsnMS4xJ10sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzdWx0Mi0+YWxsX2VudHJpZXMoKSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkVXNlcnN7JEZpbHRlcjJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJVVzZXJzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJVVzZXJzOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2hEZXRhaWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRmllbGRzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBSZXR1cm4gb25seSB2YWxpZCB1c2VycyBwZXIgZGVmYXVsdAogICAgbXkgJFZhbGlkID0gJFBhcmFte1ZhbGlkfSAvLyAxOwoKICAgICRQYXJhbXtMaW1pdH0gLy89ICcnOwoKICAgICMgU3BsaXQgdGhlIHNlYXJjaCBmaWVsZHMgaW4gc2NhbGFyIGFuZCBhcnJheSBmaWVsZHMsIGJlZm9yZSB0aGUgZGlmZnJlbnQgaGFuZGxpbmcuCiAgICBteSBAU2NhbGFyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICdJbnB1dCcgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CiAgICBteSBAQXJyYXlTZWFyY2hGaWVsZHMgID0gZ3JlcCB7ICdTZWxlY3Rpb24nIGVxICRfLT57VHlwZX0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgICMgVmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXlyZWYuCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKEBBcnJheVNlYXJjaEZpZWxkcykgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9ICkgewogICAgICAgICAgICAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gfHw9IFtdOwoKICAgICAgICAgICAgbmV4dCBBUkdVTUVOVDsKICAgICAgICB9CgogICAgICAgIGlmICggcmVmICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50LT57TmFtZX0gbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNldCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHRoZSByZXR1cm4gdHlwZS4KICAgIG15ICRSZXN1bHQgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwoKICAgICMgU3BlY2lhbCBoYW5kbGluZyBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewoKICAgICAgICAjIElnbm9yZSB0aGUgcGFyYW1ldGVyICdMaW1pdCcgd2hlbiByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgICAgICRQYXJhbXtMaW1pdH0gPSAnJzsKCiAgICAgICAgIyBEZWxldGUgdGhlIE9yZGVyQnkgcGFyYW1ldGVyIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte09yZGVyQnl9ID0gW107CiAgICB9CgogICAgIyBEZWZpbmUgb3JkZXIgdGFibGUgZnJvbSB0aGUgc2VhcmNoIGZpZWxkcy4KICAgIG15ICVPcmRlckJ5VGFibGUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfLT57RGF0YWJhc2VGaWVsZH0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICBteSAkU2VsZWN0aW9uc0RhdGEgPSAkRmllbGQtPntTZWxlY3Rpb25zRGF0YX07CgogICAgICAgIGZvciBteSAkU2VsZWN0ZWRWYWx1ZSAoIEB7ICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSB9ICkgewoKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAgICBpZiAoICEkU2VsZWN0aW9uc0RhdGEtPnskU2VsZWN0ZWRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgc2VsZWN0ZWQgdmFsdWUgJEZpZWxkLT57TmFtZX0gaXMgbm90IHZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgQnVpbGQgdGhlIGxkYXAgZmlsdGVyIGZvciB0aGUgZGlmZnJlbnQgc2VhcmNoIHBhcmFtcy4KICAgIG15ICRGaWx0ZXIgPSAnJzsKCiAgICBmb3IgbXkgJEZpZWxkIChAU2NhbGFyU2VhcmNoRmllbGRzKSB7CgogICAgICAgICMgU2VhcmNoIGZvciBzY2FsYXIgZmllbGRzICh3aWxkY2FyZHMgYXJlIGFsbG93ZWQpLgogICAgICAgIGlmICggJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ICkgewoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHMvKFwlKykvXCUvZzsKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHMvKFwqKylcKi8qL2c7CgogICAgICAgICAgICAkRmlsdGVyIC49ICIoJEZpZWxkLT57RGF0YWJhc2VGaWVsZH09IiAuICRTZWxmLT5fQ29udmVydFRvKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gKSAuICIpIjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRGaWx0ZXIpIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlcikiOwogICAgfQoKICAgIG15ICRBcnJheUZpbHRlciA9ICcnOwoKICAgICMgU3BlY2lhbCBwYXJhbWV0ZXIgZm9yIEN1c3RvbWVySURzIGZyb20gYSBjdXN0b21lciBjb21wYW55IHNlYXJjaCByZXN1bHQuCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0N1c3RvbWVyQ29tcGFueVNlYXJjaEN1c3RvbWVySURzfSApICkgewogICAgICAgICRBcnJheUZpbHRlciAuPSAnKHwnOwogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17Q3VzdG9tZXJDb21wYW55U2VhcmNoQ3VzdG9tZXJJRHN9IH0gKSB7CiAgICAgICAgICAgICRBcnJheUZpbHRlciAuPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09IiAuICRTZWxmLT5fQ29udmVydFRvKCRPbmVQYXJhbSkgLiAiKSI7CiAgICAgICAgfQogICAgICAgICRBcnJheUZpbHRlciAuPSAnKSc7CiAgICB9CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgIyBJZ25vcmUgZW1wdHkgbGlzdHMuCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH07CgogICAgICAgICRBcnJheUZpbHRlciAuPSAnKHwnOwogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfSApIHsKICAgICAgICAgICAgJEFycmF5RmlsdGVyIC49ICIoJEZpZWxkLT57RGF0YWJhc2VGaWVsZH09IiAuICRTZWxmLT5fQ29udmVydFRvKCRPbmVQYXJhbSkgLiAiKSI7CiAgICAgICAgfQogICAgICAgICRBcnJheUZpbHRlciAuPSAnKSc7CiAgICB9CgogICAgIyBBZGQgdGhlIGFycmF5IGZpbHRlciBmaWVsZHMgdG8gdGhlIGxkYXAgZmlsdGVyLgogICAgaWYgKCRBcnJheUZpbHRlcikgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJEFycmF5RmlsdGVyKSI7CiAgICB9CgogICAgbXkgJERCT2JqZWN0ICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBDaGVjayBhbGwgY29uZmlndXJlZCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMsIGJ1aWxkIGxvb2t1cCBoYXNoIGJ5IG5hbWUuCiAgICBteSAlQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkTmFtZTJDb25maWc7CiAgICBteSAkQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICk7CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgICRDdXN0b21lclVzZXJEeW5hbWljRmllbGROYW1lMkNvbmZpZ3sgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgIG15ICRTUUxEeW5hbWljRmllbGRGcm9tICAgICA9ICcnOwogICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlICAgID0gJyc7CiAgICBteSAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIgPSAxOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkc30gKSB7CgogICAgICAgIG15ICRTZWFyY2hQYXJhbSA9ICRQYXJhbXsgIkR5bmFtaWNGaWVsZF8iIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH07CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggISRTZWFyY2hQYXJhbSApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggcmVmICRTZWFyY2hQYXJhbSBuZSAnSEFTSCcgKTsKCiAgICAgICAgbXkgJE5lZWRKb2luOwoKICAgICAgICBmb3IgbXkgJE9wZXJhdG9yICggc29ydCBrZXlzICV7JFNlYXJjaFBhcmFtfSApIHsKCiAgICAgICAgICAgIG15IEBTZWFyY2hQYXJhbXMgPSAoIHJlZiAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IGVxICdBUlJBWScgKQogICAgICAgICAgICAgICAgPyBAeyAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IH0KICAgICAgICAgICAgICAgIDogKCAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9ICk7CgogICAgICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnJzsKICAgICAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyBBTkQgKCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnICgnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIFRFWFQ6CiAgICAgICAgICAgIGZvciBteSAkVGV4dCAoQFNlYXJjaFBhcmFtcykgewogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICggIWRlZmluZWQgJFRleHQgfHwgJFRleHQgZXEgJycgKTsKCiAgICAgICAgICAgICAgICAkVGV4dCA9fiBzL1wqLyUvZ2k7CgogICAgICAgICAgICAgICAgIyBDaGVjayBzZWFyY2ggYXR0cmlidXRlLCB3ZSBkbyBub3QgbmVlZCB0byBzZWFyY2ggZm9yICcqJy4KICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAkVGV4dCA9fiAvXlwlezEsM30kLzsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGVTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSB8fCAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRWYWxpZGF0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHZhbHVlICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRUZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICInIG9uIGZpZWxkICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGQtPntOYW1lfSAuICInISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoU1FMR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIiwKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciAgICAgICAgICAgPT4gJE9wZXJhdG9yLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFRlcm0gICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJykgJzsKCiAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlIC49ICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YjsKICAgICAgICAgICAgICAgICROZWVkSm9pbiA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkTmVlZEpvaW4pIHsKICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZEZyb20gLj0gIgogICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBkeW5hbWljX2ZpZWxkX3ZhbHVlIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlcgogICAgICAgICAgICAgICAgICAgIE9OIChkZl9vYmpfaWRfbmFtZS5vYmplY3RfaWQgPSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIub2JqZWN0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIuZmllbGRfaWQgPSAiCiAgICAgICAgICAgICAgICAuICREQk9iamVjdC0+UXVvdGUoICREeW5hbWljRmllbGQtPntJRH0sICdJbnRlZ2VyJyApIC4gIikKICAgICAgICAgICAgIjsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRKb2luQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIEV4ZWN1dGUgYSBkeW5hbWljIGZpZWxkIHNlYXJjaCwgaWYgYSBkeW5hbWljIGZpZWxkIHdoZXJlIHN0YXRlbWVudCBleGlzdHMuCiAgICBpZiAoJFNRTER5bmFtaWNGaWVsZFdoZXJlKSB7CgogICAgICAgIG15IEBEeW5hbWljRmllbGRVc2VyTG9naW5zOwoKICAgICAgICAjIHNxbCB1ZXJ5IGZvciB0aGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkID0gIlNFTEVDVCBESVNUSU5DVChkZl9vYmpfaWRfbmFtZS5vYmplY3RfbmFtZSkgRlJPTSBkeW5hbWljX2ZpZWxkX29ial9pZF9uYW1lIGRmX29ial9pZF9uYW1lICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkRnJvbQogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKCiAgICAgICAgbXkgJFVzZWRDYWNoZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkVXNlckxvZ2lucyA9IEB7JER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YX07CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHRoZSB1c2VkIGNhY2hlIGZsYWcKICAgICAgICAgICAgICAgICAgICAkVXNlZENhY2hlID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEdldCB0aGUgZGF0YSBvbmx5IGZyb20gZGF0YWJhc2UsIGlmIG5vIGNhY2hlIGVudHJ5IGV4aXN0cy4KICAgICAgICBpZiAoICEkVXNlZENhY2hlICkgewoKICAgICAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgICAgICBTUUwgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkVXNlckxvZ2lucywgJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBEeW5hbWljRmllbGRVc2VyTG9naW5zLAogICAgICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWRkIHRoZSB1c2VyIGxvZ2lucyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkcywgaWYgYSBzZWFyY2ggcmVzdWx0IGV4aXN0cyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaAogICAgICAgICMgICBvciBza2lwIHRoZSBzZWFyY2ggYW5kIHJldHVybiBhIGVtcHRyeSBhcnJheSByZWYsIGlmIG5vIHVzZXIgbG9naW5zIGV4aXN0cyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaC4KICAgICAgICBpZiAoQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMpIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRVc2VyTG9naW5zRmlsdGVyID0gJyh8JzsKICAgICAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMpIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRVc2VyTG9naW5zRmlsdGVyIC49ICIoJFNlbGYtPntDdXN0b21lcktleX09IiAuICRTZWxmLT5fQ29udmVydFRvKCRPbmVQYXJhbSkgLiAiKSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZFVzZXJMb2dpbnNGaWx0ZXIgLj0gJyknOwoKICAgICAgICAgICAgIyBBZGQgdGhlIGR5bmFtaWMgZmllbGQgdXNlciBsb2dpbnMgZmlsdGVyIHRvIHRoZSBsZGFwIGZpbHRlci4KICAgICAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkRHluYW1pY0ZpZWxkVXNlckxvZ2luc0ZpbHRlcikiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRSZXN1bHQgZXEgJ0NPVU5UJyA/IDAgOiBbXTsKICAgICAgICB9CiAgICB9CgogICAgIyBTcGVjaWFsIHBhcmFtZXRlciB0byBleGNsdWRlIHNvbWUgdXNlciBsb2dpbnMgZnJvbSB0aGUgc2VhcmNoIHJlc3VsdC4KICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RXhjbHVkZVVzZXJMb2dpbnN9ICkgKSB7CiAgICAgICAgbXkgJEV4Y2x1ZGVVc2VyTG9naW5zRmlsdGVyID0gJygmJzsKICAgICAgICBmb3IgbXkgJE9uZVBhcmFtICggQHsgJFBhcmFte0V4Y2x1ZGVVc2VyTG9naW5zfSB9ICkgewogICAgICAgICAgICAkRXhjbHVkZVVzZXJMb2dpbnNGaWx0ZXIgLj0gIighKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiAkU2VsZi0+X0NvbnZlcnRUbygkT25lUGFyYW0pIC4gIikpIjsKICAgICAgICB9CiAgICAgICAgJEV4Y2x1ZGVVc2VyTG9naW5zRmlsdGVyIC49ICcpJzsKCiAgICAgICAgIyBBZGQgdGhlIGV4Y2x1ZGUgdXNlciBsb2dpbnMgZmlsdGVyIHRvIHRoZSBsZGFwIGZpbHRlci4KICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRFeGNsdWRlVXNlckxvZ2luc0ZpbHRlcikiOwogICAgfQoKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1ZhbGlkRmlsdGVyfSAmJiAkVmFsaWQgKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkU2VsZi0+e1ZhbGlkRmlsdGVyfSkiOwogICAgfQoKICAgICMgRGVmYXVsdCBmaWx0ZXIgZm9yIHRoZSBzZWFyY2gsIGlmIG5vIGZpbHRlciBleGlzdHMuCiAgICBpZiAoICEkRmlsdGVyICkgewogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSopIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnkgY29udGFpbnMgb25seSB1bmlxdWUgdmFsaWQgdmFsdWVzLgogICAgbXkgJU9yZGVyQnlTZWVuOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIGlmICggISRPcmRlckJ5IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeSBjb250YWlucyBpbnZhbGlkIHZhbHVlICckT3JkZXJCeScgb3IgdGhlIHZhbHVlIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBSZW1lbWJlciB0aGUgdmFsdWUgdG8gY2hlY2sgaWYgaXQgYXBwZWFycyBtb3JlIHRoYW4gb25jZS4KICAgICAgICAkT3JkZXJCeVNlZW57JE9yZGVyQnl9ID0gMTsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnlEaXJlY3Rpb24gYXJyYXkgY29udGFpbnMgb25seSAnVXAnIG9yICdEb3duJy4KICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgT25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkLgogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ1VwJzsKICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdEb3duJzsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5RGlyZWN0aW9uIGNhbiBvbmx5IGNvbnRhaW4gJ1VwJyBvciAnRG93bichIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEFzc2VtYmxlIHRoZSBPUkRFUiBCWSBjbGF1c2UuCiAgICBteSBAT3JkZXJCeUZpZWxkczsKICAgIG15ICRPcmRlckJ5U3RyaW5nID0gJyc7CiAgICBteSAkQ291bnQgICAgICAgICA9IDA7CgogICAgT1JERVJCWToKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewogICAgICAgIG5leHQgT1JERVJCWSBpZiAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX07CgogICAgICAgIG15ICREaXJlY3Rpb24gPSAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIHx8ICdEb3duJzsKCiAgICAgICAgJE9yZGVyQnlTdHJpbmcgLj0gJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gLiAkRGlyZWN0aW9uOwoKICAgICAgICBwdXNoIEBPcmRlckJ5RmllbGRzLCB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJE9yZGVyQnksCiAgICAgICAgICAgIERhdGFiYXNlRmllbGQgPT4gJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0sCiAgICAgICAgICAgIERpcmVjdGlvbiAgICAgPT4gJERpcmVjdGlvbiwKICAgICAgICB9OwogICAgfQogICAgY29udGludWUgewogICAgICAgICRDb3VudCsrOwogICAgfQoKICAgICMgSWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBvcmRlcmluZyBpcyBub3QgZGV0ZXJtaW5lZAogICAgIyAgIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkLgogICAgaWYgKCAhZ3JlcCB7ICRfIGVxICdVc2VyTG9naW4nIH0gKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApICkgewogICAgICAgIHB1c2ggQE9yZGVyQnlGaWVsZHMsIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVXNlckxvZ2luJywKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAiJFNlbGYtPntDdXN0b21lcktleX0iLAogICAgICAgICAgICBEaXJlY3Rpb24gICAgID0+ICdEb3duJywKICAgICAgICB9OwogICAgfQoKICAgIG15ICRDYWNoZUtleSA9ICdDdXN0b21lclNlYXJjaERldGFpbDo6JyAuICRSZXN1bHQgLiAkRmlsdGVyIC4gJFBhcmFte0xpbWl0fSAuICRPcmRlckJ5U3RyaW5nOwoKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJENhY2hlRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGRlZmluZWQgJENhY2hlRGF0YSApIHsKICAgICAgICAgICAgaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRDYWNoZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCRDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIGNDbWJpbmUgbmVlZGVkIGF0dHJpYnV0ZXMuCiAgICBteSBAQXR0cmlidXRlcyA9IG1hcCB7ICRfLT57RGF0YWJhc2VGaWVsZH0gfSBAT3JkZXJCeUZpZWxkczsKCiAgICAjIFBlcmZvcm0gdGhlIGxkYXAgdXNlciBzZWFyY2guCiAgICBteSAkUmVzdWx0U2VhcmNoID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0Jhc2VETn0sCiAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICBmaWx0ZXIgICAgPT4gJEZpbHRlciwKICAgICAgICBzaXplbGltaXQgPT4gJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICBhdHRycyAgICAgPT4gXEBBdHRyaWJ1dGVzLAogICAgKTsKCiAgICBpZiAoICRSZXN1bHRTZWFyY2gtPmNvZGUoKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFJlc3VsdFNlYXJjaC0+ZXJyb3IoKSwKICAgICAgICApOwogICAgfQoKICAgIG15IEBUbXBDdXN0b21lclVzZXJzOwogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHRTZWFyY2gtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIG15ICVEYXRhOwogICAgICAgIGZvciBteSAkT3JkZXJCeSAoQE9yZGVyQnlGaWVsZHMpIHsKCiAgICAgICAgICAgIG15ICRGaWVsZFZhbHVlID0gJEVudHJ5LT5nZXRfdmFsdWUoICRPcmRlckJ5LT57RGF0YWJhc2VGaWVsZH0gKTsKICAgICAgICAgICAgJEZpZWxkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCRGaWVsZFZhbHVlKTsKCiAgICAgICAgICAgICREYXRheyAkT3JkZXJCeS0+e05hbWV9IH0gPSAkRmllbGRWYWx1ZTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQFRtcEN1c3RvbWVyVXNlcnMsIFwlRGF0YTsKICAgIH0KCiAgICAjIFNvcnQgdGhlIGN1c3RvbWVyIHVzZXJzLgogICAgQFRtcEN1c3RvbWVyVXNlcnMgPSBzb3J0IHsgJFNlbGYtPl9TZWFyY2hSZXN1bHRTb3J0KEBPcmRlckJ5RmllbGRzKSB9IEBUbXBDdXN0b21lclVzZXJzOwoKICAgIG15IEBJRHM7CgogICAgIyBDaGVjayBpZiB1c2VyIG5lZWQgdG8gYmUgaW4gYSBncm91cCEKICAgIGlmICggJFNlbGYtPntHcm91cEROfSApIHsKCiAgICAgICAgRklMVEVSSUQ6CiAgICAgICAgZm9yIG15ICREYXRhIChAVG1wQ3VzdG9tZXJVc2VycykgewoKICAgICAgICAgICAgbXkgJFJlc3VsdEdyb3VwRE4gPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntHcm91cEROfSwKICAgICAgICAgICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgICAgICAgICBmaWx0ZXIgICAgPT4gJ21lbWJlclVpZD0nIC4gJERhdGEtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgc2l6ZWxpbWl0ID0+ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICAgICAgICAgICAgICBhdHRycyAgICAgPT4gWycxLjEnXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRklMVEVSSUQgaWYgISRSZXN1bHRHcm91cEROLT5hbGxfZW50cmllcygpOwoKICAgICAgICAgICAgcHVzaCBASURzLCAkRGF0YS0+e1VzZXJMb2dpbn07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgQElEcyA9IG1hcCB7ICRfLT57VXNlckxvZ2lufSB9IEBUbXBDdXN0b21lclVzZXJzOwogICAgfQoKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICBzcGxpY2UgQElEcywgJFBhcmFte0xpbWl0fTsKICAgIH0KCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+IHNjYWxhciBASURzLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2NhbGFyIEBJRHM7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+IFxASURzLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gXEBJRHM7CiAgICB9Cn0KCnN1YiBDdXN0b21lcklETGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZCAgICAgID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CiAgICBteSAkU2VhcmNoVGVybSA9ICRQYXJhbXtTZWFyY2hUZXJtfSB8fCAnJzsKCiAgICBteSAkQ2FjaGVLZXkgPSAiQ3VzdG9tZXJJRExpc3Q6OiR7VmFsaWR9OjokU2VhcmNoVGVybSI7CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JFJlc3VsdH0gaWYgcmVmICRSZXN1bHQgZXEgJ0FSUkFZJzsKICAgIH0KCiAgICAjIHByZXBhcmUgZmlsdGVyCiAgICBteSAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVySUR9PSopIjsKICAgIGlmICgkU2VhcmNoVGVybSkgewoKICAgICAgICBteSAkU2VhcmNoRmlsdGVyID0gJFNlbGYtPntTZWFyY2hQcmVmaXh9IC4gJFNlYXJjaFRlcm0gLiAkU2VsZi0+e1NlYXJjaFN1ZmZpeH07CiAgICAgICAgJFNlYXJjaEZpbHRlciA9fiBzLyhcJSspL1wlL2c7CiAgICAgICAgJFNlYXJjaEZpbHRlciA9fiBzLyhcKispXCovKi9nOwoKICAgICAgICAjIHF1b3RlIExEQVAgZmlsdGVyIHZhbHVlIGJ1dCBrZWVwIGFzdGVyaXNrcyB1bmVzY2FwZWQgKHdpbGRjYXJkKQogICAgICAgICRTZWFyY2hGaWx0ZXIgPX4gcy9cKi9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC9nOwogICAgICAgICRTZWFyY2hGaWx0ZXIgPSBlc2NhcGVfZmlsdGVyX3ZhbHVlKCRTZWFyY2hGaWx0ZXIpOwogICAgICAgICRTZWFyY2hGaWx0ZXIgPX4gcy9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC8qL2c7CgogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09JFNlYXJjaEZpbHRlcikiOwoKICAgIH0KCiAgICBpZiAoICRTZWxmLT57QWx3YXlzRmlsdGVyfSApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57QWx3YXlzRmlsdGVyfSkiOwogICAgfQoKICAgICMgYWRkIHZhbGlkIGZpbHRlcgogICAgaWYgKCAkU2VsZi0+e1ZhbGlkRmlsdGVyfSAmJiAkVmFsaWQgKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkU2VsZi0+e1ZhbGlkRmlsdGVyfSkiOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIGNvbWJpbmUgbmVlZGVkIGF0dHJzCiAgICBteSBAQXR0cmlidXRlcyA9ICggJFNlbGYtPntDdXN0b21lcktleX0sICRTZWxmLT57Q3VzdG9tZXJJRH0gKTsKCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciAgICA9PiAkRmlsdGVyLAogICAgICAgIHNpemVsaW1pdCA9PiAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiBcQEF0dHJpYnV0ZXMsCiAgICApOwoKICAgICMgbG9nIGxkYXAgZXJyb3JzCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKCiAgICAgICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgPT0gNCApIHsKCiAgICAgICAgICAgICMgUmVzdWx0IGNvZGUgNCAoTERBUF9TSVpFTElNSVRfRVhDRUVERUQpIGlzIG5vcm1hbCBpZiB0aGVyZQogICAgICAgICAgICAjIGFyZSBtb3JlIGl0ZW1zIGluIExEQVAgdGhhbiBzZWFyY2ggbGltaXQgZGVmaW5lZCBpbiBPVE9CTyBvcgogICAgICAgICAgICAjIGluIExEQVAgc2VydmVyLiBBdm9pZCBzcGFtbWluZyBsb2dzIHdpdGggc3VjaCBlcnJvcnMuCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMREFQIHNpemUgbGltaXQgZXhjZWVkZWQgKCcgLiAkUmVzdWx0LT5lcnJvcigpIC4gJykuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2ggZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVVzZXJzOwogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHQtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIG15ICRGaWVsZFZhbHVlID0gJEVudHJ5LT5nZXRfdmFsdWUoICRTZWxmLT57Q3VzdG9tZXJJRH0gKTsKICAgICAgICAkRmllbGRWYWx1ZSA9IGRlZmluZWQgJEZpZWxkVmFsdWUgPyAkRmllbGRWYWx1ZSA6ICcnOwoKICAgICAgICBteSAkS2V5VmFsdWUgPSAkRW50cnktPmdldF92YWx1ZSggJFNlbGYtPntDdXN0b21lcktleX0gKTsKICAgICAgICAkS2V5VmFsdWUgPSBkZWZpbmVkICRLZXlWYWx1ZSA/ICRLZXlWYWx1ZSA6ICcnOwogICAgICAgICRVc2Vyc3sgJFNlbGYtPl9Db252ZXJ0RnJvbSgkS2V5VmFsdWUpIH0gPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCRGaWVsZFZhbHVlKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgbmVlZCB0byBiZSBpbiBhIGdyb3VwIQogICAgaWYgKCAkU2VsZi0+e0dyb3VwRE59ICkgewogICAgICAgIGZvciBteSAkRmlsdGVyMiAoIHNvcnQga2V5cyAlVXNlcnMgKSB7CiAgICAgICAgICAgIG15ICRSZXN1bHQyID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgICAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57R3JvdXBETn0sCiAgICAgICAgICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgICAgICAgICAgZmlsdGVyICAgID0+ICdtZW1iZXJVaWQ9JyAuIGVzY2FwZV9maWx0ZXJfdmFsdWUoJEZpbHRlcjIpLAogICAgICAgICAgICAgICAgc2l6ZWxpbWl0ID0+ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICAgICAgICAgICAgICBhdHRycyAgICAgPT4gWycxLjEnXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlc3VsdDItPmFsbF9lbnRyaWVzKCkgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJFVzZXJzeyRGaWx0ZXIyfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG1ha2UgQ3VzdG9tZXJJRHMgdW5pcXVlCiAgICBteSAlVG1wOwogICAgQFRtcHsgdmFsdWVzICVVc2VycyB9ID0gdW5kZWY7CiAgICBteSBAUmVzdWx0ID0ga2V5cyAlVG1wOwoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBAUmVzdWx0Owp9CgpzdWIgQ3VzdG9tZXJJRHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRDdXN0b21lcklEcyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lcklEczo6JFBhcmFte1VzZXJ9IiwKICAgICAgICApOwogICAgICAgIHJldHVybiBAeyRDdXN0b21lcklEc30gaWYgcmVmICRDdXN0b21lcklEcyBlcSAnQVJSQVknOwogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEKICAgIG15ICVEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkUGFyYW17VXNlcn0sCiAgICApOwoKICAgICMgdGhlcmUgYXJlIG11bHRpIGN1c3RvbWVyIGlkcwogICAgbXkgQEN1c3RvbWVySURzOwogICAgaWYgKCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ICkgewoKICAgICAgICAjIHVzZWQgc2VwYXJhdG9ycwogICAgICAgIFNFUEFSQVRPUjoKICAgICAgICBmb3IgbXkgJFNlcGFyYXRvciAoICc7JywgJywnLCAnfCcgKSB7CgogICAgICAgICAgICBuZXh0IFNFUEFSQVRPUiBpZiAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ICF+IC9cUSRTZXBhcmF0b3JcRS87CgogICAgICAgICAgICAjIHNwbGl0IGl0CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvXFEkU2VwYXJhdG9yXEUvLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9OwoKICAgICAgICAgICAgZm9yIG15ICRJRCAoQElEcykgewogICAgICAgICAgICAgICAgJElEID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgICAgICRJRCA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsYXN0IFNFUEFSQVRPUjsKICAgICAgICB9CgogICAgICAgICMgZmFsbGJhY2sgaWYgbm8gc2VwYXJhdG9yIGdvdCBmb3VuZAogICAgICAgIGlmICggIUBDdXN0b21lcklEcyApIHsKICAgICAgICAgICAgJERhdGF7VXNlckN1c3RvbWVySURzfSA9fiBzL15ccysvL2c7CiAgICAgICAgICAgICREYXRhe1VzZXJDdXN0b21lcklEc30gPX4gcy9ccyskLy9nOwogICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJERhdGF7VXNlckN1c3RvbWVySURzfTsKICAgICAgICB9CiAgICB9CgogICAgIyB1c2UgYWxzbyB0aGUgcHJpbWFyeSBjdXN0b21lciBpZAogICAgaWYgKCAkRGF0YXtVc2VyQ3VzdG9tZXJJRH0gJiYgISRTZWxmLT57RXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSApIHsKICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJERhdGF7VXNlckN1c3RvbWVySUR9OwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lcklEczo6JyAuICRQYXJhbXtVc2VyfSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBDdXN0b21lcklEcywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIEBDdXN0b21lcklEczsKfQoKc3ViIEN1c3RvbWVyVXNlckRhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15IEBBdHRyaWJ1dGVzOwogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLCAkRW50cnktPlsyXTsKICAgIH0KICAgIG15ICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkUGFyYW17VXNlcn0gKSAuICcpJzsKCiAgICAjIHByZXBhcmUgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57QWx3YXlzRmlsdGVyfSApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57QWx3YXlzRmlsdGVyfSkiOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAnQ3VzdG9tZXJVc2VyRGF0YUdldDo6JyAuICRQYXJhbXtVc2VyfSwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyREYXRhfSBpZiByZWYgJERhdGEgZXEgJ0hBU0gnOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIHBlcmZvcm0gc2VhcmNoCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgIGJhc2UgICA9PiAkU2VsZi0+e0Jhc2VETn0sCiAgICAgICAgc2NvcGUgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICBmaWx0ZXIgPT4gJEZpbHRlciwKICAgICAgICBhdHRycyAgPT4gXEBBdHRyaWJ1dGVzLAogICAgKTsKCiAgICAjIGxvZyBsZGFwIGVycm9ycwogICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRSZXN1bHQtPmVycm9yKCksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZmlyc3QgZW50cnkKICAgIG15ICRSZXN1bHQyID0gJFJlc3VsdC0+ZW50cnkoMCk7CiAgICBpZiAoICEkUmVzdWx0MiApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgdXNlciBpbmZvCiAgICBteSAlRGF0YTsKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPl9Db252ZXJ0RnJvbSggJFJlc3VsdDItPmdldF92YWx1ZSggJEVudHJ5LT5bMl0gKSApIHx8ICcnOwoKICAgICAgICBpZiAoICRWYWx1ZSAmJiAkRW50cnktPlsyXSA9fiAvXnRhcmdldGFkZHJlc3MkL2kgKSB7CiAgICAgICAgICAgICRWYWx1ZSA9fiBzL1NNVFA6KC4qKS8kMS87CiAgICAgICAgfQoKICAgICAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1RyYW5zbGF0ZU1hbmFnZXJUb30gKSApIHsKICAgICAgICAgICAgaWYgKCAkVmFsdWUgJiYgJEVudHJ5LT5bMl0gPX4gL15tYW5hZ2VyJC9pICkgewoKICAgICAgICAgICAgICAgICMgV2UgbmVlZCB0byBjaGVjayBpZiB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSB0aGUgbWFuYWdlciBmbGFnCiAgICAgICAgICAgICAgICBteSAkVHJhbnNsYXRlVG8gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntUcmFuc2xhdGVNYW5hZ2VyVG99OwoKICAgICAgICAgICAgICAgICMgcGVyZm9ybSBzZWFyY2gKICAgICAgICAgICAgICAgIG15ICRSZXN1bHRNYW5hZ2VyID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgICAgICAgICAgICAgIGJhc2UgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgc2NvcGUgID0+ICdiYXNlJywKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPT4gIihvYmplY3RDbGFzcz0qKSIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGZpcnN0IGVudHJ5CiAgICAgICAgICAgICAgICBteSAkUmVzdWx0TWFuYWdlcjIgPSAkUmVzdWx0TWFuYWdlci0+ZW50cnkoMCk7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkUmVzdWx0TWFuYWdlcjItPmdldF92YWx1ZSgkVHJhbnNsYXRlVG8pICkgfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICREYXRheyAkRW50cnktPlswXSB9ID0gJFZhbHVlOwogICAgfQoKICAgIHJldHVybiBpZiAhJERhdGF7VXNlckxvZ2lufTsKCiAgICAjIGJ1aWxkIHRoZSBVc2VyTWFpbFN0cmluZywgZS5nIHF7IlRyb3kgQW5kcmV3cyBDb2xkIFJvb20gXCJUaGUgRnJpZGdlXCIgICAg8J+ltiIgPHVuaXR0ZXN0QGV4YW1wbGUub3JnPn0KICAgIHsKICAgICAgICBteSAkRmllbGRzID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CiAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRGaWVsZHMpICkgewogICAgICAgICAgICAkRmllbGRzID0gWyAnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnZW1haWwnLCBdOwogICAgICAgIH0KCiAgICAgICAgbXkgQFZhbHVlczsKICAgICAgICBGSUVMRDoKICAgICAgICBmb3IgbXkgJEZpZWxkICggJEZpZWxkcy0+QCogKSB7CgogICAgICAgICAgICAjIF9Db252ZXJ0RnJvbSgpIGlzIHVzdWFsbHkgYSBuby1vcAogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkUmVzdWx0Mi0+Z2V0X3ZhbHVlKCRGaWVsZCkgKSB8fCAnJzsKCiAgICAgICAgICAgICMgaXQgaXMgbm90IG9idmlvdXMgd2h5IHF7MH0gaXMgbm90IGEgdmFsaWQgdmFsdWUKICAgICAgICAgICAgbmV4dCBGSUVMRCB1bmxlc3MgJFZhbHVlOwoKICAgICAgICAgICAgaWYgKCAkRmllbGQgPX4gL150YXJnZXRhZGRyZXNzJC9pICkgewogICAgICAgICAgICAgICAgJFZhbHVlID1+IHMvU01UUDooLiopLyQxLzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAVmFsdWVzLCAkVmFsdWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoQFZhbHVlcykgewoKICAgICAgICAgICAgIyBGb3JtYXQgY29tcGxpYW50IHRvIFJGQyA1MzIyLiBUaGlzIGlzIHJlbGV2YW50IHdoZW4gdGhlIHJlYWwgbmFtZQogICAgICAgICAgICAjIGNvbnRhaW4gY29tbWFzLCBkb3VibGUgcXVvdGVzLCBvciBvdGhlciBzcGVjaWFsIHN5bWJvbHMuCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBsYXN0IHBhcnQgaXMgdGhlIGFkZHJlc3MuCiAgICAgICAgICAgIG15ICRBZGRyZXNzID0gcG9wIEBWYWx1ZXM7CiAgICAgICAgICAgIG15ICRQaHJhc2UgID0gam9pbiAnICcsIEBWYWx1ZXM7CiAgICAgICAgICAgICREYXRhe1VzZXJNYWlsU3RyaW5nfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKS0+Rm9ybWF0KAogICAgICAgICAgICAgICAgUmVhbE5hbWUgPT4gJFBocmFzZSwKICAgICAgICAgICAgICAgIEFkZHJlc3MgID0+ICRBZGRyZXNzLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7VXNlck1haWxTdHJpbmd9ID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgY29tcGF0IQogICAgJERhdGF7VXNlcklEfSA9ICREYXRhe1VzZXJMb2dpbn07CgogICAgIyBnZXQgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT5HZXRQcmVmZXJlbmNlcyggVXNlcklEID0+ICREYXRhe1VzZXJMb2dpbn0gKTsKCiAgICAjIGFkZCBsYXN0IGxvZ2luIHRpbWVzdGFtcAogICAgaWYgKCAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpbn0gKSB7CgogICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgRXBvY2ggPT4gJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW59LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2luVGltZXN0YW1wfSA9ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVyVXNlckRhdGFHZXQ6OicgLiAkUGFyYW17VXNlcn0sCiAgICAgICAgICAgIFZhbHVlID0+IHsgJURhdGEsICVQcmVmZXJlbmNlcyB9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gKCAlRGF0YSwgJVByZWZlcmVuY2VzICk7Cn0KCnN1YiBDdXN0b21lclVzZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdOb3Qgc3VwcG9ydGVkIGZvciB0aGlzIG1vZHVsZSEnCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIEN1c3RvbWVyVXNlclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAnTm90IHN1cHBvcnRlZCBmb3IgdGhpcyBtb2R1bGUhJwogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBTZXRQYXNzd29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQdyA9ICRQYXJhbXtQV30gfHwgJyc7CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdOb3Qgc3VwcG9ydGVkIGZvciB0aGlzIG1vZHVsZSEnCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIEdlbmVyYXRlUmFuZG9tUGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoICAgICA9PiAkUGFyYW17U2l6ZX0gfHwgOCwKICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnQScgLi4gJ1onLCAnYScgLi4gJ3onLCAnLScsICdfJywgJyEnLCAnQCcsICcjJywgJyQnLCAnJScsICdeJywgJyYnLCAnKicgXSwKICAgICk7Cn0KCnN1YiBTZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSByZXNldAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJJRH0iLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBHZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgU2VhcmNoUHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlYXJjaFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBfQ29udmVydEZyb20gewogICAgbXkgKCAkU2VsZiwgJFRleHQgKSA9IEBfOwoKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkVGV4dDsKCiAgICAjIF9Db252ZXJ0RnJvbSgpIGRvZXMgbm90aGluZyBleGNlcHQgaW4gc3BlY2lhbCBjYXNlcyB3aGVyZSBTb3VyY2VDaGFyc2V0IGlzIHNldC4KICAgIHJldHVybiAkVGV4dCB1bmxlc3MgJFNlbGYtPntTb3VyY2VDaGFyc2V0fTsKCiAgICAjIFdoZW4gU291cmNlQ2hhcnNldCBpcyAndXRmLTgnIHRoZW4gc2V0IHRoZSBVVEYtOCBmbGFnCiAgICAjIHdpdGhvdXQgY2hlY2tlY2sgd2hldGhlciB0aGUgdGF4dCBhY3R1YWxseSBpcyB2YWxpZCBVVEYtOC4KICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkNvbnZlcnQoCiAgICAgICAgVGV4dCA9PiAkVGV4dCwKICAgICAgICBGcm9tID0+ICRTZWxmLT57U291cmNlQ2hhcnNldH0sCiAgICAgICAgVG8gICA9PiAndXRmLTgnLAogICAgKTsKfQoKc3ViIF9Db252ZXJ0VG8gewogICAgbXkgKCAkU2VsZiwgJFRleHQgKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkVGV4dDsKCiAgICAjIGdldCBlbmNvZGUgb2JqZWN0CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpOwoKICAgIGlmICggISRTZWxmLT57U291cmNlQ2hhcnNldH0gKSB7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlSW5wdXQoIFwkVGV4dCApOwogICAgICAgIHJldHVybiAkVGV4dDsKICAgIH0KCiAgICByZXR1cm4gJEVuY29kZU9iamVjdC0+Q29udmVydCgKICAgICAgICBUZXh0ID0+ICRUZXh0LAogICAgICAgIFRvICAgPT4gJFNlbGYtPntTb3VyY2VDaGFyc2V0fSwKICAgICAgICBGcm9tID0+ICd1dGYtOCcsCiAgICApOwp9CgpzdWIgX0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q2FjaGVPYmplY3R9OwoKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyTG9naW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gIkN1c3RvbWVyVXNlckRhdGFHZXQ6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICk7CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gIkN1c3RvbWVyTmFtZTo6JFBhcmFte1VzZXJMb2dpbn0iLAogICAgKTsKCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2gnLAogICAgKTsKCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICdDdXN0b21lckdyb3VwJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfU2VhcmNoUmVzdWx0U29ydCB7CiAgICBteSAoICRTZWxmLCBAT3JkZXJCeUZpZWxkcyApID0gQF87CgogICAgZm9yIG15ICRPcmRlckJ5IChAT3JkZXJCeUZpZWxkcykgewogICAgICAgIG15ICRDb21wYXJlOwoKICAgICAgICBpZiAoICRPcmRlckJ5LT57RGlyZWN0aW9ufSAmJiAkT3JkZXJCeS0+e0RpcmVjdGlvbn0gZXEgJ1VwJyApIHsKICAgICAgICAgICAgJENvbXBhcmUgPSBsYyggJGEtPnsgJE9yZGVyQnktPntOYW1lfSB9ICkgY21wIGxjKCAkYi0+eyAkT3JkZXJCeS0+e05hbWV9IH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDb21wYXJlID0gbGMoICRiLT57ICRPcmRlckJ5LT57TmFtZX0gfSApIGNtcCBsYyggJGEtPnsgJE9yZGVyQnktPntOYW1lfSB9ICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tcGFyZSBpZiAkQ29tcGFyZTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGFrZSBkb3duIHNlc3Npb24KICAgIGlmICggJFNlbGYtPntMREFQfSApIHsKICAgICAgICAkU2VsZi0+e0xEQVB9LT51bmJpbmQoKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/CustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIFJvdGhlciBPU1MKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueSAtIGN1c3RvbWVyIGNvbXBhbnkgbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBDdXN0b21lciBmdW5jdGlvbnMuIEUuZy4gdG8gYWRkIGFuZCB1cGRhdGUgY3VzdG9tZXIgY29tcGFuaWVzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKRG9uJ3QgdXNlIHRoZSBjb25zdHJ1Y3RvciBkaXJlY3RseSwgdXNlIHRoZSBPYmplY3RNYW5hZ2VyIGluc3RlYWQ6CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIG15ICRMYXlvdXRQYXJhbSA9ICRLZXJuZWw6Ok9NLT57UGFyYW19LT57J0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnfTsKCiAgICAjIENoZWNrIGlmIG11bHRpdGVuYW5jeSBpcyBlbmFibGVkIGFuZCB0aGUgcmVxdWVzdCBpcyBjb21pbmcgZnJvbSBhIHVzZXIuCiAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSAmJiAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gZXEgJ1VzZXInICYmICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CgogICAgICAgICMgU2F2ZSB0aGUgVXNlcklEIGFuZCBhbGwgZ3JvdXBzIHRoZSB1c2VyIGhhcyAncm8nIHBlcm1pc3Npb24gb24uCiAgICAgICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VySUR9ICkgewogICAgICAgICAgICAjIE9ubHkgZ2V0IHRoZSBncm91cCBsaXN0IG9uY2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgICAgICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJExheW91dFBhcmFtLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBUaGUgbGltaXQgZG9lcyBub3QgY291bnQgZm9yIG1lbWJlcnMgb2YgYSBzcGVjaWZpYyBncm91cC4KICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25Hcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSB8fCAnJzsKICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgICA9IHJldmVyc2UgJUdyb3VwczsKCiAgICAgICAgICAgIGlmICggISRHcm91cHNSZXZlcnNleyRQZXJtaXNzaW9uR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3l9ID0gJExheW91dFBhcmFtLT57VXNlcklEfTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3VwSURzfSA9IFsga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIGxvYWQgY3VzdG9tZXIgY29tcGFueSBiYWNrZW5kIG1vZHVsZXMKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHNvdXJjZS4KICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55VXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e0N1c3RvbWVyQ29tcGFueVVzZXJHcm91cH07CgogICAgICAgICMgVGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgc291cmNlLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAgKSB7CiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyA9fiAvXiRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e01vZHVsZX0KICAgICAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnk6OkRCJzsKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55TWFwID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdDdXN0b21lckNvbXBhbnk6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUFkZCgpCgphZGQgYSBuZXcgY3VzdG9tZXIgY29tcGFueQoKICAgIG15ICRJRCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICA9PiAnZXhhbXBsZS5jb20nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgICAgID0+ICdOZXcgQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55U3RyZWV0ICAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVpJUCAgICAgID0+ICczMzEyNicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q2l0eSAgICAgPT4gJ01pYW1pJywKICAgICAgICBDdXN0b21lckNvbXBhbnlDb3VudHJ5ICA9PiAnVVNBJywKICAgICAgICBDdXN0b21lckNvbXBhbnlVUkwgICAgICA9PiAnaHR0cDovL3d3dy5leGFtcGxlLm9yZycsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyBhY2NlcHRlZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBkZWZhdWx0cwogICAgJFBhcmFte1NvdXJjZX0gfHw9ICdDdXN0b21lckNvbXBhbnknOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEN1c3RvbWVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHN0b3JlIGN1c3RvbWVyIGNvbXBhbnkgZGF0YQogICAgbXkgJEN1c3RvbWVySUQgPSAkU2VsZi0+eyAkUGFyYW17U291cmNlfSB9LT5DdXN0b21lckNvbXBhbnlBZGQoJVBhcmFtKTsKCiAgICByZXR1cm4gdW5sZXNzICRDdXN0b21lcklEOwoKICAgICMgdHJpZ2dlciBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ3VzdG9tZXJDb21wYW55QWRkJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBOZXdEYXRhICAgID0+IFwlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQ3VzdG9tZXJJRDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUdldCgpCgpnZXQgY3VzdG9tZXIgY29tcGFueSBhdHRyaWJ1dGVzCgogICAgbXkgJUN1c3RvbWVyQ29tcGFueSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICBDdXN0b21lcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgoKICAgICVDdXN0b21lckNvbXBhbnkgPSAoCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueU5hbWUnICAgID0+ICdDdXN0b21lciBJbmMuJywKICAgICAgICAnQ3VzdG9tZXJJRCcgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICAnQ3VzdG9tZXJDb21wYW55U3RyZWV0JyAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgICdDdXN0b21lckNvbXBhbnlaSVAnICAgICA9PiAnMzMxMjYnLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDaXR5JyAgICA9PiAnTWlhbWknLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDb3VudHJ5JyA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueVVSTCcgICAgID0+ICdodHRwOi8vZXhhbXBsZS5jb20nLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDb21tZW50JyA9PiAnU29tZSBDb21tZW50cycsCiAgICAgICAgJ1ZhbGlkSUQnICAgICAgICAgICAgICAgID0+ICcxJywKICAgICAgICAnQ3JlYXRlVGltZScgICAgICAgICAgICAgPT4gJzIwMTAtMTAtMDQgMTY6MzU6NDknLAogICAgICAgICdDaGFuZ2VUaW1lJyAgICAgICAgICAgICA9PiAnMjAxMC0xMC0wNCAxNjozNjoxMicsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyByZXR1cm5lZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBDdXN0b21lcklEISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBGZXRjaCBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb25zIGZvciBDdXN0b21lckNvbXBhbnkuCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSAkRHluYW1pY0ZpZWxkQ29uZmlncy0+QCo7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgc2VhcmNoIGZvciB0aGUgY29tcGFueSBpbiB0aGUgY29uZmlndXJlZCBzb3VyY2VzCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKCiAgICAgICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+Q3VzdG9tZXJDb21wYW55R2V0KCAlUGFyYW0sICk7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAlQ29tcGFueTsKCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9ICkgKSB7CiAgICAgICAgICAgIENVU1RPTUVSQ09NUEFOWUZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyQ29tcGFueUZpZWxkICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCB1bmxlc3MgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMl0gfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRMb29rdXB7ICRDdXN0b21lckNvbXBhbnlGaWVsZC0+WzJdIH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDb21wYW55e0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ29tcGFueXsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMF0gfSA9ICRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uLgogICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwoKICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSAmJiAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9ICkgewogICAgICAgICAgICAjIFJlcGxhY2UgdGhlIHJlbW90ZSBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIGxvY2FsIGdyb3VwLgogICAgICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSBlcSAkUmVtb3RlR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2FsR3JvdXAgPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CiAgICAgICAgICAgICAgICAgICAgJENvbXBhbnl7VXNlckdyb3VwSUR9ID0gJExvY2FsR3JvdXA7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJExvY2FsR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkQ29tcGFueXtVc2VyR3JvdXBJRH0gPSAkR3JvdXBJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDb21wYW55e1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIGluZm9ybWF0aW9uLgogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gPX4gL14kQ29tcGFueXtVc2VyR3JvdXBJRH0kLyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgICMgcmV0dXJuIGRhdGEgZm9yIHRoZSBmaXJzdCBmb3VuZCBjb21wYW55CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJUNvbXBhbnksCiAgICAgICAgICAgIFNvdXJjZSA9PiAiQ3VzdG9tZXJDb21wYW55JENvdW50IiwKICAgICAgICAgICAgQ29uZmlnID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbXBhbnkgd2FzIG5vdCBmb3VuZAogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55VXBkYXRlKCkKCnVwZGF0ZSBjdXN0b21lciBjb21wYW55IGF0dHJpYnV0ZXMKCiAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlVcGRhdGUoCiAgICAgICAgQ3VzdG9tZXJDb21wYW55SUQgICAgICAgPT4gJ29sZGV4YW1wbGUuY29tJywgIyByZXF1aXJlZCBmb3IgQ3VzdG9tZXJDb21wYW55SUQtdXBkYXRlCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICBDdXN0b21lckNvbXBhbnlOYW1lICAgICA9PiAnTmV3IEN1c3RvbWVyIEluYy4nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVN0cmVldCAgID0+ICc1MjAxIEJsdWUgTGFnb29uIERyaXZlJywKICAgICAgICBDdXN0b21lckNvbXBhbnlaSVAgICAgICA9PiAnMzMxMjYnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueUxvY2F0aW9uID0+ICdNaWFtaScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q291bnRyeSAgPT4gJ1VTQScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55VVJMICAgICAgPT4gJ2h0dHA6Ly9leGFtcGxlLmNvbScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gfHw9ICRQYXJhbXtDdXN0b21lcklEfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ3VzdG9tZXJDb21wYW55SUQgb3IgQ3VzdG9tZXJJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBjb21wYW55IGV4aXN0cwogICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gKTsKICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBjb21wYW55ICckUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9JyEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNoYW5nZSB0aGUgVXNlckdyb3VwSUQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAjIFNldCB0aGUgVXNlckdyb3VwSUQgdG8gdGhlIGN1cnJlbnQgVXNlckdyb3VwSUQuCiAgICAgICAgaWYgKCAkQ29tcGFueXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkQ29tcGFueXtVc2VyR3JvdXBJRH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyRDb21wYW55e1NvdXJjZX19LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgIyBDaGVjayBpZiBncm91cCBJRCBvciBncm91cCBuYW1lcyBzaG91bGQgYmUgdXNlZC4KICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJFBhcmFte1VzZXJHcm91cElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUmVwbGFjZSB0aGUgbG9jYWwgZ3JvdXAgd2l0aCB0aGUgYXNzb2NpYXRlZCByZW1vdGUgZ3JvdXAuCiAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gZXEgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRSZW1vdGVHcm91cDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+eyAkQ29tcGFueXtTb3VyY2V9IH0tPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSglUGFyYW0pOwoKICAgIHJldHVybiB1bmxlc3MgJFJlc3VsdDsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0N1c3RvbWVyQ29tcGFueVVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDdXN0b21lcklEICAgID0+ICRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgT2xkQ3VzdG9tZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9LAogICAgICAgICAgICBOZXdEYXRhICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIE9sZERhdGEgICAgICAgPT4gXCVDb21wYW55LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlIGxpc3QKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAlRGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CgogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17UmVhZE9ubHl9ICkgewogICAgICAgICAgICBteSAkQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQmFja2VuZENvbmZpZy0+e1JlYWRPbmx5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICRCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRGF0YXsiQ3VzdG9tZXJDb21wYW55JENvdW50In0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpLT57TmFtZX0KICAgICAgICAgICAgfHwgIk5vIE5hbWUgJENvdW50IjsKICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lckNvbXBhbnlMaXN0KCkKCmdldCBsaXN0IG9mIGN1c3RvbWVyIGNvbXBhbmllcy4KCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoKTsKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICBMaW1pdCA9PiAwLCAgICAgIyBvcHRpb25hbCwgb3ZlcnJpZGUgY29uZmlndXJlZCBzZWFyY2ggcmVzdWx0IGxpbWl0ICgwIG1lYW5zIHVubGltaXRlZCkKICAgICk7CgogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgIFNlYXJjaCA9PiAnc29tZWNvbXBhbnknLAogICAgKTsKClJldHVybnM6CgogICAgJUxpc3QgPSB7CiAgICAgICAgJ2V4YW1wbGUuY29tJyA9PiAnZXhhbXBsZS5jb20gQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgJ2FjbWUuY29tJyAgICA9PiAnYWNtZS5jb20gQWNtZSwgSW5jLicKICAgIH07Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJDb21wYW55TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0LgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In07CgogICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzLCBpZiBjb25maWd1cmVkCiAgICAgICAgbXkgJE1hcCA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH07CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1hcCkgKSB7CgogICAgICAgICAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBNYXAKICAgICAgICAgICAgIyBvbmx5IHRoZXNlIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgYW55IG90aGVyIHNlYXJjaCBjb25maWcKICAgICAgICAgICAgIyBbICdEeW5hbWljRmllbGRfTmFtZV9ZJywgdW5kZWYsICdOYW1lX1knLCAwLCAwLCAnZHluYW1pY19maWVsZCcsIHVuZGVmLCAwLF0sCiAgICAgICAgICAgIG15ICVEeW5hbWljRmllbGROYW1lcyA9IG1hcCB7ICRfLT5bMl0gPT4gMSB9IGdyZXAgeyAkXy0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyB9IEB7JE1hcH07CgogICAgICAgICAgICBpZiAoJUR5bmFtaWNGaWVsZE5hbWVzKSB7CiAgICAgICAgICAgICAgICBteSAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICBteSAkU2VhcmNoRmllbGRzOwogICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2hpY2ggb2YgdGhlIGR5bmFtaWMgZmllbGRzIGNvbmZpZ3VyZWQgaW4gTWFwIGFyZSBhbHNvCiAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZWQgaW4gU2VhcmNoRmllbGRzCgogICAgICAgICAgICAgICAgIyBwYXJhbSBTZWFyY2gKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17U2VhcmNofSAmJiBsZW5ndGggJFBhcmFte1NlYXJjaH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkcyA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkc307CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtICA9ICRQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRzKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMgPSBncmVwIHsgZXhpc3RzICREeW5hbWljRmllbGROYW1lc3skX30gfSBAeyRTZWFyY2hGaWVsZHN9OwoKICAgICAgICAgICAgICAgICAgICBteSAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICAgICAgRklFTEROQU1FOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGROYW1lIChAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkTG9va3VweyRGaWVsZE5hbWV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRE5BTUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgICAgICAgID0+ICRTZWFyY2hQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGRWYWx1ZXMpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRWYWx1ZSAoIEB7JER5bmFtaWNGaWVsZFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzeyAkRHluYW1pY0ZpZWxkVmFsdWUtPntPYmplY3RJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcyA9IFsga2V5cyAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMgXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgYmFja2VuZCBzZWFyY2ggZm9yIGZvdW5kIG9iamVjdCBJRHMKICAgICAgICAgICAgICAgICMgdGhpcyBkYXRhIGlzIGJlaW5nIG1lcmdlZCB3aXRoIHRoZSBmb2xsb3dpbmcgQ3VzdG9tZXJDb21wYW55TGlzdCBjYWxsCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMpICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0TmFtZXMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5PYmplY3RNYXBwaW5nR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAlU2VhcmNoUGFyYW0gPSAlUGFyYW07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZWFyY2hQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgICAgIG15ICVDb21wYW55TGlzdCA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT5DdXN0b21lckNvbXBhbnlMaXN0KCVTZWFyY2hQYXJhbSk7CgogICAgICAgICAgICAgICAgICAgIE9CSkVDVE5BTUU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3ROYW1lICggdmFsdWVzICV7JE9iamVjdE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1ROQU1FIGlmIGV4aXN0cyAkRGF0YXskT2JqZWN0TmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUNvbXBhbnlMaXN0ICkgJiYgZXhpc3RzICRDb21wYW55TGlzdHskT2JqZWN0TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSA9PiAkQ29tcGFueUxpc3R7JE9iamVjdE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb21wYW55IGxpc3QgcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgbXkgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+Q3VzdG9tZXJDb21wYW55TGlzdCglUGFyYW0pOwogICAgICAgICVEYXRhID0gKCAlRGF0YSwgJVN1YkRhdGEgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNlZSB0aGUgY3VzdG9tZXIgdXNlciBkYXRhLgogICAgIyBJbXByb3ZlOiBDaGVjayBldmVyeSBjb21wYW55IG9uZSBieSBvbmUgYXMgQ3VzdG9tZXJDb21wYW55TGlzdCBkb2VzIHNvbWV0aW1lcyByZXR1cm4gYSBub24gZmlsdGVyZWQgbGlzdCAoQ3VzdG9tZXJDb21wYW55IGFkZCkKICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICElQ29tcGFueSB8fCAhJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JEN1c3RvbWVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKCkKClRvIGZpbmQgY3VzdG9tZXIgY29tcGFuaWVzIGluIHRoZSBzeXN0ZW0uCgpUaGUgc2VhcmNoIGNyaXRlcmlhIGFyZSBsb2dpY2FsbHkgQU5EIGNvbm5lY3RlZC4KV2hlbiBhIGxpc3QgaXMgcGFzc2VkIGFzIGNyaXRlcmlhLCB0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBPUiBjb25uZWN0ZWQuCldoZW4gYW4gdW5kZWYgb3IgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBzZWFyY2ggY3JpdGVyaWEKaXMgaWdub3JlZC4KClJldHVybnMgZWl0aGVyIGEgbGlzdCwgYXMgYW4gYXJyYXlyZWYsIG9yIGEgY291bnQgb2YgZm91bmQgY3VzdG9tZXIgY29tcGFueSBpZHMuClRoZSBjb3VudCBvZiByZXN1bHRzIGlzIHJldHVybmVkIHdoZW4gdGhlIHBhcmFtZXRlciBDPFJlc3VsdCA9ICdDT1VOVCc+IGlzIHBhc3NlZC4KCiAgICBteSAkQ3VzdG9tZXJDb21wYW55SURzUmVmID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKAoKICAgICAgICAjIGFsbCBmaWVsZHMgaW4gYSBDdXN0b21lckNvbXBhbnlNYXAgYXJlIHNlYXJjaGFibGUKICAgICAgICBDdXN0b21lcklEICAgICAgICAgID0+ICdleGFtcGxlKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgPT4gJ05hbWUqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgYXJyYXkgcGFyYW1ldGVycyBhcmUgdXNlZCB3aXRoIGxvZ2ljYWwgT1Igb3BlcmF0b3IgKGFsbCB2YWx1ZXMgYXJlIHBvc3NpYmxlIHdoaWNoCiAgICAgICAgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZyBzZWxlY3Rpb24gaGFzaCBmb3IgdGhlIGZpZWxkKQogICAgICAgIEN1c3RvbWVyQ29tcGFueUNvdW50cnkgPT4gWyAnQXVzdHJpYScsICdHZXJtYW55JywgXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgRHluYW1pY0ZpZWxkcwogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbJ3ZhbHVlMScsICd2YWx1ZTInXQogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZE5hbWVYID0+IHsKICAgICAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBMaWtlICAgICAgICAgICAgICA9PiAndmFsdWUqJywgICAgICAgICAgICAgICAgIyAiZXF1YWxzIiBvcGVyYXRvciB3aXRoIHdpbGRjYXJkIHN1cHBvcnQKICAgICAgICAgICAgR3JlYXRlclRoYW4gICAgICAgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBHcmVhdGVyVGhhbkVxdWFscyA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuICAgICAgID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICAgICAgU21hbGxlclRoYW5FcXVhbHMgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgIH0KCiAgICAgICAgT3JkZXJCeSA9PiBbICdDdXN0b21lcklEJywgJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknIF0sICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ0N1c3RvbWVySUQnIF0KICAgICAgICAjIChhbGwgZmllbGRzIHdoaWNoIGFyZSBpbiBhIEN1c3RvbWVyQ29tcGFueU1hcCBjYW4gYmUgdXNlZCBmb3Igb3JkZXJpbmcpCgogICAgICAgICMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgT3JkZXJCeToKICAgICAgICAjIFRoZSBPcmRlckJ5RGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggT3JkZXJCeSBhdHRyaWJ1dGUuCiAgICAgICAgIyBUaGUgcGFpcmluZyBpcyBtYWRlIGJ5IHRoZSBhcnJheSBpbmRpY2VzLgoKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ0Rvd24nLCAnVXAnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgKERvd24gfCBVcCkgRGVmYXVsdDogWyAnRG93bicgXQoKICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJyB8fCAnQ09VTlQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2YgY2hhbmdlIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgY2hhbmdlcwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgKTsKClJldHVybnM6CgpSZXN1bHQ6ICdBUlJBWScKCiAgICBAQ3VzdG9tZXJJRHMgPSAoIDEsIDIsIDMgKTsKClJlc3VsdDogJ0NPVU5UJwoKICAgICRDdXN0b21lcklEcyA9IDEwOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGFsbCBnZW5lcmFsIHNlYXJjaCBmaWVsZHMgKHdpdGhvdXQgYSByZXN0cmljdGlvbiB0byBhIHNvdXJjZSkuCiAgICBteSBAQWxsU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygpOwoKICAgICMgR2VuZXJhdGUgYSBoYXNoIHdpdGggdGhlIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlcyB3aGljaCBtdXN0IGJlIHNlYXJjaGVkLgogICAgbXkgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKCiAgICAgICAgIyBHZXQgdGhlIHNlYXJjaCBmaWVsZHMgZm9yIHRoZSBjdXJyZW50IHNvdXJjZS4KICAgICAgICBteSBAU291cmNlU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygKICAgICAgICAgICAgU291cmNlID0+ICJDdXN0b21lckNvbXBhbnkkQ291bnQiLAogICAgICAgICk7CiAgICAgICAgbXkgJUxvb2t1cFNvdXJjZVNlYXJjaEZpZWxkcyA9IG1hcCB7ICRfLT57TmFtZX0gPT4gMSB9IEBTb3VyY2VTZWFyY2hGaWVsZHM7CgogICAgICAgICMgQ2hlY2sgaWYgYWxsIHNlYXJjaCBwYXJhbSBleGlzdHMgaW4gdGhlIHNlYXJjaCBmaWVsZHMgZnJvbSB0aGUgY3VycmVudCBzb3VyY2UuCiAgICAgICAgU0VBUkNIRklFTEQ6CiAgICAgICAgZm9yIG15ICRTZWFyY2hGaWVsZCAoQEFsbFNlYXJjaEZpZWxkcykgewoKICAgICAgICAgICAgbmV4dCBTRUFSQ0hGSUVMRCBpZiAhJFBhcmFteyAkU2VhcmNoRmllbGQtPntOYW1lfSB9OwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRMb29rdXBTb3VyY2VTZWFyY2hGaWVsZHN7ICRTZWFyY2hGaWVsZC0+e05hbWV9IH07CiAgICAgICAgfQogICAgICAgICRTZWFyY2hDdXN0b21lckNvbXBhbnlTb3VyY2VzeyJDdXN0b21lckNvbXBhbnkkQ291bnQifSA9IFxAU291cmNlU2VhcmNoRmllbGRzOwogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgJFBhcmFte1Jlc3VsdH0gfHw9ICdBUlJBWSc7CgogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQ09VTlQnICkgewoKICAgICAgICBteSAkSURzQ291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEc0NvdW50ID0gJFNlbGYtPnskU291cmNlfS0+Q3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgU2VhcmNoRmllbGRzID0+ICRTZWFyY2hDdXN0b21lckNvbXBhbnlTb3VyY2VzeyRTb3VyY2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRTdWJJRHNDb3VudDsKCiAgICAgICAgICAgICRJRHNDb3VudCArPSAkU3ViSURzQ291bnQgfHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRJRHNDb3VudDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSBASURzOwoKICAgICAgICBteSAkUmVzdWx0Q291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEcyA9ICRTZWxmLT57JFNvdXJjZX0tPkN1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFNlYXJjaEZpZWxkcyA9PiAkU2VhcmNoQ3VzdG9tZXJDb21wYW55U291cmNlc3skU291cmNlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkU3ViSURzOwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU3ViSURzKTsKCiAgICAgICAgICAgIHB1c2ggQElEcywgQHskU3ViSURzfTsKCiAgICAgICAgICAgICRSZXN1bHRDb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYXZlIG1vcmUgdGhlbiBvbmUgc2VhcmNoIHJlc3VsdHMgZnJvbSBkaWZmcmVudCBzb3VyY2VzLCB3ZSBuZWVkIGEgcmVzb3J0aW5nCiAgICAgICAgIyAgIGFuZCBzcGxpY2UgKGZvciB0aGUgbGltaXQpIGJlY2F1c2Ugb2YgdGhlIG1lcmdlZCBzaW5nbGUgcmVzdWx0cy4KICAgICAgICBpZiAoICRSZXN1bHRDb3VudCA+IDEgKSB7CgogICAgICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKCiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJDb21wYW55RGF0YSA9ICRTZWxmLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCwgXCVDdXN0b21lckNvbXBhbnlEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT3JkZXJCeSA9ICdDdXN0b21lcklEJzsKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5fSApICkgewogICAgICAgICAgICAgICAgJE9yZGVyQnkgPSAkUGFyYW17T3JkZXJCeX0tPlswXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSApICYmICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WzBdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCA9IHNvcnQgeyBsYyggJGEtPnskT3JkZXJCeX0gKSBjbXAgbGMoICRiLT57JE9yZGVyQnl9ICkgfSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBDdXN0b21lckNvbXBhbnlhdGFMaXN0ID0gc29ydCB7IGxjKCAkYi0+eyRPcmRlckJ5fSApIGNtcCBsYyggJGEtPnskT3JkZXJCeX0gKSB9IEBDdXN0b21lckNvbXBhbnlhdGFMaXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtMaW1pdH0gJiYgc2NhbGFyIEBDdXN0b21lckNvbXBhbnlhdGFMaXN0ID4gJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAgICAgICAgIHNwbGljZSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCwgJFBhcmFte0xpbWl0fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQElEcyA9IG1hcCB7ICRfLT57Q3VzdG9tZXJJRH0gfSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygpCgpHZXQgYSBsaXN0IG9mIGRlZmluZWQgc2VhcmNoIGZpZWxkcyAob3B0aW9uYWwgb25seSB0aGUgcmVsZXZhbnQgZmllbGRzIGZvciB0aGUgZ2l2ZW4gc291cmNlKS4KCiAgICBteSBAU2VhY2hGaWVsZHMgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlTZWFyY2hGaWVsZHMoCiAgICAgICAgU291cmNlID0+ICdDdXN0b21lckNvbXBhbnknLCAjIG9wdGlvbmFsLCBidXQgaW1wb3J0YW50IGluIHRoZSBDdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwgdG8gZ2V0IHRoZSByaWdodCBkYXRhYmFzZSBmaWVsZHMKICAgICk7CgpSZXR1cm5zIGFuIGFycmF5IG9mIGhhc2ggcmVmZXJlbmNlcy4KCiAgICBAU2VhY2hGaWVsZHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIExhYmVsID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVHlwZSAgPT4gJ0lucHV0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknLAogICAgICAgICAgICBMYWJlbCAgICAgICAgICA9PiAnQ291bnRyeScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBTZWxlY3Rpb25zRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgICAgICdVbml0ZWQgS2luZ2RvbScgPT4gJ1VuaXRlZCBLaW5nZG9tJywKICAgICAgICAgICAgICAgICdVbml0ZWQgU3RhdGVzJyAgPT4gJ1VuaXRlZCBTdGF0ZXMnLAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF9CcmFuY2gnLAogICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdCcmFuY2gnLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IHRoZSBzZWFyY2ggZmllbGRzIGZyb20gYWxsIGN1c3RvbWVyIGNvbXBhbnkgbWFwcyAobWVyZ2UgZnJvbSBhbGwgbWFwcyB0b2dldGhlcikuCiAgICBteSBAU2VhcmNoRmllbGRzOwoKICAgIG15ICVTZWFyY2hGaWVsZHNFeGlzdHM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAkUGFyYW17U291cmNlfSAmJiAkUGFyYW17U291cmNlfSBuZSAiQ3VzdG9tZXJDb21wYW55JENvdW50IjsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZE5hbWUgPSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFNlYXJjaEZpZWxkc0V4aXN0c3skU2VhcmNoRmllbGROYW1lfTsKCiAgICAgICAgICAgICMgUmVtZWJlciB0aGUgYWxyZWFkeSBjb2xsZWN0ZWQgc2VhcmNoIGZpZWxkIG5hbWUuCiAgICAgICAgICAgICRTZWFyY2hGaWVsZHNFeGlzdHN7JFNlYXJjaEZpZWxkTmFtZX0gPSAxOwoKICAgICAgICAgICAgbXkgJUZpZWxkQ29uZmlnID0gJFNlbGYtPkdldEZpZWxkQ29uZmlnKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBTb3VyY2UgICAgPT4gJFBhcmFte1NvdXJjZX0sICAgICAjIHRvIGdldCB0aGUgcmlnaHQgZGF0YWJhc2UgZmllbGQgZm9yIHRoZSBnaXZlbiBzb3VyY2UKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISVGaWVsZENvbmZpZzsKCiAgICAgICAgICAgIG15ICVTZWFyY2hGaWVsZERhdGEgPSAoCiAgICAgICAgICAgICAgICAlRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBOYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkU2VsZi0+R2V0RmllbGRTZWxlY3Rpb25zKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRTZWFyY2hGaWVsZERhdGF7U3RvcmFnZVR5cGV9IGVxICdkeW5hbWljX2ZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gPSAnRHluYW1pY0ZpZWxkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJVNlbGVjdGlvbnNEYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ICAgICAgICAgICA9ICdTZWxlY3Rpb24nOwogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtTZWxlY3Rpb25zRGF0YX0gPSBcJVNlbGVjdGlvbnNEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSA9ICdJbnB1dCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgXCVTZWFyY2hGaWVsZERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAU2VhcmNoRmllbGRzOwp9Cgo9aGVhZDIgR2V0RmllbGRDb25maWcoKQoKVGhpcyBmdW5jdGlvbiBjb2xsZWN0IHNvbWUgZmllbGQgY29uZmlnIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1c3RvbWVyIHVzZXIgbWFwLgoKICAgIG15ICVGaWVsZENvbmZpZyA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkdldEZpZWxkQ29uZmlnKAogICAgICAgIEZpZWxkTmFtZSA9PiAnQ3VzdG9tZXJDb21wYW55TmFtZScsCiAgICAgICAgU291cmNlICAgID0+ICdDdXN0b21lckNvbXBhbnknLCAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJucyBzb21lIGZpZWxkIGNvbmZpZyBpbmZvcm1hdGlvbjoKCiAgICBteSAlRmllbGRDb25maWcgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnbmFtZScsCiAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAndmFyJywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0RmllbGRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICRQYXJhbXtTb3VyY2V9ICYmICRQYXJhbXtTb3VyY2V9IG5lICJDdXN0b21lckNvbXBhbnkkQ291bnQiOwoKICAgICAgICAjIFNlYXJjaCB0aGUgcmlnaHQgZmllbGQgYW5kIHJldHVybiB0aGUgbGFiZWwuCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkUGFyYW17RmllbGROYW1lfSBuZSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG15ICVGaWVsZENvbmZpZyA9ICgKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAkRW50cnktPls1XSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAlRmllbGRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEdldEZpZWxkU2VsZWN0aW9ucygpCgpUaGlzIGZ1bmN0aW9uIGNvbGxlY3QgdGhlIHNlbGVjdGlvbnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLCBpZiB0aGUgZmllbGQgaGFzIHNvbWUgc2VsZWN0aW9ucy4KCiAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5HZXRGaWVsZFNlbGVjdGlvbnMoCiAgICAgICAgRmllbGROYW1lID0+ICdDdXN0b21lckNvbXBhbnlDb3VudHJ5JywKICAgICk7CgpSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIGZvciB0aGUgZ2l2ZW4gZmllbGQgbmFtZSAobWVyZ2VkIGZyb20gYWxsIHNvdXJjZXMpIG9yIGEgZW1wdHkgaGFzaDoKCiAgICBteSAlU2VsZWN0aW9uRGF0YSA9ICgKICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAnVW5pdGVkIEtpbmdkb20nID0+ICdVbml0ZWQgS2luZ2RvbScsCiAgICAgICAgJ1VuaXRlZCBTdGF0ZXMnICA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICApOwoKPWN1dAoKc3ViIEdldEZpZWxkU2VsZWN0aW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlU2VsZWN0aW9uc0RhdGE7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57U2VsZWN0aW9uc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfTsKCiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gKAogICAgICAgICAgICAlU2VsZWN0aW9uc0RhdGEsCiAgICAgICAgICAgICV7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1NlbGVjdGlvbnN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gfQogICAgICAgICk7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldC4KICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTZWxlY3Rpb25zRGF0YSApIHsKICAgICAgICAkU2VsZWN0aW9uc0RhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZUlucHV0KCAkU2VsZWN0aW9uc0RhdGF7JEtleX0gKTsKICAgIH0KCiAgICAjIERlZmF1bHQgaGFuZGxpbmcgZm9yIGZpZWxkICdDdXN0b21lckNvbXBhbnlDb3VudHJ5Jy4KICAgIGlmICggISVTZWxlY3Rpb25zRGF0YSAmJiAkUGFyYW17RmllbGROYW1lfSA9fiAvXkN1c3RvbWVyQ29tcGFueUNvdW50cnkvaSApIHsKICAgICAgICAlU2VsZWN0aW9uc0RhdGEgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVmZXJlbmNlRGF0YScpLT5Db3VudHJ5TGlzdCgpIH07CiAgICB9CgogICAgIyBEZWZhdWx0IGhhbmRsaW5nIGZvciBmaWVsZCAnVmFsaWRJRCcuCiAgICBlbHNpZiAoICElU2VsZWN0aW9uc0RhdGEgJiYgJFBhcmFte0ZpZWxkTmFtZX0gPX4gL15WYWxpZElEL2kgKSB7CiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgfQoKICAgIHJldHVybiAlU2VsZWN0aW9uc0RhdGE7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBleGVjdXRlIGFsbCB0cmFuc2FjdGlvbiBldmVudHMKICAgICRTZWxmLT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpOwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhMmE1ZTIzNjkxZDFhMDA2MTBmMTQ2MDZlZGIwMDUyMzM2MWY5MTNkIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIC0gY3VzdG9tZXIgdXNlciBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGN1c3RvbWVyIHVzZXIgZnVuY3Rpb25zLiBFLiBnLiB0byBhZGQgYW5kIHVwZGF0ZSBjdXN0b21lciB1c2Vycy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHt9LCAkVHlwZTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQ3VzdG9tZXJVc2VyJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgbG9hZCBnZW5lcmF0b3IgY3VzdG9tZXIgcHJlZmVyZW5jZXMgbW9kdWxlCiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzJyktPntNb2R1bGV9CiAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OlByZWZlcmVuY2VzOjpEQic7CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICBpZiAoICRNYWluT2JqZWN0LT5SZXF1aXJlKCRHZW5lcmF0b3JNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9ID0gJEdlbmVyYXRvck1vZHVsZS0+bmV3KCk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwoKICAgICMgQ2hlY2sgaWYgbXVsdGl0ZW5hbmN5IGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIGEgdXNlci4KICAgIGlmICggJExheW91dFBhcmFtLT57VXNlclR5cGV9ICYmICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSBlcSAnVXNlcicgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKCiAgICAgICAgIyBTYXZlIHRoZSBVc2VySUQgYW5kIGFsbCBncm91cHMgdGhlIHVzZXIgaGFzICdybycgcGVybWlzc2lvbiBvbi4KICAgICAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICMgT25seSBnZXQgdGhlIGdyb3VwIGxpc3Qgb25jZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkTGF5b3V0UGFyYW0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRoZSBsaW1pdCBkb2VzIG5vdCBjb3VudCBmb3IgbWVtYmVycyBvZiBhIHNwZWNpZmljIGdyb3VwLgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpIHx8ICcnOwogICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSAgID0gcmV2ZXJzZSAlR3JvdXBzOwoKICAgICAgICAgICAgaWYgKCAhJEdyb3Vwc1JldmVyc2V7JFBlcm1pc3Npb25Hcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeX0gPSAkTGF5b3V0UGFyYW0tPntVc2VySUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBJRHN9ID0gWyBrZXlzICVHcm91cHMgXTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3Vwc30gICA9IFsgdmFsdWVzICVHcm91cHMgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgbG9hZCBjdXN0b21lciB1c2VyIGJhY2tlbmQgbW9kdWxlCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBzb3VyY2UuCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e0N1c3RvbWVyVXNlckdyb3VwfTsKCiAgICAgICAgIyBUaGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhpcyBzb3VyY2UuCiAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gJiYgJEN1c3RvbWVyVXNlckdyb3VwICkgewogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gPX4gL14kQ3VzdG9tZXJVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e01vZHVsZX07CiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRHZW5lcmljTW9kdWxlISAkQCIpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0gPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIFByZWZlcmVuY2VzT2JqZWN0ID0+ICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LAogICAgICAgICAgICBDdXN0b21lclVzZXJNYXAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLAogICAgICAgICk7CiAgICB9CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnQ3VzdG9tZXJVc2VyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDdXN0b21lclNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIHNvdXJjZSBsaXN0CgogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyU291cmNlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKTsKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9IHx8ICRDdXN0b21lckJhY2tlbmRDb25maWctPntNb2R1bGV9ICF+IC9MREFQL2k7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9IHx8ICRDdXN0b21lckJhY2tlbmRDb25maWctPntNb2R1bGV9ID1+IC9MREFQL2k7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGF7IkN1c3RvbWVyVXNlciRDb3VudCJ9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e05hbWV9CiAgICAgICAgICAgIHx8ICJObyBOYW1lICRDb3VudCI7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lclNlYXJjaCgpCgp0byBzZWFyY2ggY3VzdG9tZXIgdXNlcnMuCgogICAgIyB0ZXh0IHNlYXJjaCBpbiB0aGUgY3VzdG9tZXIgc2VhcmNoIGZpZWxkcwogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBTZWFyY2ggPT4gJypzb21lKicsICMgYWxzbyAnaGFucytodWJlcicgcG9zc2libGUKICAgICAgICBWYWxpZCAgPT4gMSwgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICAgICBMaW1pdCAgPT4gMTAwLCAgICAgICMgKG9wdGlvbmFsKSBvdmVycmlkZXMgbGltaXQgb2YgdGhlIGNvbmZpZwogICAgKTsKCiAgICAjIHVzZXJuYW1lIHNlYXJjaAogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBVc2VyTG9naW4gPT4gJypzb21lKicsCiAgICAgICAgVmFsaWQgICAgID0+IDEsICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKCiAgICAjIGVtYWlsIHNlYXJjaAogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICdlbWFpbEBleGFtcGxlLmNvbScsCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKCiAgICAjIHNlYXJjaCBieSBDdXN0b21lcklECiAgICAjIEl0IGRlcGVuZHMgb24gdGhlIGRhdGEgYmFja2VuZCB3aGVuIGFuICcqJyBpcyBjb25zaWRlcmVkIGEgd2lsZGNhcmQuCiAgICAjIFRoZSBEQiBiYWNrZW5kIGNvbnNpZGVycyAnKicgYXMgYW4gd2lsZGNhcmQuCiAgICAjIFRoZSBMREFQIGJhY2tlbmQgZG9lcyBub3QgZG8gc28uCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIEN1c3RvbWVySUQgICAgICAgPT4gJ0N1c3RvbWVySUQxMjMnLAogICAgICAgIFZhbGlkICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKCiAgICAjIFNlYXJjaCBieSBDdXN0b21lcklEIHdpdGhvdXQgd2lsZGNhcmQgZXhwYW5zaW9uLgogICAgIyBTbyBzZWFyY2hpbmcgYnkgJ0Fsb2lzKicgd291bGQgZmluZCBvbmx5ICdBbG9pcyonIGFuZCBub3QgJ0Fsb2lzJyBvciAnQWxvaXNpYScuCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIEN1c3RvbWVySURSYXcgICAgPT4gJ0N1c3RvbWVySUQxMjMnLAogICAgICAgIFZhbGlkICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgKTsKClJldHVybnMgYSBoYXNoIGxpa2U6CgogICAgewogICAgICAgICd0aW5hJyA9PiAnIlRpbmEgVGVzdGVyIiA8dGluYUBleGFtcGxlLmNvbT4nLAogICAgICAgICd0b25pJyA9PiAnIlRvbmkgVGVzdGVyIiA8dG9uaUBleGFtcGxlLmNvbT4nLAogICAgfQoKVGhlIG1ldGhvZCBpcyBtaXNuYW1lZCBhcyBDPEN1c3RvbWVyU2VhcmNoPiBzZWFyY2hlcyBmb3IgY3VzdG9tZXIgdXNlcnMsIG5vdCBjdXN0b21lcnMgYWthIGN1c3RvbWVyIGNvbXBhbmllcy4KCj1jdXQKCnN1YiBDdXN0b21lclNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcmVtb3ZlIGxlYWRpbmcgYW5kIGVuZGluZyBzcGFjZXMKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CiAgICAgICAgJFBhcmFte1NlYXJjaH0gPX4gcy9eXHMrLy87CiAgICAgICAgJFBhcmFte1NlYXJjaH0gPX4gcy9ccyskLy87CiAgICB9CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBvYmplY3QuCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgIG15ICREeW5hbWljRmllbGRDb25maWdzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfTsKCiAgICAjIEdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0LgogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJURhdGE7CiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBzZWFyY2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgICAgICBteSAkTWFwID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfTsKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTWFwKSApIHsKCiAgICAgICAgICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIE1hcAogICAgICAgICAgICAjIG9ubHkgdGhlc2Ugd2lsbCBiZSBjb25zaWRlcmVkIGZvciBhbnkgb3RoZXIgc2VhcmNoIGNvbmZpZwogICAgICAgICAgICAjIFsgJ0R5bmFtaWNGaWVsZF9OYW1lX1gnLCB1bmRlZiwgJ05hbWVfWCcsIDAsIDAsICdkeW5hbWljX2ZpZWxkJywgdW5kZWYsIDAsIHVuZGVmLCB1bmRlZiwgXSwKICAgICAgICAgICAgbXkgJUR5bmFtaWNGaWVsZE5hbWVzID0gbWFwIHsgJF8tPlsyXSA9PiAxIH0gZ3JlcCB7ICRfLT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnIH0gQHskTWFwfTsKCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlRHluYW1pY0ZpZWxkTmFtZXMgKSApIHsKICAgICAgICAgICAgICAgIG15ICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEczsKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZHM7CiAgICAgICAgICAgICAgICBteSAkU2VhcmNoUGFyYW07CgogICAgICAgICAgICAgICAgIyBjaGVjayB3aGljaCBvZiB0aGUgZHluYW1pYyBmaWVsZHMgY29uZmlndXJlZCBpbiBNYXAgYXJlIGFsc28KICAgICAgICAgICAgICAgICMgY29uZmlndXJlZCBpbiBTZWFyY2hGaWVsZHMKCiAgICAgICAgICAgICAgICAjIHBhcmFtIFNlYXJjaAogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTZWFyY2h9ICYmIGxlbmd0aCAkUGFyYW17U2VhcmNofSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGRzID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzfTsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW0gID0gJFBhcmFte1NlYXJjaH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBwYXJhbSBQb3N0TWFzdGVyU2VhcmNoCiAgICAgICAgICAgICAgICBlbHNpZiAoIGRlZmluZWQgJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICYmIGxlbmd0aCAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkcyA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHN9OwogICAgICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbSAgPSAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZWFyY2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZHMpICkgewogICAgICAgICAgICAgICAgICAgIG15IEBTZWFyY2hEeW5hbWljRmllbGROYW1lcyA9IGdyZXAgeyBleGlzdHMgJER5bmFtaWNGaWVsZE5hbWVzeyRffSB9IEB7JFNlYXJjaEZpZWxkc307CgogICAgICAgICAgICAgICAgICAgIG15ICVGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEczsKICAgICAgICAgICAgICAgICAgICBGSUVMRE5BTUU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZE5hbWUgKEBTZWFyY2hEeW5hbWljRmllbGROYW1lcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRMb29rdXB7JEZpZWxkTmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxETkFNRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2VhcmNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgICAgICAgICAgPT4gJFNlYXJjaFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZFZhbHVlcykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZFZhbHVlICggQHskRHluYW1pY0ZpZWxkVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHN7ICREeW5hbWljRmllbGRWYWx1ZS0+e09iamVjdElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzID0gWyBrZXlzICVGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcyBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSBiYWNrZW5kIHNlYXJjaCBmb3IgZm91bmQgb2JqZWN0IElEcwogICAgICAgICAgICAgICAgIyB0aGlzIGRhdGEgaXMgYmVpbmcgbWVyZ2VkIHdpdGggdGhlIGZvbGxvd2luZyBDdXN0b21lclNlYXJjaCBjYWxsCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMpICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0TmFtZXMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5PYmplY3RNYXBwaW5nR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBPQkpFQ1ROQU1FOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0TmFtZSAoIHZhbHVlcyAleyRPYmplY3ROYW1lc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgT0JKRUNUTkFNRSBpZiBleGlzdHMgJERhdGF7JE9iamVjdE5hbWV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNlYXJjaFBhcmFtID0gJVBhcmFtOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFNlYXJjaFBhcmFte1NlYXJjaH07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VhcmNoUGFyYW17UG9zdE1hc3RlclNlYXJjaH07CgogICAgICAgICAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW17VXNlckxvZ2lufSA9ICRPYmplY3ROYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJTZWFyY2goJVNlYXJjaFBhcmFtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlckxvZ2luIHNlYXJjaCBkb2VzIGEgd2lsZC1jYXJkIHNlYXJjaCwgYnV0IGluIHRoaXMgY2FzZSBvbmx5IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAjIGV4YWN0IG1hdGNoaW5nIHVzZXIgbG9naW4gaXMgcmVsZXZhbnQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdWJEYXRhICkgJiYgZXhpc3RzICRTdWJEYXRheyRPYmplY3ROYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhID0gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRPYmplY3ROYW1lID0+ICRTdWJEYXRheyRPYmplY3ROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgc2VhcmNoIHJlc3VsdCBvZiBiYWNrZW5kIGFuZCBtZXJnZSBpdAogICAgICAgIG15ICVTdWJEYXRhID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPkN1c3RvbWVyU2VhcmNoKCVQYXJhbSk7CgogICAgICAgICVEYXRhID0gKCAlU3ViRGF0YSwgJURhdGEgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNlZSB0aGlzIGN1c3RvbWVyIHVzZXIuCiAgICAjIFRPRE86IFJlbW92ZSB0aGlzIGlmIHRoZSBEQi9MREFQIGZ1bmN0aW9uIEN1c3RvbWVyU2VhcmNoIGlzIGZ1bGx5IGltcGxlbWVudGVkLgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgQ1VTVE9NRVJMT0dJTjoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlckxvZ2luICgga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISVVc2VyRGF0YSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskQ3VzdG9tZXJVc2VyTG9naW59OwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkxPR0lOOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJTZWFyY2hEZXRhaWwoKQoKVG8gZmluZCBjdXN0b21lciB1c2VycyBpbiB0aGUgc3lzdGVtLgoKVGhlIHNlYXJjaCBjcml0ZXJpYSBhcmUgbG9naWNhbGx5IEFORCBjb25uZWN0ZWQuCldoZW4gYSBsaXN0IGlzIHBhc3NlZCBhcyBjcml0ZXJpYSwgdGhlIGluZGl2aWR1YWwgbWVtYmVycyBhcmUgT1IgY29ubmVjdGVkLgpXaGVuIGFuIHVuZGVmIG9yIGEgcmVmZXJlbmNlIHRvIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZCwgdGhlbiB0aGUgc2VhcmNoIGNyaXRlcmlhCmlzIGlnbm9yZWQuCgpSZXR1cm5zIGVpdGhlciBhIGxpc3QsIGFzIGFuIGFycmF5cmVmLCBvciBhIGNvdW50IG9mIGZvdW5kIGN1c3RvbWVyIHVzZXIgaWRzLgpUaGUgY291bnQgb2YgcmVzdWx0cyBpcyByZXR1cm5lZCB3aGVuIHRoZSBwYXJhbWV0ZXIgQzxSZXN1bHQgPSAnQ09VTlQnPiBpcyBwYXNzZWQuCgogICAgbXkgJEN1c3RvbWVyVXNlcklEc1JlZiA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoRGV0YWlsKAoKICAgICAgICAjIGFsbCBmaWVsZHMgd2hpY2ggYXJlIGRlZmluZWQgaW4gYSBDdXN0b21lclVzZXJNYXAsIGV4Y2VwdCBwYXNzd29yZCBmaWVsZHMsIGFyZSBzZWFyY2hhYmxlCiAgICAgICAgVXNlckxvZ2luICAgICA9PiAnZXhhbXBsZSonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0ZpcnN0bionLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBzZWFyY2ggZm9yIHZhbGlkIHVzZXJzIG9ubHkgcGVyIGRlZmF1bHQsCiAgICAgICAgIyBwYXNzIDAgaW4gb3JkZXIgdG8gYWxzbyBzZWFyY2ggZm9yIGludmFsaWQgdXNlcnMKICAgICAgICBWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQoKICAgICAgICAjIHNwZWNpYWwgcGFyYW1ldGVycwogICAgICAgIEN1c3RvbWVyQ29tcGFueVNlYXJjaEN1c3RvbWVySURzID0+IFsgJ2V4YW1wbGUuY29tJyBdLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBFeGNsdWRlVXNlckxvZ2lucyAgICAgICAgICAgICAgICA9PiBbICdleGFtcGxlJywgJ2RvZWpvaG4nIF0sICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgYXJyYXkgcGFyYW1ldGVycyBhcmUgdXNlZCB3aXRoIGxvZ2ljYWwgT1Igb3BlcmF0b3IgKGFsbCB2YWx1ZXMgYXJlIHBvc3NpYmxlIHdoaWNoCiAgICAgICAgIyBhcmUgZGVmaW5lZCBpbiB0aGUgY29uZmlnIHNlbGVjdGlvbiBoYXNoIGZvciB0aGUgZmllbGQpCiAgICAgICAgVXNlckNvdW50cnkgICAgICAgICAgICAgID0+IFsgJ0F1c3RyaWEnLCAnR2VybWFueScsIF0sICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIER5bmFtaWNGaWVsZHMKICAgICAgICAjICAgQXQgbGVhc3Qgb25lIG9wZXJhdG9yIG11c3QgYmUgc3BlY2lmaWVkLiBPcGVyYXRvcnMgd2lsbCBiZSBjb25uZWN0ZWQgd2l0aCBBTkQsCiAgICAgICAgIyAgICAgICB2YWx1ZXMgaW4gYW4gb3BlcmF0b3Igd2l0aCBPUi4KICAgICAgICAjICAgWW91IGNhbiBhbHNvIHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byBhbiBvcGVyYXRvcjogWyd2YWx1ZTEnLCAndmFsdWUyJ10KICAgICAgICBEeW5hbWljRmllbGRfRmllbGROYW1lWCA9PiB7CiAgICAgICAgICAgIEVxdWFscyAgICAgICAgICAgID0+IDEyMywKICAgICAgICAgICAgTGlrZSAgICAgICAgICAgICAgPT4gJ3ZhbHVlKicsICAgICAgICAgICAgICAgICMgImVxdWFscyIgb3BlcmF0b3Igd2l0aCB3aWxkY2FyZCBzdXBwb3J0CiAgICAgICAgICAgIEdyZWF0ZXJUaGFuICAgICAgID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgR3JlYXRlclRoYW5FcXVhbHMgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBTbWFsbGVyVGhhbiAgICAgICA9PiAnMjAwMi0wMi0wMiAwMjowMjowMicsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuRXF1YWxzID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICB9CgogICAgICAgIE9yZGVyQnkgPT4gWyAnVXNlckxvZ2luJywgJ1VzZXJDdXN0b21lcklEJyBdLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ1VzZXJMb2dpbicgXQogICAgICAgICMgKGFsbCBmaWVsZHMgd2hpY2ggYXJlIGRlZmluZWQgaW4gYSBDdXN0b21lclVzZXJNYXAgY2FuIGJlIHVzZWQgZm9yIG9yZGVyaW5nKQoKICAgICAgICAjIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIE9yZGVyQnk6CiAgICAgICAgIyBUaGUgT3JkZXJCeURpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIE9yZGVyQnkgYXR0cmlidXRlLgogICAgICAgICMgVGhlIHBhaXJpbmcgaXMgbWFkZSBieSB0aGUgYXJyYXkgaW5kaWNlcy4KCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICAgICAgIyAoRG93biB8IFVwKSBEZWZhdWx0OiBbICdEb3duJyBdCgogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknIHx8ICdDT1VOVCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2YgY2hhbmdlIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgY2hhbmdlcwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICk7CgpSZXR1cm5zIGEgbGlzdCBvZiBjdXN0b21lciB1c2VycyB3aGVuICRSZXN1bHQgPT4gJ0FSUkFZJyB3YXMgcGFzc2VkOgoKICAgICRDdXN0b21lclVzZXJJRHMgPSBbICdhZGFsZHJpZGEnLCAnYWRhbWFudGEnLCAnYWRhbGdyaW0gJyBdOwogICAgJEN1c3RvbWVyVXNlcklEcyA9IFtdOyAjIHdoZW4gbm8gY3VzdG9tZXIgdXNlcnMgaGFkIGJlZW4gZm91bmQKClJldHVybnMgYSBjb3VudCBvZiBjdXN0b21lciB1c2VycyB3aGVuICRSZXN1bHQgPT4gJ0NPVU5UJyB3YXMgcGFzc2VkOgoKICAgICRDdXN0b21lclVzZXJJRHMgPSAzOwogICAgJEN1c3RvbWVyVXNlcklEcyA9IDA7ICMgd2hlbiBubyBjdXN0b21lciB1c2VycyBoYWQgYmVlbiBmb3VuZAoKPWN1dAoKc3ViIEN1c3RvbWVyU2VhcmNoRGV0YWlsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYWxsIGdlbmVyYWwgc2VhcmNoIGZpZWxkcyAod2l0aG91dCBhIHJlc3RyaWN0aW9uIHRvIGEgc291cmNlKQogICAgbXkgQEFsbFNlYXJjaEZpZWxkcyA9ICRTZWxmLT5DdXN0b21lclVzZXJTZWFyY2hGaWVsZHMoKTsKCiAgICAjIGdlbmVyYXRlIGEgaGFzaCB3aXRoIHRoZSBjdXN0b21lciB1c2VyIHNvdXJjZXMgd2hpY2ggbXVzdCBiZSBzZWFyY2hlZAogICAgbXkgJVNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBnZXQgdGhlIHNlYXJjaCBmaWVsZHMgZm9yIHRoZSBjdXJyZW50IHNvdXJjZQogICAgICAgIG15IEBTb3VyY2VTZWFyY2hGaWVsZHMgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKAogICAgICAgICAgICBTb3VyY2UgPT4gIkN1c3RvbWVyVXNlciRDb3VudCIsCiAgICAgICAgKTsKICAgICAgICBteSAlTG9va3VwU291cmNlU2VhcmNoRmllbGRzID0gbWFwIHsgJF8tPntOYW1lfSA9PiAxIH0gQFNvdXJjZVNlYXJjaEZpZWxkczsKCiAgICAgICAgIyBjaGVjayBpZiBhbGwgc2VhcmNoIHBhcmFtIGV4aXN0cyBpbiB0aGUgc2VhcmNoIGZpZWxkcyBmcm9tIHRoZSBjdXJyZW50IHNvdXJjZQogICAgICAgIFNFQVJDSEZJRUxEOgogICAgICAgIGZvciBteSAkU2VhcmNoRmllbGQgKEBBbGxTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgICAgIG5leHQgU0VBUkNIRklFTEQgaWYgISRQYXJhbXsgJFNlYXJjaEZpZWxkLT57TmFtZX0gfTsKCiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkTG9va3VwU291cmNlU2VhcmNoRmllbGRzeyAkU2VhcmNoRmllbGQtPntOYW1lfSB9OwogICAgICAgIH0KICAgICAgICAkU2VhcmNoQ3VzdG9tZXJVc2VyU291cmNlc3siQ3VzdG9tZXJVc2VyJENvdW50In0gPSBcQFNvdXJjZVNlYXJjaEZpZWxkczsKICAgIH0KCiAgICAjIHNldCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHRoZSByZXR1cm4gdHlwZQogICAgJFBhcmFte1Jlc3VsdH0gfHw9ICdBUlJBWSc7CgogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQ09VTlQnICkgewoKICAgICAgICBteSAkSURzQ291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEc0NvdW50ID0gJFNlbGYtPnskU291cmNlfS0+Q3VzdG9tZXJTZWFyY2hEZXRhaWwoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBTZWFyY2hGaWVsZHMgPT4gJFNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXN7JFNvdXJjZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gaWYgIWRlZmluZWQgJFN1YklEc0NvdW50OwoKICAgICAgICAgICAgJElEc0NvdW50ICs9ICRTdWJJRHNDb3VudCB8fCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJElEc0NvdW50OwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15IEBJRHM7CgogICAgICAgIG15ICRSZXN1bHRDb3VudCA9IDA7CgogICAgICAgIFNPVVJDRToKICAgICAgICBmb3IgbXkgJFNvdXJjZSAoIHNvcnQga2V5cyAlU2VhcmNoQ3VzdG9tZXJVc2VyU291cmNlcyApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57JFNvdXJjZX07CgogICAgICAgICAgICBteSAkU3ViSURzID0gJFNlbGYtPnskU291cmNlfS0+Q3VzdG9tZXJTZWFyY2hEZXRhaWwoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBTZWFyY2hGaWVsZHMgPT4gJFNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXN7JFNvdXJjZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gaWYgIWRlZmluZWQgJFN1YklEczsKCiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoJFN1YklEcyk7CgogICAgICAgICAgICBwdXNoIEBJRHMsIEB7JFN1YklEc307CgogICAgICAgICAgICAkUmVzdWx0Q291bnQrKzsKICAgICAgICB9CgogICAgICAgICMgaWYgd2UgaGF2ZSBtb3JlIHRoZW4gb25lIHNlYXJjaCByZXN1bHRzIGZyb20gZGlmZnJlbnQgc291cmNlcywgd2UgbmVlZCBhIHJlc29ydGluZwogICAgICAgICMgYmVjYXVzZSBvZiB0aGUgbWVyZ2VkIHNpbmdsZSByZXN1bHRzCiAgICAgICAgaWYgKCAkUmVzdWx0Q291bnQgPiAxICkgewoKICAgICAgICAgICAgbXkgQFVzZXJEYXRhTGlzdDsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKCiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBVc2VyRGF0YUxpc3QsIFwlVXNlckRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRPcmRlckJ5ID0gJ1VzZXJMb2dpbic7CiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17T3JkZXJCeX0gKSApIHsKICAgICAgICAgICAgICAgICRPcmRlckJ5ID0gJFBhcmFte09yZGVyQnl9LT5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0gKSAmJiAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlswXSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgQFVzZXJEYXRhTGlzdCA9IHNvcnQgeyBsYyggJGEtPnskT3JkZXJCeX0gKSBjbXAgbGMoICRiLT57JE9yZGVyQnl9ICkgfSBAVXNlckRhdGFMaXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgQFVzZXJEYXRhTGlzdCA9IHNvcnQgeyBsYyggJGItPnskT3JkZXJCeX0gKSBjbXAgbGMoICRhLT57JE9yZGVyQnl9ICkgfSBAVXNlckRhdGFMaXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtMaW1pdH0gJiYgc2NhbGFyIEBVc2VyRGF0YUxpc3QgPiAkUGFyYW17TGltaXR9ICkgewogICAgICAgICAgICAgICAgc3BsaWNlIEBVc2VyRGF0YUxpc3QsICRQYXJhbXtMaW1pdH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBJRHMgPSBtYXAgeyAkXy0+e1VzZXJMb2dpbn0gfSBAVXNlckRhdGFMaXN0OwogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uIGZvciBldmVyeSBzaW5nbGUgY3VzdG9tZXIgdXNlci4KICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAgICAgbXkgQE5ld0lEUyA9IEBJRHM7CiAgICAgICAgICAgIEBJRHMgPSAoKTsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBOZXdJRFMpIHsKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoJVVzZXJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASURzLCAkSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKCkKCkdldCBhIGxpc3Qgb2YgdGhlIGRlZmluZWQgc2VhcmNoIGZpZWxkcyAob3B0aW9uYWwgb25seSB0aGUgcmVsZXZhbnQgZmllbGRzIGZvciB0aGUgZ2l2ZW4gc291cmNlKS4KCiAgICBteSBAU2VhY2hGaWVsZHMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJTZWFyY2hGaWVsZHMoCiAgICAgICAgU291cmNlID0+ICdDdXN0b21lclVzZXInLCAjIG9wdGlvbmFsLCBidXQgaW1wb3J0YW50IGluIHRoZSBDdXN0b21lclNlYXJjaERldGFpbCB0byBnZXQgdGhlIHJpZ2h0IGRhdGFiYXNlIGZpZWxkcwogICAgKTsKClJldHVybnMgYW4gYXJyYXkgb2YgaGFzaCByZWZlcmVuY2VzLgoKICAgIEBTZWFjaEZpZWxkcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1VzZXJFbWFpbCcsCiAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJ0VtYWlsJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnSW5wdXQnLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdtYWlsJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1VzZXJDb3VudHJ5JywKICAgICAgICAgICAgTGFiZWwgICAgICAgICAgPT4gJ0NvdW50cnknLAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgU2VsZWN0aW9uc0RhdGEgPT4gewogICAgICAgICAgICAgICAgJ0dlcm1hbnknICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgICAgICAnVW5pdGVkIEtpbmdkb20nID0+ICdVbml0ZWQgS2luZ2RvbScsCiAgICAgICAgICAgICAgICAnVW5pdGVkIFN0YXRlcycgID0+ICdVbml0ZWQgU3RhdGVzJywKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICB9LAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdjb3VudHJ5JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnRHluYW1pY0ZpZWxkX1NreXBlQWNjb3VudE5hbWUnLAogICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdTa3lwZUFjY291bnROYW1lJywKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEdldCB0aGUgc2VhcmNoIGZpZWxkcyBmcm9tIGFsbCBjdXN0b21lciB1c2VyIG1hcHMgKG1lcmdlIGZyb20gYWxsIG1hcHMgdG9nZXRoZXIpLgogICAgbXkgQFNlYXJjaEZpZWxkczsKCiAgICBteSAlU2VhcmNoRmllbGRzRXhpc3RzOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgJFBhcmFte1NvdXJjZX0gJiYgJFBhcmFte1NvdXJjZX0gbmUgIkN1c3RvbWVyVXNlciRDb3VudCI7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgICAgICBteSAkU2VhcmNoRmllbGROYW1lID0gJEVudHJ5LT5bMF07CgogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRTZWFyY2hGaWVsZHNFeGlzdHN7JFNlYXJjaEZpZWxkTmFtZX07CiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFNlYXJjaEZpZWxkTmFtZSA9fiBteyhQYXNzd29yZHxQdylcZCokfXNteGk7CgogICAgICAgICAgICAjIFJlbWVtYmVyIHRoZSBhbHJlYWR5IGNvbGxlY3RlZCBzZWFyY2ggZmllbGQgbmFtZS4KICAgICAgICAgICAgJFNlYXJjaEZpZWxkc0V4aXN0c3skU2VhcmNoRmllbGROYW1lfSA9IDE7CgogICAgICAgICAgICBteSAlRmllbGRDb25maWcgPSAkU2VsZi0+R2V0RmllbGRDb25maWcoCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgPT4gJFNlYXJjaEZpZWxkTmFtZSwKICAgICAgICAgICAgICAgIFNvdXJjZSAgICA9PiAkUGFyYW17U291cmNlfSwgICAgICMgdG8gZ2V0IHRoZSByaWdodCBkYXRhYmFzZSBmaWVsZCBmb3IgdGhlIGdpdmVuIHNvdXJjZQogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhJUZpZWxkQ29uZmlnOwoKICAgICAgICAgICAgbXkgJVNlYXJjaEZpZWxkRGF0YSA9ICgKICAgICAgICAgICAgICAgICVGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNlYXJjaEZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICVTZWxlY3Rpb25zRGF0YSA9ICRTZWxmLT5HZXRGaWVsZFNlbGVjdGlvbnMoCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgPT4gJFNlYXJjaEZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFNlYXJjaEZpZWxkRGF0YXtTdG9yYWdlVHlwZX0gZXEgJ2R5bmFtaWNfZmllbGQnICkgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSA9ICdEeW5hbWljRmllbGQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICglU2VsZWN0aW9uc0RhdGEpIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gICAgICAgICAgID0gJ1NlbGVjdGlvbic7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1NlbGVjdGlvbnNEYXRhfSA9IFwlU2VsZWN0aW9uc0RhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ID0gJ0lucHV0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCBcJVNlYXJjaEZpZWxkRGF0YTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBTZWFyY2hGaWVsZHM7Cn0KCj1oZWFkMiBHZXRGaWVsZENvbmZpZygpCgpUaGlzIGZ1bmN0aW9uIGNvbGxlY3Qgc29tZSBmaWVsZCBjb25maWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgY3VzdG9tZXIgdXNlciBtYXAuCgogICAgbXkgJUZpZWxkQ29uZmlnID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2V0RmllbGRDb25maWcoCiAgICAgICAgRmllbGROYW1lID0+ICdVc2VyRW1haWwnLAogICAgICAgIFNvdXJjZSAgICA9PiAnQ3VzdG9tZXJVc2VyJywgIyBvcHRpb25hbAogICAgKTsKClJldHVybnMgc29tZSBmaWVsZCBjb25maWcgaW5mb3JtYXRpb246CgogICAgbXkgJUZpZWxkQ29uZmlnID0gKAogICAgICAgIExhYmVsICAgICAgICAgPT4gJ0VtYWlsJywKICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdlbWFpbCcsCiAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAndmFyJywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0RmllbGRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICRQYXJhbXtTb3VyY2V9ICYmICRQYXJhbXtTb3VyY2V9IG5lICJDdXN0b21lclVzZXIkQ291bnQiOwoKICAgICAgICAjIFNlYXJjaCB0aGUgcmlnaHQgZmllbGQgYW5kIHJldHVybiBzb21lIGNvbmZpZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWVsZC4KICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRQYXJhbXtGaWVsZE5hbWV9IG5lICRFbnRyeS0+WzBdOwoKICAgICAgICAgICAgbXkgJUZpZWxkQ29uZmlnID0gKAogICAgICAgICAgICAgICAgTGFiZWwgICAgICAgICA9PiAkRW50cnktPlsxXSwKICAgICAgICAgICAgICAgIERhdGFiYXNlRmllbGQgPT4gJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSAgID0+ICRFbnRyeS0+WzVdLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICVGaWVsZENvbmZpZzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgR2V0RmllbGRTZWxlY3Rpb25zKCkKClRoaXMgZnVuY3Rpb24gY29sbGVjdCB0aGUgc2VsZWN0aW9ucyBmb3IgdGhlIGdpdmVuIGZpZWxkIG5hbWUsIGlmIHRoZSBmaWVsZCBoYXMgc29tZSBzZWxlY3Rpb25zLgoKICAgIG15ICVTZWxlY3Rpb25zRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdldEZpZWxkU2VsZWN0aW9ucygKICAgICAgICBGaWVsZE5hbWUgPT4gJ1VzZXJUaXRsZScsCiAgICApOwoKUmV0dXJucyB0aGUgc2VsZWN0aW9ucyBmb3IgdGhlIGdpdmVuIGZpZWxkIG5hbWUgKG1lcmdlZCBmcm9tIGFsbCBzb3VyY2VzKSBvciBhIGVtcHR5IGhhc2g6CgogICAgbXkgJVNlbGVjdGlvbkRhdGEgPSAoCiAgICAgICAgJ01yLicgID0+ICdNci4nLAogICAgICAgICdNcnMuJyA9PiAnTXJzLicsCiAgICApOwoKPWN1dAoKc3ViIEdldEZpZWxkU2VsZWN0aW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlU2VsZWN0aW9uc0RhdGE7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57U2VsZWN0aW9uc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfTsKCiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gKAogICAgICAgICAgICAlU2VsZWN0aW9uc0RhdGEsICV7ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1NlbGVjdGlvbnN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gfQogICAgICAgICk7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldC4KICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTZWxlY3Rpb25zRGF0YSApIHsKICAgICAgICAkU2VsZWN0aW9uc0RhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZUlucHV0KCAkU2VsZWN0aW9uc0RhdGF7JEtleX0gKTsKICAgIH0KCiAgICAjIERlZmF1bHQgaGFuZGxpbmcgZm9yIGZpZWxkICdWYWxpZElEJy4KICAgIGlmICggISVTZWxlY3Rpb25zRGF0YSAmJiAkUGFyYW17RmllbGROYW1lfSA9fiAvXlZhbGlkSUQvaSApIHsKICAgICAgICAlU2VsZWN0aW9uc0RhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICB9CgogICAgcmV0dXJuICVTZWxlY3Rpb25zRGF0YTsKfQoKPWhlYWQyIEN1c3RvbWVySURMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2Ygd2l0aCBhbGwga25vd24gdW5pcXVlIEN1c3RvbWVySURzIG9mIHRoZSByZWdpc3RlcmVkIGN1c3RvbWVycyB1c2VycyAobm8gU2VhcmNoVGVybSksCm9yIGEgZmlsdGVyZWQgbGlzdCB3aGVyZSB0aGUgQ3VzdG9tZXJJRHMgbXVzdCBjb250YWluIGEgc2VhcmNoIHRlcm0uCgogICAgbXkgQEN1c3RvbWVySURzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJJRExpc3QoCiAgICAgICAgU2VhcmNoVGVybSAgPT4gJ3NvbWVjdXN0b21lcicsICAgICMgb3B0aW9uYWwKICAgICAgICBWYWxpZCAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lcklETGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGxpc3QgcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgcHVzaCBARGF0YSwgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPkN1c3RvbWVySURMaXN0KCVQYXJhbSk7CiAgICB9CgogICAgIyBtYWtlIGVudHJpZXMgdW5pcXVlCiAgICBteSAlVG1wOwogICAgQFRtcHtARGF0YX0gPSB1bmRlZjsKICAgIEBEYXRhID0gc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJVRtcDsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIERvbid0IHJldHVybiBjdXN0b21lciBJRHMgaWYgdGhlIGFnZW50IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgbXkgQENsZWFuZWRDdXN0b21lcklEczsKCiAgICAgICAgZm9yIG15ICRDdXN0b21lcklEICggQERhdGEgKSB7CiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAlQ29tcGFueSAmJiAkQ29tcGFueXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQENsZWFuZWRDdXN0b21lcklEcywgJEN1c3RvbWVySUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEBEYXRhID0gQENsZWFuZWRDdXN0b21lcklEczsKICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIHJldHVybiBARGF0YTsKfQoKPWhlYWQyIEN1c3RvbWVyTmFtZSgpCgpnZXQgY3VzdG9tZXIgdXNlciBuYW1lCgogICAgbXkgJE5hbWUgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoCiAgICAgICAgVXNlckxvZ2luID0+ICdzb21lLWxvZ2luJywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJOYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgR2V0IGN1c3RvbWVyIG5hbWUgYW5kIHJldHVybiBpdC4KICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lck5hbWUoJVBhcmFtKTsKICAgICAgICBpZiAoJE5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuICROYW1lOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKPWhlYWQyIEN1c3RvbWVySURzKCkKCmdldCBjdXN0b21lciB1c2VyIGN1c3RvbWVyIGlkcwoKICAgIG15IEBDdXN0b21lcklEcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVySURzKAogICAgICAgIFVzZXIgPT4gJ3NvbWUtbG9naW4nLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lcklEcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGlkcyAoc3RvcCBhZnRlciBmaXJzdCBzb3VyY2Ugd2l0aCByZXN1bHRzKQogICAgbXkgQEN1c3RvbWVySURzOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGlkcyBmcm9tIHNvdXJjZQogICAgICAgIG15IEBTb3VyY2VDdXN0b21lcklEcyA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lcklEcyglUGFyYW0pOwogICAgICAgIG5leHQgU09VUkNFIGlmICFAU291cmNlQ3VzdG9tZXJJRHM7CgogICAgICAgIEBDdXN0b21lcklEcyA9IEBTb3VyY2VDdXN0b21lcklEczsKICAgICAgICBsYXN0IFNPVVJDRTsKICAgIH0KCiAgICAjIGNyZWF0ZSBoYXNoIHdpdGggZXhpc3RpbmcgY3VzdG9tZXIgaWRzCiAgICBteSAlQ3VzdG9tZXJJRHMgPSBtYXAgeyAkXyA9PiAxIH0gQEN1c3RvbWVySURzOwoKICAgICMgZ2V0IHJlbGF0ZWQgY3VzdG9tZXIgaWRzCiAgICBteSBAUmVsYXRlZEN1c3RvbWVySURzID0gJFNlbGYtPkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17VXNlcn0sCiAgICApOwoKICAgICMgYWRkIHJlbGF0ZWQgY3VzdG9tZXIgaWRzIGlmIG5vdCBmb3VuZCBpbiBzb3VyY2UKICAgIFJFTEFURURDVVNUT01FUklEOgogICAgZm9yIG15ICRSZWxhdGVkQ3VzdG9tZXJJRCAoQFJlbGF0ZWRDdXN0b21lcklEcykgewogICAgICAgIG5leHQgUkVMQVRFRENVU1RPTUVSSUQgaWYgJEN1c3RvbWVySURzeyRSZWxhdGVkQ3VzdG9tZXJJRH07CgogICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkUmVsYXRlZEN1c3RvbWVySUQ7CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBEb24ndCByZXR1cm4gY3VzdG9tZXIgSURzIGlmIHRoZSBhZ2VudCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldy4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIG15IEBDbGVhbmVkQ3VzdG9tZXJJRHM7CgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIEBDdXN0b21lcklEcyApIHsKICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICVDb21wYW55ICYmICRDb21wYW55e0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQ2xlYW5lZEN1c3RvbWVySURzLCAkQ3VzdG9tZXJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQEN1c3RvbWVySURzID0gQENsZWFuZWRDdXN0b21lcklEczsKICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgcmV0dXJuIGN1c3RvbWVyIGlkcwogICAgcmV0dXJuIEBDdXN0b21lcklEczsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckRhdGFHZXQoKQoKZ2V0IHVzZXIgZGF0YSAoVXNlckxvZ2luLCBVc2VyRmlyc3RuYW1lLCBVc2VyTGFzdG5hbWUsIFVzZXJFbWFpbCwgLi4uKQoKICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICdmcmFueicsCiAgICApOwoKV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgYmFja2VuZHMgdGhlbiBvbmx5IHRoZSBkYXRhIGZyb20gdGhlIGZpcnN0IGJhY2tlbmQgd2hlcmUgdGhlIGN1c3RvbWVyIHVzZXIgaXMgZm91bmQuCkFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQgd2hlbiB0aGUgY3VzdG9tZXIgdXNlciB3YXMndCBmb3VuZCBpbiBhbnkgYmFja2VuZC4KCj1jdXQKCnN1YiBDdXN0b21lclVzZXJEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIHVubGVzcyAkUGFyYW17VXNlcn07CgogICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb25zIGZvciBDdXN0b21lclVzZXIuCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfTsKCiAgICAjIEdldCBuZWVkZWQgb2JqZWN0cy4KICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDdXN0b21lckNvbXBhbnlPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgIG15ICVDdXN0b21lciA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lclVzZXJEYXRhR2V0KCVQYXJhbSk7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISVDdXN0b21lcjsKCiAgICAgICAgIyBnZW5lcmF0ZSB0aGUgZnVsbCBuYW1lIGFuZCBzYXZlIGl0IGluIHRoZSBoYXNoCiAgICAgICAgbXkgJFVzZXJGdWxsbmFtZSA9ICRTZWxmLT5DdXN0b21lck5hbWUoJUN1c3RvbWVyKTsKCiAgICAgICAgIyBzYXZlIHRoZSBnZW5lcmF0ZWQgZnVsbG5hbWUgaW4gdGhlIGhhc2guCiAgICAgICAgJEN1c3RvbWVye1VzZXJGdWxsbmFtZX0gPSAkVXNlckZ1bGxuYW1lOwoKICAgICAgICAjIGFkZCBwcmVmZXJlbmNlcyBkZWZhdWx0cwogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKTsKICAgICAgICBpZiAoJENvbmZpZykgewogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JENvbmZpZ30gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgIWRlZmluZWQgJENvbmZpZy0+eyRLZXl9LT57RGF0YVNlbGVjdGVkfTsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmIGRlZmluZWQgJEN1c3RvbWVyeyAkQ29uZmlnLT57JEtleX0tPntQcmVmS2V5fSB9OwoKICAgICAgICAgICAgICAgICMgc2V0IGRlZmF1bHQgZGF0YQogICAgICAgICAgICAgICAgJEN1c3RvbWVyeyAkQ29uZmlnLT57JEtleX0tPntQcmVmS2V5fSB9ID0gJENvbmZpZy0+eyRLZXl9LT57RGF0YVNlbGVjdGVkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBjdXN0b21lciBjb21wYW55IHN1cHBvcnQgaXMgZW5hYmxlZCBhbmQgZ2V0IGNvbXBhbnkgZGF0YQogICAgICAgIG15ICVDb21wYW55OwogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkiKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJUNvbXBhbnkgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcntVc2VyQ3VzdG9tZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ29tcGFueXtDdXN0b21lckNvbXBhbnlWYWxpZElEfSA9ICRDb21wYW55e1ZhbGlkSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9ICkgKSB7CiAgICAgICAgICAgIENVU1RPTUVSVVNFUkZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlckZpZWxkICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJGSUVMRCBpZiAkQ3VzdG9tZXJVc2VyRmllbGQtPls1XSBuZSAnZHluYW1pY19maWVsZCc7CiAgICAgICAgICAgICAgICBuZXh0IENVU1RPTUVSVVNFUkZJRUxEIGlmICEkRHluYW1pY0ZpZWxkTG9va3VweyAkQ3VzdG9tZXJVc2VyRmllbGQtPlsyXSB9OwoKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyVXNlckZpZWxkLT5bMl0gfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVye1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRDdXN0b21lcnsgJEN1c3RvbWVyVXNlckZpZWxkLT5bMF0gfSA9ICRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uLgogICAgICAgIGlmICggJEN1c3RvbWVye1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1VzZXJHcm91cElEU3luY307CgogICAgICAgICAgICAjIFJlcGxhY2UgdGhlIHJlbW90ZSBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIGxvY2FsIGdyb3VwLgogICAgICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJ7VXNlckdyb3VwSUR9IGVxICRSZW1vdGVHcm91cCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVye1VzZXJHcm91cElEfSA9ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH17JFJlbW90ZUdyb3VwfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIG1hdGNoZWQuCiAgICAgICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVye1VzZXJHcm91cElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBHcm91cCA9PiAkQ3VzdG9tZXJ7VXNlckdyb3VwSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBhbnkgbGltaXRzIGFyZSBzZXQuCiAgICAgICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICFncmVwIHsgJF8gPX4gL14kQ3VzdG9tZXJ7VXNlckdyb3VwSUR9JC8gfSBAeyAkU2VsZi0+e1VzZXJHcm91cElEc30gfSApIHsKICAgICAgICAgICAgICAgICMgVGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhpcyBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIElmIHRoZXJlIGFyZSBubyBncm91cCBzZXR0aW5ncywgY2hlY2sgaWYgcGVybWlzc2lvbiBvbiBjdXN0b21lciBjb21wYW55IGlzIHBlcm1pdHRlZC4KICAgICAgICBlbHNpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSAmJiAhJEN1c3RvbWVye1VzZXJHcm91cElEfSAmJiAoICElQ29tcGFueSB8fCAhJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICAgICAjIHJldHVybiBjdXN0b21lciBkYXRhCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJUNvbXBhbnksCiAgICAgICAgICAgICVDdXN0b21lciwKICAgICAgICAgICAgU291cmNlICAgICAgICA9PiAiQ3VzdG9tZXJVc2VyJENvdW50IiwKICAgICAgICAgICAgQ29uZmlnICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLAogICAgICAgICAgICBDb21wYW55Q29uZmlnID0+ICRDb25maWdPYmplY3QtPkdldCggJENvbXBhbnl7U291cmNlfSAvLyAnQ3VzdG9tZXJDb21wYW55JyApLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyQWRkKCkKCnRvIGFkZCBuZXcgY3VzdG9tZXIgdXNlcnMKCiAgICBteSAkVXNlckxvZ2luID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgIFNvdXJjZSAgICAgICAgID0+ICdDdXN0b21lclVzZXInLCAjIEN1c3RvbWVyVXNlciBzb3VyY2UgY29uZmlnCiAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJ01hbmZyZWQnLAogICAgICAgIFVzZXJMYXN0bmFtZSAgID0+ICdIdWJlcicsCiAgICAgICAgVXNlckN1c3RvbWVySUQgPT4gJ0ExMjQnLAogICAgICAgIFVzZXJMb2dpbiAgICAgID0+ICdtaHViZXInLAogICAgICAgIFVzZXJQYXNzd29yZCAgID0+ICdzb21lLXBhc3MnLCAjIG5vdCByZXF1aXJlZAogICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICdtYW5mcmVkLmh1YmVyQGV4YW1wbGUuY29tJywKICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBkYXRhIHNvdXJjZQogICAgaWYgKCAhJFBhcmFte1NvdXJjZX0gKSB7CiAgICAgICAgJFBhcmFte1NvdXJjZX0gPSAnQ3VzdG9tZXJVc2VyJzsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBpZiAoICRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKICAgICAgICBpZiAoJVVzZXIpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoICdDdXN0b21lciB1c2VyICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJFBhcmFte1VzZXJMb2dpbn0gKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGFkZCB0aGUgVXNlckdyb3VwSUQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBkZWxldGUgJFBhcmFte1VzZXJHcm91cElEfTsKICAgIH0KCiAgICBteSAkVXNlckdyb3VwSURTeW5jID0gJFNlbGYtPnskUGFyYW17U291cmNlfX0tPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSApIHsKICAgICAgICAjIENoZWNrIGlmIGdyb3VwIElEIG9yIGdyb3VwIG5hbWVzIHNob3VsZCBiZSBtYXRjaGVkLgogICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICBteSAkR3JvdXBOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkUGFyYW17VXNlckdyb3VwSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRHcm91cE5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VXNlckdyb3VwSUR9IGVxICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH17JFJlbW90ZUdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIHN0b3JlIGN1c3RvbWVyIHVzZXIgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57ICRQYXJhbXtTb3VyY2V9IH0tPkN1c3RvbWVyVXNlckFkZCglUGFyYW0pOwogICAgcmV0dXJuIGlmICEkUmVzdWx0OwoKICAgICMgdHJpZ2dlciBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ3VzdG9tZXJVc2VyQWRkJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgTmV3RGF0YSAgID0+IFwlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0OwoKfQoKPWhlYWQyIEN1c3RvbWVyVXNlclVwZGF0ZSgpCgp0byB1cGRhdGUgY3VzdG9tZXIgdXNlcnMKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJVcGRhdGUoCiAgICAgICAgU291cmNlICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyJywgIyBDdXN0b21lclVzZXIgc291cmNlIGNvbmZpZwogICAgICAgIElEICAgICAgICAgICAgPT4gJ21oJyAgICAgICAgICAgICMgY3VycmVudCB1c2VyIGxvZ2luCiAgICAgICAgVXNlckxvZ2luICAgICA9PiAnbWh1YmVyJywgICAgICAgIyBuZXcgdXNlciBsb2dpbgogICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0h1YmVyJywKICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdNYW5mcmVkJywKICAgICAgICBVc2VyUGFzc3dvcmQgID0+ICdzb21lLXBhc3MnLCAgICAjIG5vdCByZXF1aXJlZAogICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ2VtYWlsQGV4YW1wbGUuY29tJywKICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlckxvZ2luISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBVc2VyTG9naW4tcmVuYW1pbmcgYW5kIGlmIG5ldyBVc2VyTG9naW4gYWxyZWFkeSBleGlzdHMuLi4KICAgIGlmICggJFBhcmFte0lEfSAmJiAoIGxjICRQYXJhbXtVc2VyTG9naW59IG5lIGxjICRQYXJhbXtJRH0gKSApIHsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CiAgICAgICAgaWYgKCVVc2VyKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCAnQ3VzdG9tZXIgdXNlciAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRQYXJhbXtVc2VyTG9naW59ICksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgbXkgJFVzZXJMb2dpbiA9ICRQYXJhbXtJRH0gfHwgJFBhcmFte1VzZXJMb2dpbn07CiAgICBteSAlVXNlciAgICAgID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFVzZXJMb2dpbiApOwogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIHVzZXIgJyRVc2VyTG9naW4nISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBVc2VyR3JvdXBJRC4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICMgU2V0IHRoZSBVc2VyR3JvdXBJRCB0byB0aGUgY3VycmVudCBVc2VyR3JvdXBJRC4KICAgICAgICBpZiAoICRVc2Vye1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRVc2Vye1VzZXJHcm91cElEfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57JFVzZXJ7U291cmNlfX0tPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSApIHsKICAgICAgICAjIENoZWNrIGlmIGdyb3VwIElEIG9yIGdyb3VwIG5hbWVzIHNob3VsZCBiZSBtYXRjaGVkLgogICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICBteSAkR3JvdXBOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkUGFyYW17VXNlckdyb3VwSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRHcm91cE5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VXNlckdyb3VwSUR9IGVxICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH17JFJlbW90ZUdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5DdXN0b21lclVzZXJVcGRhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gdW5sZXNzICRSZXN1bHQ7CgogICAgIyB0cmlnZ2VyIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDdXN0b21lclVzZXJVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgIE5ld0RhdGEgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBPbGREYXRhICAgPT4gXCVVc2VyLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIFNldFBhc3N3b3JkKCkKCnRvIHNldCBjdXN0b21lciB1c2VycyBwYXNzd29yZHMKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQYXNzd29yZCgKICAgICAgICBVc2VyTG9naW4gPT4gJ3NvbWUtbG9naW4nLAogICAgICAgIFBXICAgICAgICA9PiAnc29tZS1uZXctcGFzc3dvcmQnCiAgICApOwoKPWN1dAoKc3ViIFNldFBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVXNlciBVc2VyTG9naW4hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlckxvZ2lufSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPlNldFBhc3N3b3JkKCVQYXJhbSk7Cn0KCj1oZWFkMiBHZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKCkKCmdlbmVyYXRlIGEgcmFuZG9tIHBhc3N3b3JkCgogICAgbXkgJFBhc3N3b3JkID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCgpOwoKICAgIG9yCgogICAgbXkgJFBhc3N3b3JkID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCgKICAgICAgICBTaXplID0+IDE2LAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmF0ZVJhbmRvbVBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57Q3VzdG9tZXJVc2VyfS0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCglUGFyYW0pOwp9Cgo9aGVhZDIgU2V0UHJlZmVyZW5jZXMoKQoKc2V0IGN1c3RvbWVyIHVzZXIgcHJlZmVyZW5jZXMKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEID0+ICdzb21lLWxvZ2luJywKICAgICk7Cgo9Y3V0CgpzdWIgU2V0UHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBEb24ndCBhbGxvdyBvdmVyd3JpdGluZyBvZiBuYXRpdmUgdXNlciBkYXRhLgogICAgbXkgJUJsYWNrbGlzdGVkID0gKAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgVXNlckxvZ2luICAgICAgPT4gMSwKICAgICAgICBVc2VyUGFzc3dvcmQgICA9PiAxLAogICAgICAgIFVzZXJGaXJzdG5hbWUgID0+IDEsCiAgICAgICAgVXNlckxhc3RuYW1lICAgPT4gMSwKICAgICAgICBVc2VyRnVsbG5hbWUgICA9PiAxLAogICAgICAgIFVzZXJTdHJlZXQgICAgID0+IDEsCiAgICAgICAgVXNlckNpdHkgICAgICAgPT4gMSwKICAgICAgICBVc2VyWmlwICAgICAgICA9PiAxLAogICAgICAgIFVzZXJDb3VudHJ5ICAgID0+IDEsCiAgICAgICAgVXNlckNvbW1lbnQgICAgPT4gMSwKICAgICAgICBVc2VyQ3VzdG9tZXJJRCA9PiAxLAogICAgICAgIFVzZXJUaXRsZSAgICAgID0+IDEsCiAgICAgICAgVXNlckVtYWlsICAgICAgPT4gMSwKICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAxLAogICAgICAgIENoYW5nZUJ5ICAgICAgID0+IDEsCiAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gMSwKICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAxLAogICAgICAgIFVzZXJQaG9uZSAgICAgID0+IDEsCiAgICAgICAgVXNlck1vYmlsZSAgICAgPT4gMSwKICAgICAgICBVc2VyRmF4ICAgICAgICA9PiAxLAogICAgICAgIFVzZXJNYWlsU3RyaW5nID0+IDEsCiAgICAgICAgVmFsaWRJRCAgICAgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDAgaWYgJEJsYWNrbGlzdGVkeyAkUGFyYW17S2V5fSB9OwoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlcklEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhbGwgbmV3IGFwaSAoMi40LjggYW5kIGhpZ2hlcikKICAgIGlmICggJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5jYW4oJ1NldFByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+U2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKICAgIH0KCiAgICAjIGNhbGwgb2xkIGFwaQogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9Cgo9aGVhZDIgR2V0UHJlZmVyZW5jZXMoKQoKZ2V0IGN1c3RvbWVyIHVzZXIgcHJlZmVyZW5jZXMKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJ3NvbWUtbG9naW4nLAogICAgKTsKCj1jdXQKCnN1YiBHZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VySUR9ICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggdXNlciAnJFBhcmFte1VzZXJJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIG5ldyBhcGkgKDIuNC44IGFuZCBoaWdoZXIpCiAgICBpZiAoICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+Y2FuKCdHZXRQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybiAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPkdldFByZWZlcmVuY2VzKCVQYXJhbSk7CiAgICB9CgogICAgIyBjYWxsIG9sZCBhcGkKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKPWhlYWQyIFNlYXJjaFByZWZlcmVuY2VzKCkKCnNlYXJjaCBpbiB1c2VyIHByZWZlcmVuY2VzCgogICAgbXkgJVVzZXJMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+U2VhcmNoUHJlZmVyZW5jZXMoCiAgICAgICAgS2V5ICAgPT4gJ1VzZXJTb21lS2V5JywKICAgICAgICBWYWx1ZSA9PiAnU29tZVZhbHVlJywgICAjIG9wdGlvbmFsLCBsaW1pdCB0byBhIGNlcnRhaW4gdmFsdWUvcGF0dGVybgogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIHNlYXJjaCByZXN1bHQgb2YgYmFja2VuZCBhbmQgbWVyZ2UgaXQKICAgICAgICAjIGNhbGwgbmV3IGFwaSAoMi40LjggYW5kIGhpZ2hlcikKICAgICAgICBteSAlU3ViRGF0YTsKICAgICAgICBpZiAoICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5jYW4oJ1NlYXJjaFByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVTdWJEYXRhID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPlNlYXJjaFByZWZlcmVuY2VzKCVQYXJhbSk7CiAgICAgICAgfQoKICAgICAgICAjIGNhbGwgb2xkIGFwaQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlU3ViRGF0YSA9ICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZWFyY2hQcmVmZXJlbmNlcyglUGFyYW0pOwogICAgICAgIH0KICAgICAgICAlRGF0YSA9ICggJVN1YkRhdGEsICVEYXRhICk7CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgVG9rZW5HZW5lcmF0ZSgpCgpnZW5lcmF0ZSBhIHJhbmRvbSB0b2tlbgoKICAgIG15ICRUb2tlbiA9ICRDdXN0b21lclVzZXJPYmplY3QtPlRva2VuR2VuZXJhdGUoCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVG9rZW5HZW5lcmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkVG9rZW4gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggPT4gMTQsCiAgICApOwoKICAgICMgc2F2ZSB0b2tlbiBpbiBwcmVmZXJlbmNlcwogICAgJFNlbGYtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlclRva2VuJywKICAgICAgICBWYWx1ZSAgPT4gJFRva2VuLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRUb2tlbjsKfQoKPWhlYWQyIFRva2VuQ2hlY2soKQoKY2hlY2sgcGFzc3dvcmQgdG9rZW4KCiAgICBteSAkVmFsaWQgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0PlRva2VuQ2hlY2soCiAgICAgICAgVG9rZW4gID0+ICRUb2tlbiwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBUb2tlbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUb2tlbn0gfHwgISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBUb2tlbiBhbmQgVXNlcklEISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcyB0b2tlbgogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayByZXF1ZXN0ZWQgdnMuIHN0b3JlZCB0b2tlbgogICAgcmV0dXJuIGlmICEkUHJlZmVyZW5jZXN7VXNlclRva2VufTsKICAgIHJldHVybiBpZiAkUHJlZmVyZW5jZXN7VXNlclRva2VufSBuZSAkUGFyYW17VG9rZW59OwoKICAgICMgcmVzZXQgcGFzc3dvcmQgdG9rZW4KICAgICRTZWxmLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICAgPT4gJ1VzZXJUb2tlbicsCiAgICAgICAgVmFsdWUgID0+ICcnLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJDYWNoZUNsZWFyKCkKCmNsZWFyIGNhY2hlIG9mIGN1c3RvbWVyIHVzZXIgZGF0YQoKICAgICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckNhY2hlQ2xlYXIoCiAgICAgICAgVXNlckxvZ2luID0+ICdtaHViZXInLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJDYWNoZUNsZWFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CiAgICAgICAgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPl9DdXN0b21lclVzZXJDYWNoZUNsZWFyKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyQWRkKCkKCnRvIGFkZCBhIGN1c3RvbWVyIHVzZXIgdG8gYSBjdXN0b21lcgoKICAgIG15ICRTdWNjZXNzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJBZGQoCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gMTIzLAogICAgICAgIEN1c3RvbWVySUQgICAgID0+IDEyMywKICAgICAgICBBY3RpdmUgICAgICAgICA9PiAxLCAgICAgICAgIyBvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3VzdG9tZXJVc2VySUQgQ3VzdG9tZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGFmZmVjdGVkIGNhY2hlcwogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3Q6Oic7CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5IC4gJ0N1c3RvbWVyVXNlcklEOjonIC4gJFBhcmFte0N1c3RvbWVyVXNlcklEfSwKICAgICk7CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5IC4gJ0N1c3RvbWVySUQ6OicgLiAkUGFyYW17Q3VzdG9tZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGN1c3RvbWVyX3VzZXJfY3VzdG9tZXIKICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgQU5EIGN1c3RvbWVyX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3VzdG9tZXJVc2VySUR9LCBcJFBhcmFte0N1c3RvbWVySUR9IF0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIHJlbGF0aW9uIGlzIG5vdCBhY3RpdmUKICAgIHJldHVybiAxIGlmICEkUGFyYW17QWN0aXZlfTsKCiAgICAjIGluc2VydCBuZXcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBJTlNFUlQgSU5UTyBjdXN0b21lcl91c2VyX2N1c3RvbWVyICh1c2VyX2lkLCBjdXN0b21lcl9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwKICAgICAgICAgICAgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkKICAgICAgICAgICAgVkFMVUVTICg/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJJRH0sIFwkUGFyYW17Q3VzdG9tZXJJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LCBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCgpCgpnZXQgcmVsYXRlZCBjdXN0b21lciBJRHMgb2YgYSBjdXN0b21lciB1c2VyCgogICAgbXkgQEN1c3RvbWVySURzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0KAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgogICAgQEN1c3RvbWVySURzID0gKAogICAgICAgICcxMjMnLAogICAgICAgICc0NTYnLAogICAgKTsKCmdldCByZWxhdGVkIGN1c3RvbWVyIHVzZXJzIG9mIGEgY3VzdG9tZXIgSUQKCiAgICBteSBAQ3VzdG9tZXJVc2VycyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgogICAgQEN1c3RvbWVyVXNlcnMgPSAoCiAgICAgICAgJzEyMycsCiAgICAgICAgJzQ1NicsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICYmICEkUGFyYW17Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdHb3Qgbm8gQ3VzdG9tZXJVc2VySUQgb3IgQ3VzdG9tZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0OjonOwoKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGlzIHJlc3VsdCBpcyBwcmVzZW50IChpbiBjYWNoZSkKICAgICAgICAkQ2FjaGVLZXkgLj0gJ0N1c3RvbWVyVXNlcklEOjonIC4gJFBhcmFte0N1c3RvbWVyVXNlcklEfTsKICAgICAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgaWRzCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PgogICAgICAgICAgICAgICAgJ1NFTEVDVCBjdXN0b21lcl9pZAogICAgICAgICAgICAgICAgRlJPTSBjdXN0b21lcl91c2VyX2N1c3RvbWVyCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgT1JERVIgQlkgY3VzdG9tZXJfaWQnLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJJRH0sIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgQEN1c3RvbWVySURzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBDdXN0b21lcklEcywKCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIEBDdXN0b21lcklEczsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHByZXNlbnQgKGluIGNhY2hlKQogICAgICAgICRDYWNoZUtleSAuPSAnQ3VzdG9tZXJJRDo6JyAuICRQYXJhbXtDdXN0b21lcklEfTsKICAgICAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgdXNlcnMKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+CiAgICAgICAgICAgICAgICAnU0VMRUNUIHVzZXJfaWQKICAgICAgICAgICAgICAgIEZST00gY3VzdG9tZXJfdXNlcl9jdXN0b21lciBXSEVSRQogICAgICAgICAgICAgICAgY3VzdG9tZXJfaWQgPSA/CiAgICAgICAgICAgICAgICBPUkRFUiBCWSB1c2VyX2lkJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3VzdG9tZXJJRH0sIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgQEN1c3RvbWVyVXNlcklEczsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJVc2VySURzLCAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcQEN1c3RvbWVyVXNlcklEcywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gQEN1c3RvbWVyVXNlcklEczsKICAgIH0KfQoKPWhlYWQyIERlbGV0ZU9uZVByZWZlcmVuY2UoKQoKZ2V0IGN1c3RvbWVyIHVzZXIgcHJlZmVyZW5jZXMKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5EZWxldGVPbmVQcmVmZXJlbmNlKAogICAgICAgIFVzZXJJRCA9PiAnc29tZS1sb2dpbicsCiAgICAgICAgS2V5ICAgID0+ICdQcmVmZXJlbmNlS2V5JywKICAgICk7Cgo9Y3V0CgpzdWIgRGVsZXRlT25lUHJlZmVyZW5jZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VySUR9ICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggdXNlciAnJFBhcmFte1VzZXJJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIG5ldyBhcGkgKDIuNC44IGFuZCBoaWdoZXIpCiAgICBpZiAoICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+Y2FuKCdEZWxldGVPbmVQcmVmZXJlbmNlJykgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+RGVsZXRlT25lUHJlZmVyZW5jZSglUGFyYW0pOwogICAgfQoKICAgICMgY2FsbCBvbGQgYXBpCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkRlbGV0ZU9uZVByZWZlcmVuY2UoJVBhcmFtKTsKfQoKc3ViIERFU1RST1kgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGV4ZWN1dGUgYWxsIHRyYW5zYWN0aW9uIGV2ZW50cwogICAgJFNlbGYtPkV2ZW50SGFuZGxlclRyYW5zYWN0aW9uKCk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Kernel/Config/Files/XML/CustomerMultitenancy.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJNdWx0aXRlbmFuY3kiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyB0aGUgbXVsdGl0ZW5hbmN5IGZ1bmN0aW9uIGZvciBjdXN0b21lciBhbmQgY3VzdG9tZXIgdXNlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlBlcm1pc3Npb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TcGVjaWZpZXMgdGhlIGdyb3VwIHRoYXQgY2FuIHNldCBtdWx0aXRlbmFuY3kgZm9yIGN1c3RvbWVyLiBNdWx0aXRlbmFuY3kgZG9lcyBub3QgYXBwbHkgdG8gbWVtYmVycyBvZiB0aGlzIGdyb3VwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6UGVybWlzc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPmFkbWluPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Language/de_CustomerMultitenancy.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0N1c3RvbWVyTXVsdGl0ZW5hbmN5OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIG11bHRpdGVuYW5jeSBmdW5jdGlvbiBmb3IgY3VzdG9tZXIgYW5kIGN1c3RvbWVyIHVzZXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3BlY2lmaWVzIHRoZSBncm91cCB0aGF0IGNhbiBzZXQgbXVsdGl0ZW5hbmN5IGZvciBjdXN0b21lci4gTXVsdGl0ZW5hbmN5IGRvZXMgbm90IGFwcGx5IHRvIG1lbWJlcnMgb2YgdGhpcyBncm91cC4nfSA9CiAgICAgICAgJyc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="doc/en/CustomerMultitenancy.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="customer_user">
            <ColumnAdd Name="group_id" Required="false" Size="100" Type="VARCHAR"></ColumnAdd>
        </TableAlter>
        <TableAlter Type="post" Name="customer_company">
            <ColumnAdd Name="group_id" Required="false" Size="100" Type="VARCHAR"></ColumnAdd>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="customer_user">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
        <TableAlter Type="pre" Name="customer_company">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>