<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerMultitenancy</Name>
    <Version>10.1.3</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-28 13:08:39" Version="10.1.3">Added hungarian translation; tidied and updated to latest OTOBO 10.1 state.</ChangeLog>
    <ChangeLog Date="2025-02-26 13:46:08" Version="10.1.2">Updated to OTOBO 10.1.12.</ChangeLog>
    <ChangeLog Date="2022-06-01 13:13:24" Version="10.1.1">Initial Release on OTOBO 10.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>10.1.x</Framework>
    <BuildCommitID>aef9aa5f08e4f177a429e5d79f92f473f205dde5</BuildCommitID>
    <BuildDate>2026-10-28 13:08:43</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AdminCustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKdXNlIExpc3Q6OlV0aWwgcXcoYW55KTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0gPSB7IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfSB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkTmF2ICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmF2JyApIHx8IDA7CiAgICBteSAkTmF2aWdhdGlvbkJhclR5cGUgPSAkTmF2IGVxICdBZ2VudCcgPyAnQ3VzdG9tZXJzJyA6ICdBZG1pbic7CiAgICBteSAkU2VhcmNoICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VhcmNoJyApOwogICAgJFNlYXJjaAogICAgICAgIHx8PSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FkbWluQ3VzdG9tZXJDb21wYW55OjpSdW5Jbml0aWFsV2lsZGNhcmRTZWFyY2gnKSA/ICcqJyA6ICcnOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDdXN0b21lckNvbXBhbnlPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55Jyk7CgogICAgbXkgJUdldFBhcmFtOwogICAgJEdldFBhcmFte1NvdXJjZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU291cmNlJyApIHx8ICdDdXN0b21lckNvbXBhbnknOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gc2V0IG11bHRpdGVuYW5jeS4KICAgIGlmICggJENvbmZpZ09iamVjdC0+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+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGUgZW50cmllcwogICAgICAgIGlmICggJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSBuZSAkR2V0UGFyYW17Q3VzdG9tZXJJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBDdXN0b21lckNvbXBhbnkgbGlzdAogICAgICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgICAgIGlmICggJUxpc3QgJiYgJExpc3R7ICRHZXRQYXJhbXtDdXN0b21lcklEfSB9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tEdXBsaWNhdGV9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgZ3JvdXAKICAgICAgICAgICAgbXkgJFVwZGF0ZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSggJUdldFBhcmFtLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9ICk7CgogICAgICAgICAgICBpZiAoJFVwZGF0ZSkgewoKICAgICAgICAgICAgICAgIG15ICRTZXRERkVycm9yOwoKICAgICAgICAgICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoQEN1c3RvbWVyQ29tcGFueU1hcCkgewogICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gbmUgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9LT57ICRFbnRyeS0+WzJdIH07CgogICAgICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2V0REZFcnJvciAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pYyBmaWVsZCAlcyBub3QgZm91bmQhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlU2V0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2V0REZFcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJENvbnRpbnVlQWZ0ZXJTYXZlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApIHx8IDA7CgogICAgICAgICAgICAgICAgIyBpZiBzZXQgREYgZXJyb3IgZXhpc3RzLCBjcmVhdGUgbm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICBpZiAoJFNldERGRXJyb3IpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIGN1c3RvbWVyIGNvbXBhbnksIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29udGludWVBZnRlclNhdmUgZXEgJzEnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJ0NoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycyA9PiBcJUVycm9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgY29tcGFueSB1cGRhdGVkIScpICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2V0REZFcnJvcjsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGlmIHRoZSB1c2VyIHdvdWxkIGxpa2UgdG8gY29udGludWUgZWRpdGluZyB0aGUgY3VzdG9tZXIgY29tcGFueSwganVzdCByZWRpcmVjdCB0byB0aGUgZWRpdCBzY3JlZW4KICAgICAgICAgICAgICAgIGlmICggJENvbnRpbnVlQWZ0ZXJTYXZlIGVxICcxJyApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1DaGFuZ2U7Q3VzdG9tZXJJRD0iIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ3VzdG9tZXJJRCkgLiAiO05hdj0kTmF2O05vdGlmaWNhdGlvbj1VcGRhdGUiCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gdG8gb3ZlcnZpZXcKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O05vdGlmaWNhdGlvbj1VcGRhdGUiICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29tZXRoaW5nIHdlbnQgd3JvbmcKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwoKICAgICAgICAjIHNldCBub3RpZmljYXRpb24gZm9yIGR1cGxpY2F0ZSBlbnRyeQogICAgICAgIGlmICggJEVycm9yc3tEdXBsaWNhdGV9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBJbmZvICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyIENvbXBhbnkgJXMgYWxyZWFkeSBleGlzdHMhJywKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBFcnJvcnMgPT4gXCVFcnJvcnMsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkJyApIHsKICAgICAgICAkR2V0UGFyYW17TmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmFtZScgKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUVycm9yczsKCiAgICAgICAgbXkgJEN1c3RvbWVyQ29tcGFueUtleSA9ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e0N1c3RvbWVyQ29tcGFueUtleX07CiAgICAgICAgbXkgJEN1c3RvbWVyQ29tcGFueUlEOwoKICAgICAgICAjIEdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0LgogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJENvbmZpZ09iamVjdC0+R2V0KCAkR2V0UGFyYW17U291cmNlfSApLT57TWFwfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyApIHsKCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9LT57ICRFbnRyeS0+WzJdIH07CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEeW5hbWljRmllbGQgJEVudHJ5LT5bMl0gbm90IGZvdW5kISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgPT4gJEVudHJ5LT5bNF0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgc3RvcmFibGUgdmFsdWUgb2YgZHluYW1pYyBmaWVsZCBlZGl0IGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayByZW1haW5pbmcgbm9uLWR5bmFtaWMtZmllbGQgbWFuZGF0b3J5IGZpZWxkcwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRFbnRyeS0+WzBdICkgLy8gJyc7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gJiYgJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSBjdXN0b21lciBjb21wYW55IGtleSBmb3IgY2hlY2tpbmcgZHVwbGljYXRlCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bMl0gZXEgJEN1c3RvbWVyQ29tcGFueUtleSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckNvbXBhbnlJRCA9ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgQ3VzdG9tZXJDb21wYW55IGxpc3QKICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBkdXBsaWNhdGUgZmllbGQKICAgICAgICBpZiAoICVMaXN0ICYmICRMaXN0eyRDdXN0b21lckNvbXBhbnlJRH0gKSB7CiAgICAgICAgICAgICRFcnJvcnN7RHVwbGljYXRlfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGVycm9ycyBvY2N1cnJlZAogICAgICAgIGlmICggISVFcnJvcnMgKSB7CgogICAgICAgICAgICAjIGFkZCBjb21wYW55CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgY29tcGFueSBhZGRlZCEnKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgICAgICAgICAgICAgRU5UUlk6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJENvbmZpZ09iamVjdC0+R2V0KCAkR2V0UGFyYW17U291cmNlfSApLT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gbmUgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9LT57ICRFbnRyeS0+WzJdIH07CgogICAgICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljIGZpZWxkICVzIG5vdCBmb3VuZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlU2V0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBkeW5hbWljIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29tZXRoaW5nIHdlbnQgd3JvbmcKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwoKICAgICAgICAjIHNldCBub3RpZmljYXRpb24gZm9yIGR1cGxpY2F0ZSBlbnRyeQogICAgICAgIGlmICggJEVycm9yc3tEdXBsaWNhdGV9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBJbmZvICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyIENvbXBhbnkgJXMgYWxyZWFkeSBleGlzdHMhJywKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FkZCcsCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBFcnJvcnMgPT4gXCVFcnJvcnMsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPl9PdmVydmlldygKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICBteSAkT3V0cHV0ICAgICAgID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgY29tcGFueSB1cGRhdGVkIScpICkKICAgICAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb24gZXEgJ1VwZGF0ZScgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX0VkaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzZW5kIHBhcmFtZXRlciBSZWFkT25seSB0byBKUyBvYmplY3QKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmVhZE9ubHknLAogICAgICAgIFZhbHVlID0+ICRDb25maWdPYmplY3QtPnsgJFBhcmFte1NvdXJjZX0gfS0+e1JlYWRPbmx5fSwKICAgICk7CgogICAgIyBHZXQgdmFsaWQgb2JqZWN0LgogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgJFBhcmFteydWYWxpZE9wdGlvbid9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSwKICAgICk7CgogICAgIyBHZXQgbmVlZGVkIG9iamVjdHMuCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzBdICkgewoKICAgICAgICAgICAgIyBIYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICMgR2V0IEhUTUwgZm9yIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9ID8gJFBhcmFteyAkRW50cnktPlswXSB9IDogdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAgICAgICAgICMgU2VydmVyIGVycm9yLCBpZiBhbnkKICAgICAgICAgICAgICAgICAgICAleyAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSB9IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgZm9yIHdoaWNoIEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZEhUTUwpOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzR2VuZXJpYycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEJsb2NrID0gJ0lucHV0JzsKCiAgICAgICAgICAgICMgYnVpbGQgc2VsZWN0aW9ucyBvciBpbnB1dCBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25SZXF1aXJlZCA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBidWlsZCBWYWxpZElEIHN0cmluZwogICAgICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57U2VsZWN0aW9uc30KICAgICAgICAgICAgICAgICAgICAgICAgLT57ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDM1LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiAvXkN1c3RvbWVyQ29tcGFueUNvdW50cnkvaSApIHsKICAgICAgICAgICAgICAgIG15ICRPcHRpb25SZXF1aXJlZCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgICAgICAgICAkT3B0aW9uUmVxdWlyZWQgPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYnVpbGQgQ291bnRyeSBzdHJpbmcKICAgICAgICAgICAgICAgIG15ICRDb3VudHJ5TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZWZlcmVuY2VEYXRhJyktPkNvdW50cnlMaXN0KCk7CgogICAgICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ291bnRyeUxpc3QsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAiJE9wdGlvblJlcXVpcmVkIE1vZGVybml6ZSAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgKCAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnICksCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiBkZWZpbmVkKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gKSA/ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSA6IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEVudHJ5LT5bMF0gPX4gL15WYWxpZElEL2kgKSB7CiAgICAgICAgICAgICAgICBteSAkT3B0aW9uUmVxdWlyZWQgPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE9wdGlvblJlcXVpcmVkID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgPT4geyAkVmFsaWRPYmplY3QtPlZhbGlkTGlzdCgpLCB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICIkT3B0aW9uUmVxdWlyZWQgTW9kZXJuaXplICIgLgogICAgICAgICAgICAgICAgICAgICAgICAoICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gfHwgJycgKSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApID8gJFBhcmFteyAkRW50cnktPlswXSB9IDogMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAgICAgIyBCdWlsZCB0aGUgZ3JvdXAgZmllbGQuCiAgICAgICAgICAgIGVsc2lmICggJEVudHJ5LT5bMF0gPX4gL15Vc2VyR3JvdXBJRCQvaSApIHsKICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHRoZSBwZXJtaXNzaW9uIHRvIHNlZS9jaGFuZ2UgdGhlIG11bHRpdGVuYW5jeSBmaWVsZC4KICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TXVsdGl0ZW5hbmN5UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIyBCdWlsZCB0aGUgZmllbGQuCiAgICAgICAgICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gfHwgJycgKSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgcmVxdWlyZWQgZmxhZwogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgJFBhcmFte01hbmRhdG9yeUNsYXNzfSA9ICdjbGFzcz0iTWFuZGF0b3J5Iic7CiAgICAgICAgICAgICAgICAkUGFyYW17U3RhckxhYmVsfSAgICAgID0gJzxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+JzsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSAgPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte01hbmRhdG9yeUNsYXNzfSA9ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte1N0YXJMYWJlbH0gICAgICA9ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgcmVxdWlyZWQgZmxhZwogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzddICkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5VHlwZX0gPSAncmVhZG9ubHk9InJlYWRvbmx5Iic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBmb3JtIG9wdGlvbgogICAgICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSAmJiAkUGFyYW17VHlwZX0gZXEgJ2hpZGRlbicgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9IC49ICRQYXJhbXtWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc0dlbmVyaWMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJdGVtID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpYyRCbG9jayIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRGaWVsZCA9PiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljJHtCbG9ja31SZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfT3ZlcnZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uU2VhcmNoJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRDdXN0b21lckNvbXBhbnlPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55Jyk7CgogICAgIyBnZXQgd3JpdGFibGUgZGF0YSBzb3VyY2VzCiAgICBteSAlQ3VzdG9tZXJDb21wYW55U291cmNlID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55U291cmNlTGlzdCgKICAgICAgICBSZWFkT25seSA9PiAwLAogICAgKTsKCiAgICAjIG9ubHkgc2hvdyBBZGQgb3B0aW9uIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHdyaXRhYmxlIGJhY2tlbmQKICAgIGlmICggc2NhbGFyIGtleXMgJUN1c3RvbWVyQ29tcGFueVNvdXJjZSApIHsKICAgICAgICAkUGFyYW17U291cmNlT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IHsgJUN1c3RvbWVyQ29tcGFueVNvdXJjZSwgfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU291cmNlJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U291cmNlfSB8fCAnJywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uQWRkJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBpZiB0aGVyZSBhcmUgYW55IHJlZ2lzdHJpZXMgdG8gc2VhcmNoLCB0aGUgdGFibGUgaXMgZmlsbGVkIGFuZCBzaG93bgogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAjIHNhbWUgTGltaXQgYXMgJFNlbGYtPntDdXN0b21lckNvbXBhbnl9LT57Q3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdExpbWl0fQogICAgICAgICMgc21hbGxlc3QgTGltaXQgZnJvbSBhbGwgc291cmNlcwogICAgICAgIG15ICRMaW1pdDsKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlck1hcCA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQ3VzdG9tZXJVc2VyTWFwLT57Q3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdExpbWl0fTsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkTGltaXQgfHwgJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH0gPCAkTGltaXQgKSB7CiAgICAgICAgICAgICAgICAkTGltaXQgPSAkQ3VzdG9tZXJVc2VyTWFwLT57Q3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdExpbWl0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhcyBmYWxsYmFjayB0YWtlIHRoZSBoYXJkY29kZWQgbGltaXQgb2YgS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkvREIucG0KICAgICAgICAkTGltaXQgLy89IDUwMDAwOwoKICAgICAgICBteSAlTGlzdEFsbEl0ZW1zID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55TGlzdCgKICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICBMaW1pdCAgPT4gJExpbWl0ICsgMSwKICAgICAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBrZXlzICVMaXN0QWxsSXRlbXMgPD0gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zID0ga2V5cyAlTGlzdEFsbEl0ZW1zOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExpc3RBbGwgPT4gJExpc3RBbGxJdGVtcywKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBrZXlzICVMaXN0QWxsSXRlbXMgPiAkTGltaXQgKSB7CiAgICAgICAgICAgIG15ICRMaXN0QWxsSXRlbXMgICA9IGtleXMgJUxpc3RBbGxJdGVtczsKICAgICAgICAgICAgbXkgJFNlYXJjaExpc3RTaXplID0ga2V5cyAlTGlzdDsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdIZWFkZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU2VhcmNoTGlzdFNpemUgPT4gJFNlYXJjaExpc3RTaXplLAogICAgICAgICAgICAgICAgICAgIExpc3RBbGwgICAgICAgID0+ICRMaXN0QWxsSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgPT4gJExpbWl0LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB2YWxpZCBsaXN0CiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKCiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57UGFyYW1zfS0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdMb2NhbERCJyApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgcmVzdWx0cyB0byBzaG93CiAgICAgICAgaWYgKCVMaXN0KSB7CiAgICAgICAgICAgIGZvciBteSAkTGlzdEtleSAoIHNvcnQgeyAkTGlzdHskYX0gY21wICRMaXN0eyRifSB9IGtleXMgJUxpc3QgKSB7CgogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoIEN1c3RvbWVySUQgPT4gJExpc3RLZXkgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICRQYXJhbXtOYXZ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1BhcmFtc30tPntGb3JlaWduREJ9ICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMb2NhbERCUm93JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAkVmFsaWRMaXN0eyAkRGF0YXtWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3RoZXJ3aXNlIGl0IGRpc3BsYXlzIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHNlYXJjaCBpdCBzaG93cyBhIG1lc3NhZ2UKICAgIGVsc2UKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9TZWFyY2hUZXJtcycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AdminCustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJVc2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICk7CgogICAgJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9ID0geyBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc30gfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJE5hdiAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOYXYnICkgICAgfHwgJyc7CiAgICBteSAkU291cmNlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvdXJjZScgKSB8fCAnQ3VzdG9tZXJVc2VyJzsKICAgIG15ICRTZWFyY2ggPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VhcmNoJyApOwogICAgJFNlYXJjaAogICAgICAgIHx8PSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FkbWluQ3VzdG9tZXJVc2VyOjpSdW5Jbml0aWFsV2lsZGNhcmRTZWFyY2gnKSA/ICcqJyA6ICcnOwoKICAgICMgY3JlYXRlIGxvY2FsIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBteSAkTmF2QmFyICAgICAgID0gJyc7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAkTmF2QmFyID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICROYXZCYXIgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkTmF2QmFyIC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoCiAgICAgICAgICAgIFR5cGUgPT4gJE5hdiBlcSAnQWdlbnQnID8gJ0N1c3RvbWVycycgOiAnQWRtaW4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgbGlzdCBvZiB2YWxpZCBJRHMuCiAgICBteSBAVmFsaWRJRExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAjIGNoZWNrIHRoZSBwZXJtaXNzaW9uIGZvciB0aGUgU3dpdGNoVG9DdXN0b21lciBmZWF0dXJlCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU3dpdGNoVG9DdXN0b21lcicpICkgewoKICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICAgICAgIyBnZXQgdGhlIGdyb3VwIGlkIHdoaWNoIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBzd2l0Y2ggdG8gY3VzdG9tZXIgZmVhdHVyZQogICAgICAgIG15ICRTd2l0Y2hUb0N1c3RvbWVyR3JvdXBJRCA9ICRHcm91cE9iamVjdC0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwID0+ICRDb25maWdPYmplY3QtPkdldCgnU3dpdGNoVG9DdXN0b21lcjo6UGVybWlzc2lvbkdyb3VwJyksCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgcncgcHJpdmlsZWdlCiAgICAgICAgbXkgJUdyb3VwcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICk7CgogICAgICAgICMgaWYgdGhlIHVzZXIgaXMgYSBtZW1iZXIgaW4gdGhpcyBncm91cCBoZSBjYW4gYWNjZXNzIHRoZSBmZWF0dXJlCiAgICAgICAgaWYgKCAkR3JvdXBzeyRTd2l0Y2hUb0N1c3RvbWVyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57U3dpdGNoVG9DdXN0b21lclBlcm1pc3Npb259ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gc2V0IG11bHRpdGVuYW5jeS4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICAgICAgbXkgJE11bHRpdGVuYW5jeUdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwID0+ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSwKICAgICAgICApOwoKICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cHN7JE11bHRpdGVuYW5jeUdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeVBlcm1pc3Npb259ID0gMTsKICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICBzd2l0Y2ggdG8gY3VzdG9tZXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N3aXRjaCcKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKQogICAgICAgICYmICRTZWxmLT57U3dpdGNoVG9DdXN0b21lclBlcm1pc3Npb259CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAkVXNlcklEICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgc2Vzc2lvbiBpZAogICAgICAgIG15ICROZXdTZXNzaW9uSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+Q3JlYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgIFVzZXJMYXN0UmVxdWVzdCA9PiAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpLAogICAgICAgICAgICBVc2VyVHlwZSAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgU2Vzc2lvblNvdXJjZSAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgaW50ZXJmYWNlIHNlc3Npb24gbmFtZQogICAgICAgIG15ICRTZXNzaW9uTmFtZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJykgfHwgJ0NTSUQnOwoKICAgICAgICAjIGNyZWF0ZSBhIG5ldyBMYXlvdXRPYmplY3Qgd2l0aCBTZXNzaW9uSURDb29raWUKICAgICAgICBteSAkRXhwaXJlcyA9ICcrJyAuICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvbk1heFRpbWUnKSAuICdzJzsKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWVBZnRlckJyb3dzZXJDbG9zZScpICkgewogICAgICAgICAgICAkRXhwaXJlcyA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBSZXN0cmljdCBDb29raWUgdG8gSFRUUFMgaWYgaXQgaXMgdXNlZC4KICAgICAgICBteSAkQ29va2llU2VjdXJlQXR0cmlidXRlID0gJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpIGVxICdodHRwcycgPyAxIDogdW5kZWY7CgogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBTZXRDb29raWVzID0+IHsKICAgICAgICAgICAgICAgIFNlc3Npb25JRENvb2tpZSA9PiAkUGFyYW1PYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkU2Vzc2lvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgICAgICAgICBFeHBpcmVzICA9PiAkRXhwaXJlcywKICAgICAgICAgICAgICAgICAgICBQYXRoICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NjcmlwdEFsaWFzJyksCiAgICAgICAgICAgICAgICAgICAgU2VjdXJlICAgPT4gJENvb2tpZVNlY3VyZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICAgICBIVFRQT25seSA9PiAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2Vzc2lvbklEICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgU2Vzc2lvbk5hbWUgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTmFtZScpLAogICAgICAgICk7CgogICAgICAgICMgbG9nIGV2ZW50CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgIlN3aXRjaGVkIGZyb20gQWdlbnQgdG8gQ3VzdG9tZXIgKCRTZWxmLT57VXNlckxvZ2lufSAtPT4gJFVzZXJEYXRhe1VzZXJMb2dpbn0pIiwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIFVSTCB0byBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBteSAkVVJMID0gJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpCiAgICAgICAgICAgIC4gJzovLycKICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZRRE4nKQogICAgICAgICAgICAuICcvJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKQogICAgICAgICAgICAuICdjdXN0b21lci5wbCc7CgogICAgICAgICMgaWYgbm8gc2Vzc2lvbnMgYXJlIHVzZWQgd2UgYXR0YWNoIHRoZSBzZXNzaW9uIGFzIFVSTCBwYXJhbWV0ZXIKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSApIHsKICAgICAgICAgICAgJFVSTCAuPSAiPyRTZXNzaW9uTmFtZT0kTmV3U2Vzc2lvbklEIjsKICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QgdG8gY3VzdG9tZXIgaW50ZXJmYWNlIHdpdGggbmV3IHNlc3Npb24gaWQKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIEV4dFVSTCA9PiAkVVJMICk7CiAgICB9CgogICAgIyBzZWFyY2ggdXNlciBsaXN0CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VhcmNoJyApIHsKICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgKTsKICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhcjsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRvd25sb2FkIGZpbGUgcHJlZmVyZW5jZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZCcgKSB7CiAgICAgICAgbXkgJEdyb3VwID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0dyb3VwJyApIHx8ICcnOwogICAgICAgIG15ICRVc2VyICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSAgICB8fCAnJzsKICAgICAgICBteSAkRmlsZSAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsZScgKSAgfHwgJyc7CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSAgICA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFVzZXIgKTsKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKSB9OwogICAgICAgIG15ICRNb2R1bGUgICAgICA9ICRQcmVmZXJlbmNlc3skR3JvdXB9LT57TW9kdWxlfTsKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRHcm91cH0sCiAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwKICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICApOwogICAgICAgIG15ICVGaWxlID0gJE9iamVjdC0+RG93bmxvYWQoIFVzZXJEYXRhID0+IFwlVXNlckRhdGEgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoJUZpbGUpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICBteSAkVXNlciAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkTm90aWZpY2F0aW9uID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05vdGlmaWNhdGlvbicgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkVXNlciApOwoKICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhcjsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIHVwZGF0ZWQhJykgKQogICAgICAgICAgICBpZiAoICROb3RpZmljYXRpb24gJiYgJE5vdGlmaWNhdGlvbiBlcSAnVXBkYXRlJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZSwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgIElEICAgICA9PiAkVXNlciwKICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2VBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIHVwZGF0ZSBvbmx5IHRoZSBwcmVmZXJlbmNlcyBhbmQgZHluYW1pYyBmaWVsZHMsIGlmIHRoZSBzb3VyY2UgaXMgcmVhZG9ubHkgb3IgYSBsZGFwIGJhY2tlbmQKICAgICAgICBteSAkVXBkYXRlT25seVByZWZlcmVuY2VzOwoKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e1JlYWRPbmx5fSB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNb2R1bGV9ID1+IC9MREFQL2kgKSB7CiAgICAgICAgICAgICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJE5vdGUgPSAnJzsKICAgICAgICBteSAoICVHZXRQYXJhbSwgJUVycm9ycyApOwoKICAgICAgICAjIEdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0LgogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJENvbmZpZ09iamVjdC0+R2V0KCRTb3VyY2UpLT57TWFwfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyApIHsKCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9LT57ICRFbnRyeS0+WzJdIH07CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEeW5hbWljRmllbGQgJEVudHJ5LT5bMl0gbm90IGZvdW5kISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgPT4gJEVudHJ5LT5bNF0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgc3RvcmFibGUgdmFsdWUgb2YgZHluYW1pYyBmaWVsZCBlZGl0IGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayByZW1haW5pbmcgbm9uLWR5bmFtaWMtZmllbGQgbWFuZGF0b3J5IGZpZWxkcwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRFbnRyeS0+WzBdICkgfHwgJyc7CgogICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkVXBkYXRlT25seVByZWZlcmVuY2VzOwoKICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSAmJiAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3JzeyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkR2V0UGFyYW17SUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkVXBkYXRlT25seVByZWZlcmVuY2VzCiAgICAgICAgICAgICYmICRHZXRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgICAgICYmICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRHZXRQYXJhbXtVc2VyRW1haWx9ICkKICAgICAgICAgICAgJiYgZ3JlcCB7ICRfIGVxICRHZXRQYXJhbXtWYWxpZElEfSB9IEBWYWxpZElETGlzdAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3Jze1VzZXJFbWFpbEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tFcnJvclR5cGV9ICAgICAgICA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdGhlIGN1cnJlbnQgdXNlciBkYXRhIGZvciBzb21lIGNoZWNrcy4KICAgICAgICBteSAlQ3VycmVudFVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkR2V0UGFyYW17SUR9LAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgQ3VzdG9tZXJJRCwgaWYgQ3VzdG9tZXJDb21wYW55U3VwcG9ydCBpcyBlbmFibGVkIGFuZCB0aGUgVXNlckN1c3RvbWVySUQgd2FzIGNoYW5nZWQuCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fQogICAgICAgICAgICAmJiAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9CiAgICAgICAgICAgICYmICRDdXJyZW50VXNlckRhdGF7VXNlckN1c3RvbWVySUR9IG5lICRHZXRQYXJhbXtVc2VyQ3VzdG9tZXJJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRHZXRQYXJhbXtVc2VyQ3VzdG9tZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICElQ29tcGFueSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnN7VXNlckN1c3RvbWVySURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgbm8gZXJyb3JzIG9jY3VycmVkCiAgICAgICAgaWYgKCAhJUVycm9ycyApIHsKCiAgICAgICAgICAgIG15ICRVcGRhdGVTdWNjZXNzOwogICAgICAgICAgICBpZiAoICEkVXBkYXRlT25seVByZWZlcmVuY2VzICkgewogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2Nlc3MgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtVc2VyUGFzc3dvcmR9ICYmICggJEN1cnJlbnRVc2VyRGF0YXtVc2VyUGFzc3dvcmR9IC8vICcnICkgbmUgJEdldFBhcmFte1VzZXJQYXNzd29yZH0gKSB7CgogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2Nlc3MgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5EZWxldGVPbmVQcmVmZXJlbmNlKAogICAgICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlckxhc3RQd0NoYW5nZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkR2V0UGFyYW17SUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFVwZGF0ZVN1Y2Nlc3MgfHwgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBuZSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljIGZpZWxkICVzIG5vdCBmb3VuZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWVTZXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBkeW5hbWljIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAkR3JvdXAgZXEgJ1Bhc3N3b3JkJzsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkR2V0UGFyYW17VXNlckxvZ2lufQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skR3JvdXB9LT57TW9kdWxlfTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRHcm91cH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSggVXNlckRhdGEgPT4gXCVVc2VyRGF0YSApOwogICAgICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRQYXJhbU9iamVjdC0+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+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIHx8ICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgICAgICYmICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRHZXRQYXJhbXtVc2VyRW1haWx9ICkKICAgICAgICAgICAgJiYgZ3JlcCB7ICRfIGVxICRHZXRQYXJhbXtWYWxpZElEfSB9IEBWYWxpZElETGlzdAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3Jze1VzZXJFbWFpbEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tFcnJvclR5cGV9ICAgICAgICA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBDdXN0b21lcklELCBpZiBDdXN0b21lckNvbXBhbnlTdXBwb3J0IGlzIGVuYWJsZWQuCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSAmJiAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9ICkgewoKICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte1VzZXJDdXN0b21lcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tVc2VyQ3VzdG9tZXJJREludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgdXNlcgogICAgICAgICAgICBteSAkVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFVzZXIpIHsKCiAgICAgICAgICAgICAgICAjIHNldCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBuZSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljIGZpZWxkICVzIG5vdCBmb3VuZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWVTZXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBkeW5hbWljIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAkR3JvdXAgZXEgJ1Bhc3N3b3JkJzsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkVXNlciwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXN7JEdyb3VwfS0+e01vZHVsZX07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skR3JvdXB9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyT2JqZWN0ID0+ICRDdXN0b21lclVzZXJPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oICV7ICRQcmVmZXJlbmNlc3skR3JvdXB9IH0sIFVzZXJEYXRhID0+IFwlVXNlckRhdGEgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSBAQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1JdGVtLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFBhcmFtSXRlbS0+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+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25TZWFyY2gnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIGdldCB3cml0YWJsZSBkYXRhIHNvdXJjZXMKICAgIG15ICVDdXN0b21lclNvdXJjZSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU291cmNlTGlzdCgKICAgICAgICBSZWFkT25seSA9PiAwLAogICAgKTsKCiAgICAjIG9ubHkgc2hvdyBBZGQgb3B0aW9uIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHdyaXRhYmxlIGJhY2tlbmQKICAgIGlmICggc2NhbGFyIGtleXMgJUN1c3RvbWVyU291cmNlICkgewogICAgICAgICRQYXJhbXtTb3VyY2VPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4geyAlQ3VzdG9tZXJTb3VyY2UsIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NvdXJjZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NvdXJjZX0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2hvdywgYSBtZXNzYWdlIGlzIGRpc3BsYXllZCBvbiB0aGUgdGFibGUgd2l0aCB0aGlzIGNvbHNwYW4KICAgICAgICBteSAkQ29sU3BhbiA9IDY7CgogICAgICAgICMgc2FtZSBMaW1pdCBhcyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9CiAgICAgICAgIyBzbWFsbGVzdCBMaW1pdCBmcm9tIGFsbCBzb3VyY2VzCiAgICAgICAgbXkgJExpbWl0OwogICAgICAgIFNPVVJDRToKICAgICAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VyTWFwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKTsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9OwogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRMaW1pdCB8fCAkQ3VzdG9tZXJVc2VyTWFwLT57Q3VzdG9tZXJVc2VyU2VhcmNoTGlzdExpbWl0fSA8ICRMaW1pdCApIHsKICAgICAgICAgICAgICAgICRMaW1pdCA9ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFzIGZhbGxiYWNrIHRha2UgdGhlIGhhcmRjb2RlZCBsaW1pdCBvZiBLZXJuZWwvU3lzdGVtL0N1c3RvbWVyVXNlci9EQi5wbQogICAgICAgICRMaW1pdCAvLz0gMjUwOwoKICAgICAgICBteSAlTGlzdEFsbEl0ZW1zID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCArIDEsCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zIDw9ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyA9IGtleXMgJUxpc3RBbGxJdGVtczsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsID0+ICRMaXN0QWxsSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICApOwoKICAgICAgICBpZiAoIGtleXMgJUxpc3RBbGxJdGVtcyA+ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyAgID0ga2V5cyAlTGlzdEFsbEl0ZW1zOwogICAgICAgICAgICBteSAkU2VhcmNoTGlzdFNpemUgPSBrZXlzICVMaXN0OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTZWFyY2hMaXN0U2l6ZSA9PiAkU2VhcmNoTGlzdFNpemUsCiAgICAgICAgICAgICAgICAgICAgTGlzdEFsbCAgICAgICAgPT4gJExpc3RBbGxJdGVtcywKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdTd2l0Y2hUb0N1c3RvbWVyJykgJiYgJFNlbGYtPntTd2l0Y2hUb0N1c3RvbWVyUGVybWlzc2lvbn0gJiYgJFBhcmFte05hdn0gbmUgJ05vbmUnICkKICAgICAgICB7CiAgICAgICAgICAgICRDb2xTcGFuID0gNzsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFN3aXRjaFRvQ3VzdG9tZXInLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgcmVzdWx0cyB0byBzaG93CiAgICAgICAgaWYgKCVMaXN0KSB7CgogICAgICAgICAgICAjIGdldCB2YWxpZCBsaXN0CiAgICAgICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAgICAgICAgIGZvciBteSAkTGlzdEtleSAoIHNvcnQgeyBsYygkYSkgY21wIGxjKCRiKSB9IGtleXMgJUxpc3QgKSB7CgogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkTGlzdEtleSApOwogICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX0gPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyRGF0YXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+ICRWYWxpZExpc3R7ICRVc2VyRGF0YXtWYWxpZElEfSB8fCAnJyB9IHx8ICctJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRMaXN0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtOYXZ9IGVxICdOb25lJyApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3dMaW5rTm9uZScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSA9PiAkTGlzdEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXYgICAgICAgICA9PiAkUGFyYW17TmF2fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRMaXN0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnU3dpdGNoVG9DdXN0b21lcicpCiAgICAgICAgICAgICAgICAgICAgJiYgJFNlbGYtPntTd2l0Y2hUb0N1c3RvbWVyUGVybWlzc2lvbn0KICAgICAgICAgICAgICAgICAgICAmJiAkUGFyYW17TmF2fSBuZSAnTm9uZScKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93U3dpdGNoVG9DdXN0b21lcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3RoZXJ3aXNlIGl0IGRpc3BsYXlzIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29sU3BhbiA9PiAkQ29sU3BhbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBzZWFyY2ggaXQgc2hvd3MgYSBtZXNzYWdlCiAgICBlbHNlCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VhcmNoVGVybXMnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXYnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtOYXZ9LAogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBfRWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGxheW91dCBvYmplY3QuCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRPdXRwdXQgPSAnJzsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3VXBkYXRlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIGlmICggJFBhcmFte0FjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CgogICAgICAgICMgc2hvd3MgZWRpdCBoZWFkZXIKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSGVhZGVyRWRpdCcgKTsKCiAgICAgICAgIyBzaG93cyBlZmZlY3RpdmUgcGVybWlzc2lvbnMgbWF0cml4CiAgICAgICAgJFNlbGYtPl9FZmZlY3RpdmVQZXJtaXNzaW9ucyglUGFyYW0pOwogICAgfQoKICAgICMgc2hvd3MgYWRkIGhlYWRlcgogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0hlYWRlckFkZCcgKTsKICAgIH0KCiAgICBteSAkVXBkYXRlT25seVByZWZlcmVuY2VzOwoKICAgICMgR2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgdXBkYXRlIHVzZXIKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57UmVhZE9ubHl9IHx8ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e01vZHVsZX0gPX4gL0xEQVAvaSApCiAgICB7CiAgICAgICAgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA9IDE7CiAgICB9CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgISRFbnRyeS0+WzBdOwoKICAgICAgICAjIEhhbmRsZSBkeW5hbWljIGZpZWxkcwogICAgICAgIGlmICggJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnICkgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIEdldCBIVE1MIGZvciBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSA/ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSA6IHVuZGVmLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAoKICAgICAgICAgICAgICAgICMgU2VydmVyIGVycm9yLCBpZiBhbnkKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIH0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgZm9yIHdoaWNoIEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkSFRNTCk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgIH0KCiAgICAgICAgbXkgJEJsb2NrID0gJ0lucHV0JzsKCiAgICAgICAgIyBjaGVjayBpbnB1dCB0eXBlCiAgICAgICAgaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJQYXNzd29yL2kgKSB7CiAgICAgICAgICAgICRCbG9jayA9ICdQYXNzd29yZCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGxvZ2luIGF1dG8gY3JlYXRpb24KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e0F1dG9Mb2dpbkNyZWF0aW9ufSAmJiAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyApIHsKICAgICAgICAgICAgJEJsb2NrID0gJ0lucHV0SGlkZGVuJzsKICAgICAgICB9CgogICAgICAgIGlmICggJEVudHJ5LT5bN10gfHwgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5fSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVhZE9ubHl9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgc2hvdyByZXF1aXJlZCBmbGFnCiAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICAgICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkTGFiZWxDbGFzc30gICAgID0gJ01hbmRhdG9yeSc7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZExhYmVsQ2hhcmFjdGVyfSA9ICcqJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSAgICAgICAgICA9ICcnOwogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRMYWJlbENsYXNzfSAgICAgPSAnJzsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkTGFiZWxDaGFyYWN0ZXJ9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBlbXB0eSBzdHJpbmcKICAgICAgICAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8PSAnJzsKCiAgICAgICAgIyBhZGQgY2xhc3MgdG8gdmFsaWRhdGUgZW1haWxzCiAgICAgICAgaWYgKCAkRW50cnktPlswXSBlcSAnVXNlckVtYWlsJyApIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9IC49ICcgVmFsaWRhdGVfRW1haWwnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb25zIG9yIGlucHV0IGZpZWxkcwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57U2VsZWN0aW9uc30tPnsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CgogICAgICAgICAgICAjIENoYW5nZSB0aGUgdmFsaWRhdGlvbiBjbGFzcwogICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZENsYXNzfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSBkYXRhIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkU2VsZWN0aW9uc0RhdGEgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9OwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldAogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRTZWxlY3Rpb25zRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0aW9uc0RhdGEtPnskS2V5fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlSW5wdXQoICRTZWxlY3Rpb25zRGF0YS0+eyRLZXl9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgb3B0aW9uIHN0cmluZwogICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJFNlbGVjdGlvbnNEYXRhLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gIiRQYXJhbXtSZXF1aXJlZENsYXNzfSBNb2Rlcm5pemUgIiAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0sCiAgICAgICAgICAgICAgICBEaXNhYmxlZCAgICA9PiAkVXBkYXRlT25seVByZWZlcmVuY2VzID8gMSA6IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVudHJ5LT5bMF0gPX4gL15WYWxpZElEL2kgKSB7CgogICAgICAgICAgICAjIENoYW5nZSB0aGUgdmFsaWRhdGlvbiBjbGFzcwogICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZENsYXNzfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgVmFsaWRJRCBzdHJpbmcKICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IHsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpLCB9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gZGVmaW5lZCggJFBhcmFteyAkRW50cnktPlswXSB9ICkgPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgIERpc2FibGVkICAgPT4gJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA/IDEgOiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRFbnRyeS0+WzBdID1+IC9eVXNlckN1c3RvbWVySUQkL2kKICAgICAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKICAgICAgICAgICAgbXkgJUNvbXBhbnlMaXN0ICAgICAgICAgICA9ICgKICAgICAgICAgICAgICAgICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoIExpbWl0ID0+IDAgKSwKICAgICAgICAgICAgICAgICcnID0+ICctJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQ29tcGFueSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICElQ29tcGFueSApIHsKICAgICAgICAgICAgICAgICAgICAkQ29tcGFueUxpc3R7ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB9ID0gJFBhcmFteyAkRW50cnktPlswXSB9IC4gJyAoLSknOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwoKICAgICAgICAgICAgIyBDaGFuZ2UgdGhlIHZhbGlkYXRpb24gY2xhc3MKICAgICAgICAgICAgaWYgKCAkUGFyYW17UmVxdWlyZWRDbGFzc30gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVXNlQXV0b0NvbXBsZXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBZG1pbkN1c3RvbWVyVXNlcjo6VXNlQXV0b0NvbXBsZXRlJyk7CgogICAgICAgICAgICBpZiAoJFVzZUF1dG9Db21wbGV0ZSkgewoKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB8fCAkUGFyYW17Q3VzdG9tZXJJRH07CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gIlslIERhdGEuVmFsdWUgfCBodG1sICVdIiwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVXNlckN1c3RvbWVySUQiIG5hbWU9IlVzZXJDdXN0b21lcklEIiB2YWx1ZT0iJyAuICRWYWx1ZSAuICciCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Ilc1MHBjIEN1c3RvbWVyQXV0b0NvbXBsZXRlU2ltcGxlICcKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtSZXF1aXJlZENsYXNzfSAuICcgJwogICAgICAgICAgICAgICAgICAgIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfQogICAgICAgICAgICAgICAgICAgIC4gJyIgZGF0YS1jdXN0b21lci1zZWFyY2gtdHlwZT0iQ3VzdG9tZXJJRCIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlQ29tcGFueUxpc3QsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgID0+IDgwLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICIkUGFyYW17UmVxdWlyZWRDbGFzc30gTW9kZXJuaXplICIgLiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9LAogICAgICAgICAgICAgICAgICAgIERpc2FibGVkICAgPT4gJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA/IDEgOiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb259IGVxICdBZGQnICYmICRFbnRyeS0+WzBdID1+IC9eVXNlckN1c3RvbWVySUQkL2kgKSB7CgogICAgICAgICAgICAjIFVzZSBDdXN0b21lcklEIHBhcmFtIGlmIGNhbGxlZCBmcm9tIENJQy4KICAgICAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB8fCAkUGFyYW17Q3VzdG9tZXJJRH0gfHwgJyc7CiAgICAgICAgfQojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQnVpbGQgdGhlIGdyb3VwIGZpZWxkLgogICAgICAgIGVsc2lmICggJEVudHJ5LT5bMF0gPX4gL15Vc2VyR3JvdXBJRCQvaSApIHsKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgdGhlIHBlcm1pc3Npb24gdG8gc2VlL2NoYW5nZSB0aGUgbXVsdGl0ZW5hbmN5IGZpZWxkLgogICAgICAgICAgICBpZiAoICEkU2VsZi0+e011bHRpdGVuYW5jeVBlcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICMgQnVpbGQgdGhlIGZpZWxkLgogICAgICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gfHwgJycgKSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIERpc2FibGVkICAgICA9PiAkVXBkYXRlT25seVByZWZlcmVuY2VzID8gMSA6IDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBmb3JtIG9wdGlvbgogICAgICAgIGlmICggJFBhcmFte1R5cGV9ICYmICRQYXJhbXtUeXBlfSBlcSAnaGlkZGVuJyApIHsKICAgICAgICAgICAgJFBhcmFte1ByZWZlcmVuY2VzfSAuPSAkUGFyYW17VmFsdWV9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc0dlbmVyaWMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgSXRlbSA9PiAkRW50cnktPlsxXSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljJEJsb2NrIiwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEl0ZW0gICAgICAgICA9PiAkRW50cnktPlsxXSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgSW52YWxpZEZpZWxkID0+ICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIHRoZSBjb3JyZWN0IGNsaWVudCBzaWRlIGVycm9yIG1zZwogICAgICAgICAgICBpZiAoICRCbG9jayBlcSAnSW5wdXQnICYmICRFbnRyeS0+WzBdIGVxICdVc2VyRW1haWwnICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJlZmVyZW5jZXNVc2VyRW1haWxFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IE5hbWUgPT4gJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJQcmVmZXJlbmNlc0dlbmVyaWNFcnJvck1zZyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IE5hbWUgPT4gJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIHRoZSBjb3JyZWN0IHNlcnZlciBlcnJvciBtc2cKICAgICAgICAgICAgaWYgKCAkQmxvY2sgZXEgJ0lucHV0JyAmJiAkUGFyYW17VXNlckVtYWlsfSAmJiAkRW50cnktPlswXSBlcSAnVXNlckVtYWlsJyApIHsKCiAgICAgICAgICAgICAgICAjIGRpc3BsYXkgc2VydmVyIGVycm9yIG1zZyBhY2NvcmRpbmcgd2l0aCB0aGUgb2NjdXJyZWQgZW1haWwgZXJyb3IgdHlwZQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJlZmVyZW5jZXNVc2VyRW1haWwnIC4gKCAkUGFyYW17RXJyb3JzfS0+e0Vycm9yVHlwZX0gfHwgJycgKSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgTmFtZSA9PiAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpY1NlcnZlckVycm9yTXNnIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgTmFtZSA9PiAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUHJlZmVyZW5jZXNVc2VkID0gJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57QWRtaW5TZXRQcmVmZXJlbmNlc307CiAgICBpZiAoICggZGVmaW5lZCAkUHJlZmVyZW5jZXNVc2VkICYmICRQcmVmZXJlbmNlc1VzZWQgIT0gMCApIHx8ICFkZWZpbmVkICRQcmVmZXJlbmNlc1VzZWQgKSB7CgogICAgICAgIG15ICVEYXRhOwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQcmVmZXJlbmNlc0dyb3VwcycpIH07CgogICAgICAgIEdST1VQOgogICAgICAgIGZvciBteSAkR3JvdXAgKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewoKICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEdyb3VwOwoKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VzR3JvdXAgPSAkUHJlZmVyZW5jZXN7JEdyb3VwfTsKCiAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRQcmVmZXJlbmNlc0dyb3VwOwogICAgICAgICAgICBuZXh0IEdST1VQIGlmIHJlZiAkUHJlZmVyZW5jZXNHcm91cCBuZSAnSEFTSCc7CgogICAgICAgICAgICBpZiAoICREYXRheyAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99IH0gKSB7CgogICAgICAgICAgICAgICAgQ09VTlQ6CiAgICAgICAgICAgICAgICBmb3IgKCAxIC4uIDE1MSApIHsKCiAgICAgICAgICAgICAgICAgICAgJFByZWZlcmVuY2VzR3JvdXAtPntQcmlvfSsrOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkRGF0YXsgJFByZWZlcmVuY2VzR3JvdXAtPntQcmlvfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsgJFByZWZlcmVuY2VzR3JvdXAtPntQcmlvfSB9ID0gJEdyb3VwOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IENPVU5UOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERhdGF7ICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30gfSA9ICRHcm91cDsKICAgICAgICB9CgogICAgICAgICMgc29ydAogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVEYXRhICkgewogICAgICAgICAgICAkRGF0YXsgc3ByaW50ZiAiJTA3ZCIsICRLZXkgfSA9ICREYXRheyRLZXl9OwogICAgICAgICAgICBkZWxldGUgJERhdGF7JEtleX07CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgZWFjaCBwcmVmZXJlbmNlcyBzZXR0aW5nCiAgICAgICAgUFJJTzoKICAgICAgICBmb3IgbXkgJFByaW8gKCBzb3J0IGtleXMgJURhdGEgKSB7CgogICAgICAgICAgICBteSAkR3JvdXAgPSAkRGF0YXskUHJpb307CiAgICAgICAgICAgIGlmICggISRDb25maWdPYmplY3QtPntDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzfS0+eyRHcm91cH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFBSSU87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVQcmVmZXJlbmNlID0gJXsgJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHN9LT57JEdyb3VwfSB9OwogICAgICAgICAgICBpZiAoICRHcm91cCBlcSAnUGFzc3dvcmQnICkgewogICAgICAgICAgICAgICAgbmV4dCBQUklPOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2V7TW9kdWxlfQogICAgICAgICAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpDdXN0b21lclByZWZlcmVuY2VzR2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiBcJVByZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgICAgVXNlck9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyksCiAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIFVzZXJEYXRhID0+IFwlUGFyYW0gKTsKICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkUGFyYW1JdGVtLT57RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByZWYgJFByZWZlcmVuY2V7RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVCdWlsZFNlbGVjdGlvblBhcmFtcyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHJlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRCdWlsZFNlbGVjdGlvblBhcmFtc3tDbGFzc30gPSBqb2luKCAnICcsICRCdWlsZFNlbGVjdGlvblBhcmFtc3tDbGFzc30gLy8gJycsICdNb2Rlcm5pemUnICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtSXRlbS0+e09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQnVpbGRTZWxlY3Rpb25QYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXtCbG9ja30gfHwgJ09wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQcmVmZXJlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXYnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtOYXZ9LAogICAgKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lclVzZXInLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIF9FZmZlY3RpdmVQZXJtaXNzaW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb25seSBpZiBjdXN0b21lciBncm91cCBmZWF0dXJlIGlzIGFjdGl2ZQogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDdXN0b21lckdyb3VwU3VwcG9ydCcpICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDdXN0b21lckdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKCiAgICAjIHNob3cgdGFibGVzCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdFZmZlY3RpdmVQZXJtaXNzaW9ucycsCiAgICApOwoKICAgIG15ICVHcm91cHM7CiAgICBteSAlUGVybWlzc2lvbnM7CgogICAgIyBnbyB0aHJvdWdoIHBlcm1pc3Npb24gdHlwZXMKICAgIG15IEBUeXBlcyA9IEB7ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtOjpDdXN0b21lcjo6UGVybWlzc2lvbicpIH07CiAgICBmb3IgbXkgJFR5cGUgKEBUeXBlcykgewoKICAgICAgICAjIHNob3cgaGVhZGVyCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gIkhlYWRlckdyb3VwUGVybWlzc2lvblR5cGUiLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZ3JvdXBzIG9mIHRoZSB1c2VyCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkUGFyYW17SUR9LAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICBSYXdQZXJtaXNzaW9ucyA9PiAwLCAgICAgICAgICAgICMgZ2V0IGVmZmVjdGl2ZSBwZXJtaXNzaW9ucwogICAgICAgICk7CgogICAgICAgICMgc3RvcmUgZGF0YSBpbiBsb29rdXAgaGFzaGVzCiAgICAgICAgZm9yIG15ICRHcm91cElEICggc29ydCBrZXlzICVVc2VyR3JvdXBzICkgewogICAgICAgICAgICAkR3JvdXBzeyRHcm91cElEfSA9ICRVc2VyR3JvdXBzeyRHcm91cElEfTsKICAgICAgICAgICAgJFBlcm1pc3Npb25zeyRHcm91cElEfXskVHlwZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgbWVzc2FnZSBpZiBubyBwZXJtaXNzaW9ucyBmb3VuZAogICAgaWYgKCAhJVBlcm1pc3Npb25zICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0dyb3VwUGVybWlzc2lvbnNGb3VuZE1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdvIHRocm91Z2ggZ3JvdXBzLCBzb3J0IGJ5IG5hbWUKICAgIGVsc2UgewogICAgICAgIGZvciBteSAkR3JvdXBJRCAoIHNvcnQgeyB1YyggJEdyb3Vwc3skYX0gKSBjbXAgdWMoICRHcm91cHN7JGJ9ICkgfSBrZXlzICVHcm91cHMgKSB7CgogICAgICAgICAgICAjIHNob3cgdGFibGUgcm93cwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwUGVybWlzc2lvblRhYmxlUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIElEICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkR3JvdXBzeyRHcm91cElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgcGVybWlzc2lvbiBtYXJrcwogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKEBUeXBlcykgewogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25NYXJrID0gJFBlcm1pc3Npb25zeyRHcm91cElEfXskVHlwZX0gPyAnT24nICAgICAgICA6ICdPZmYnOwogICAgICAgICAgICAgICAgbXkgJEhpZ2hsaWdodE1hcmsgID0gJFR5cGUgZXEgJ3J3JyAgICAgICAgICAgICAgICAgPyAnSGlnaGxpZ2h0JyA6ICcnOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnR3JvdXBQZXJtaXNzaW9uTWFyaycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnR3JvdXBQZXJtaXNzaW9uTWFyaycgLiAkUGVybWlzc2lvbk1hcmssCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCA9PiAkSGlnaGxpZ2h0TWFyaywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhbGwgYWNjZXNzaWJsZSBjdXN0b21lcnMgb2YgdGhlIHVzZXIKICAgIG15ICVDdXN0b21lcnMgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDb250ZXh0Q3VzdG9tZXJzKAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtJRH0sCiAgICApOwoKICAgICMgc2hvdyBtZXNzYWdlIGlmIG5vIGN1c3RvbWVycyBmb3VuZAogICAgaWYgKCAhJUN1c3RvbWVycyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9DdXN0b21lckFjY2Vzc0ZvdW5kTXNnJywKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IHBlcm1pc3Npb24gY29udGV4dHMKICAgIG15ICRDb250ZXh0Q29uZmlnICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyR3JvdXBQZXJtaXNzaW9uQ29udGV4dCcpOwogICAgbXkgJERpcmVjdEFjY2Vzc0NvbnRleHRLZXkgICA9ICcwMDEtQ3VzdG9tZXJJRC1zYW1lJzsKICAgIG15ICRJbmRpcmVjdEFjY2Vzc0NvbnRleHRLZXkgPSAnMTAwLUN1c3RvbWVySUQtb3RoZXInOwoKICAgICMgdXNlIGRlZmF1bHQgY29udGV4dCBpZiBub25lIGFyZSBmb3VuZAogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJENvbnRleHRDb25maWcpICkgewogICAgICAgICRDb250ZXh0Q29uZmlnID0gewogICAgICAgICAgICAkRGlyZWN0QWNjZXNzQ29udGV4dEtleSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnU2FtZSBDdXN0b21lcicpLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGRlZmF1bHQgYW5kIGV4dHJhIGNvbnRleHQgaGVhZGVycyBpZiBhdmFpbGFibGUKICAgIGlmICggJENvbnRleHRDb25maWctPnskRGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckN1c3RvbWVyQWNjZXNzQ29udGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0RpcmVjdCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JEluZGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckN1c3RvbWVyQWNjZXNzQ29udGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0luZGlyZWN0JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRldGVybWluZSBjdXN0b21lcnMgZm9yIGRpcmVjdCBhbmQgaW5kaXJlY3QgYWNjZXNzCiAgICBteSBAVXNlckN1c3RvbWVySURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lcklEcygKICAgICAgICBVc2VyID0+ICRQYXJhbXtJRH0sCiAgICApOwogICAgbXkgJUV4dHJhQ3VzdG9tZXJJRHM7CiAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JEluZGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgbXkgJEV4dHJhQ29udGV4dE5hbWUgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDb250ZXh0TmFtZUdldCgKICAgICAgICAgICAgU3lzQ29uZmlnTmFtZSA9PiAkSW5kaXJlY3RBY2Nlc3NDb250ZXh0S2V5LAogICAgICAgICk7CgogICAgICAgICMgZm9yIGFsbCBDdXN0b21lcklEcyBnZXQgZ3JvdXBzIHdpdGggZXh0cmEgYWNjZXNzCiAgICAgICAgbXkgJUV4dHJhUGVybWlzc2lvbkdyb3VwczsKICAgICAgICBDVVNUT01FUklEOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoQFVzZXJDdXN0b21lcklEcykgewogICAgICAgICAgICBteSAlR3JvdXBMaXN0ID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ3VzdG9tZXJMaXN0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIENvbnRleHQgICAgPT4gJEV4dHJhQ29udGV4dE5hbWUsCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBDVVNUT01FUklEIGlmICElR3JvdXBMaXN0OwoKICAgICAgICAgICAgIyBhZGQgdG8gZ3JvdXBzCiAgICAgICAgICAgICVFeHRyYVBlcm1pc3Npb25Hcm91cHMgPSAoCiAgICAgICAgICAgICAgICAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzLAogICAgICAgICAgICAgICAgJUdyb3VwTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGFsbCB1bmlxdWUgYWNjZXNzaWJsZSBHcm91cDwtPkN1c3RvbWVyIGNvbWJpbmF0aW9ucwogICAgICAgIEdST1VQSUQ6CiAgICAgICAgZm9yIG15ICRHcm91cElEICggc29ydCBrZXlzICVFeHRyYVBlcm1pc3Npb25Hcm91cHMgKSB7CiAgICAgICAgICAgIG15IEBHcm91cEN1c3RvbWVySURzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ3VzdG9tZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0lEJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBHUk9VUElEIGlmICFAR3JvdXBDdXN0b21lcklEczsKCiAgICAgICAgICAgICMgYWRkIHRvIEV4dHJhQ3VzdG9tZXJJRHMKICAgICAgICAgICAgJUV4dHJhQ3VzdG9tZXJJRHMgPSAoCiAgICAgICAgICAgICAgICAlRXh0cmFDdXN0b21lcklEcywKICAgICAgICAgICAgICAgIG1hcCB7ICRfID0+IDEgfSBAR3JvdXBDdXN0b21lcklEcywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnbyB0aHJvdWdoIGN1c3RvbWVycwogICAgQ1VTVE9NRVJJRDoKICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJzICkgewoKICAgICAgICAjIHNob3cgdGFibGUgcm93cwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckFjY2Vzc1RhYmxlUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBJRCAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICAgICAgTmFtZSA9PiAkQ3VzdG9tZXJzeyRDdXN0b21lcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjICdTYW1lIEN1c3RvbWVyJwogICAgICAgIGlmICggJENvbnRleHRDb25maWctPnskRGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHdlIHNob3VsZCBzaG93IGNoZWNrIG1hcmsgZm9yICdTYW1lIEN1c3RvbWVyJwogICAgICAgICAgICBteSAkQWNjZXNzTWFyayA9ICggZ3JlcCB7ICRfIGVxICRDdXN0b21lcklEIH0gQFVzZXJDdXN0b21lcklEcyApID8gJ09uJyA6ICdPZmYnOwoKICAgICAgICAgICAgIyBzaG93IGJsb2NrcwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJBY2Nlc3NNYXJrJyAuICRBY2Nlc3NNYXJrLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyAnT3RoZXIgQ3VzdG9tZXJzJwogICAgICAgIG5leHQgQ1VTVE9NRVJJRCBpZiAhJENvbnRleHRDb25maWctPnskSW5kaXJlY3RBY2Nlc3NDb250ZXh0S2V5fTsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBzaG91bGQgc2hvdyBjaGVjayBtYXJrIGZvciAnT3RoZXIgQ3VzdG9tZXJzJwogICAgICAgIG15ICRBY2Nlc3NNYXJrID0gJEV4dHJhQ3VzdG9tZXJJRHN7JEN1c3RvbWVySUR9ID8gJ09uJyA6ICdPZmYnOwoKICAgICAgICAjIHNob3cgYmxvY2tzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJBY2Nlc3NNYXJrJyAuICRBY2Nlc3NNYXJrLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/CustomerCompany/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OjpEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6Q29uZmlnJywKIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgY3VzdG9tZXIgY29tcGFueSBtYXAKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfSA9ICRQYXJhbXtDdXN0b21lckNvbXBhbnlNYXB9IHx8IGRpZSAiR290IG5vIEN1c3RvbWVyQ29tcGFueU1hcCEiOwoKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e1RhYmxlfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPlBhcmFtcy0+VGFibGUgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPkN1c3RvbWVyQ29tcGFueUtleSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVZhbGlkfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlWYWxpZCd9OwogICAgJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9ICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPnsnQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdExpbWl0J30gfHwgNTAwMDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hQcmVmaXgnfTsKCiAgICBpZiAoICFkZWZpbmVkKCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gPSAnJzsKICAgIH0KICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hTdWZmaXgnfTsKICAgIGlmICggIWRlZmluZWQoICRTZWxmLT57U2VhcmNoU3VmZml4fSApICkgewogICAgICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICcqJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgJFNlbGYtPntDYWNoZVR5cGV9ICAgPSAnQ3VzdG9tZXJDb21wYW55JyAuICRQYXJhbXtDb3VudH07CiAgICAgICAgJFNlbGYtPntDYWNoZVRUTH0gICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0gfHwgMDsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBjcmVhdGUgbmV3IGRiIGNvbm5lY3QgaWYgRFNOIGlzIGdpdmVuCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntEU059ICkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgICAgIERhdGFiYXNlRFNOICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57RFNOfSwKICAgICAgICAgICAgRGF0YWJhc2VVc2VyID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntVc2VyfSwKICAgICAgICAgICAgRGF0YWJhc2VQdyAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntQYXNzd29yZH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57VHlwZX0gfHwgJycsCiAgICAgICAgKSB8fCBkaWUoJ0NhblwndCBjb25uZWN0IHRvIGRhdGFiYXNlIScpOwoKICAgICAgICAjIHJlbWVtYmVyIHRoYXQgd2UgaGF2ZSB0aGUgREJPYmplY3Qgbm90IGZyb20gcGFyZW50IGNhbGwKICAgICAgICAkU2VsZi0+e05vdFBhcmVudERCT2JqZWN0fSA9IDE7CiAgICB9CgogICAgIyB0aGlzIHNldHRpbmcgc3BlY2lmaWVzIGlmIHRoZSB0YWJsZSBoYXMgdGhlIGNyZWF0ZV90aW1lLAogICAgIyBjcmVhdGVfYnksIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkgZmllbGRzIG9mIE9UT0JPCiAgICAkU2VsZi0+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+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSUQgZXEgJExvY2FsR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlckdyb3VwSUQgPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEluQ29uZGl0aW9uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdyb3VwSURDb2wsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVzICAgPT4gXEBVc2VyR3JvdXBJRHMsCiAgICAgICAgICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEluQ29uZGl0aW9uIC49ICIgT1IgKCRHcm91cElEQ29sIElTIE5VTEwgT1IgJEdyb3VwSURDb2wgPSAnJykiOwogICAgICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAoJEluQ29uZGl0aW9uKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFuZGxpbmcKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIG15ICREeW5hbWljRmllbGRDb25maWdzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0N1c3RvbWVyQ29tcGFueScsCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKICAgIG15ICVEeW5hbWljRmllbGRDb25maWdzQnlOYW1lID0gbWFwIHsgJF8tPntOYW1lfSA9PiAkXyB9IEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9OwoKICAgIG15IEBDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzRHluYW1pY0ZpZWxkcyA9IGdyZXAgeyBleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0gQHskQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc307CgogICAgIyBzcWwKICAgIG15ICRDb21wbGV0ZVNRTCA9ICJTRUxFQ1QgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9LCAkV2hhdCBGUk9NICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9IjsKCiAgICBpZiAoQENvbmRpdGlvbnMpIHsKICAgICAgICAkU1FMID0gam9pbiggJyBBTkQgJywgQENvbmRpdGlvbnMgKTsKICAgICAgICAkQ29tcGxldGVTUUwgLj0gIiBXSEVSRSAkU1FMIjsKICAgIH0KCiAgICAjIGdldCBkYXRhIGZyb20gY3VzdG9tZXIgY29tcGFueSB0YWJsZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJENvbXBsZXRlU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAkTGltaXQsCiAgICApOwoKICAgIG15IEBDdXN0b21lckNvbXBhbnlEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDdXN0b21lckNvbXBhbnlEYXRhLCBbQFJvd107CiAgICB9CgogICAgbXkgJUxpc3Q7CgogICAgQ1VTVE9NRVJDT01QQU5ZREFUQToKICAgIGZvciBteSAkQ3VzdG9tZXJDb21wYW55RGF0YSAoQEN1c3RvbWVyQ29tcGFueURhdGEpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55SUQgPSBzaGlmdCBAeyRDdXN0b21lckNvbXBhbnlEYXRhfTsKICAgICAgICBuZXh0IENVU1RPTUVSQ09NUEFOWURBVEEgaWYgJExpc3R7JEN1c3RvbWVyQ29tcGFueUlEfTsKCiAgICAgICAgbXkgJUNvbXBhbnlTdHJpbmdQYXJ0czsKCiAgICAgICAgbXkgJEZpZWxkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyQ29tcGFueURhdGF9ICkgewogICAgICAgICAgICAkQ29tcGFueVN0cmluZ1BhcnRzeyAkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzWyRGaWVsZENvdW50ZXJdIH0gPSAkRmllbGQ7CiAgICAgICAgICAgICRGaWVsZENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgICAgICBpZiAoQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNEeW5hbWljRmllbGRzKSB7CiAgICAgICAgICAgIERZTkFNSUNGSUVMRE5BTUU6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNEeW5hbWljRmllbGRzKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWV4aXN0cyAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX07CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDdXN0b21lckNvbXBhbnlJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSBbJFZhbHVlXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBAVmFsdWVzOwoKICAgICAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50VmFsdWUgKCBAeyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhZGVmaW5lZCAkQ3VycmVudFZhbHVlIHx8ICFsZW5ndGggJEN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlYWRhYmxlVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRDdXJyZW50VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlYWRhYmxlVmFsdWUpIHx8ICFkZWZpbmVkICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUG9zc2libGVWYWx1ZXMtPnsgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSA9ICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWx1ZXMsICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDb21wYW55U3RyaW5nUGFydHN7JER5bmFtaWNGaWVsZE5hbWV9ID0gam9pbiAnICcsIEBWYWx1ZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXNzZW1ibGUgY29tcGFueSBzdHJpbmcKICAgICAgICBteSBAQ29tcGFueVN0cmluZ1BhcnRzOwogICAgICAgIENVU1RPTUVSQ09NUEFOWUxJU1RGSUVMRDoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZCAoIEB7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHN9ICkgewogICAgICAgICAgICBuZXh0IENVU1RPTUVSQ09NUEFOWUxJU1RGSUVMRAogICAgICAgICAgICAgICAgaWYgIWV4aXN0cyAkQ29tcGFueVN0cmluZ1BhcnRzeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGR9CiAgICAgICAgICAgICAgICB8fCAhZGVmaW5lZCAkQ29tcGFueVN0cmluZ1BhcnRzeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGR9CiAgICAgICAgICAgICAgICB8fCAhbGVuZ3RoICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH07CiAgICAgICAgICAgIHB1c2ggQENvbXBhbnlTdHJpbmdQYXJ0cywgJENvbXBhbnlTdHJpbmdQYXJ0c3skQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkfTsKICAgICAgICB9CgogICAgICAgICRMaXN0eyRDdXN0b21lckNvbXBhbnlJRH0gPSBqb2luICcgJywgQENvbXBhbnlTdHJpbmdQYXJ0czsKICAgIH0KCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJENhY2hlVHlwZSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJUxpc3QsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVMaXN0Owp9CgpzdWIgQ3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCByZWYgJFBhcmFte1NlYXJjaEZpZWxkc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlYXJjaEZpZWxkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRWYWxpZCA9IGRlZmluZWQgJFBhcmFte1ZhbGlkfSA/ICRQYXJhbXtWYWxpZH0gOiAxOwoKICAgICRQYXJhbXtMaW1pdH0gLy89ICcnOwoKICAgICMgU3BsaXQgdGhlIHNlYXJjaCBmaWVsZHMgaW4gc2NhbGFyIGFuZCBhcnJheSBmaWVsZHMuCiAgICBteSBAU2NhbGFyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICdJbnB1dCcgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CiAgICBteSBAQXJyYXlTZWFyY2hGaWVsZHMgID0gZ3JlcCB7ICdTZWxlY3Rpb24nIGVxICRfLT57VHlwZX0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgICMgVmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXlyZWYuCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKEBBcnJheVNlYXJjaEZpZWxkcykgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9ICkgewogICAgICAgICAgICAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gfHw9IFtdOwoKICAgICAgICAgICAgbmV4dCBBUkdVTUVOVDsKICAgICAgICB9CgogICAgICAgIGlmICggcmVmICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50LT57TmFtZX0gbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNldCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHRoZSByZXR1cm4gdHlwZS4KICAgIG15ICRSZXN1bHQgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwoKICAgICMgU3BlY2lhbCBoYW5kbGluZyBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewoKICAgICAgICAjIElnbm9yZSB0aGUgcGFyYW1ldGVyICdMaW1pdCcgd2hlbiByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgICAgICRQYXJhbXtMaW1pdH0gPSAnJzsKCiAgICAgICAgIyBEZWxldGUgdGhlIE9yZGVyQnkgcGFyYW1ldGVyIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte09yZGVyQnl9ID0gW107CiAgICB9CgogICAgIyBEZWZpbmUgb3JkZXIgdGFibGUgZnJvbSB0aGUgc2VhcmNoIGZpZWxkcy4KICAgIG15ICVPcmRlckJ5VGFibGUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfLT57RGF0YWJhc2VGaWVsZH0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICBteSAkU2VsZWN0aW9uc0RhdGEgPSAkRmllbGQtPntTZWxlY3Rpb25zRGF0YX07CgogICAgICAgIGZvciBteSAkU2VsZWN0ZWRWYWx1ZSAoIEB7ICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSB9ICkgewoKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAgICBpZiAoICEkU2VsZWN0aW9uc0RhdGEtPnskU2VsZWN0ZWRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgc2VsZWN0ZWQgdmFsdWUgJEZpZWxkLT57TmFtZX0gaXMgbm90IHZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRTZWxmLT57REJPYmplY3R9OwoKICAgICMgQXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlLgogICAgbXkgQFNRTFdoZXJlOwoKICAgIGZvciBteSAkRmllbGQgKEBTY2FsYXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgIyBTZWFyY2ggZm9yIHNjYWxhciBmaWVsZHMgKHdpbGRjYXJkcyBhcmUgYWxsb3dlZCkuCiAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAjIEdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpLgogICAgICAgICAgICBteSAkTGlrZUVzY2FwZVN0cmluZyA9ICREQk9iamVjdC0+R2V0RGF0YWJhc2VGdW5jdGlvbignTGlrZUVzY2FwZVN0cmluZycpOwoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFteyAkRmllbGQtPntOYW1lfSB9LCAnTGlrZScgKTsKCiAgICAgICAgICAgICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSA9fiBzeyBcKisgfXslfXhtc2c7CgogICAgICAgICAgICAjIElmIHRoZSBmaWVsZCBjb250YWlucyBtb3JlIHRoYW4gb25seSAnJScuCiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ICF+IG17IFxBICUqIFx6IH14bXMgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICAgICAiTE9XRVIoJEZpZWxkLT57RGF0YWJhc2VGaWVsZH0pIExJS0UgTE9XRVIoJyRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfScpICRMaWtlRXNjYXBlU3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgQ2hlY2sgYWxsIGNvbmZpZ3VyZWQgY2hhbmdlIGR5bmFtaWMgZmllbGRzLCBidWlsZCBsb29rdXAgaGFzaCBieSBuYW1lLgogICAgbXkgJUN1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZE5hbWUyQ29uZmlnOwogICAgbXkgJEN1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZHMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0N1c3RvbWVyQ29tcGFueScsCiAgICApOwogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyRDdXN0b21lckNvbXBhbnlEeW5hbWljRmllbGRzfSApIHsKICAgICAgICAkQ3VzdG9tZXJDb21wYW55RHluYW1pY0ZpZWxkTmFtZTJDb25maWd7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZDsKICAgIH0KCiAgICBteSAkU1FMRHluYW1pY0ZpZWxkRnJvbSAgICAgPSAnJzsKICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZSAgICA9ICcnOwogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyID0gMTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JEN1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZHN9ICkgewoKICAgICAgICBteSAkU2VhcmNoUGFyYW0gPSAkUGFyYW17ICJEeW5hbWljRmllbGRfIiAuICREeW5hbWljRmllbGQtPntOYW1lfSB9OwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoIHJlZiAkU2VhcmNoUGFyYW0gbmUgJ0hBU0gnICk7CgogICAgICAgIG15ICROZWVkSm9pbjsKCiAgICAgICAgZm9yIG15ICRPcGVyYXRvciAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbX0gKSB7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyc7CiAgICAgICAgICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgQU5EICgnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyAoJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBURVhUOgogICAgICAgICAgICBmb3IgbXkgJFRleHQgKEBTZWFyY2hQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0IGVxICcnICk7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAnKicuCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0gfHwgMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsaWRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB2YWx1ZSAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkVGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyBvbiBmaWVsZCAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnIE9SICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlNlYXJjaFNRTEdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBUYWJsZUFsaWFzICAgICAgICAgPT4gImRmdiREeW5hbWljRmllbGRKb2luQ291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgICAgICAgICAgID0+ICRPcGVyYXRvciwKICAgICAgICAgICAgICAgICAgICBTZWFyY2hUZXJtICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICcpICc7CgogICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZSAuPSAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWI7CiAgICAgICAgICAgICAgICAkTmVlZEpvaW4gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJE5lZWRKb2luKSB7CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRGcm9tIC49ICIKICAgICAgICAgICAgICAgIElOTkVSIEpPSU4gZHluYW1pY19maWVsZF92YWx1ZSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIKICAgICAgICAgICAgICAgICAgICBPTiAoZGZfb2JqX2lkX25hbWUub2JqZWN0X2lkID0gZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLm9iamVjdF9pZAogICAgICAgICAgICAgICAgICAgICAgICBBTkQgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLmZpZWxkX2lkID0gIgogICAgICAgICAgICAgICAgLiAkREJPYmplY3QtPlF1b3RlKCAkRHluYW1pY0ZpZWxkLT57SUR9LCAnSW50ZWdlcicgKSAuICIpCiAgICAgICAgICAgICI7CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBFeGVjdXRlIGEgZHluYW1pYyBmaWVsZCBzZWFyY2gsIGlmIGEgZHluYW1pYyBmaWVsZCB3aGVyZSBzdGF0ZW1lbnQgZXhpc3RzLgogICAgaWYgKCAkU1FMRHluYW1pY0ZpZWxkRnJvbSAmJiAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgKSB7CgogICAgICAgIG15IEBEeW5hbWljRmllbGRDdXN0b21lcklEczsKCiAgICAgICAgIyBTcWwgdWVyeSBmb3IgdGhlIGR5bmFtaWMgZmllbGRzLgogICAgICAgIG15ICRTUUxEeW5hbWljRmllbGQgPSAiU0VMRUNUIERJU1RJTkNUKGRmX29ial9pZF9uYW1lLm9iamVjdF9uYW1lKSBGUk9NIGR5bmFtaWNfZmllbGRfb2JqX2lkX25hbWUgZGZfb2JqX2lkX25hbWUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRGcm9tCiAgICAgICAgICAgIC4gIiBXSEVSRSAiCiAgICAgICAgICAgIC4gJFNRTER5bmFtaWNGaWVsZFdoZXJlOwoKICAgICAgICBteSAkVXNlZENhY2hlOwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWxEeW5hbWljRmllbGRzJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRDdXN0b21lcklEcyA9IEB7JER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YX07CgogICAgICAgICAgICAgICAgICAgICMgU2V0IHRoZSB1c2VkIGNhY2hlIGZsYWcuCiAgICAgICAgICAgICAgICAgICAgJFVzZWRDYWNoZSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgcmVmICcgLiByZWYoJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSkgLiAnIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdGhlIGRhdGEgb25seSBmcm9tIGRhdGFiYXNlLCBpZiBubyBjYWNoZSBlbnRyeSBleGlzdHMuCiAgICAgICAgaWYgKCAhJFVzZWRDYWNoZSApIHsKCiAgICAgICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEN1c3RvbWVySURzLCAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQER5bmFtaWNGaWVsZEN1c3RvbWVySURzLAogICAgICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWRkIHRoZSB1c2VyIGxvZ2lucyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkcywgaWYgYSBzZWFyY2ggcmVzdWx0IGV4aXN0cyBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaAogICAgICAgICMgICBvciBza2lwIHRoZSBzZWFyY2ggYW5kIHJldHVybiBhIGVtcHRyeSBhcnJheSByZWYgKG9yIHplcm8gZm9yIHRoZSByZXN1bHQgJ0NPVU5UJywgaWYgbm8gdXNlciBsb2dpbnMgZXhpc3RzCiAgICAgICAgIyAgIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoLgogICAgICAgIGlmIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMpIHsKCiAgICAgICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9LAogICAgICAgICAgICAgICAgVmFsdWVzICAgPT4gXEBEeW5hbWljRmllbGRDdXN0b21lcklEcywKICAgICAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFNRTFF1ZXJ5SW5Db25kaXRpb247CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFJlc3VsdCBlcSAnQ09VTlQnID8gMCA6IFtdOwogICAgICAgIH0KICAgIH0KCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICBuZXh0IEZJRUxEIGlmICFAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfTsKCiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkREJPYmplY3QtPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgID0+ICRGaWVsZC0+e0RhdGFiYXNlRmllbGR9LAogICAgICAgICAgICBWYWx1ZXMgICA9PiAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0sCiAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgfQoKICAgICMgQWRkIHRoZSB2YWxpZCBvcHRpb24gaWYgbmVlZGVkLgogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lclZhbGlkfSAmJiAkVmFsaWQgKSB7CgogICAgICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e0N1c3RvbWVyVmFsaWR9IElOICgiIC4gam9pbiggJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpICkgLiAiKSAiOwogICAgfQoKICAgICMgQ2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMuCiAgICBteSAlT3JkZXJCeVNlZW47CiAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgaWYgKCAhJE9yZGVyQnkgfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5IGNvbnRhaW5zIGludmFsaWQgdmFsdWUgJyRPcmRlckJ5JyAiCiAgICAgICAgICAgICAgICAgICAgLiAnb3IgdGhlIHZhbHVlIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBSZW1lbWJlciB0aGUgdmFsdWUgdG8gY2hlY2sgaWYgaXQgYXBwZWFycyBtb3JlIHRoYW4gb25jZS4KICAgICAgICAkT3JkZXJCeVNlZW57JE9yZGVyQnl9ID0gMTsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnlEaXJlY3Rpb24gYXJyYXkgY29udGFpbnMgb25seSAnVXAnIG9yICdEb3duJy4KICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgT25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkLgogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ1VwJzsKICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdEb3duJzsKCiAgICAgICAgIyBmb3VuZCBhbiBlcnJvcgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeURpcmVjdGlvbiBjYW4gb25seSBjb250YWluICdVcCcgb3IgJ0Rvd24nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBCdWlsZCB0aGUgc3FsIHN0YXRlbWVudCBmb3IgdGhlIHNlYXJjaC4KICAgIG15ICRTUUwgPSAiU0VMRUNUIERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSkiOwoKICAgICMgTW9kaWZ5IFNRTCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFNRTCA9ICJTRUxFQ1QgQ09VTlQoRElTVElOQ1QoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSkiOwogICAgfQoKICAgIG15IEBTUUxPcmRlckJ5OwoKICAgICMgVGhlIE9yZGVyIGJ5IGNsYXVzZSBpcyBub3QgbmVlZGVkIGZvciB0aGUgcmVzdWx0IHR5cGUgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBuZSAnQ09VTlQnICkgewoKICAgICAgICBteSAkQ291bnQgPSAwOwoKICAgICAgICBPUkRFUkJZOgogICAgICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICAgICAgIyBTZXQgdGhlIGRlZmF1bHQgb3JkZXIgZGlyZWN0aW9uLgogICAgICAgICAgICBteSAkRGlyZWN0aW9uID0gJ0RFU0MnOwoKICAgICAgICAgICAgIyBBZGQgdGhlIGdpdmVuIG9yZGVyIGRpcmVjdGlvbi4KICAgICAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdICkgewogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdBU0MnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdEb3duJyApIHsKICAgICAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0RFU0MnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgICAgIG5leHQgT1JERVJCWSBpZiAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX07CgogICAgICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gJERpcmVjdGlvbiI7CgogICAgICAgICAgICBuZXh0IE9SREVSQlkgaWYgJE9yZGVyQnkgZXEgJ0N1c3RvbWVySUQnOwoKICAgICAgICAgICAgJFNRTCAuPSAiLCAkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSI7CiAgICAgICAgfQoKICAgICAgICAjIElmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGUgb3JkZXJpbmcgaXMgbm90IGRldGVybWluZWQKICAgICAgICAjICAgd2UgYWRkIGFuIGRlc2NlbmRpbmcgb3JkZXJpbmcgYnkgaWQuCiAgICAgICAgaWYgKCAhZ3JlcCB7ICRfIGVxICdDdXN0b21lcklEJyB9ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSApIHsKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSBERVNDIjsKICAgICAgICB9CiAgICB9CgogICAgIyBBZGQgZm9ybSB0byB0aGUgU1FMIGFmdGVyIHRoZSBvcmRlciBieSBjcmVhdGlvbi4KICAgICRTUUwgLj0gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9ICI7CgogICAgaWYgKEBTUUxXaGVyZSkgewogICAgICAgIG15ICRTUUxXaGVyZVN0cmluZyA9IGpvaW4gJyBBTkQgJywgbWFwIHsiKCAkXyApIn0gQFNRTFdoZXJlOwogICAgICAgICRTUUwgLj0gIldIRVJFICRTUUxXaGVyZVN0cmluZyAiOwogICAgfQoKICAgIGlmIChAU1FMT3JkZXJCeSkgewogICAgICAgIG15ICRPcmRlckJ5U3RyaW5nID0gam9pbiAnLCAnLCBAU1FMT3JkZXJCeTsKICAgICAgICAkU1FMIC49ICJPUkRFUiBCWSAkT3JkZXJCeVN0cmluZyI7CiAgICB9CgogICAgIyBDaGVjayBpZiBhIGNhY2hlIGV4aXN0cyBiZWZvcmUgd2UgYXNrIHRoZSBkYXRhYmFzZS4KICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CgogICAgICAgIG15ICRDYWNoZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsJywKICAgICAgICAgICAgS2V5ICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGRlZmluZWQgJENhY2hlRGF0YSApIHsKICAgICAgICAgICAgaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRDYWNoZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCRDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICBteSBASURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBASURzLCAkUm93WzBdOwogICAgfQoKICAgICMgSGFuZGxlIHRoZSBkaWZmcmVudCByZXN1bHQgdHlwZXMuCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsJywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUwgLiAkUGFyYW17TGltaXR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJElEc1swXSwKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRJRHNbMF07CiAgICB9CgogICAgZWxzZSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+IFxASURzLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gXEBJRHM7CiAgICB9Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICREYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVyQ29tcGFueUdldDo6JFBhcmFte0N1c3RvbWVySUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyREYXRhfSBpZiByZWYgJERhdGEgZXEgJ0hBU0gnOwogICAgfQoKICAgICMgYnVpbGQgc2VsZWN0CiAgICBteSBARmllbGRzOwogICAgbXkgJUZpZWxkc01hcDsKCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CiAgICAgICAgcHVzaCBARmllbGRzLCAkRW50cnktPlsyXTsKICAgICAgICAkRmllbGRzTWFweyAkRW50cnktPlsyXSB9ID0gJEVudHJ5LT5bMF07CiAgICB9CiAgICBteSAkU1FMID0gJ1NFTEVDVCAnIC4gam9pbiggJywgJywgQEZpZWxkcyApOwoKICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAkU1FMIC49ICIsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkiOwogICAgfQoKICAgICMgdGhpcyBzZWVtcyB0byBiZSBsZWdhY3ksIGlmIE5hbWUgaXMgcGFzc2VkIGl0IHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBDdXN0b21lcklECiAgICBteSAkQ3VzdG9tZXJJRCA9ICRQYXJhbXtOYW1lfSB8fCAkUGFyYW17Q3VzdG9tZXJJRH07CgogICAgJFNRTCAuPSAiIEZST00gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0gV0hFUkUgIjsKCiAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0pID0gTE9XRVIoID8gKSI7CiAgICB9CgogICAgIyBnZXQgaW5pdGlhbCBkYXRhCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsgXCRDdXN0b21lcklEIF0KICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGF0YTsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICRNYXBDb3VudGVyID0gMDsKCiAgICAgICAgZm9yIG15ICRGaWVsZCAoQEZpZWxkcykgewogICAgICAgICAgICAkRGF0YXsgJEZpZWxkc01hcHskRmllbGR9IH0gPSAkUm93WyRNYXBDb3VudGVyXTsKICAgICAgICAgICAgJE1hcENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIG5leHQgUk9XIGlmICRTZWxmLT57Rm9yZWlnbkRCfTsKCiAgICAgICAgZm9yIG15ICRLZXkgKHF3KENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSkpIHsKICAgICAgICAgICAgJERhdGF7JEtleX0gPSAkUm93WyRNYXBDb3VudGVyXTsKICAgICAgICAgICAgJE1hcENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gIkN1c3RvbWVyQ29tcGFueUdldDo6JFBhcmFte0N1c3RvbWVySUR9IiwKICAgICAgICAgICAgVmFsdWUgPT4gXCVEYXRhLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgICMgcmV0dXJuIGRhdGEKICAgIHJldHVybiAoJURhdGEpOwp9CgpzdWIgQ3VzdG9tZXJDb21wYW55QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyQ29tcGFueSBiYWNrZW5kIGlzIHJlYWQgb25seSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQEZpZWxkczsKICAgIG15IEBQbGFjZWhvbGRlcnM7CiAgICBteSBAVmFsdWVzOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgIyBpZ25vcmUgZHluYW1pYyBmaWVsZHMgaGVyZQogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICBwdXNoIEBGaWVsZHMsICAgICAgICRFbnRyeS0+WzJdOwogICAgICAgIHB1c2ggQFBsYWNlaG9sZGVycywgJz8nOwogICAgICAgIHB1c2ggQFZhbHVlcywgICAgICAgXCRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgIH0KICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICBwdXNoIEBGaWVsZHMsICAgICAgIHF3KGNyZWF0ZV90aW1lIGNyZWF0ZV9ieSBjaGFuZ2VfdGltZSBjaGFuZ2VfYnkpOwogICAgICAgIHB1c2ggQFBsYWNlaG9sZGVycywgcXcoY3VycmVudF90aW1lc3RhbXAgPyBjdXJyZW50X3RpbWVzdGFtcCA/KTsKICAgICAgICBwdXNoIEBWYWx1ZXMsICggXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0gKTsKICAgIH0KCiAgICAjIGJ1aWxkIGluc2VydAogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSAoIjsKICAgICRTUUwgLj0gam9pbiggJywgJywgQEZpZWxkcyApIC4gIiApIFZBTFVFUyAoICIgLiBqb2luKCAnLCAnLCBAUGxhY2Vob2xkZXJzICkgLiAiICkiOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAVmFsdWVzLAogICAgKTsKCiAgICAjIGxvZyBub3RpY2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAiQ3VzdG9tZXJDb21wYW55OiAnJFBhcmFte0N1c3RvbWVyQ29tcGFueU5hbWV9LyRQYXJhbXtDdXN0b21lcklEfScgY3JlYXRlZCBzdWNjZXNzZnVsbHkgKCRQYXJhbXtVc2VySUR9KSEiLAogICAgKTsKCiAgICAkU2VsZi0+X0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIoIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9ICk7CgogICAgcmV0dXJuICRQYXJhbXtDdXN0b21lcklEfTsKfQoKc3ViIEN1c3RvbWVyQ29tcGFueVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIEZJRUxEOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsgICAgICAgICAgICAgIyB3b3JyeSBvbmx5IGFib3V0IGVtcHR5IGZpZWxkcywgJzAnIGlzIGNvbnNpZGVyZWQgYXMgYmVpbmcgZW1wdHkKICAgICAgICBuZXh0IEZJRUxEIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsgICAgIyBkbyBub3QgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBkeW5hbWljIGZpZWxkcwogICAgICAgIG5leHQgRklFTEQgaWYgISRFbnRyeS0+WzRdOyAgICAgICAgICAgICAgICAgICAgICAjIGNvbXBsYWluIG9ubHkgYWJvdXQgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMKICAgICAgICBuZXh0IEZJRUxEIGlmICRFbnRyeS0+WzBdIGVxICdVc2VyUGFzc3dvcmQnOyAgICAgIyBkbyBub3QgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBwYXNzd29yZCBmaWVsZAoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEVudHJ5LT5bMF0hIgogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENvbGxlY3QgdGhlIGluZm8gbmVlZGVkIGZvciB0aGUgU1FMIFVQREFURSBzdGF0ZW1lbnQKICAgICMgVGhlIHJlYWRvbmx5IGZsYWcgaXMgbm90IGhvbm9yZWQgaGVyZS4KICAgIG15ICggQEZpZWxkcywgQFZhbHVlcyApOwogICAgRklFTEQ6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRklFTEQgaWYgJEVudHJ5LT5bMF0gPX4gbS9eVXNlclBhc3N3b3JkJC9pOyAgICAjIHNraXAgdGhlIHBhc3N3b3JkIGZpZWxkCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7ICAgICAgICMgc2tpcCBkeW5hbWljIGZpZWxkcwogICAgICAgIHB1c2ggQEZpZWxkcywgJEVudHJ5LT5bMl0gLiAnID0gPyc7CiAgICAgICAgcHVzaCBAVmFsdWVzLCBcJFBhcmFteyAkRW50cnktPlswXSB9OwogICAgfQogICAgaWYgKCAhJFNlbGYtPntGb3JlaWduREJ9ICkgewogICAgICAgIHB1c2ggQEZpZWxkcywgKCAnY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCcsICdjaGFuZ2VfYnkgPSA/JyApOwogICAgICAgIHB1c2ggQFZhbHVlcywgXCRQYXJhbXtVc2VySUR9OwogICAgfQoKICAgICMgY3JlYXRlIFNRTCBzdGF0ZW1lbnQKICAgIG15ICRTUUwgPSAiVVBEQVRFICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9IFNFVCAiOwogICAgJFNRTCAuPSBqb2luKCAnLCAnLCBARmllbGRzICk7CgogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiBXSEVSRSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0gPSA/IjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gIiBXSEVSRSBMT1dFUigkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0pID0gTE9XRVIoID8gKSI7CiAgICB9CiAgICBwdXNoIEBWYWx1ZXMsIFwkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9OwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAVmFsdWVzLAogICAgKTsKCiAgICAjIGxvZyBub3RpY2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAiQ3VzdG9tZXJDb21wYW55OiAnJFBhcmFte0N1c3RvbWVyQ29tcGFueU5hbWV9LyRQYXJhbXtDdXN0b21lcklEfScgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKCRQYXJhbXtVc2VySUR9KSEiLAogICAgKTsKCiAgICAkU2VsZi0+X0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIoIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9ICk7CiAgICBpZiAoICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gbmUgJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRTZWxmLT5fQ3VzdG9tZXJDb21wYW55Q2FjaGVDbGVhciggQ3VzdG9tZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9ICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQ3VzdG9tZXJDb21wYW55Q2FjaGVDbGVhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntDYWNoZU9iamVjdH07CgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gIkN1c3RvbWVyQ29tcGFueUdldDo6JFBhcmFte0N1c3RvbWVySUR9IiwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIHNlYXJjaCBjYWNoZSBlbnRyaWVzCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJDb21wYW55TGlzdCcsCiAgICApOwoKICAgIGZvciBteSAkRnVuY3Rpb24gKHF3KEN1c3RvbWVyQ29tcGFueUxpc3QpKSB7CiAgICAgICAgZm9yIG15ICRWYWxpZCAoIDAgLi4gMSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICA9PiAiJHtGdW5jdGlvbn06OiR7VmFsaWR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBkaXNjb25uZWN0IGlmIGl0J3Mgbm90IGEgcGFyZW50IERCT2JqZWN0CiAgICBpZiAoICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ICkgewogICAgICAgIGlmICggJFNlbGYtPntEQk9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EaXNjb25uZWN0KCk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerUser/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAyYWQ2ZjYxMWQyYWJhYzVmNGIzZjZkYzdlMjQyYTUxOGI3ZDY4MDY5IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOjpEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnVzZSBDcnlwdDo6UGFzc3dkTUQ1IHF3KHVuaXhfbWQ1X2NyeXB0IGFwYWNoZV9tZDVfY3J5cHQpOwp1c2UgRGlnZXN0OjpTSEE7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpMYW5ndWFnZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZU9iamVjdE5hbWUnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBkYXRhCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFByZWZlcmVuY2VzT2JqZWN0IEN1c3RvbWVyVXNlck1hcCApKSB7CiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfSB8fCBkaWUgIkdvdCBubyAkTmVlZGVkISI7CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgbWF4IHNob3duIHVzZXIgcGVyIHNlYXJjaCBsaXN0CiAgICAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoTGlzdExpbWl0fSB8fCAyNTA7CgogICAgIyBjb25maWcgb3B0aW9ucwogICAgJFNlbGYtPntDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntUYWJsZX0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPlRhYmxlIGluIEtlcm5lbC9Db25maWcucG0hIjsKICAgICRTZWxmLT57Q3VzdG9tZXJLZXl9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJLZXl9CiAgICAgICAgfHwgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57S2V5fQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVyS2V5IGluIEtlcm5lbC9Db25maWcucG0hIjsKICAgICRTZWxmLT57Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lcklEfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVySUQgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntSZWFkT25seX0gICAgICAgICAgICAgICAgID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UmVhZE9ubHl9OwogICAgJFNlbGYtPntFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyRXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSB8fCAwOwogICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ICAgICAgICAgICAgID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoUHJlZml4fTsKCiAgICBpZiAoICFkZWZpbmVkICRTZWxmLT57U2VhcmNoUHJlZml4fSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gPSAnJzsKICAgIH0KICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaFN1ZmZpeH07CiAgICBpZiAoICFkZWZpbmVkICRTZWxmLT57U2VhcmNoU3VmZml4fSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gPSAnKic7CiAgICB9CgogICAgIyBjaGVjayBpZiBDdXN0b21lcktleSBpcyB2YXIgb3IgaW50CiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyAmJiAkRW50cnktPls1XSA9fiAvXmludCQvaSApIHsKICAgICAgICAgICAgJFNlbGYtPntDdXN0b21lcktleUludGVnZXJ9ID0gMTsKICAgICAgICAgICAgbGFzdCBFTlRSWTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgY2FjaGUgdHlwZQogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0N1c3RvbWVyVXNlcicgLiAkUGFyYW17Q291bnR9OwoKICAgICMgY3JlYXRlIGNhY2hlIG9iamVjdCwgYnV0IG9ubHkgaWYgQ2FjaGVUVEwgaXMgc2V0IGluIGN1c3RvbWVyIGNvbmZpZwogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgZGIgY29ubmVjdCBpZiBEU04gaXMgZ2l2ZW4KICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0RTTn0gKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICAgICAgRGF0YWJhc2VEU04gID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntEU059LAogICAgICAgICAgICBEYXRhYmFzZVVzZXIgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1VzZXJ9LAogICAgICAgICAgICBEYXRhYmFzZVB3ICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1Bhc3N3b3JkfSwKICAgICAgICAgICAgJXsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfSB9LAogICAgICAgICkgfHwgZGllKCdDYW5cJ3QgY29ubmVjdCB0byBkYXRhYmFzZSEnKTsKCiAgICAgICAgIyByZW1lbWJlciB0aGF0IHdlIGhhdmUgdGhlIERCT2JqZWN0IG5vdCBmcm9tIHBhcmVudCBjYWxsCiAgICAgICAgJFNlbGYtPntOb3RQYXJlbnREQk9iamVjdH0gPSAxOwogICAgfQoKICAgICMgdGhpcyBzZXR0aW5nIHNwZWNpZmllcyBpZiB0aGUgdGFibGUgaGFzIHRoZSBjcmVhdGVfdGltZSwKICAgICMgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSBhbmQgY2hhbmdlX2J5IGZpZWxkcyBvZiBPVE9CTwogICAgJFNlbGYtPntGb3JlaWduREJ9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0ZvcmVpZ25EQn0gPyAxIDogMDsKCiAgICAjIGRlZmluZXMgaWYgdGhlIGRhdGFiYXNlIHNlYXJjaCB3aWxsIGJlIHBlcmZvcm1lbmQgY2FzZSBzZW5zaXRpdmUgKDEpIG9yIG5vdCAoMCkKICAgICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57U2VhcmNoQ2FzZVNlbnNpdGl2ZX0KICAgICAgICAvLyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57Q2FzZVNlbnNpdGl2ZX0gfHwgMDsKCiAgICAjIGZldGNoIG5hbWVzIG9mIGNvbmZpZ3VyZWQgZHluYW1pYyBmaWVsZHMKICAgIG15IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzID0gZ3JlcCB7ICRfLT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnIH0gQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9OwogICAgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9ID0geyBtYXAgeyAkXy0+WzJdID0+IDEgfSBARHluYW1pY0ZpZWxkTWFwRW50cmllcyB9OwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIG15ICRMYXlvdXRQYXJhbSA9ICRLZXJuZWw6Ok9NLT57UGFyYW19LT57J0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnfTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgQ2hlY2sgaWYgbXVsdGl0ZW5hbmN5IGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIGEgdXNlci4KICAgIGlmICggJExheW91dFBhcmFtLT57VXNlclR5cGV9ICYmICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSBlcSAnVXNlcicgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKCiAgICAgICAgIyBTYXZlIHRoZSBVc2VySUQgYW5kIGFsbCBncm91cHMgdGhlIHVzZXIgaGFzICdybycgcGVybWlzc2lvbiBvbi4KICAgICAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICMgT25seSBnZXQgdGhlIGdyb3VwIGxpc3Qgb25jZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkTGF5b3V0UGFyYW0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRoZSBsaW1pdCBkb2VzIG5vdCBjb3VudCBmb3IgbWVtYmVycyBvZiBhIHNwZWNpZmljIGdyb3VwLgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpIHx8ICcnOwogICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSAgID0gcmV2ZXJzZSAlR3JvdXBzOwoKICAgICAgICAgICAgaWYgKCAhJEdyb3Vwc1JldmVyc2V7JFBlcm1pc3Npb25Hcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeX0gPSAkTGF5b3V0UGFyYW0tPntVc2VySUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBJRHN9ID0gWyBzb3J0IGtleXMgJUdyb3VwcyBdOwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBzfSAgID0gWyB2YWx1ZXMgJUdyb3VwcyBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQ3VzdG9tZXJOYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyTG9naW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICROYW1lID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVyTmFtZTo6JFBhcmFte1VzZXJMb2dpbn0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICROYW1lIGlmIGRlZmluZWQgJE5hbWU7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlck5hbWVGaWVsZHMgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgKSB7CiAgICAgICAgJEN1c3RvbWVyVXNlck5hbWVGaWVsZHMgPSBbICdmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsIF07CiAgICB9CgogICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlck5hbWVGaWVsZHMKICAgICMgYXMgdGhleSBjYW5ub3QgYmUgaGFuZGxlZCBoZXJlCiAgICBteSBAQ3VzdG9tZXJVc2VyTmFtZUZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0gQHskQ3VzdG9tZXJVc2VyTmFtZUZpZWxkc307CgogICAgIyBidWlsZCBTUUwgc3RyaW5nIDEvMgogICAgbXkgJFNRTCA9ICJTRUxFQ1QgIjsKCiAgICAkU1FMIC49IGpvaW4oICIsICIsIEBDdXN0b21lclVzZXJOYW1lRmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgKTsKICAgICRTUUwgLj0gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gV0hFUkUgIjsKCiAgICAjIGNoZWNrIEN1c3RvbWVyS2V5IHR5cGUKICAgIG15ICRVc2VyTG9naW4gPSAkUGFyYW17VXNlckxvZ2lufTsKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lcktleX0pID0gTE9XRVIoPykiOwogICAgfQoKICAgIG15ICVOYW1lUGFydHM7CgogICAgIyBnZXQgZGF0YSBmcm9tIGN1c3RvbWVyIHVzZXIgdGFibGUKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VXNlckxvZ2lufSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRGaWVsZENvdW50ZXIgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkIChAUm93KSB7CiAgICAgICAgICAgICROYW1lUGFydHN7ICRDdXN0b21lclVzZXJOYW1lRmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHNbJEZpZWxkQ291bnRlcl0gfSA9ICRGaWVsZDsKICAgICAgICAgICAgJEZpZWxkQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgdmFsdWVzLCBpZiBjb25maWd1cmVkCiAgICBteSBARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcyA9IGdyZXAgeyBleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0gQHskQ3VzdG9tZXJVc2VyTmFtZUZpZWxkc307CiAgICBpZiAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRFlOQU1JQ0ZJRUxETkFNRToKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKEBEeW5hbWljRmllbGRDdXN0b21lclVzZXJOYW1lRmllbGRzKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhZGVmaW5lZCAkVmFsdWU7CgogICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAUmVuZGVyZWRWYWx1ZXM7CgogICAgICAgICAgICBWQUxVRToKICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50VmFsdWUgKCBAeyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgIG15ICRSZW5kZXJlZFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlJlYWRhYmxlVmFsdWVSZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRDdXJyZW50VmFsdWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRSZW5kZXJlZFZhbHVlKSB8fCAhZGVmaW5lZCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKCiAgICAgICAgICAgICAgICBwdXNoIEBSZW5kZXJlZFZhbHVlcywgJFJlbmRlcmVkVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICROYW1lUGFydHN7JER5bmFtaWNGaWVsZE5hbWV9ID0gam9pbiAnICcsIEBSZW5kZXJlZFZhbHVlczsKICAgICAgICB9CiAgICB9CgogICAgIyBhc3NlbWJsZSBuYW1lCiAgICBteSBATmFtZVBhcnRzOwogICAgQ1VTVE9NRVJVU0VSTkFNRUZJRUxEOgogICAgZm9yIG15ICRDdXN0b21lclVzZXJOYW1lRmllbGQgKCBAeyRDdXN0b21lclVzZXJOYW1lRmllbGRzfSApIHsKICAgICAgICBuZXh0IENVU1RPTUVSVVNFUk5BTUVGSUVMRAogICAgICAgICAgICBpZiAhZXhpc3RzICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH0KICAgICAgICAgICAgfHwgIWRlZmluZWQgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfQogICAgICAgICAgICB8fCAhbGVuZ3RoICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH07CiAgICAgICAgcHVzaCBATmFtZVBhcnRzLCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9OwogICAgfQoKICAgIG15ICRKb2luQ2hhcmFjdGVyID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTmFtZUZpZWxkc0pvaW59IC8vICcgJzsKICAgIG15ICROYW1lICAgICAgICAgID0gam9pbiAkSm9pbkNoYXJhY3RlciwgQE5hbWVQYXJ0czsKCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAiQ3VzdG9tZXJOYW1lOjokUGFyYW17VXNlckxvZ2lufSIsCiAgICAgICAgICAgIFZhbHVlID0+ICROYW1lLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkTmFtZTsKfQoKc3ViIEN1c3RvbWVyU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVVzZXJzOwogICAgbXkgJFZhbGlkID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte1NlYXJjaH0KICAgICAgICAmJiAhJFBhcmFte1VzZXJMb2dpbn0KICAgICAgICAmJiAhJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9CiAgICAgICAgJiYgISRQYXJhbXtDdXN0b21lcklEfQogICAgICAgICYmICEkUGFyYW17Q3VzdG9tZXJJRFJhd30KICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlYXJjaCwgVXNlckxvZ2luLCBQb3N0TWFzdGVyU2VhcmNoLCBDdXN0b21lcklEUmF3IG9yIEN1c3RvbWVySUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gam9pbiAnOjonLCBtYXAgeyAkXyAuICc9JyAuICRQYXJhbXskX30gfSBzb3J0IGtleXMgJVBhcmFtOwojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBVc2UgY2FjaGUgZm9yIG11bHRpdGVuYW5jeS4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICRDYWNoZUtleSAuPSBqb2luICcnLCBtYXAgeyAnOjpHcm91cElEPScgLiAkXyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9OwogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JFVzZXJzfSBpZiByZWYgJFVzZXJzIGVxICdIQVNIJzsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+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+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlYXJjaEZpZWxkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRWYWxpZCA9ICRQYXJhbXtWYWxpZH0gLy8gMTsKCiAgICAkUGFyYW17TGltaXR9IC8vPSAnJzsKCiAgICAjIFNwbGl0IHRoZSBzZWFyY2ggZmllbGRzIGluIHNjYWxhciBhbmQgYXJyYXkgZmllbGRzLCBiZWZvcmUgdGhlIGRpZmZyZW50IGhhbmRsaW5nLgogICAgbXkgQFNjYWxhclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAnSW5wdXQnIGVxICRfLT57VHlwZX0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwogICAgbXkgQEFycmF5U2VhcmNoRmllbGRzICA9IGdyZXAgeyAnU2VsZWN0aW9uJyBlcSAkXy0+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+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwKSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCA9IFsgJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2VtYWlsJywgXTsKICAgIH0KCiAgICAjIE9yZGVyIGZpZWxkcyBieSBDdXN0b21lclVzZXJMaXN0RmllbGRzIChzZWUgYnVnIzEzODIxKS4KICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzOwogICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXB9ICkgewogICAgICAgIG15IEBGaWVsZE5hbWVzID0gbWFwIHsgJF8tPlswXSB9IGdyZXAgeyAkXy0+WzJdIGVxICRGaWVsZCB9IEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfTsKICAgICAgICBwdXNoIEBDdXN0b21lclVzZXJMaXN0RmllbGRzLCAkRmllbGROYW1lc1swXTsKICAgIH0KCiAgICBteSAkVXNlck1haWxTdHJpbmcgPSAnJzsKICAgIG15IEBVc2VyTWFpbFN0cmluZ1BhcnRzOwoKICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAoQEN1c3RvbWVyVXNlckxpc3RGaWVsZHMpIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRGF0YXskRmllbGR9OwoKICAgICAgICBwdXNoIEBVc2VyTWFpbFN0cmluZ1BhcnRzLCAkRGF0YXskRmllbGR9OwogICAgfQogICAgJFVzZXJNYWlsU3RyaW5nID0gam9pbiAnICcsIEBVc2VyTWFpbFN0cmluZ1BhcnRzOwogICAgJFVzZXJNYWlsU3RyaW5nID1+IHMvXiguKilccyguKz9cQC4rP1wuLis/KShcc3wpJC8iJDEiIDwkMj4vOwoKICAgICMgYWRkIHRoZSBVc2VyTWFpbFN0cmluZyB0byB0aGUgZGF0YSBoYXNoCiAgICAkRGF0YXtVc2VyTWFpbFN0cmluZ30gPSAkVXNlck1haWxTdHJpbmc7CgogICAgIyBjb21wYXQhCiAgICAkRGF0YXtVc2VySUR9ID0gJERhdGF7VXNlckxvZ2lufTsKCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPkdldFByZWZlcmVuY2VzKCBVc2VySUQgPT4gJERhdGF7VXNlcklEfSApOwoKICAgICMgYWRkIGxhc3QgbG9naW4gdGltZXN0YW1wCiAgICBpZiAoICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2lufSApIHsKCiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBFcG9jaCA9PiAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpbn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW5UaW1lc3RhbXB9ID0gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwoKICAgIH0KCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJ9IiwKICAgICAgICAgICAgVmFsdWUgPT4geyAlRGF0YSwgJVByZWZlcmVuY2VzIH0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAoICVEYXRhLCAlUHJlZmVyZW5jZXMgKTsKfQoKc3ViIEN1c3RvbWVyVXNlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewoKICAgICAgICAgICAgIyBza2lwIFVzZXJMb2dpbiwgd2lsbCBiZSBjaGVja2VkIGxhdGVyCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgKCAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyApOwoKICAgICAgICAgICAgIyBpZ25vcmUgZHluYW1pYyBmaWVsZHMgaGVyZQogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRFbnRyeS0+WzBdISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiBubyBVc2VyTG9naW4gaXMgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICYmICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0F1dG9Mb2dpbkNyZWF0aW9ufSApIHsKCiAgICAgICAgIyBnZXQgdGltZSBvYmplY3QKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICBteSAkRGF0ZVRpbWVTdHJpbmcgPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCggRm9ybWF0ID0+ICclWSVtJWQlSCVNJyApOwoKICAgICAgICBteSAkUHJlZml4ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57QXV0b0xvZ2luQ3JlYXRpb25QcmVmaXh9IHx8ICdhdXRvJzsKICAgICAgICAkUGFyYW17VXNlckxvZ2lufSA9ICIkUHJlZml4LSREYXRlVGltZVN0cmluZyIgLiBpbnQoIHJhbmQoOTkpICk7CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGxvZ2luIGV4aXN0cwogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcyBpZiBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCAkUGFyYW17VXNlckVtYWlsfSAmJiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFbWFpbFVuaXFDaGVja30gKSB7CiAgICAgICAgbXkgJVJlc3VsdCA9ICRTZWxmLT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRQYXJhbXtVc2VyRW1haWx9LAogICAgICAgICk7CiAgICAgICAgaWYgKCVSZXN1bHQpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoJ1RoaXMgZW1haWwgYWRkcmVzcyBpcyBhbHJlYWR5IGluIHVzZSBmb3IgYW5vdGhlciBjdXN0b21lciB1c2VyLicpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcyBteAogICAgaWYgKAogICAgICAgICRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgJiYgISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJFBhcmFte1VzZXJFbWFpbH0gKQogICAgICAgICYmIGdyZXAgeyAkXyBlcSAkUGFyYW17VmFsaWRJRH0gfSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVtYWlsIGFkZHJlc3MgKCRQYXJhbXtVc2VyRW1haWx9KSBub3QgdmFsaWQgKCIKICAgICAgICAgICAgICAgIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvcigpIC4gIikhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHF1b3RlIHZhbHVlcwogICAgbXkgJVZhbHVlOwogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzVdID1+IC9eaW50JC9pICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gJFBhcmFteyAkRW50cnktPlswXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBpbnNlcnQKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gJFNlbGYtPntDdXN0b21lclRhYmxlfSAoIjsKICAgIG15IEBCaW5kOwogICAgbXkgJVNlZW5LZXk7ICAgICMgSWYgdGhlIG1hcCBjb250YWlucyBkdXBsaWNhdGVkIGZpZWxkIG5hbWVzLCBpbnNlcnQgb25seSBvbmNlLgogICAgbXkgQENvbHVtbk5hbWVzOwoKICAgIE1BUEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+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+WzBdIH0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdXBkYXRlIGRiCiAgICBteSAkU1FMID0gIlVQREFURSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9IFNFVCAiOwogICAgbXkgQEJpbmQ7CgogICAgbXkgJVNlZW5LZXk7ICAgICMgSWYgdGhlIG1hcCBjb250YWlucyBkdXBsaWNhdGVkIGZpZWxkIG5hbWVzLCBpbnNlcnQgb25seSBvbmNlLgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAgICAgICMgc2tpcCBkeW5hbWljIGZpZWxkcwogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCByZWFkb25seSBmaWVsZHMKICAgICAgICBuZXh0IEVOVFJZIGlmICggbGMoICRFbnRyeS0+WzBdICkgZXEgInVzZXJwYXNzd29yZCIgKTsKICAgICAgICBuZXh0IEVOVFJZIGlmICRTZWVuS2V5eyAkRW50cnktPlsyXSB9Kys7CiAgICAgICAgJFNRTCAuPSAiICRFbnRyeS0+WzJdID0gPywgIjsKICAgICAgICBwdXNoIEBCaW5kLCBcJFZhbHVleyAkRW50cnktPlswXSB9OwogICAgfQoKICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAkU1FMIC49ICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/JzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjaG9wICRTUUw7CiAgICAgICAgY2hvcCAkU1FMOwogICAgfQoKICAgICRTUUwgLj0gJyBXSEVSRSAnOwoKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lcktleX0pID0gTE9XRVIoPykiOwogICAgfQogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtJRH07CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kCiAgICApOwoKICAgICMgY2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgQ3VzdG9tZXIgUHJlZmVyZW5jZXMKICAgIGlmICggJFBhcmFte1VzZXJMb2dpbn0gbmUgJFVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CgogICAgICAgICMgdXBkYXRlIHRoZSBwcmVmZXJlbmNlcwogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5SZW5hbWVQcmVmZXJlbmNlcygKICAgICAgICAgICAgTmV3VXNlcklEID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBPbGRVc2VySUQgPT4gJFVzZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvZyBub3RpY2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFBhcmFte1VzZXJMb2dpbn0nIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgIyBjaGVjayBwdwogICAgaWYgKCAkUGFyYW17VXNlclBhc3N3b3JkfSApIHsKICAgICAgICAkU2VsZi0+U2V0UGFzc3dvcmQoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgUFcgICAgICAgID0+ICRQYXJhbXtVc2VyUGFzc3dvcmR9CiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSApOwogICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSBuZSAkVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkVXNlckRhdGF7VXNlckxvZ2lufSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgU2V0UGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9naW4gPSAkUGFyYW17VXNlckxvZ2lufTsKICAgIG15ICRQdyAgICA9ICRQYXJhbXtQV30gfHwgJyc7CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyTG9naW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG15ICRDcnlwdGVkUHcgPSAnJzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkQ3J5cHRUeXBlID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6REI6OkNyeXB0VHlwZScpIHx8ICdzaGEyJzsKCiAgICAjIGdldCBlbmNvZGUgb2JqZWN0CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpOwoKICAgICMgY3J5cHQgcGxhaW4gKG5vIGNyeXB0IGF0IGFsbCkKICAgIGlmICggJENyeXB0VHlwZSBlcSAncGxhaW4nICkgewogICAgICAgICRDcnlwdGVkUHcgPSAkUHc7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIHVuaXggY3J5cHQKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnY3J5cHQnICkgewoKICAgICAgICAjIGVuY29kZSBvdXRwdXQsIG5lZWRlZCBieSBjcnlwdCgpIG9ubHkgbm9uIHV0Zjggc2lnbnMKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkTG9naW4gKTsKCiAgICAgICAgJENyeXB0ZWRQdyA9IGNyeXB0KCAkUHcsICRMb2dpbiApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZUlucHV0KCBcJENyeXB0ZWRQdyApOwogICAgfQoKICAgICMgY3J5cHQgd2l0aCBtZDUgY3J5cHQKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnbWQ1JyApIHsKCiAgICAgICAgIyBlbmNvZGUgb3V0cHV0LCBuZWVkZWQgYnkgdW5peF9tZDVfY3J5cHQoKSBvbmx5IG5vbiB1dGY4IHNpZ25zCiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJExvZ2luICk7CgogICAgICAgICRDcnlwdGVkUHcgPSB1bml4X21kNV9jcnlwdCggJFB3LCAkTG9naW4gKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVJbnB1dCggXCRDcnlwdGVkUHcgKTsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggbWQ1IGNyeXB0IChjb21wYXRpYmxlIHdpdGggQXBhY2hlJ3MgLmh0cGFzc3dkIGZpbGVzKQogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdhcHIxJyApIHsKCiAgICAgICAgIyBlbmNvZGUgb3V0cHV0LCBuZWVkZWQgYnkgYXBhY2hlX21kNV9jcnlwdCgpIG9ubHkgbm9uIHV0Zjggc2lnbnMKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkTG9naW4gKTsKCiAgICAgICAgJENyeXB0ZWRQdyA9IGFwYWNoZV9tZDVfY3J5cHQoICRQdywgJExvZ2luICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlSW5wdXQoIFwkQ3J5cHRlZFB3ICk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIHNoYTEKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnc2hhMScgKSB7CgogICAgICAgIG15ICRTSEFPYmplY3QgPSBEaWdlc3Q6OlNIQS0+bmV3KCdzaGExJyk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CiAgICAgICAgJFNIQU9iamVjdC0+YWRkKCRQdyk7CiAgICAgICAgJENyeXB0ZWRQdyA9ICRTSEFPYmplY3QtPmhleGRpZ2VzdCgpOwogICAgfQoKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnc2hhNTEyJyApIHsKCiAgICAgICAgbXkgJFNIQU9iamVjdCA9IERpZ2VzdDo6U0hBLT5uZXcoJ3NoYTUxMicpOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRTSEFPYmplY3QtPmFkZCgkUHcpOwogICAgICAgICRDcnlwdGVkUHcgPSAkU0hBT2JqZWN0LT5oZXhkaWdlc3QoKTsKICAgIH0KCiAgICAjIGJjcnlwdAogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdiY3J5cHQnICkgewoKICAgICAgICAjIGdldCBtYWluIG9iamVjdAogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJ0NyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0JykgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIkN1c3RvbWVyVXNlcjogJyRMb2dpbicgdHJpZWQgdG8gc3RvcmUgcGFzc3dvcmQgd2l0aCBiY3J5cHQgYnV0ICdDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdCcgaXMgbm90IGluc3RhbGxlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkQ29zdCA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXI6OkF1dGhNb2R1bGU6OkRCOjpiY3J5cHRDb3N0JykgLy8gMTI7CgogICAgICAgICMgRG9uJ3QgYWxsb3cgdmFsdWVzIHNtYWxsZXIgdGhhbiA5IGZvciBzZWN1cml0eS4KICAgICAgICAkQ29zdCA9IDkgaWYgJENvc3QgPCA5OwoKICAgICAgICAjIEN1cnJlbnQgQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQgbGltaXQgaXMgMzEuCiAgICAgICAgJENvc3QgPSAzMSBpZiAkQ29zdCA+IDMxOwoKICAgICAgICBteSAkU2FsdCA9ICRNYWluT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVN0cmluZyggTGVuZ3RoID0+IDE2ICk7CgogICAgICAgICMgcmVtb3ZlIFVURjggZmxhZywgcmVxdWlyZWQgYnkgQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKCiAgICAgICAgIyBjYWxjdWxhdGUgcGFzc3dvcmQgaGFzaAogICAgICAgIG15ICRPY3RldHMgPSBDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdDo6YmNyeXB0X2hhc2goCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleV9udWwgPT4gMSwKICAgICAgICAgICAgICAgIGNvc3QgICAgPT4gJENvc3QsCiAgICAgICAgICAgICAgICBzYWx0ICAgID0+ICRTYWx0LAogICAgICAgICAgICB9LAogICAgICAgICAgICAkUHcKICAgICAgICApOwoKICAgICAgICAjIFdlIHdpbGwgc3RvcmUgY29zdCBhbmQgc2FsdCBpbiB0aGUgcGFzc3dvcmQgc3RyaW5nIHNvIHRoYXQgaXQgY2FuIGJlIGRlY29kZWQKICAgICAgICAjICAgaW4gZnV0dXJlIGV2ZW4gaWYgd2UgdXNlIGEgaGlnaGVyIGNvc3QgYnkgZGVmYXVsdC4KICAgICAgICAkQ3J5cHRlZFB3ID0gIkJDUllQVDokQ29zdDokU2FsdDoiIC4gQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQ6OmVuX2Jhc2U2NCgkT2N0ZXRzKTsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggc2hhMiBhcyBmYWxsYmFjawogICAgZWxzZSB7CgogICAgICAgIG15ICRTSEFPYmplY3QgPSBEaWdlc3Q6OlNIQS0+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA4YzkzZTVkMGU0MDc4N2Q2NWYzNjFmMjZlYWY1NGQzYzUyMmExOWZmIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvTERBUC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OkxEQVA7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTmV0OjpMREFQOwp1c2UgTmV0OjpMREFQOjpVdGlsIHF3KGVzY2FwZV9maWx0ZXJfdmFsdWUpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkTmVlZGVkIChxdyggUHJlZmVyZW5jZXNPYmplY3QgQ3VzdG9tZXJVc2VyTWFwICkpIHsKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9IHx8IGRpZSAiR290IG5vICROZWVkZWQhIjsKICAgIH0KCiAgICAjIG1heCBzaG93biB1c2VyIGEgc2VhcmNoIGxpc3QKICAgICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9IHx8IDIwMDsKCiAgICAjIGdldCBsZGFwIHByZWZlcmVuY2VzCiAgICAkU2VsZi0+e0RpZX0gPSAwOwogICAgaWYgKCBkZWZpbmVkICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntEaWV9ICkgewogICAgICAgICRTZWxmLT57RGllfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntEaWV9OwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgcGFyYW1zCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntQYXJhbXN9ICkgewogICAgICAgICRTZWxmLT57UGFyYW1zfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntQYXJhbXN9OwogICAgfQoKICAgICMgTmV0OjpMREFQIG5ldyBwYXJhbXMKICAgIGVsc2lmICggJENvbmZpZ09iamVjdC0+R2V0KCAnQXV0aE1vZHVsZTo6TERBUDo6UGFyYW1zJyAuICRQYXJhbXtDb3VudH0gKSApIHsKICAgICAgICAkU2VsZi0+e1BhcmFtc30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoICdBdXRoTW9kdWxlOjpMREFQOjpQYXJhbXMnIC4gJFBhcmFte0NvdW50fSApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntQYXJhbXN9ID0ge307CiAgICB9CgogICAgJFNlbGYtPntTdGFydFRMU30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoICdBdXRoTW9kdWxlOjpMREFQOjpTdGFydFRMUycgLiAkUGFyYW17Q291bnR9ICkgfHwgJyc7CgogICAgIyBob3N0CiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntIb3N0fSApIHsKICAgICAgICAkU2VsZi0+e0hvc3R9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0hvc3R9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5Ib3N0IGluIEtlcm5lbC9Db25maWcucG0nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYmFzZSBkbgogICAgaWYgKCBkZWZpbmVkICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntCYXNlRE59ICkgewogICAgICAgICRTZWxmLT57QmFzZUROfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntCYXNlRE59OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5CYXNlRE4gaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzY29wZQogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57U1NDT1BFfSApIHsKICAgICAgICAkU2VsZi0+e1NTY29wZX0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57U1NDT1BFfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lclVzZXItPlBhcmFtcy0+U1NDT1BFIGluIEtlcm5lbC9Db25maWcucG0nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2VhcmNoIHVzZXIKICAgICRTZWxmLT57U2VhcmNoVXNlckROfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntVc2VyRE59IHx8ICcnOwogICAgJFNlbGYtPntTZWFyY2hVc2VyUHd9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1VzZXJQd30gfHwgJyc7CgogICAgIyBncm91cCBkbgogICAgJFNlbGYtPntHcm91cEROfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntHcm91cEROfSB8fCAnJzsKCiAgICAjIGN1c3RvbWVyIGtleQogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lcktleX0gKSB7CiAgICAgICAgJFNlbGYtPntDdXN0b21lcktleX0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lcktleX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5DdXN0b21lcktleSBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGlkCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVySUR9ICkgewogICAgICAgICRTZWxmLT57Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lcklEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVySUQgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsZGFwIGZpbHRlciBhbHdheXMgdXNlZAogICAgJFNlbGYtPntBbHdheXNGaWx0ZXJ9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Fsd2F5c0ZpbHRlcn0gfHwgJyc7CgogICAgJFNlbGYtPntFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyRXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSB8fCAwOwogICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ICAgICAgICAgICAgID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoUHJlZml4fTsKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntTZWFyY2hQcmVmaXh9ICkgewogICAgICAgICRTZWxmLT57U2VhcmNoUHJlZml4fSA9ICcnOwogICAgfQogICAgJFNlbGYtPntTZWFyY2hTdWZmaXh9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoU3VmZml4fTsKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntTZWFyY2hTdWZmaXh9ICkgewogICAgICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICcqJzsKICAgIH0KCiAgICAjIGNoYXJzZXQgc2V0dGluZ3MKICAgICRTZWxmLT57U291cmNlQ2hhcnNldH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57U291cmNlQ2hhcnNldH0gfHwgJyc7CgogICAgIyBzZXQgY2FjaGUgdHlwZQogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0N1c3RvbWVyVXNlcicgLiAkUGFyYW17Q291bnR9OwoKICAgICMgY3JlYXRlIGNhY2hlIG9iamVjdCwgYnV0IG9ubHkgaWYgQ2FjaGVUVEwgaXMgc2V0IGluIGN1c3RvbWVyIGNvbmZpZwogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIH0KCiAgICAjIGdldCB2YWxpZCBmaWx0ZXIgaWYgdXNlZAogICAgJFNlbGYtPntWYWxpZEZpbHRlcn0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJWYWxpZEZpbHRlcn0gfHwgJyc7CgogICAgIyBjb25uZWN0IGZpcnN0IGlmIERpZSBpcyBlbmFibGVkLCBtYWtlIHN1cmUgdGhhdCBjb25uZWN0aW9uIGlzIHBvc3NpYmxlLCBlbHNlIGRpZQogICAgaWYgKCAkU2VsZi0+e0RpZX0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKICAgIH0KCiAgICAjIGZldGNoIG5hbWVzIG9mIGNvbmZpZ3VyZWQgZHluYW1pYyBmaWVsZHMKICAgIG15IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzID0gZ3JlcCB7ICRfLT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnIH0gQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9OwogICAgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9ID0geyBtYXAgeyAkXy0+WzJdID0+IDEgfSBARHluYW1pY0ZpZWxkTWFwRW50cmllcyB9OwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIG15ICRMYXlvdXRQYXJhbSA9ICRLZXJuZWw6Ok9NLT57UGFyYW19LT57J0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnfTsKCiAgICAjIENoZWNrIGlmIG11bHRpdGVuYW5jeSBpcyBlbmFibGVkIGFuZCB0aGUgcmVxdWVzdCBpcyBjb21pbmcgZnJvbSBhIHVzZXIuCiAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSAmJiAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gZXEgJ1VzZXInICYmICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CgogICAgICAgICMgU2F2ZSB0aGUgVXNlcklEIGFuZCBhbGwgZ3JvdXBzIHRoZSB1c2VyIGhhcyAncm8nIHBlcm1pc3Npb24gb24uCiAgICAgICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VySUR9ICkgewogICAgICAgICAgICAjIE9ubHkgZ2V0IHRoZSBncm91cCBsaXN0IG9uY2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgICAgICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJExheW91dFBhcmFtLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBUaGUgbGltaXQgZG9lcyBub3QgY291bnQgZm9yIG1lbWJlcnMgb2YgYSBzcGVjaWZpYyBncm91cC4KICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25Hcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSB8fCAnJzsKICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgICA9IHJldmVyc2UgJUdyb3VwczsKCiAgICAgICAgICAgIGlmICggISRHcm91cHNSZXZlcnNleyRQZXJtaXNzaW9uR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3l9ID0gJExheW91dFBhcmFtLT57VXNlcklEfTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3VwSURzfSA9IFsgc29ydCBrZXlzICVHcm91cHMgXTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3Vwc30gICA9IFsgdmFsdWVzICVHcm91cHMgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIF9Db25uZWN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyByZXR1cm4gaWYgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG9wZW4KICAgIHJldHVybiAxIGlmICRTZWxmLT57TERBUH07CgogICAgIyBsZGFwIGNvbm5lY3QgYW5kIGJpbmQgKG1heWJlIHdpdGggU2VhcmNoVXNlckROIGFuZCBTZWFyY2hVc2VyUHcpCiAgICAkU2VsZi0+e0xEQVB9ID0gTmV0OjpMREFQLT5uZXcoICRTZWxmLT57SG9zdH0sICV7ICRTZWxmLT57UGFyYW1zfSB9ICk7CgogICAgaWYgKCAhJFNlbGYtPntMREFQfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57RGllfSApIHsKICAgICAgICAgICAgZGllICJDYW4ndCBjb25uZWN0IHRvICRTZWxmLT57SG9zdH06ICRAIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjb25uZWN0IHRvICRTZWxmLT57SG9zdH06ICRAIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggJFNlbGYtPntTdGFydFRMU30gKSB7CiAgICAgICAgbXkgJFN0YXJ0ZWQgPSAkU2VsZi0+e0xEQVB9LT5zdGFydF90bHMoIHZlcmlmeSA9PiAkU2VsZi0+e1N0YXJ0VExTfSApOwogICAgICAgIGlmICggISRTdGFydGVkICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57RGllfSApIHsKICAgICAgICAgICAgICAgIGRpZSAic3RhcnRfdGxzIG9uICRTZWxmLT57SG9zdH0gZmFpbGVkOiAkQCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJzdGFydF90bHM6ICckU2VsZi0+e1N0YXJ0VExTfScgb24gJFNlbGYtPntIb3N0fSBmYWlsZWQ6ICRAIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xEQVB9LT5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFJlc3VsdDsKICAgIGlmICggJFNlbGYtPntTZWFyY2hVc2VyRE59ICYmICRTZWxmLT57U2VhcmNoVXNlclB3fSApIHsKICAgICAgICAkUmVzdWx0ID0gJFNlbGYtPntMREFQfS0+YmluZCgKICAgICAgICAgICAgZG4gICAgICAgPT4gJFNlbGYtPntTZWFyY2hVc2VyRE59LAogICAgICAgICAgICBwYXNzd29yZCA9PiAkU2VsZi0+e1NlYXJjaFVzZXJQd30sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5iaW5kKCk7CiAgICB9CgogICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGaXJzdCBiaW5kIGZhaWxlZCEgJyAuICRSZXN1bHQtPmVycm9yKCksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xEQVB9LT5kaXNjb25uZWN0KCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgQ3VzdG9tZXJOYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyTG9naW4hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYnVpbGQgZmlsdGVyCiAgICBteSAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFBhcmFte1VzZXJMb2dpbn0gKSAuICcpJzsKCiAgICAjIHByZXBhcmUgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57QWx3YXlzRmlsdGVyfSApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57QWx3YXlzRmlsdGVyfSkiOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJE5hbWUgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAnQ3VzdG9tZXJOYW1lOjonIC4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE5hbWUgaWYgZGVmaW5lZCAkTmFtZTsKICAgIH0KCiAgICAjIGNyZWF0ZSBsZGFwIGNvbm5lY3QKICAgIHJldHVybiBpZiAhJFNlbGYtPl9Db25uZWN0KCk7CgogICAgIyBwZXJmb3JtIHVzZXIgc2VhcmNoCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0Jhc2VETn0sCiAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICBmaWx0ZXIgICAgPT4gJEZpbHRlciwKICAgICAgICBzaXplbGltaXQgPT4gJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICBhdHRycyAgICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTmFtZUZpZWxkc30sCiAgICApOwoKICAgIGlmICggJFJlc3VsdC0+Y29kZSgpICkgewogICAgICAgIGlmICggJFJlc3VsdC0+Y29kZSgpID09IDQgKSB7CgogICAgICAgICAgICAjIFJlc3VsdCBjb2RlIDQgKExEQVBfU0laRUxJTUlUX0VYQ0VFREVEKSBpcyBub3JtYWwgaWYgdGhlcmUKICAgICAgICAgICAgIyBhcmUgbW9yZSBpdGVtcyBpbiBMREFQIHRoYW4gc2VhcmNoIGxpbWl0IGRlZmluZWQgaW4gT1RPQk8gb3IKICAgICAgICAgICAgIyBpbiBMREFQIHNlcnZlci4gQXZvaWQgc3BhbW1pbmcgbG9ncyB3aXRoIHN1Y2ggZXJyb3JzLgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTERBUCBzaXplIGxpbWl0IGV4Y2VlZGVkICgnIC4gJFJlc3VsdC0+ZXJyb3IoKSAuICcpLicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU2VhcmNoIGZhaWxlZCEgJyAuICRSZXN1bHQtPmVycm9yKCksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTmFtZVBhcnRzOwoKICAgIGZvciBteSAkRW50cnkgKCAkUmVzdWx0LT5hbGxfZW50cmllcygpICkgewoKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTmFtZUZpZWxkc30gfSApIHsKCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkRW50cnktPmdldF92YWx1ZSgkRmllbGQpICkgewogICAgICAgICAgICAgICAgJE5hbWVQYXJ0c3skRmllbGR9ID0gJFNlbGYtPl9Db252ZXJ0RnJvbSggJEVudHJ5LT5nZXRfdmFsdWUoJEZpZWxkKSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgIG15IEBEeW5hbWljRmllbGRDdXN0b21lclVzZXJOYW1lRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfQogICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHN9IH07CiAgICBpZiAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRFlOQU1JQ0ZJRUxETkFNRToKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKEBEeW5hbWljRmllbGRDdXN0b21lclVzZXJOYW1lRmllbGRzKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhZGVmaW5lZCAkVmFsdWU7CgogICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAUmVuZGVyZWRWYWx1ZXM7CgogICAgICAgICAgICBWQUxVRToKICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50VmFsdWUgKCBAeyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgIG15ICRSZW5kZXJlZFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlJlYWRhYmxlVmFsdWVSZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRDdXJyZW50VmFsdWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRSZW5kZXJlZFZhbHVlKSB8fCAhZGVmaW5lZCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKCiAgICAgICAgICAgICAgICBwdXNoIEBSZW5kZXJlZFZhbHVlcywgJFJlbmRlcmVkVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICROYW1lUGFydHN7JER5bmFtaWNGaWVsZE5hbWV9ID0gam9pbiAnICcsIEBSZW5kZXJlZFZhbHVlczsKICAgICAgICB9CiAgICB9CgogICAgIyBhc3NlbWJsZSBuYW1lCiAgICBteSBATmFtZVBhcnRzOwogICAgQ1VTVE9NRVJVU0VSTkFNRUZJRUxEOgogICAgZm9yIG15ICRDdXN0b21lclVzZXJOYW1lRmllbGQgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSB9ICkgewogICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSTkFNRUZJRUxECiAgICAgICAgICAgIGlmICFleGlzdHMgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfQogICAgICAgICAgICB8fCAhZGVmaW5lZCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFsZW5ndGggJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgICAgICBwdXNoIEBOYW1lUGFydHMsICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH07CiAgICB9CgogICAgbXkgJEpvaW5DaGFyYWN0ZXIgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzSm9pbn0gLy8gJyAnOwogICAgbXkgJE5hbWUgICAgICAgICAgPSBqb2luICRKb2luQ2hhcmFjdGVyLCBATmFtZVBhcnRzOwoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lck5hbWU6OicgLiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgVmFsdWUgPT4gJE5hbWUsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkTmFtZTsKfQoKc3ViIEN1c3RvbWVyU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJJRFJhd30gKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFte0N1c3RvbWVySURSYXd9OwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtTZWFyY2h9CiAgICAgICAgJiYgISRQYXJhbXtVc2VyTG9naW59CiAgICAgICAgJiYgISRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofQogICAgICAgICYmICEkUGFyYW17Q3VzdG9tZXJJRH0KICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlYXJjaCwgVXNlckxvZ2luLCBQb3N0TWFzdGVyU2VhcmNoLCBDdXN0b21lcklEUmF3IG9yIEN1c3RvbWVySUQhJwogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGJ1aWxkIGZpbHRlcgogICAgbXkgJEZpbHRlciA9ICcnOwogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICBteSBAUGFydHMgPSBzcGxpdCggL1wrLywgJFBhcmFte1NlYXJjaH0sIDYgKTsKICAgICAgICBmb3IgbXkgJFBhcnQgKEBQYXJ0cykgewoKICAgICAgICAgICAgJFBhcnQgPSAkU2VsZi0+e1NlYXJjaFByZWZpeH0gLiAkUGFydCAuICRTZWxmLT57U2VhcmNoU3VmZml4fTsKICAgICAgICAgICAgJFBhcnQgPX4gcy8oXCUrKS9cJS9nOwogICAgICAgICAgICAkUGFydCA9fiBzLyhcKispXCovKi9nOwogICAgICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMKICAgICAgICAgICAgIyBhcyB0aGV5IGNhbm5vdCBiZSByZXRyaWV2ZWQgaGVyZQogICAgICAgICAgICBteSBAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc30gfTsKCiAgICAgICAgICAgIGlmIChAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKSB7CgogICAgICAgICAgICAgICAgIyBxdW90ZSBMREFQIGZpbHRlciB2YWx1ZSBidXQga2VlcCBhc3Rlcmlza3MgdW5lc2NhcGVkICh3aWxkY2FyZCkKICAgICAgICAgICAgICAgICRQYXJ0ID1+IHMvXCovZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvZzsKICAgICAgICAgICAgICAgICRQYXJ0ID0gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFNlbGYtPl9Db252ZXJ0VG8oJFBhcnQpICk7CiAgICAgICAgICAgICAgICAkUGFydCA9fiBzL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwLyovZzsKCiAgICAgICAgICAgICAgICAkRmlsdGVyIC49ICcofCc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEZpbHRlciAuPSAiKCRGaWVsZD0iIC4gJFBhcnQgLiAnKSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRmlsdGVyIC49ICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHF1b3RlIExEQVAgZmlsdGVyIHZhbHVlIGJ1dCBrZWVwIGFzdGVyaXNrcyB1bmVzY2FwZWQgKHdpbGRjYXJkKQogICAgICAgICAgICAgICAgJFBhcnQgPX4gcy9cKi9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC9nOwogICAgICAgICAgICAgICAgJFBhcnQgPSBlc2NhcGVfZmlsdGVyX3ZhbHVlKCRQYXJ0KTsKICAgICAgICAgICAgICAgICRQYXJ0ID1+IHMvZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvKi9nOwoKICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gJFBhcnQgLiAnKSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJENvdW50ID4gMSApIHsKICAgICAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIpIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApIHsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMKICAgICAgICAjIGFzIHRoZXkgY2Fubm90IGJlIHJldHJpZXZlZCBoZXJlCiAgICAgICAgbXkgQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfQogICAgICAgICAgICBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBpZiAoQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgICAgICMgcXVvdGUgTERBUCBmaWx0ZXIgdmFsdWUgYnV0IGtlZXAgYXN0ZXJpc2tzIHVuZXNjYXBlZCAod2lsZGNhcmQpCiAgICAgICAgICAgICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSA9fiBzL1wqL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwL2c7CiAgICAgICAgICAgICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSA9IGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApOwogICAgICAgICAgICAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gPX4gcy9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC8qL2c7CgogICAgICAgICAgICAkRmlsdGVyID0gJyh8JzsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMpIHsKICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gIigkRmllbGQ9JFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9KSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEZpbHRlciAuPSAnKSc7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFBhcmFte1VzZXJMb2dpbn0gKSAuICcpJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVySUR9ICkgewoKICAgICAgICAjICRQYXJhbXtDdXN0b21lcklEUmF3fSBpcyBhbHNvIGhhbmRsZWQgaW4gdGhlIHRoaXMgYmxvY2sKICAgICAgICAjIHRoZXJlIGlzIG5vICcqJyB3aWxkY2FyZCBleHBhbnNpb24gd2hlbiBzZWFyY2hpbmcgZm9yIEN1c3RvbWVySUQKICAgICAgICAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVySUR9PSIgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkUGFyYW17Q3VzdG9tZXJJRH0gKSAuICcpJzsKICAgIH0KCiAgICAjIHByZXBhcmUgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57QWx3YXlzRmlsdGVyfSApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57QWx3YXlzRmlsdGVyfSkiOwogICAgfQoKICAgICMgYWRkIHZhbGlkIGZpbHRlcgogICAgaWYgKCAkU2VsZi0+e1ZhbGlkRmlsdGVyfSApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57VmFsaWRGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gam9pbiAnOjonLCBtYXAgeyAkXyAuICc9JyAuICRQYXJhbXskX30gfSBzb3J0IGtleXMgJVBhcmFtOwojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBVc2UgY2FjaGUgZm9yIG11bHRpdGVuYW5jeS4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICRDYWNoZUtleSAuPSBqb2luICcnLCBtYXAgeyAnOjpHcm91cElEPScgLiAkXyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9OwogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JFVzZXJzfSBpZiByZWYgJFVzZXJzIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBsZGFwIGNvbm5lY3QKICAgIHJldHVybiBpZiAhJFNlbGYtPl9Db25uZWN0KCk7CgogICAgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHMgPSAkU2VsZi0+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+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFZhbGlkID0gJFBhcmFte1ZhbGlkfSAvLyAxOwoKICAgICRQYXJhbXtMaW1pdH0gLy89ICcnOwoKICAgICMgU3BsaXQgdGhlIHNlYXJjaCBmaWVsZHMgaW4gc2NhbGFyIGFuZCBhcnJheSBmaWVsZHMsIGJlZm9yZSB0aGUgZGlmZnJlbnQgaGFuZGxpbmcuCiAgICBteSBAU2NhbGFyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICdJbnB1dCcgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CiAgICBteSBAQXJyYXlTZWFyY2hGaWVsZHMgID0gZ3JlcCB7ICdTZWxlY3Rpb24nIGVxICRfLT57VHlwZX0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgICMgVmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXlyZWYuCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKEBBcnJheVNlYXJjaEZpZWxkcykgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9ICkgewogICAgICAgICAgICAkUGFyYW17ICRBcmd1bWVudC0+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+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15IEBBdHRyaWJ1dGVzOwogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgIHB1c2goIEBBdHRyaWJ1dGVzLCAkRW50cnktPlsyXSApOwogICAgfQogICAgbXkgJEZpbHRlciA9ICIoJFNlbGYtPntDdXN0b21lcktleX09IiAuIGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtVc2VyfSApIC4gJyknOwoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdDdXN0b21lclVzZXJEYXRhR2V0OjonIC4gJFBhcmFte1VzZXJ9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JERhdGF9IGlmIHJlZiAkRGF0YSBlcSAnSEFTSCc7CiAgICB9CgogICAgIyBjcmVhdGUgbGRhcCBjb25uZWN0CiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwoKICAgICMgcGVyZm9ybSBzZWFyY2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgIGF0dHJzICA9PiBcQEF0dHJpYnV0ZXMsCiAgICApOwoKICAgICMgbG9nIGxkYXAgZXJyb3JzCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmaXJzdCBlbnRyeQogICAgbXkgJFJlc3VsdDIgPSAkUmVzdWx0LT5lbnRyeSgwKTsKICAgIGlmICggISRSZXN1bHQyICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjdXN0b21lciB1c2VyIGluZm8KICAgIG15ICVEYXRhOwogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkUmVzdWx0Mi0+Z2V0X3ZhbHVlKCAkRW50cnktPlsyXSApICkgfHwgJyc7CgogICAgICAgIGlmICggJFZhbHVlICYmICRFbnRyeS0+WzJdID1+IC9edGFyZ2V0YWRkcmVzcyQvaSApIHsKICAgICAgICAgICAgJFZhbHVlID1+IHMvU01UUDooLiopLyQxLzsKICAgICAgICB9CgogICAgICAgICREYXRheyAkRW50cnktPlswXSB9ID0gJFZhbHVlOwogICAgfQoKICAgIHJldHVybiBpZiAhJERhdGF7VXNlckxvZ2lufTsKCiAgICAjIHRvIGJ1aWxkIHRoZSBVc2VyTWFpbFN0cmluZwogICAgbXkgJFVzZXJNYWlsU3RyaW5nID0gJyc7CiAgICBteSBAVXNlck1haWxTdHJpbmdQYXJ0czsKCiAgICBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwKSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCA9IFsgJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2VtYWlsJywgXTsKICAgIH0KCiAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcH0gKSB7CgogICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5fQ29udmVydEZyb20oICRSZXN1bHQyLT5nZXRfdmFsdWUoJEZpZWxkKSApIHx8ICcnOwoKICAgICAgICBpZiAoJFZhbHVlKSB7CiAgICAgICAgICAgIGlmICggJEZpZWxkID1+IC9edGFyZ2V0YWRkcmVzcyQvaSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9fiBzL1NNVFA6KC4qKS8kMS87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBAVXNlck1haWxTdHJpbmdQYXJ0cywgJFZhbHVlOwogICAgICAgIH0KICAgIH0KICAgICRVc2VyTWFpbFN0cmluZyA9IGpvaW4gJyAnLCBAVXNlck1haWxTdHJpbmdQYXJ0czsKICAgICRVc2VyTWFpbFN0cmluZyA9fiBzL14oLiopXHMoLis/XEAuKz9cLi4rPykoXHN8KSQvIiQxIiA8JDI+LzsKCiAgICAjIGFkZCB0aGUgVXNlck1haWxTdHJpbmcgdG8gdGhlIGRhdGEgaGFzaAogICAgJERhdGF7VXNlck1haWxTdHJpbmd9ID0gJFVzZXJNYWlsU3RyaW5nOwoKICAgICMgY29tcGF0IQogICAgJERhdGF7VXNlcklEfSA9ICREYXRhe1VzZXJMb2dpbn07CgogICAgIyBnZXQgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT5HZXRQcmVmZXJlbmNlcyggVXNlcklEID0+ICREYXRhe1VzZXJMb2dpbn0gKTsKCiAgICAjIGFkZCBsYXN0IGxvZ2luIHRpbWVzdGFtcAogICAgaWYgKCAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpbn0gKSB7CgogICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgRXBvY2ggPT4gJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW59LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2luVGltZXN0YW1wfSA9ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVyVXNlckRhdGFHZXQ6OicgLiAkUGFyYW17VXNlcn0sCiAgICAgICAgICAgIFZhbHVlID0+IHsgJURhdGEsICVQcmVmZXJlbmNlcyB9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gKCAlRGF0YSwgJVByZWZlcmVuY2VzICk7Cn0KCnN1YiBDdXN0b21lclVzZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gJ05vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kdWxlIScKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgQ3VzdG9tZXJVc2VyVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdOb3Qgc3VwcG9ydGVkIGZvciB0aGlzIG1vZHVsZSEnCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFNldFBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFB3ID0gJFBhcmFte1BXfSB8fCAnJzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gJ05vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgbW9kdWxlIScKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgR2VuZXJhdGVSYW5kb21QYXNzd29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggICAgID0+ICRQYXJhbXtTaXplfSB8fCA4LAogICAgICAgIERpY3Rpb25hcnkgPT4gWyAwIC4uIDksICdBJyAuLiAnWicsICdhJyAuLiAneicsICctJywgJ18nLCAnIScsICdAJywgJyMnLCAnJCcsICclJywgJ14nLCAnJicsICcqJyBdLAogICAgKTsKfQoKc3ViIFNldFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHJlc2V0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlcklEfSIsCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKc3ViIEdldFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBTZWFyY2hQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2VhcmNoUHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKc3ViIF9Db252ZXJ0RnJvbSB7CiAgICBteSAoICRTZWxmLCAkVGV4dCApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRUZXh0OwoKICAgIGlmICggISRTZWxmLT57U291cmNlQ2hhcnNldH0gKSB7CiAgICAgICAgcmV0dXJuICRUZXh0OwogICAgfQoKICAgIHJldHVybiAkS2VybmVsOjpPTS0+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpSZWZlcmVuY2VEYXRhJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnkgLSBjdXN0b21lciBjb21wYW55IGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgQ3VzdG9tZXIgZnVuY3Rpb25zLiBFLmcuIHRvIGFkZCBhbmQgdXBkYXRlIGN1c3RvbWVyIGNvbXBhbmllcy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRDdXN0b21lckNvbXBhbnlPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIG15ICRMYXlvdXRQYXJhbSA9ICRLZXJuZWw6Ok9NLT57UGFyYW19LT57J0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnfTsKCiAgICAjIENoZWNrIGlmIG11bHRpdGVuYW5jeSBpcyBlbmFibGVkIGFuZCB0aGUgcmVxdWVzdCBpcyBjb21pbmcgZnJvbSBhIHVzZXIuCiAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSAmJiAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gZXEgJ1VzZXInICYmICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CgogICAgICAgICMgU2F2ZSB0aGUgVXNlcklEIGFuZCBhbGwgZ3JvdXBzIHRoZSB1c2VyIGhhcyAncm8nIHBlcm1pc3Npb24gb24uCiAgICAgICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VySUR9ICkgewogICAgICAgICAgICAjIE9ubHkgZ2V0IHRoZSBncm91cCBsaXN0IG9uY2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgICAgICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJExheW91dFBhcmFtLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBUaGUgbGltaXQgZG9lcyBub3QgY291bnQgZm9yIG1lbWJlcnMgb2YgYSBzcGVjaWZpYyBncm91cC4KICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25Hcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSB8fCAnJzsKICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgICA9IHJldmVyc2UgJUdyb3VwczsKCiAgICAgICAgICAgIGlmICggISRHcm91cHNSZXZlcnNleyRQZXJtaXNzaW9uR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3l9ID0gJExheW91dFBhcmFtLT57VXNlcklEfTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3VwSURzfSA9IFsga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIGxvYWQgY3VzdG9tZXIgY29tcGFueSBiYWNrZW5kIG1vZHVsZXMKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHNvdXJjZS4KICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55VXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e0N1c3RvbWVyQ29tcGFueVVzZXJHcm91cH07CgogICAgICAgICMgVGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgc291cmNlLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAgKSB7CiAgICAgICAgICAgIGlmICggIWdyZXAgeyAvXiRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e01vZHVsZX0KICAgICAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnk6OkRCJzsKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55TWFwID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdDdXN0b21lckNvbXBhbnk6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUFkZCgpCgphZGQgYSBuZXcgY3VzdG9tZXIgY29tcGFueQoKICAgIG15ICRJRCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICA9PiAnZXhhbXBsZS5jb20nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgICAgID0+ICdOZXcgQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55U3RyZWV0ICAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVpJUCAgICAgID0+ICczMzEyNicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q2l0eSAgICAgPT4gJ01pYW1pJywKICAgICAgICBDdXN0b21lckNvbXBhbnlDb3VudHJ5ICA9PiAnVVNBJywKICAgICAgICBDdXN0b21lckNvbXBhbnlVUkwgICAgICA9PiAnaHR0cDovL3d3dy5leGFtcGxlLm9yZycsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyBhY2NlcHRlZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGRhdGEgc291cmNlCiAgICBpZiAoICEkUGFyYW17U291cmNlfSApIHsKICAgICAgICAkUGFyYW17U291cmNlfSA9ICdDdXN0b21lckNvbXBhbnknOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEN1c3RvbWVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHN0b3JlIGN1c3RvbWVyIGNvbXBhbnkgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57ICRQYXJhbXtTb3VyY2V9IH0tPkN1c3RvbWVyQ29tcGFueUFkZCglUGFyYW0pOwogICAgcmV0dXJuIGlmICEkUmVzdWx0OwoKICAgICMgdHJpZ2dlciBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ3VzdG9tZXJDb21wYW55QWRkJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBOZXdEYXRhICAgID0+IFwlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55R2V0KCkKCmdldCBjdXN0b21lciBjb21wYW55IGF0dHJpYnV0ZXMKCiAgICBteSAlQ3VzdG9tZXJDb21wYW55ID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgIEN1c3RvbWVySUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJUN1c3RvbWVyQ29tcGFueSA9ICgKICAgICAgICAnQ3VzdG9tZXJDb21wYW55TmFtZScgICAgPT4gJ0N1c3RvbWVyIEluYy4nLAogICAgICAgICdDdXN0b21lcklEJyAgICAgICAgICAgICA9PiAnZXhhbXBsZS5jb20nLAogICAgICAgICdDdXN0b21lckNvbXBhbnlTdHJlZXQnICA9PiAnNTIwMSBCbHVlIExhZ29vbiBEcml2ZScsCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueVpJUCcgICAgID0+ICczMzEyNicsCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueUNpdHknICAgID0+ICdNaWFtaScsCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknID0+ICdVbml0ZWQgU3RhdGVzJywKICAgICAgICAnQ3VzdG9tZXJDb21wYW55VVJMJyAgICAgPT4gJ2h0dHA6Ly9leGFtcGxlLmNvbScsCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueUNvbW1lbnQnID0+ICdTb21lIENvbW1lbnRzJywKICAgICAgICAnVmFsaWRJRCcgICAgICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICdDcmVhdGVUaW1lJyAgICAgICAgICAgICA9PiAnMjAxMC0xMC0wNCAxNjozNTo0OScsCiAgICAgICAgJ0NoYW5nZVRpbWUnICAgICAgICAgICAgID0+ICcyMDEwLTEwLTA0IDE2OjM2OjEyJywKICAgICk7CgpOT1RFOiBBY3R1YWwgZmllbGRzIHJldHVybmVkIGJ5IHRoaXMgQVBJIGNhbGwgbWF5IGRpZmZlciBiYXNlZCBvbgpDdXN0b21lckNvbXBhbnkgbWFwcGluZyBpbiB5b3VyIHN5c3RlbSBjb25maWd1cmF0aW9uLgoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEN1c3RvbWVySUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgRmV0Y2ggZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9ucyBmb3IgQ3VzdG9tZXJDb21wYW55LgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9OwoKICAgICAgICBteSAlQ29tcGFueSA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT5DdXN0b21lckNvbXBhbnlHZXQoICVQYXJhbSwgKTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJUNvbXBhbnk7CgogICAgICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSApICkgewogICAgICAgICAgICBDVVNUT01FUkNPTVBBTllGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lckNvbXBhbnlGaWVsZCAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZRklFTEQgaWYgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bNV0gbmUgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCBpZiAhJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMl0gfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRMb29rdXB7ICRDdXN0b21lckNvbXBhbnlGaWVsZC0+WzJdIH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDb21wYW55e0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ29tcGFueXsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMF0gfSA9ICRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uLgogICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwoKICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSAmJiAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9ICkgewogICAgICAgICAgICAjIFJlcGxhY2UgdGhlIHJlbW90ZSBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIGxvY2FsIGdyb3VwLgogICAgICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSBlcSAkUmVtb3RlR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2FsR3JvdXAgPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CiAgICAgICAgICAgICAgICAgICAgJENvbXBhbnl7VXNlckdyb3VwSUR9ID0gJExvY2FsR3JvdXA7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJExvY2FsR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkQ29tcGFueXtVc2VyR3JvdXBJRH0gPSAkR3JvdXBJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDb21wYW55e1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIGluZm9ybWF0aW9uLgogICAgICAgICAgICBpZiAoICFncmVwIHsgL14kQ29tcGFueXtVc2VyR3JvdXBJRH0kLyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgICMgcmV0dXJuIGNvbXBhbnkgZGF0YQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICVDb21wYW55LAogICAgICAgICAgICBTb3VyY2UgPT4gIkN1c3RvbWVyQ29tcGFueSRDb3VudCIsCiAgICAgICAgICAgIENvbmZpZyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55VXBkYXRlKCkKCnVwZGF0ZSBjdXN0b21lciBjb21wYW55IGF0dHJpYnV0ZXMKCiAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlVcGRhdGUoCiAgICAgICAgQ3VzdG9tZXJDb21wYW55SUQgICAgICAgPT4gJ29sZGV4YW1wbGUuY29tJywgIyByZXF1aXJlZCBmb3IgQ3VzdG9tZXJDb21wYW55SUQtdXBkYXRlCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICBDdXN0b21lckNvbXBhbnlOYW1lICAgICA9PiAnTmV3IEN1c3RvbWVyIEluYy4nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVN0cmVldCAgID0+ICc1MjAxIEJsdWUgTGFnb29uIERyaXZlJywKICAgICAgICBDdXN0b21lckNvbXBhbnlaSVAgICAgICA9PiAnMzMxMjYnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueUxvY2F0aW9uID0+ICdNaWFtaScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q291bnRyeSAgPT4gJ1VTQScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55VVJMICAgICAgPT4gJ2h0dHA6Ly9leGFtcGxlLmNvbScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gfHw9ICRQYXJhbXtDdXN0b21lcklEfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ3VzdG9tZXJDb21wYW55SUQgb3IgQ3VzdG9tZXJJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBjb21wYW55IGV4aXN0cwogICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gKTsKICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBjb21wYW55ICckUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBVc2VyR3JvdXBJRC4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICMgU2V0IHRoZSBVc2VyR3JvdXBJRCB0byB0aGUgY3VycmVudCBVc2VyR3JvdXBJRC4KICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRDb21wYW55e1VzZXJHcm91cElEfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57JENvbXBhbnl7U291cmNlfX0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSApIHsKICAgICAgICAjIENoZWNrIGlmIGdyb3VwIElEIG9yIGdyb3VwIG5hbWVzIHNob3VsZCBiZSB1c2VkLgogICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICAkUGFyYW17VXNlckdyb3VwSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkUGFyYW17VXNlckdyb3VwSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBSZXBsYWNlIHRoZSBsb2NhbCBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIHJlbW90ZSBncm91cC4KICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSBlcSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VXNlckdyb3VwSUR9ID0gJFJlbW90ZUdyb3VwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57ICRDb21wYW55e1NvdXJjZX0gfS0+Q3VzdG9tZXJDb21wYW55VXBkYXRlKCVQYXJhbSk7CiAgICByZXR1cm4gaWYgISRSZXN1bHQ7CgogICAgIyB0cmlnZ2VyIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDdXN0b21lckNvbXBhbnlVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICA9PiAkUGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIE9sZEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSwKICAgICAgICAgICAgTmV3RGF0YSAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBPbGREYXRhICAgICAgID0+IFwlQ29tcGFueSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlIGxpc3QKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAlRGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CgogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17UmVhZE9ubHl9ICkgewogICAgICAgICAgICBteSAkQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQmFja2VuZENvbmZpZy0+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAzODI2M2FjZmYzYTFjZGI1NDE4Mjc3NDUwYjllZmJiODFjYmMyZDI1IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXIgLSBjdXN0b21lciB1c2VyIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgY3VzdG9tZXIgdXNlciBmdW5jdGlvbnMuIEUuIGcuIHRvIGFkZCBhbmQgdXBkYXRlIGN1c3RvbWVyIHVzZXJzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKRG9uJ3QgdXNlIHRoZSBjb25zdHJ1Y3RvciBkaXJlY3RseSwgdXNlIHRoZSBPYmplY3RNYW5hZ2VyIGluc3RlYWQ6CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdDdXN0b21lclVzZXInOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBsb2FkIGdlbmVyYXRvciBjdXN0b21lciBwcmVmZXJlbmNlcyBtb2R1bGUKICAgIG15ICRHZW5lcmF0b3JNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXMnKS0+e01vZHVsZX0KICAgICAgICB8fCAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjo6UHJlZmVyZW5jZXM6OkRCJzsKCiAgICAjIGdldCBtYWluIG9iamVjdAogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyYXRvck1vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0gPSAkR2VuZXJhdG9yTW9kdWxlLT5uZXcoKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICBteSAkTGF5b3V0UGFyYW0gPSAkS2VybmVsOjpPTS0+e1BhcmFtfS0+eydLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0J307CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIGtleXMgJUdyb3VwcyBdOwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBzfSAgID0gWyB2YWx1ZXMgJUdyb3VwcyBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgIyBsb2FkIGN1c3RvbWVyIHVzZXIgYmFja2VuZCBtb2R1bGUKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgdW5sZXNzICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50Iik7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHNvdXJjZS4KICAgICAgICBteSAkQ3VzdG9tZXJVc2VyR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLT57Q3VzdG9tZXJVc2VyR3JvdXB9OwoKICAgICAgICAjIFRoZSB1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHNvdXJjZS4KICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSAmJiAkQ3VzdG9tZXJVc2VyR3JvdXAgKSB7CiAgICAgICAgICAgIGlmICggIWdyZXAgeyAvXiRDdXN0b21lclVzZXJHcm91cCQvIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBTT1VSQ0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLT57TW9kdWxlfTsKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgUHJlZmVyZW5jZXNPYmplY3QgPT4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlck1hcCAgID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdDdXN0b21lclVzZXI6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEN1c3RvbWVyU291cmNlTGlzdCgpCgpyZXR1cm4gY3VzdG9tZXIgc291cmNlIGxpc3QKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU291cmNlTGlzdCgKICAgICAgICBSZWFkT25seSA9PiAwICMgb3B0aW9uYWwsIDEgcmV0dXJucyBvbmx5IFJPIGJhY2tlbmRzLCAwIHJldHVybnMgd3JpdGFibGUsIGlmIG5vdCBwYXNzZWQgcmV0dXJucyBhbGwgYmFja2VuZHMKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJTb3VyY2VMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJURhdGE7CiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17UmVhZE9ubHl9ICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKTsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UmVhZE9ubHl9ICkgewogICAgICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDdXN0b21lckJhY2tlbmRDb25maWctPntSZWFkT25seX0gfHwgJEN1c3RvbWVyQmFja2VuZENvbmZpZy0+e01vZHVsZX0gIX4gL0xEQVAvaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICRDdXN0b21lckJhY2tlbmRDb25maWctPntSZWFkT25seX0gfHwgJEN1c3RvbWVyQmFja2VuZENvbmZpZy0+e01vZHVsZX0gPX4gL0xEQVAvaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YXsiQ3VzdG9tZXJVc2VyJENvdW50In0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLT57TmFtZX0KICAgICAgICAgICAgfHwgIk5vIE5hbWUgJENvdW50IjsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWhlYWQyIEN1c3RvbWVyU2VhcmNoKCkKCnRvIHNlYXJjaCBjdXN0b21lciB1c2Vycy4KCiAgICAjIHRleHQgc2VhcmNoIGluIHRoZSBjdXN0b21lciBzZWFyY2ggZmllbGRzCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFNlYXJjaCA9PiAnKnNvbWUqJywgIyBhbHNvICdoYW5zK2h1YmVyJyBwb3NzaWJsZQogICAgICAgIFZhbGlkICA9PiAxLCAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgICAgIExpbWl0ICA9PiAxMDAsICAgICAgIyAob3B0aW9uYWwpIG92ZXJyaWRlcyBsaW1pdCBvZiB0aGUgY29uZmlnCiAgICApOwoKICAgICMgdXNlcm5hbWUgc2VhcmNoCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFVzZXJMb2dpbiA9PiAnKnNvbWUqJywKICAgICAgICBWYWxpZCAgICAgPT4gMSwgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKICAgICMgZW1haWwgc2VhcmNoCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJ2VtYWlsQGV4YW1wbGUuY29tJywKICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKICAgICMgc2VhcmNoIGJ5IEN1c3RvbWVySUQKICAgICMgSXQgZGVwZW5kcyBvbiB0aGUgZGF0YSBiYWNrZW5kIHdoZW4gYW4gJyonIGlzIGNvbnNpZGVyZWQgYSB3aWxkY2FyZC4KICAgICMgVGhlIERCIGJhY2tlbmQgY29uc2lkZXJzICcqJyBhcyBhbiB3aWxkY2FyZC4KICAgICMgVGhlIExEQVAgYmFja2VuZCBkb2VzIG5vdCBkbyBzby4KICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgICA9PiAnQ3VzdG9tZXJJRDEyMycsCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKICAgICMgU2VhcmNoIGJ5IEN1c3RvbWVySUQgd2l0aG91dCB3aWxkY2FyZCBleHBhbnNpb24uCiAgICAjIFNvIHNlYXJjaGluZyBieSAnQWxvaXMqJyB3b3VsZCBmaW5kIG9ubHkgJ0Fsb2lzKicgYW5kIG5vdCAnQWxvaXMnIG9yICdBbG9pc2lhJy4KICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgQ3VzdG9tZXJJRFJhdyAgICA9PiAnQ3VzdG9tZXJJRDEyMycsCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKUmV0dXJucyBhIGhhc2ggbGlrZToKCiAgICB7CiAgICAgICAgJ3RpbmEnID0+ICciVGluYSBUZXN0ZXIiIDx0aW5hQGV4YW1wbGUuY29tPicsCiAgICAgICAgJ3RvbmknID0+ICciVG9uaSBUZXN0ZXIiIDx0b25pQGV4YW1wbGUuY29tPicsCiAgICB9CgpUaGUgbWV0aG9kIGlzIG1pc25hbWVkIGFzIEM8Q3VzdG9tZXJTZWFyY2g+IHNlYXJjaGVzIGZvciBjdXN0b21lciB1c2Vycywgbm90IGN1c3RvbWVycyBha2EgY3VzdG9tZXIgY29tcGFuaWVzLgoKPWN1dAoKc3ViIEN1c3RvbWVyU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyByZW1vdmUgbGVhZGluZyBhbmQgZW5kaW5nIHNwYWNlcwogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKICAgICAgICAkUGFyYW17U2VhcmNofSA9fiBzL15ccysvLzsKICAgICAgICAkUGFyYW17U2VhcmNofSA9fiBzL1xzKyQvLzsKICAgIH0KCiAgICAjIEdldCBkeW5hbWljIGZpZWxkIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKCiAgICBteSAlRHluYW1pY0ZpZWxkTG9va3VwID0gbWFwIHsgJF8tPntOYW1lfSA9PiAkXyB9IEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9OwoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBteSAlRGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIHNlYXJjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgICAgIG15ICRNYXAgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9OwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRNYXApICkgewoKICAgICAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gTWFwCiAgICAgICAgICAgICMgb25seSB0aGVzZSB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGFueSBvdGhlciBzZWFyY2ggY29uZmlnCiAgICAgICAgICAgICMgWyAnRHluYW1pY0ZpZWxkX05hbWVfWCcsIHVuZGVmLCAnTmFtZV9YJywgMCwgMCwgJ2R5bmFtaWNfZmllbGQnLCB1bmRlZiwgMCwgdW5kZWYsIHVuZGVmLCBdLAogICAgICAgICAgICBteSAlRHluYW1pY0ZpZWxkTmFtZXMgPSBtYXAgeyAkXy0+WzJdID0+IDEgfSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyRNYXB9OwoKICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVEeW5hbWljRmllbGROYW1lcyApICkgewogICAgICAgICAgICAgICAgbXkgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzOwogICAgICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkczsKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hQYXJhbTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHdoaWNoIG9mIHRoZSBkeW5hbWljIGZpZWxkcyBjb25maWd1cmVkIGluIE1hcCBhcmUgYWxzbwogICAgICAgICAgICAgICAgIyBjb25maWd1cmVkIGluIFNlYXJjaEZpZWxkcwoKICAgICAgICAgICAgICAgICMgcGFyYW0gU2VhcmNoCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1NlYXJjaH0gJiYgbGVuZ3RoICRQYXJhbXtTZWFyY2h9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZHMgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hGaWVsZHN9OwogICAgICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbSAgPSAkUGFyYW17U2VhcmNofTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHBhcmFtIFBvc3RNYXN0ZXJTZWFyY2gKICAgICAgICAgICAgICAgIGVsc2lmICggZGVmaW5lZCAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gJiYgbGVuZ3RoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGRzID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkc307CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtICA9ICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlYXJjaCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJFNlYXJjaEZpZWxkcykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQFNlYXJjaER5bmFtaWNGaWVsZE5hbWVzID0gZ3JlcCB7IGV4aXN0cyAkRHluYW1pY0ZpZWxkTmFtZXN7JF99IH0gQHskU2VhcmNoRmllbGRzfTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJUZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzOwogICAgICAgICAgICAgICAgICAgIEZJRUxETkFNRToKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkTmFtZSAoQFNlYXJjaER5bmFtaWNGaWVsZE5hbWVzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZExvb2t1cHskRmllbGROYW1lfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaCAgICAgICAgICAgICA9PiAkU2VhcmNoUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkVmFsdWVzKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkVmFsdWUgKCBAeyREeW5hbWljRmllbGRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEc3sgJER5bmFtaWNGaWVsZFZhbHVlLT57T2JqZWN0SUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMgPSBbIGtleXMgJUZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzIF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBleGVjdXRlIGJhY2tlbmQgc2VhcmNoIGZvciBmb3VuZCBvYmplY3QgSURzCiAgICAgICAgICAgICAgICAjIHRoaXMgZGF0YSBpcyBiZWluZyBtZXJnZWQgd2l0aCB0aGUgZm9sbG93aW5nIEN1c3RvbWVyU2VhcmNoIGNhbGwKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcykgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICRPYmplY3ROYW1lcyA9ICREeW5hbWljRmllbGRPYmplY3QtPk9iamVjdE1hcHBpbmdHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzLAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIE9CSkVDVE5BTUU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3ROYW1lICggdmFsdWVzICV7JE9iamVjdE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1ROQU1FIGlmIGV4aXN0cyAkRGF0YXskT2JqZWN0TmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICBteSAlU2VhcmNoUGFyYW0gPSAlUGFyYW07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VhcmNoUGFyYW17U2VhcmNofTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZWFyY2hQYXJhbXtQb3N0TWFzdGVyU2VhcmNofTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbXtVc2VyTG9naW59ID0gJE9iamVjdE5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAlU3ViRGF0YSA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lclNlYXJjaCglU2VhcmNoUGFyYW0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VyTG9naW4gc2VhcmNoIGRvZXMgYSB3aWxkLWNhcmQgc2VhcmNoLCBidXQgaW4gdGhpcyBjYXNlIG9ubHkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICMgZXhhY3QgbWF0Y2hpbmcgdXNlciBsb2dpbiBpcyByZWxldmFudAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN1YkRhdGEgKSAmJiBleGlzdHMgJFN1YkRhdGF7JE9iamVjdE5hbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE9iamVjdE5hbWUgPT4gJFN1YkRhdGF7JE9iamVjdE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjdXN0b21lciBzZWFyY2ggcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgbXkgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJTZWFyY2goJVBhcmFtKTsKCiAgICAgICAgJURhdGEgPSAoICVTdWJEYXRhLCAlRGF0YSApOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gc2VlIHRoaXMgY3VzdG9tZXIgdXNlci4KICAgICMgVE9ETzogUmVtb3ZlIHRoaXMgaWYgdGhlIERCL0xEQVAgZnVuY3Rpb24gQ3VzdG9tZXJTZWFyY2ggaXMgZnVsbHkgaW1wbGVtZW50ZWQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBDVVNUT01FUlVTRVJMT0dJTjoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlckxvZ2luICgga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISVVc2VyRGF0YSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskQ3VzdG9tZXJVc2VyTG9naW59OwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJMT0dJTjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIHJldHVybiAlRGF0YTsKfQoKPWhlYWQyIEN1c3RvbWVyU2VhcmNoRGV0YWlsKCkKClRvIGZpbmQgY3VzdG9tZXIgdXNlcnMgaW4gdGhlIHN5c3RlbS4KClRoZSBzZWFyY2ggY3JpdGVyaWEgYXJlIGxvZ2ljYWxseSBBTkQgY29ubmVjdGVkLgpXaGVuIGEgbGlzdCBpcyBwYXNzZWQgYXMgY3JpdGVyaWEsIHRoZSBpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIE9SIGNvbm5lY3RlZC4KV2hlbiBhbiB1bmRlZiBvciBhIHJlZmVyZW5jZSB0byBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQsIHRoZW4gdGhlIHNlYXJjaCBjcml0ZXJpYQppcyBpZ25vcmVkLgoKUmV0dXJucyBlaXRoZXIgYSBsaXN0LCBhcyBhbiBhcnJheXJlZiwgb3IgYSBjb3VudCBvZiBmb3VuZCBjdXN0b21lciB1c2VyIGlkcy4KVGhlIGNvdW50IG9mIHJlc3VsdHMgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcGFyYW1ldGVyIEM8UmVzdWx0ID0gJ0NPVU5UJz4gaXMgcGFzc2VkLgoKICAgIG15ICRDdXN0b21lclVzZXJJRHNSZWYgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaERldGFpbCgKCiAgICAgICAgIyBhbGwgZmllbGRzIHdoaWNoIGFyZSBkZWZpbmVkIGluIGEgQ3VzdG9tZXJVc2VyTWFwLCBleGNlcHQgcGFzc3dvcmQgZmllbGRzLCBhcmUgc2VhcmNoYWJsZQogICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ2V4YW1wbGUqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdGaXJzdG4qJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgc2VhcmNoIGZvciB2YWxpZCB1c2VycyBvbmx5IHBlciBkZWZhdWx0LAogICAgICAgICMgcGFzcyAwIGluIG9yZGVyIHRvIGFsc28gc2VhcmNoIGZvciBpbnZhbGlkIHVzZXJzCiAgICAgICAgVmFsaWQgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKCiAgICAgICAgIyBzcGVjaWFsIHBhcmFtZXRlcnMKICAgICAgICBDdXN0b21lckNvbXBhbnlTZWFyY2hDdXN0b21lcklEcyA9PiBbICdleGFtcGxlLmNvbScgXSwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRXhjbHVkZVVzZXJMb2dpbnMgICAgICAgICAgICAgICAgPT4gWyAnZXhhbXBsZScsICdkb2Vqb2huJyBdLCAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGFycmF5IHBhcmFtZXRlcnMgYXJlIHVzZWQgd2l0aCBsb2dpY2FsIE9SIG9wZXJhdG9yIChhbGwgdmFsdWVzIGFyZSBwb3NzaWJsZSB3aGljaAogICAgICAgICMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZyBzZWxlY3Rpb24gaGFzaCBmb3IgdGhlIGZpZWxkKQogICAgICAgIFVzZXJDb3VudHJ5ICAgICAgICAgICAgICA9PiBbICdBdXN0cmlhJywgJ0dlcm1hbnknLCBdLCAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBEeW5hbWljRmllbGRzCiAgICAgICAgIyAgIEF0IGxlYXN0IG9uZSBvcGVyYXRvciBtdXN0IGJlIHNwZWNpZmllZC4gT3BlcmF0b3JzIHdpbGwgYmUgY29ubmVjdGVkIHdpdGggQU5ELAogICAgICAgICMgICAgICAgdmFsdWVzIGluIGFuIG9wZXJhdG9yIHdpdGggT1IuCiAgICAgICAgIyAgIFlvdSBjYW4gYWxzbyBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gYW4gb3BlcmF0b3I6IFsndmFsdWUxJywgJ3ZhbHVlMiddCiAgICAgICAgRHluYW1pY0ZpZWxkX0ZpZWxkTmFtZVggPT4gewogICAgICAgICAgICBFcXVhbHMgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIExpa2UgICAgICAgICAgICAgID0+ICd2YWx1ZSonLCAgICAgICAgICAgICAgICAjICJlcXVhbHMiIG9wZXJhdG9yIHdpdGggd2lsZGNhcmQgc3VwcG9ydAogICAgICAgICAgICBHcmVhdGVyVGhhbiAgICAgICA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIEdyZWF0ZXJUaGFuRXF1YWxzID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgU21hbGxlclRoYW4gICAgICAgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgICAgICBTbWFsbGVyVGhhbkVxdWFscyA9PiAnMjAwMi0wMi0wMiAwMjowMjowMicsCiAgICAgICAgfQoKICAgICAgICBPcmRlckJ5ID0+IFsgJ1VzZXJMb2dpbicsICdVc2VyQ3VzdG9tZXJJRCcgXSwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICAgICAgIyBkZWZhdWx0OiBbICdVc2VyTG9naW4nIF0KICAgICAgICAjIChhbGwgZmllbGRzIHdoaWNoIGFyZSBkZWZpbmVkIGluIGEgQ3VzdG9tZXJVc2VyTWFwIGNhbiBiZSB1c2VkIGZvciBvcmRlcmluZykKCiAgICAgICAgIyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBPcmRlckJ5OgogICAgICAgICMgVGhlIE9yZGVyQnlEaXJlY3Rpb24gY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBPcmRlckJ5IGF0dHJpYnV0ZS4KICAgICAgICAjIFRoZSBwYWlyaW5nIGlzIG1hZGUgYnkgdGhlIGFycmF5IGluZGljZXMuCgogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyAnRG93bicsICdVcCcgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgKERvd24gfCBVcCkgRGVmYXVsdDogWyAnRG93bicgXQoKICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJyB8fCAnQ09VTlQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGRlZmF1bHQ6IEFSUkFZLCByZXR1cm5zIGFuIGFycmF5IG9mIGNoYW5nZSBpZHMKICAgICAgICAjIENPVU5UIHJldHVybnMgYSBzY2FsYXIgd2l0aCB0aGUgbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMKCiAgICAgICAgTGltaXQgPT4gMTAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICApOwoKUmV0dXJucyBhIGxpc3Qgb2YgY3VzdG9tZXIgdXNlcnMgd2hlbiAkUmVzdWx0ID0+ICdBUlJBWScgd2FzIHBhc3NlZDoKCiAgICAkQ3VzdG9tZXJVc2VySURzID0gWyAnYWRhbGRyaWRhJywgJ2FkYW1hbnRhJywgJ2FkYWxncmltICcgXTsKICAgICRDdXN0b21lclVzZXJJRHMgPSBbXTsgIyB3aGVuIG5vIGN1c3RvbWVyIHVzZXJzIGhhZCBiZWVuIGZvdW5kCgpSZXR1cm5zIGEgY291bnQgb2YgY3VzdG9tZXIgdXNlcnMgd2hlbiAkUmVzdWx0ID0+ICdDT1VOVCcgd2FzIHBhc3NlZDoKCiAgICAkQ3VzdG9tZXJVc2VySURzID0gMzsKICAgICRDdXN0b21lclVzZXJJRHMgPSAwOyAjIHdoZW4gbm8gY3VzdG9tZXIgdXNlcnMgaGFkIGJlZW4gZm91bmQKCj1jdXQKCnN1YiBDdXN0b21lclNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCBnZW5lcmFsIHNlYXJjaCBmaWVsZHMgKHdpdGhvdXQgYSByZXN0cmljdGlvbiB0byBhIHNvdXJjZSkKICAgIG15IEBBbGxTZWFyY2hGaWVsZHMgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKCk7CgogICAgIyBnZW5lcmF0ZSBhIGhhc2ggd2l0aCB0aGUgY3VzdG9tZXIgdXNlciBzb3VyY2VzIHdoaWNoIG11c3QgYmUgc2VhcmNoZWQKICAgIG15ICVTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgZ2V0IHRoZSBzZWFyY2ggZmllbGRzIGZvciB0aGUgY3VycmVudCBzb3VyY2UKICAgICAgICBteSBAU291cmNlU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcygKICAgICAgICAgICAgU291cmNlID0+ICJDdXN0b21lclVzZXIkQ291bnQiLAogICAgICAgICk7CiAgICAgICAgbXkgJUxvb2t1cFNvdXJjZVNlYXJjaEZpZWxkcyA9IG1hcCB7ICRfLT57TmFtZX0gPT4gMSB9IEBTb3VyY2VTZWFyY2hGaWVsZHM7CgogICAgICAgICMgY2hlY2sgaWYgYWxsIHNlYXJjaCBwYXJhbSBleGlzdHMgaW4gdGhlIHNlYXJjaCBmaWVsZHMgZnJvbSB0aGUgY3VycmVudCBzb3VyY2UKICAgICAgICBTRUFSQ0hGSUVMRDoKICAgICAgICBmb3IgbXkgJFNlYXJjaEZpZWxkIChAQWxsU2VhcmNoRmllbGRzKSB7CgogICAgICAgICAgICBuZXh0IFNFQVJDSEZJRUxEIGlmICEkUGFyYW17ICRTZWFyY2hGaWVsZC0+e05hbWV9IH07CgogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJExvb2t1cFNvdXJjZVNlYXJjaEZpZWxkc3sgJFNlYXJjaEZpZWxkLT57TmFtZX0gfTsKICAgICAgICB9CiAgICAgICAgJFNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXN7IkN1c3RvbWVyVXNlciRDb3VudCJ9ID0gXEBTb3VyY2VTZWFyY2hGaWVsZHM7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciB0aGUgcmV0dXJuIHR5cGUKICAgICRQYXJhbXtSZXN1bHR9IHx8PSAnQVJSQVknOwoKICAgIGlmICggJFBhcmFte1Jlc3VsdH0gZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgbXkgJElEc0NvdW50ID0gMDsKCiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkU291cmNlICggc29ydCBrZXlzICVTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzICkgewogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnskU291cmNlfTsKCiAgICAgICAgICAgIG15ICRTdWJJRHNDb3VudCA9ICRTZWxmLT57JFNvdXJjZX0tPkN1c3RvbWVyU2VhcmNoRGV0YWlsKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgU2VhcmNoRmllbGRzID0+ICRTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzeyRTb3VyY2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRTdWJJRHNDb3VudDsKCiAgICAgICAgICAgICRJRHNDb3VudCArPSAkU3ViSURzQ291bnQgfHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRJRHNDb3VudDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSBASURzOwoKICAgICAgICBteSAkUmVzdWx0Q291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEcyA9ICRTZWxmLT57JFNvdXJjZX0tPkN1c3RvbWVyU2VhcmNoRGV0YWlsKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgU2VhcmNoRmllbGRzID0+ICRTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzeyRTb3VyY2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRTdWJJRHM7CgogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCRTdWJJRHMpOwoKICAgICAgICAgICAgcHVzaCBASURzLCBAeyRTdWJJRHN9OwoKICAgICAgICAgICAgJFJlc3VsdENvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHdlIGhhdmUgbW9yZSB0aGVuIG9uZSBzZWFyY2ggcmVzdWx0cyBmcm9tIGRpZmZyZW50IHNvdXJjZXMsIHdlIG5lZWQgYSByZXNvcnRpbmcKICAgICAgICAjIGJlY2F1c2Ugb2YgdGhlIG1lcmdlZCBzaW5nbGUgcmVzdWx0cwogICAgICAgIGlmICggJFJlc3VsdENvdW50ID4gMSApIHsKCiAgICAgICAgICAgIG15IEBVc2VyRGF0YUxpc3Q7CgogICAgICAgICAgICBmb3IgbXkgJElEIChASURzKSB7CgogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAVXNlckRhdGFMaXN0LCBcJVVzZXJEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT3JkZXJCeSA9ICdVc2VyTG9naW4nOwogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte09yZGVyQnl9ICkgKSB7CiAgICAgICAgICAgICAgICAkT3JkZXJCeSA9ICRQYXJhbXtPcmRlckJ5fS0+WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259ICkgJiYgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bMF0gZXEgJ1VwJyApIHsKICAgICAgICAgICAgICAgIEBVc2VyRGF0YUxpc3QgPSBzb3J0IHsgbGMoICRhLT57JE9yZGVyQnl9ICkgY21wIGxjKCAkYi0+eyRPcmRlckJ5fSApIH0gQFVzZXJEYXRhTGlzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBVc2VyRGF0YUxpc3QgPSBzb3J0IHsgbGMoICRiLT57JE9yZGVyQnl9ICkgY21wIGxjKCAkYS0+eyRPcmRlckJ5fSApIH0gQFVzZXJEYXRhTGlzdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17TGltaXR9ICYmIHNjYWxhciBAVXNlckRhdGFMaXN0ID4gJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAgICAgICAgIHNwbGljZSBAVXNlckRhdGFMaXN0LCAkUGFyYW17TGltaXR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBASURzID0gbWFwIHsgJF8tPntVc2VyTG9naW59IH0gQFVzZXJEYXRhTGlzdDsKICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQ2hlY2sgcGVybWlzc2lvbiBmb3IgZXZlcnkgc2luZ2xlIGN1c3RvbWVyIHVzZXIuCiAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgICAgIG15IEBOZXdJRFMgPSBASURzOwogICAgICAgICAgICBASURzID0gKCk7CgogICAgICAgICAgICBmb3IgbXkgJElEIChATmV3SURTKSB7CiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCVVc2VyRGF0YSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQElEcywgJElEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKPWhlYWQyIEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcygpCgpHZXQgYSBsaXN0IG9mIHRoZSBkZWZpbmVkIHNlYXJjaCBmaWVsZHMgKG9wdGlvbmFsIG9ubHkgdGhlIHJlbGV2YW50IGZpZWxkcyBmb3IgdGhlIGdpdmVuIHNvdXJjZSkuCgogICAgbXkgQFNlYWNoRmllbGRzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKAogICAgICAgIFNvdXJjZSA9PiAnQ3VzdG9tZXJVc2VyJywgIyBvcHRpb25hbCwgYnV0IGltcG9ydGFudCBpbiB0aGUgQ3VzdG9tZXJTZWFyY2hEZXRhaWwgdG8gZ2V0IHRoZSByaWdodCBkYXRhYmFzZSBmaWVsZHMKICAgICk7CgpSZXR1cm5zIGFuIGFycmF5IG9mIGhhc2ggcmVmZXJlbmNlcy4KCiAgICBAU2VhY2hGaWVsZHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdVc2VyRW1haWwnLAogICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICdFbWFpbCcsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0lucHV0JywKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnbWFpbCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdVc2VyQ291bnRyeScsCiAgICAgICAgICAgIExhYmVsICAgICAgICAgID0+ICdDb3VudHJ5JywKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgIFNlbGVjdGlvbnNEYXRhID0+IHsKICAgICAgICAgICAgICAgICdHZXJtYW55JyAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICAgICAgJ1VuaXRlZCBLaW5nZG9tJyA9PiAnVW5pdGVkIEtpbmdkb20nLAogICAgICAgICAgICAgICAgJ1VuaXRlZCBTdGF0ZXMnICA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgfSwKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnY291bnRyeScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF9Ta3lwZUFjY291bnROYW1lJywKICAgICAgICAgICAgTGFiZWwgICAgICAgICA9PiAnJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnU2t5cGVBY2NvdW50TmFtZScsCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBHZXQgdGhlIHNlYXJjaCBmaWVsZHMgZnJvbSBhbGwgY3VzdG9tZXIgdXNlciBtYXBzIChtZXJnZSBmcm9tIGFsbCBtYXBzIHRvZ2V0aGVyKS4KICAgIG15IEBTZWFyY2hGaWVsZHM7CgogICAgbXkgJVNlYXJjaEZpZWxkc0V4aXN0czsKCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICRQYXJhbXtTb3VyY2V9ICYmICRQYXJhbXtTb3VyY2V9IG5lICJDdXN0b21lclVzZXIkQ291bnQiOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewoKICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkTmFtZSA9ICRFbnRyeS0+WzBdOwoKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkU2VhcmNoRmllbGRzRXhpc3RzeyRTZWFyY2hGaWVsZE5hbWV9OwogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRTZWFyY2hGaWVsZE5hbWUgPX4gbXsoUGFzc3dvcmR8UHcpXGQqJH1zbXhpOwoKICAgICAgICAgICAgIyBSZW1lbWJlciB0aGUgYWxyZWFkeSBjb2xsZWN0ZWQgc2VhcmNoIGZpZWxkIG5hbWUuCiAgICAgICAgICAgICRTZWFyY2hGaWVsZHNFeGlzdHN7JFNlYXJjaEZpZWxkTmFtZX0gPSAxOwoKICAgICAgICAgICAgbXkgJUZpZWxkQ29uZmlnID0gJFNlbGYtPkdldEZpZWxkQ29uZmlnKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBTb3VyY2UgICAgPT4gJFBhcmFte1NvdXJjZX0sICAgICAjIHRvIGdldCB0aGUgcmlnaHQgZGF0YWJhc2UgZmllbGQgZm9yIHRoZSBnaXZlbiBzb3VyY2UKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISVGaWVsZENvbmZpZzsKCiAgICAgICAgICAgIG15ICVTZWFyY2hGaWVsZERhdGEgPSAoCiAgICAgICAgICAgICAgICAlRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBOYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkU2VsZi0+R2V0RmllbGRTZWxlY3Rpb25zKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRTZWFyY2hGaWVsZERhdGF7U3RvcmFnZVR5cGV9IGVxICdkeW5hbWljX2ZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gPSAnRHluYW1pY0ZpZWxkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJVNlbGVjdGlvbnNEYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ICAgICAgICAgICA9ICdTZWxlY3Rpb24nOwogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtTZWxlY3Rpb25zRGF0YX0gPSBcJVNlbGVjdGlvbnNEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSA9ICdJbnB1dCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgXCVTZWFyY2hGaWVsZERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAU2VhcmNoRmllbGRzOwp9Cgo9aGVhZDIgR2V0RmllbGRDb25maWcoKQoKVGhpcyBmdW5jdGlvbiBjb2xsZWN0IHNvbWUgZmllbGQgY29uZmlnIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1c3RvbWVyIHVzZXIgbWFwLgoKICAgIG15ICVGaWVsZENvbmZpZyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdldEZpZWxkQ29uZmlnKAogICAgICAgIEZpZWxkTmFtZSA9PiAnVXNlckVtYWlsJywKICAgICAgICBTb3VyY2UgICAgPT4gJ0N1c3RvbWVyVXNlcicsICMgb3B0aW9uYWwKICAgICk7CgpSZXR1cm5zIHNvbWUgZmllbGQgY29uZmlnIGluZm9ybWF0aW9uOgoKICAgIG15ICVGaWVsZENvbmZpZyA9ICgKICAgICAgICBMYWJlbCAgICAgICAgID0+ICdFbWFpbCcsCiAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnZW1haWwnLAogICAgICAgIFN0b3JhZ2VUeXBlICAgPT4gJ3ZhcicsCiAgICApOwoKPWN1dAoKc3ViIEdldEZpZWxkQ29uZmlnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte0ZpZWxkTmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEZpZWxkTmFtZSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAkUGFyYW17U291cmNlfSAmJiAkUGFyYW17U291cmNlfSBuZSAiQ3VzdG9tZXJVc2VyJENvdW50IjsKCiAgICAgICAgIyBTZWFyY2ggdGhlIHJpZ2h0IGZpZWxkIGFuZCByZXR1cm4gc29tZSBjb25maWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmllbGQuCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkUGFyYW17RmllbGROYW1lfSBuZSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG15ICVGaWVsZENvbmZpZyA9ICgKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAkRW50cnktPls1XSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAlRmllbGRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEdldEZpZWxkU2VsZWN0aW9ucygpCgpUaGlzIGZ1bmN0aW9uIGNvbGxlY3QgdGhlIHNlbGVjdGlvbnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLCBpZiB0aGUgZmllbGQgaGFzIHNvbWUgc2VsZWN0aW9ucy4KCiAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZXRGaWVsZFNlbGVjdGlvbnMoCiAgICAgICAgRmllbGROYW1lID0+ICdVc2VyVGl0bGUnLAogICAgKTsKClJldHVybnMgdGhlIHNlbGVjdGlvbnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lIChtZXJnZWQgZnJvbSBhbGwgc291cmNlcykgb3IgYSBlbXB0eSBoYXNoOgoKICAgIG15ICVTZWxlY3Rpb25EYXRhID0gKAogICAgICAgICdNci4nICA9PiAnTXIuJywKICAgICAgICAnTXJzLicgPT4gJ01ycy4nLAogICAgKTsKCj1jdXQKCnN1YiBHZXRGaWVsZFNlbGVjdGlvbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0ZpZWxkTmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEZpZWxkTmFtZSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJVNlbGVjdGlvbnNEYXRhOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1NlbGVjdGlvbnN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH07CgogICAgICAgICVTZWxlY3Rpb25zRGF0YSA9ICgKICAgICAgICAgICAgJVNlbGVjdGlvbnNEYXRhLCAleyAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntTZWxlY3Rpb25zfS0+eyAkUGFyYW17RmllbGROYW1lfSB9IH0KICAgICAgICApOwogICAgfQoKICAgICMgTWFrZSBzdXJlIHRoZSBlbmNvZGluZyBzdGFtcCBpcyBzZXQuCiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU2VsZWN0aW9uc0RhdGEgKSB7CiAgICAgICAgJFNlbGVjdGlvbnNEYXRheyRLZXl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVJbnB1dCggJFNlbGVjdGlvbnNEYXRheyRLZXl9ICk7CiAgICB9CgogICAgIyBEZWZhdWx0IGhhbmRsaW5nIGZvciBmaWVsZCAnVmFsaWRJRCcuCiAgICBpZiAoICElU2VsZWN0aW9uc0RhdGEgJiYgJFBhcmFte0ZpZWxkTmFtZX0gPX4gL15WYWxpZElEL2kgKSB7CiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgfQoKICAgIHJldHVybiAlU2VsZWN0aW9uc0RhdGE7Cn0KCj1oZWFkMiBDdXN0b21lcklETGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIHdpdGggYWxsIGtub3duIHVuaXF1ZSBDdXN0b21lcklEcyBvZiB0aGUgcmVnaXN0ZXJlZCBjdXN0b21lcnMgdXNlcnMgKG5vIFNlYXJjaFRlcm0pLApvciBhIGZpbHRlcmVkIGxpc3Qgd2hlcmUgdGhlIEN1c3RvbWVySURzIG11c3QgY29udGFpbiBhIHNlYXJjaCB0ZXJtLgoKICAgIG15IEBDdXN0b21lcklEcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVySURMaXN0KAogICAgICAgIFNlYXJjaFRlcm0gID0+ICdzb21lY3VzdG9tZXInLCAgICAjIG9wdGlvbmFsCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJJRExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBARGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIGdldCBjdXN0b21lciBsaXN0IHJlc3VsdCBvZiBiYWNrZW5kIGFuZCBtZXJnZSBpdAogICAgICAgIHB1c2ggQERhdGEsICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lcklETGlzdCglUGFyYW0pOwogICAgfQoKICAgICMgbWFrZSBlbnRyaWVzIHVuaXF1ZQogICAgbXkgJVRtcDsKICAgIEBUbXB7QERhdGF9ID0gdW5kZWY7CiAgICBARGF0YSA9IHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVUbXA7CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBEb24ndCByZXR1cm4gY3VzdG9tZXIgSURzIGlmIHRoZSBhZ2VudCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldy4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIG15IEBDbGVhbmVkQ3VzdG9tZXJJRHM7CgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIEBEYXRhICkgewogICAgICAgICAgICBteSAlQ29tcGFueSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJUNvbXBhbnkgJiYgJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBDbGVhbmVkQ3VzdG9tZXJJRHMsICRDdXN0b21lcklEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBARGF0YSA9IEBDbGVhbmVkQ3VzdG9tZXJJRHM7CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gQERhdGE7Cn0KCj1oZWFkMiBDdXN0b21lck5hbWUoKQoKZ2V0IGN1c3RvbWVyIHVzZXIgbmFtZQoKICAgIG15ICROYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKAogICAgICAgIFVzZXJMb2dpbiA9PiAnc29tZS1sb2dpbicsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyTmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIEdldCBjdXN0b21lciBuYW1lIGFuZCByZXR1cm4gaXQuCiAgICAgICAgbXkgJE5hbWUgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJOYW1lKCVQYXJhbSk7CiAgICAgICAgaWYgKCROYW1lKSB7CiAgICAgICAgICAgIHJldHVybiAkTmFtZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCj1oZWFkMiBDdXN0b21lcklEcygpCgpnZXQgY3VzdG9tZXIgdXNlciBjdXN0b21lciBpZHMKCiAgICBteSBAQ3VzdG9tZXJJRHMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lcklEcygKICAgICAgICBVc2VyID0+ICdzb21lLWxvZ2luJywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJJRHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjdXN0b21lciBpZHMgKHN0b3AgYWZ0ZXIgZmlyc3Qgc291cmNlIHdpdGggcmVzdWx0cykKICAgIG15IEBDdXN0b21lcklEczsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIGdldCBjdXN0b21lciBpZHMgZnJvbSBzb3VyY2UKICAgICAgICBteSBAU291cmNlQ3VzdG9tZXJJRHMgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJJRHMoJVBhcmFtKTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhQFNvdXJjZUN1c3RvbWVySURzOwoKICAgICAgICBAQ3VzdG9tZXJJRHMgPSBAU291cmNlQ3VzdG9tZXJJRHM7CiAgICAgICAgbGFzdCBTT1VSQ0U7CiAgICB9CgogICAgIyBjcmVhdGUgaGFzaCB3aXRoIGV4aXN0aW5nIGN1c3RvbWVyIGlkcwogICAgbXkgJUN1c3RvbWVySURzID0gbWFwIHsgJF8gPT4gMSB9IEBDdXN0b21lcklEczsKCiAgICAjIGdldCByZWxhdGVkIGN1c3RvbWVyIGlkcwogICAgbXkgQFJlbGF0ZWRDdXN0b21lcklEcyA9ICRTZWxmLT5DdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3QoCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte1VzZXJ9LAogICAgKTsKCiAgICAjIGFkZCByZWxhdGVkIGN1c3RvbWVyIGlkcyBpZiBub3QgZm91bmQgaW4gc291cmNlCiAgICBSRUxBVEVEQ1VTVE9NRVJJRDoKICAgIGZvciBteSAkUmVsYXRlZEN1c3RvbWVySUQgKEBSZWxhdGVkQ3VzdG9tZXJJRHMpIHsKICAgICAgICBuZXh0IFJFTEFURURDVVNUT01FUklEIGlmICRDdXN0b21lcklEc3skUmVsYXRlZEN1c3RvbWVySUR9OwoKICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJFJlbGF0ZWRDdXN0b21lcklEOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgRG9uJ3QgcmV0dXJuIGN1c3RvbWVyIElEcyBpZiB0aGUgYWdlbnQgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBteSBAQ2xlYW5lZEN1c3RvbWVySURzOwoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVySUQgKCBAQ3VzdG9tZXJJRHMgKSB7CiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAlQ29tcGFueSAmJiAkQ29tcGFueXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQENsZWFuZWRDdXN0b21lcklEcywgJEN1c3RvbWVySUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEBDdXN0b21lcklEcyA9IEBDbGVhbmVkQ3VzdG9tZXJJRHM7CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIHJldHVybiBjdXN0b21lciBpZHMKICAgIHJldHVybiBAQ3VzdG9tZXJJRHM7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJEYXRhR2V0KCkKCmdldCB1c2VyIGRhdGEgKFVzZXJMb2dpbiwgVXNlckZpcnN0bmFtZSwgVXNlckxhc3RuYW1lLCBVc2VyRW1haWwsIC4uLikKCiAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAnZnJhbnonLAogICAgKTsKCldoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGJhY2tlbmRzIHRoZW4gb25seSB0aGUgZGF0YSBmcm9tIHRoZSBmaXJzdCBiYWNrZW5kIHdoZXJlIHRoZSBjdXN0b21lciB1c2VyIGlzIGZvdW5kLgpBbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkIHdoZW4gdGhlIGN1c3RvbWVyIHVzZXIgd2FzJ3QgZm91bmQgaW4gYW55IGJhY2tlbmQuCgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiB1bmxlc3MgJFBhcmFte1VzZXJ9OwoKICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9ucyBmb3IgQ3VzdG9tZXJVc2VyLgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgIyBHZXQgbmVlZGVkIG9iamVjdHMuCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICBteSAlQ3VzdG9tZXIgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJVc2VyRGF0YUdldCglUGFyYW0pOwogICAgICAgIG5leHQgU09VUkNFIGlmICElQ3VzdG9tZXI7CgogICAgICAgICMgZ2VuZXJhdGUgdGhlIGZ1bGwgbmFtZSBhbmQgc2F2ZSBpdCBpbiB0aGUgaGFzaAogICAgICAgIG15ICRVc2VyRnVsbG5hbWUgPSAkU2VsZi0+Q3VzdG9tZXJOYW1lKCVDdXN0b21lcik7CgogICAgICAgICMgc2F2ZSB0aGUgZ2VuZXJhdGVkIGZ1bGxuYW1lIGluIHRoZSBoYXNoLgogICAgICAgICRDdXN0b21lcntVc2VyRnVsbG5hbWV9ID0gJFVzZXJGdWxsbmFtZTsKCiAgICAgICAgIyBhZGQgcHJlZmVyZW5jZXMgZGVmYXVsdHMKICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJyk7CiAgICAgICAgaWYgKCRDb25maWcpIHsKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRDb25maWd9ICkgewoKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRDb25maWctPnskS2V5fS0+e0RhdGFTZWxlY3RlZH07CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiBkZWZpbmVkICRDdXN0b21lcnsgJENvbmZpZy0+eyRLZXl9LT57UHJlZktleX0gfTsKCiAgICAgICAgICAgICAgICAjIHNldCBkZWZhdWx0IGRhdGEKICAgICAgICAgICAgICAgICRDdXN0b21lcnsgJENvbmZpZy0+eyRLZXl9LT57UHJlZktleX0gfSA9ICRDb25maWctPnskS2V5fS0+e0RhdGFTZWxlY3RlZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgY3VzdG9tZXIgY29tcGFueSBzdXBwb3J0IGlzIGVuYWJsZWQgYW5kIGdldCBjb21wYW55IGRhdGEKICAgICAgICBteSAlQ29tcGFueTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55IikKICAgICAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICVDb21wYW55ID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJ7VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvbXBhbnl7Q3VzdG9tZXJDb21wYW55VmFsaWRJRH0gPSAkQ29tcGFueXtWYWxpZElEfTsKICAgICAgICB9CgogICAgICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSApICkgewogICAgICAgICAgICBDVVNUT01FUlVTRVJGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJGaWVsZCAoIEB7ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSRklFTEQgaWYgJEN1c3RvbWVyVXNlckZpZWxkLT5bNV0gbmUgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJGSUVMRCBpZiAhJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyVXNlckZpZWxkLT5bMl0gfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRMb29rdXB7ICRDdXN0b21lclVzZXJGaWVsZC0+WzJdIH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDdXN0b21lcntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJ7ICRDdXN0b21lclVzZXJGaWVsZC0+WzBdIH0gPSAkVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQ2hlY2sgcGVybWlzc2lvbi4KICAgICAgICBpZiAoICRDdXN0b21lcntVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwoKICAgICAgICAgICAgIyBSZXBsYWNlIHRoZSByZW1vdGUgZ3JvdXAgd2l0aCB0aGUgYXNzb2NpYXRlZCBsb2NhbCBncm91cC4KICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVye1VzZXJHcm91cElEfSBlcSAkUmVtb3RlR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lcntVc2VyR3JvdXBJRH0gPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIGlmIGdyb3VwIElEIG9yIGdyb3VwIG5hbWVzIHNob3VsZCBiZSBtYXRjaGVkLgogICAgICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcntVc2VyR3JvdXBJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJEN1c3RvbWVye1VzZXJHcm91cElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgaWYgYW55IGxpbWl0cyBhcmUgc2V0LgogICAgICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSAmJiAhZ3JlcCB7IC9eJEN1c3RvbWVye1VzZXJHcm91cElEfSQvIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH0gKSB7CiAgICAgICAgICAgICAgICAjIFRoZSB1c2VyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoaXMgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBJZiB0aGVyZSBhcmUgbm8gZ3JvdXAgc2V0dGluZ3MsIGNoZWNrIGlmIHBlcm1pc3Npb24gb24gY3VzdG9tZXIgY29tcGFueSBpcyBwZXJtaXR0ZWQuCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gJiYgISRDdXN0b21lcntVc2VyR3JvdXBJRH0gJiYgKCAhJUNvbXBhbnkgfHwgISRDb21wYW55e0N1c3RvbWVySUR9ICkgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAgICAgIyByZXR1cm4gY3VzdG9tZXIgZGF0YQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICVDb21wYW55LAogICAgICAgICAgICAlQ3VzdG9tZXIsCiAgICAgICAgICAgIFNvdXJjZSAgICAgICAgPT4gIkN1c3RvbWVyVXNlciRDb3VudCIsCiAgICAgICAgICAgIENvbmZpZyAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKSwKICAgICAgICAgICAgQ29tcGFueUNvbmZpZyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoICRDb21wYW55e1NvdXJjZX0gLy8gJ0N1c3RvbWVyQ29tcGFueScgKSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckFkZCgpCgp0byBhZGQgbmV3IGN1c3RvbWVyIHVzZXJzCgogICAgbXkgJFVzZXJMb2dpbiA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICBTb3VyY2UgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyJywgIyBDdXN0b21lclVzZXIgc291cmNlIGNvbmZpZwogICAgICAgIFVzZXJGaXJzdG5hbWUgID0+ICdNYW5mcmVkJywKICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnSHViZXInLAogICAgICAgIFVzZXJDdXN0b21lcklEID0+ICdBMTI0JywKICAgICAgICBVc2VyTG9naW4gICAgICA9PiAnbWh1YmVyJywKICAgICAgICBVc2VyUGFzc3dvcmQgICA9PiAnc29tZS1wYXNzJywgIyBub3QgcmVxdWlyZWQKICAgICAgICBVc2VyRW1haWwgICAgICA9PiAnbWFuZnJlZC5odWJlckBleGFtcGxlLmNvbScsCiAgICAgICAgVmFsaWRJRCAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZGF0YSBzb3VyY2UKICAgIGlmICggISRQYXJhbXtTb3VyY2V9ICkgewogICAgICAgICRQYXJhbXtTb3VyY2V9ID0gJ0N1c3RvbWVyVXNlcic7CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CiAgICAgICAgaWYgKCVVc2VyKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCAnQ3VzdG9tZXIgdXNlciAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRQYXJhbXtVc2VyTG9naW59ICksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhZGQgdGhlIFVzZXJHcm91cElELgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgZGVsZXRlICRQYXJhbXtVc2VyR3JvdXBJRH07CiAgICB9CgogICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57JFBhcmFte1NvdXJjZX19LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgIyBDaGVjayBpZiBncm91cCBJRCBvciBncm91cCBuYW1lcyBzaG91bGQgYmUgbWF0Y2hlZC4KICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJFBhcmFte1VzZXJHcm91cElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkR3JvdXBOYW1lOwogICAgICAgIH0KCiAgICAgICAgIyBSZXBsYWNlIHRoZSBsb2NhbCBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIHJlbW90ZSBncm91cC4KICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSBlcSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VXNlckdyb3VwSUR9ID0gJFJlbW90ZUdyb3VwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgIyBzdG9yZSBjdXN0b21lciB1c2VyIGRhdGEKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+eyAkUGFyYW17U291cmNlfSB9LT5DdXN0b21lclVzZXJBZGQoJVBhcmFtKTsKICAgIHJldHVybiBpZiAhJFJlc3VsdDsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0N1c3RvbWVyVXNlckFkZCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgIE5ld0RhdGEgICA9PiBcJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKCn0KCj1oZWFkMiBDdXN0b21lclVzZXJVcGRhdGUoKQoKdG8gdXBkYXRlIGN1c3RvbWVyIHVzZXJzCgogICAgJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyVXBkYXRlKAogICAgICAgIFNvdXJjZSAgICAgICAgPT4gJ0N1c3RvbWVyVXNlcicsICMgQ3VzdG9tZXJVc2VyIHNvdXJjZSBjb25maWcKICAgICAgICBJRCAgICAgICAgICAgID0+ICdtaCcgICAgICAgICAgICAjIGN1cnJlbnQgdXNlciBsb2dpbgogICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ21odWJlcicsICAgICAgICMgbmV3IHVzZXIgbG9naW4KICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdIdWJlcicsCiAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnTWFuZnJlZCcsCiAgICAgICAgVXNlclBhc3N3b3JkICA9PiAnc29tZS1wYXNzJywgICAgIyBub3QgcmVxdWlyZWQKICAgICAgICBVc2VyRW1haWwgICAgID0+ICdlbWFpbEBleGFtcGxlLmNvbScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJMb2dpbiEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBmb3IgVXNlckxvZ2luLXJlbmFtaW5nIGFuZCBpZiBuZXcgVXNlckxvZ2luIGFscmVhZHkgZXhpc3RzLi4uCiAgICBpZiAoICRQYXJhbXtJRH0gJiYgKCBsYyAkUGFyYW17VXNlckxvZ2lufSBuZSBsYyAkUGFyYW17SUR9ICkgKSB7CiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSApOwogICAgICAgIGlmICglVXNlcikgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSggJ0N1c3RvbWVyIHVzZXIgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkUGFyYW17VXNlckxvZ2lufSApLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte0lEfSB8fCAkUGFyYW17VXNlckxvZ2lufSApOwogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIHVzZXIgJyRQYXJhbXtVc2VyTG9naW59JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBVc2VyR3JvdXBJRC4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICMgU2V0IHRoZSBVc2VyR3JvdXBJRCB0byB0aGUgY3VycmVudCBVc2VyR3JvdXBJRC4KICAgICAgICBpZiAoICRVc2Vye1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRVc2Vye1VzZXJHcm91cElEfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57JFVzZXJ7U291cmNlfX0tPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSApIHsKICAgICAgICAjIENoZWNrIGlmIGdyb3VwIElEIG9yIGdyb3VwIG5hbWVzIHNob3VsZCBiZSBtYXRjaGVkLgogICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICBteSAkR3JvdXBOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkUGFyYW17VXNlckdyb3VwSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRHcm91cE5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VXNlckdyb3VwSUR9IGVxICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH17JFJlbW90ZUdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5DdXN0b21lclVzZXJVcGRhdGUoJVBhcmFtKTsKICAgIHJldHVybiBpZiAhJFJlc3VsdDsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0N1c3RvbWVyVXNlclVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte0lEfSB8fCAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgTmV3RGF0YSAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIE9sZERhdGEgICA9PiBcJVVzZXIsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aGVhZDIgU2V0UGFzc3dvcmQoKQoKdG8gc2V0IGN1c3RvbWVyIHVzZXJzIHBhc3N3b3JkcwoKICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFBhc3N3b3JkKAogICAgICAgIFVzZXJMb2dpbiA9PiAnc29tZS1sb2dpbicsCiAgICAgICAgUFcgICAgICAgID0+ICdzb21lLW5ldy1wYXNzd29yZCcKICAgICk7Cgo9Y3V0CgpzdWIgU2V0UGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdVc2VyIFVzZXJMb2dpbiEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSApOwogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIHVzZXIgJyRQYXJhbXtVc2VyTG9naW59JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+U2V0UGFzc3dvcmQoJVBhcmFtKTsKfQoKPWhlYWQyIEdlbmVyYXRlUmFuZG9tUGFzc3dvcmQoKQoKZ2VuZXJhdGUgYSByYW5kb20gcGFzc3dvcmQKCiAgICBteSAkUGFzc3dvcmQgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKCk7CgogICAgb3IKCiAgICBteSAkUGFzc3dvcmQgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKAogICAgICAgIFNpemUgPT4gMTYsCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyYXRlUmFuZG9tUGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntDdXN0b21lclVzZXJ9LT5HZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKCVQYXJhbSk7Cn0KCj1oZWFkMiBTZXRQcmVmZXJlbmNlcygpCgpzZXQgY3VzdG9tZXIgdXNlciBwcmVmZXJlbmNlcwoKICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlckNvbW1lbnQnLAogICAgICAgIFZhbHVlICA9PiAnc29tZSBjb21tZW50JywKICAgICAgICBVc2VySUQgPT4gJ3NvbWUtbG9naW4nLAogICAgKTsKCj1jdXQKCnN1YiBTZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIERvbid0IGFsbG93IG92ZXJ3cml0aW5nIG9mIG5hdGl2ZSB1c2VyIGRhdGEuCiAgICBteSAlQmxhY2tsaXN0ZWQgPSAoCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICBVc2VyTG9naW4gICAgICA9PiAxLAogICAgICAgIFVzZXJQYXNzd29yZCAgID0+IDEsCiAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gMSwKICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAxLAogICAgICAgIFVzZXJGdWxsbmFtZSAgID0+IDEsCiAgICAgICAgVXNlclN0cmVldCAgICAgPT4gMSwKICAgICAgICBVc2VyQ2l0eSAgICAgICA9PiAxLAogICAgICAgIFVzZXJaaXAgICAgICAgID0+IDEsCiAgICAgICAgVXNlckNvdW50cnkgICAgPT4gMSwKICAgICAgICBVc2VyQ29tbWVudCAgICA9PiAxLAogICAgICAgIFVzZXJDdXN0b21lcklEID0+IDEsCiAgICAgICAgVXNlclRpdGxlICAgICAgPT4gMSwKICAgICAgICBVc2VyRW1haWwgICAgICA9PiAxLAogICAgICAgIENoYW5nZVRpbWUgICAgID0+IDEsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gMSwKICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAxLAogICAgICAgIENyZWF0ZUJ5ICAgICAgID0+IDEsCiAgICAgICAgVXNlclBob25lICAgICAgPT4gMSwKICAgICAgICBVc2VyTW9iaWxlICAgICA9PiAxLAogICAgICAgIFVzZXJGYXggICAgICAgID0+IDEsCiAgICAgICAgVXNlck1haWxTdHJpbmcgPT4gMSwKICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAkQmxhY2tsaXN0ZWR7ICRQYXJhbXtLZXl9IH07CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlcklEfSApOwogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIHVzZXIgJyRQYXJhbXtVc2VySUR9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FsbCBuZXcgYXBpICgyLjQuOCBhbmQgaGlnaGVyKQogICAgaWYgKCAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPmNhbignU2V0UHJlZmVyZW5jZXMnKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5TZXRQcmVmZXJlbmNlcyglUGFyYW0pOwogICAgfQoKICAgICMgY2FsbCBvbGQgYXBpCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCj1oZWFkMiBHZXRQcmVmZXJlbmNlcygpCgpnZXQgY3VzdG9tZXIgdXNlciBwcmVmZXJlbmNlcwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAnc29tZS1sb2dpbicsCiAgICApOwoKPWN1dAoKc3ViIEdldFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlcklEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhbGwgbmV3IGFwaSAoMi40LjggYW5kIGhpZ2hlcikKICAgIGlmICggJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5jYW4oJ0dldFByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+R2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKICAgIH0KCiAgICAjIGNhbGwgb2xkIGFwaQogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9Cgo9aGVhZDIgU2VhcmNoUHJlZmVyZW5jZXMoKQoKc2VhcmNoIGluIHVzZXIgcHJlZmVyZW5jZXMKCiAgICBteSAlVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZWFyY2hQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICA9PiAnVXNlclNvbWVLZXknLAogICAgICAgIFZhbHVlID0+ICdTb21lVmFsdWUnLCAgICMgb3B0aW9uYWwsIGxpbWl0IHRvIGEgY2VydGFpbiB2YWx1ZS9wYXR0ZXJuCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGE7CiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgc2VhcmNoIHJlc3VsdCBvZiBiYWNrZW5kIGFuZCBtZXJnZSBpdAogICAgICAgICMgY2FsbCBuZXcgYXBpICgyLjQuOCBhbmQgaGlnaGVyKQogICAgICAgIG15ICVTdWJEYXRhOwogICAgICAgIGlmICggJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPmNhbignU2VhcmNoUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+U2VhcmNoUHJlZmVyZW5jZXMoJVBhcmFtKTsKICAgICAgICB9CgogICAgICAgICMgY2FsbCBvbGQgYXBpCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVTdWJEYXRhID0gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlYXJjaFByZWZlcmVuY2VzKCVQYXJhbSk7CiAgICAgICAgfQogICAgICAgICVEYXRhID0gKCAlU3ViRGF0YSwgJURhdGEgKTsKICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBUb2tlbkdlbmVyYXRlKCkKCmdlbmVyYXRlIGEgcmFuZG9tIHRva2VuCgogICAgbXkgJFRva2VuID0gJEN1c3RvbWVyVXNlck9iamVjdC0+VG9rZW5HZW5lcmF0ZSgKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBUb2tlbkdlbmVyYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRUb2tlbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgIExlbmd0aCA9PiAxNCwKICAgICk7CgogICAgIyBzYXZlIHRva2VuIGluIHByZWZlcmVuY2VzCiAgICAkU2VsZi0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgS2V5ICAgID0+ICdVc2VyVG9rZW4nLAogICAgICAgIFZhbHVlICA9PiAkVG9rZW4sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFRva2VuOwp9Cgo9aGVhZDIgVG9rZW5DaGVjaygpCgpjaGVjayBwYXNzd29yZCB0b2tlbgoKICAgIG15ICRWYWxpZCA9ICRDdXN0b21lclVzZXJPYmplY3Q+VG9rZW5DaGVjaygKICAgICAgICBUb2tlbiAgPT4gJFRva2VuLAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFRva2VuQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1Rva2VufSB8fCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFRva2VuIGFuZCBVc2VySUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHByZWZlcmVuY2VzIHRva2VuCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHJlcXVlc3RlZCB2cy4gc3RvcmVkIHRva2VuCiAgICByZXR1cm4gaWYgISRQcmVmZXJlbmNlc3tVc2VyVG9rZW59OwogICAgcmV0dXJuIGlmICRQcmVmZXJlbmNlc3tVc2VyVG9rZW59IG5lICRQYXJhbXtUb2tlbn07CgogICAgIyByZXNldCBwYXNzd29yZCB0b2tlbgogICAgJFNlbGYtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlclRva2VuJywKICAgICAgICBWYWx1ZSAgPT4gJycsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckNhY2hlQ2xlYXIoKQoKY2xlYXIgY2FjaGUgb2YgY3VzdG9tZXIgdXNlciBkYXRhCgogICAgJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ2FjaGVDbGVhcigKICAgICAgICBVc2VyTG9naW4gPT4gJ21odWJlcicsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlckNhY2hlQ2xlYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKICAgICAgICAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJBZGQoKQoKdG8gYWRkIGEgY3VzdG9tZXIgdXNlciB0byBhIGN1c3RvbWVyCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJDdXN0b21lck1lbWJlckFkZCgKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAxMjMsCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gMTIzLAogICAgICAgIEFjdGl2ZSAgICAgICAgID0+IDEsICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDdXN0b21lclVzZXJJRCBDdXN0b21lcklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgYWZmZWN0ZWQgY2FjaGVzCiAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdDo6JzsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXkgLiAnQ3VzdG9tZXJVc2VySUQ6OicgLiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9LAogICAgKTsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXkgLiAnQ3VzdG9tZXJJRDo6JyAuICRQYXJhbXtDdXN0b21lcklEfSwKICAgICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyByZWxhdGlvbgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY3VzdG9tZXJfdXNlcl9jdXN0b21lcgogICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICBBTkQgY3VzdG9tZXJfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJJRH0sIFwkUGFyYW17Q3VzdG9tZXJJRH0gXSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgcmVsYXRpb24gaXMgbm90IGFjdGl2ZQogICAgcmV0dXJuIDEgaWYgISRQYXJhbXtBY3RpdmV9OwoKICAgICMgaW5zZXJ0IG5ldyByZWxhdGlvbgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIGN1c3RvbWVyX3VzZXJfY3VzdG9tZXIgKHVzZXJfaWQsIGN1c3RvbWVyX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LAogICAgICAgICAgICBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KQogICAgICAgICAgICBWQUxVRVMgKD8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVyVXNlcklEfSwgXCRQYXJhbXtDdXN0b21lcklEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0KCkKCmdldCByZWxhdGVkIGN1c3RvbWVyIElEcyBvZiBhIGN1c3RvbWVyIHVzZXIKCiAgICBteSBAQ3VzdG9tZXJJRHMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3QoCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CiAgICBAQ3VzdG9tZXJJRHMgPSAoCiAgICAgICAgJzEyMycsCiAgICAgICAgJzQ1NicsCiAgICApOwoKZ2V0IHJlbGF0ZWQgY3VzdG9tZXIgdXNlcnMgb2YgYSBjdXN0b21lciBJRAoKICAgIG15IEBDdXN0b21lclVzZXJzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0KAogICAgICAgIEN1c3RvbWVySUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CiAgICBAQ3VzdG9tZXJVc2VycyA9ICgKICAgICAgICAnMTIzJywKICAgICAgICAnNDU2JywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0dvdCBubyBDdXN0b21lclVzZXJJRCBvciBDdXN0b21lcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3Q6Oic7CgogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHByZXNlbnQgKGluIGNhY2hlKQogICAgICAgICRDYWNoZUtleSAuPSAnQ3VzdG9tZXJVc2VySUQ6OicgLiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiBAeyRDYWNoZX0gaWYgJENhY2hlOwoKICAgICAgICAjIGdldCBjdXN0b21lciBpZHMKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+CiAgICAgICAgICAgICAgICAnU0VMRUNUIGN1c3RvbWVyX2lkCiAgICAgICAgICAgICAgICBGUk9NIGN1c3RvbWVyX3VzZXJfY3VzdG9tZXIKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICBPUkRFUiBCWSBjdXN0b21lcl9pZCcsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVyVXNlcklEfSwgXSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSBAQ3VzdG9tZXJJRHM7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcQEN1c3RvbWVySURzLAoKICAgICAgICApOwoKICAgICAgICByZXR1cm4gQEN1c3RvbWVySURzOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcHJlc2VudCAoaW4gY2FjaGUpCiAgICAgICAgJENhY2hlS2V5IC49ICdDdXN0b21lcklEOjonIC4gJFBhcmFte0N1c3RvbWVySUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiBAeyRDYWNoZX0gaWYgJENhY2hlOwoKICAgICAgICAjIGdldCBjdXN0b21lciB1c2VycwogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4KICAgICAgICAgICAgICAgICdTRUxFQ1QgdXNlcl9pZAogICAgICAgICAgICAgICAgRlJPTSBjdXN0b21lcl91c2VyX2N1c3RvbWVyIFdIRVJFCiAgICAgICAgICAgICAgICBjdXN0b21lcl9pZCA9ID8KICAgICAgICAgICAgICAgIE9SREVSIEJZIHVzZXJfaWQnLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lcklEfSwgXSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSBAQ3VzdG9tZXJVc2VySURzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBwdXNoIEBDdXN0b21lclVzZXJJRHMsICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFxAQ3VzdG9tZXJVc2VySURzLAogICAgICAgICk7CgogICAgICAgIHJldHVybiBAQ3VzdG9tZXJVc2VySURzOwogICAgfQp9Cgo9aGVhZDIgRGVsZXRlT25lUHJlZmVyZW5jZSgpCgpnZXQgY3VzdG9tZXIgdXNlciBwcmVmZXJlbmNlcwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkRlbGV0ZU9uZVByZWZlcmVuY2UoCiAgICAgICAgVXNlcklEID0+ICdzb21lLWxvZ2luJywKICAgICAgICBLZXkgICAgPT4gJ1ByZWZlcmVuY2VLZXknLAogICAgKTsKCj1jdXQKCnN1YiBEZWxldGVPbmVQcmVmZXJlbmNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlcklEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhbGwgbmV3IGFwaSAoMi40LjggYW5kIGhpZ2hlcikKICAgIGlmICggJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5jYW4oJ0RlbGV0ZU9uZVByZWZlcmVuY2UnKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5EZWxldGVPbmVQcmVmZXJlbmNlKCVQYXJhbSk7CiAgICB9CgogICAgIyBjYWxsIG9sZCBhcGkKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+RGVsZXRlT25lUHJlZmVyZW5jZSglUGFyYW0pOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZXhlY3V0ZSBhbGwgdHJhbnNhY3Rpb24gZXZlbnRzCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyVHJhbnNhY3Rpb24oKTsKCiAgICByZXR1cm4gMTsKfQoKMTsK</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>