<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>ITSMConfigItemMultitenancy</Name>
    <Version>11.0.2</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-04-24 12:42:48" Version="11.0.2">Update to CMDB 11.0.14.</ChangeLog>
    <ChangeLog Date="2025-08-22 11:52:26" Version="11.0.1">Initial Release.</ChangeLog>
    <Description Lang="en">The OTOBO ITSM CMDB Package enhanced with group permissions at config item level.</Description>
    <Framework>11.0.x</Framework>
    <IntroInstall Lang="en" Title="Convert legacy reference fields" Type="post">

        &lt;br/&gt;
        If you are using Elasticsearch, please execute the console command &quot;bin/otobo.Console.pl Maint::Elasticsearch::Migration --target i&quot;&lt;br/&gt;

    </IntroInstall>
    <PackageRequired Version="11.0.1">ITSMConfigurationManagement</PackageRequired>
    <BuildCommitID>95bf08c974440b5821871c08814dc30d54560749</BuildCommitID>
    <BuildDate>2026-04-24 12:42:51</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/GenericInterface/Operation/ConfigItem/ConfigItemUpsert.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvR2VuZXJpY0ludGVyZmFjZS9PcGVyYXRpb24vQ29uZmlnSXRlbS9Db25maWdJdGVtVXBzZXJ0LnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1VcHNlcnQ7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbW1vbik7CgojIGNvcmUgbW9kdWxlcwp1c2UgTGlzdDo6VXRpbCAgIHF3KHBhaXJzKTsKdXNlIFNjYWxhcjo6VXRpbCBxdyhyZWZ0eXBlKTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtVXBzZXJ0IC0gR2VuZXJpY0ludGVyZmFjZSBDb25maWd1cmF0aW9uIEl0ZW0gQWRkIGFuZCBVcGRhdGUgT3BlcmF0aW9uIGJhY2tlbmQKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCnVzdWFsbHksIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzCmJ5IHVzaW5nIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uLT5uZXcoKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkIChxdyggT3BlcmF0aW9uIERlYnVnZ2VyT2JqZWN0IFdlYnNlcnZpY2VJRCApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICRTZWxmLT57T3BlcmF0aW9uTmFtZX0gPSAnQ29uZmlnSXRlbVVwc2VydCc7CgogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OiRTZWxmLT57T3BlcmF0aW9uTmFtZX0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKcGVyZm9ybSBDb25maWdJdGVtVXBzZXJ0IE9wZXJhdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBhYmxlIHRvIGFjY2VwdApvbmUgb3IgbW9yZSBDb25maWdJdGVtIGVudHJpZXMgaW4gb25lIGNhbGwuCgogICAgbXkgJFJlc3VsdCA9ICRPcGVyYXRpb25PYmplY3QtPlJ1bigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luICA9PiAnc29tZSBhZ2VudCBsb2dpbicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlckxvZ2luIG9yIFNlc3Npb25JRCBpcwogICAgICAgICAgICBTZXNzaW9uSUQgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHJlcXVpcmVkCiAgICAgICAgICAgIFBhc3N3b3JkICAgPT4gJ3NvbWUgcGFzc3dvcmQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIFVzZXJMb2dpbiBpcyBzZW50IHRoZW4gUGFzc3dvcmQgaXMgcmVxdWlyZWQKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiBbICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVxdWlyZWQKICAgICAgICAgICAgICAgIHsgLi4uIH0sCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICApOwoKICAgICRSZXN1bHQgPSB7CiAgICAgICAgU3VjY2VzcyAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAgb3IgMQogICAgICAgIEVycm9yTWVzc2FnZSA9PiAnJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbiBjYXNlIG9mIGFuIGVycm9yCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICAgID0+ICcyMDEwMTAyNzAwMDAwMScsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgID0+IDEyMywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIyAuIC4gLgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPkluaXQoCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICk7CgogICAgaWYgKCAhJFJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICdXZWJzZXJ2aWNlLkludmFsaWRDb25maWd1cmF0aW9uJywKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRSZXN1bHQtPntFcnJvck1lc3NhZ2V9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgKCRVc2VySUQpID0gJFNlbGYtPkF1dGgoCiAgICAgICAgJVBhcmFtCiAgICApOwoKICAgIGlmICggISRVc2VySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkF1dGhGYWlsIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBBdXRob3JpemF0aW9uIGZhaWxpbmchIiwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17RGF0YX0tPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogJE5lZWRlZCBwYXJhbWV0ZXIgaXMgbWlzc2luZyEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG9wdGlvbmFsIGFycmF5L2hhc2hlcwogICAgZm9yIG15ICRPcHRpb25hbCAocXcoRHluYW1pY0ZpZWxkIEF0dGFjaG1lbnQpKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtEYXRhfS0+eyRPcHRpb25hbH0KICAgICAgICAgICAgJiYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPnskT3B0aW9uYWx9ICkKICAgICAgICAgICAgJiYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57JE9wdGlvbmFsfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06ICRPcHRpb25hbCBwYXJhbWV0ZXIgaXMgbWlzc2luZyBvciBub3QgdmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiAgICBteSAkSXRlbUdyb3VwTW9kZTsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKICAgICMgdHJhbnNmb3JtIHNpbmdsZSBDSXMgdG8gYW4gYXJyYXkgcmVmZXJlbmNlCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfXtDb25maWdJdGVtfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfXtDb25maWdJdGVtfSA9IFsgJFBhcmFte0RhdGF9e0NvbmZpZ0l0ZW19IF07CiAgICB9CgogICAgZm9yIG15ICRSZW1vdGVDSURhdGEgKCBAeyAkUGFyYW17RGF0YX17Q29uZmlnSXRlbX0gfSApIHsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUmVtb3RlQ0lEYXRhKSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5Xcm9uZ1N0cnVjdHVyZSIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFN0cnVjdHVyZSBmb3IgQ29uZmlnSXRlbSBpcyBub3QgY29ycmVjdCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgQFJlcXVpcmVkQXR0cmlidXRlcyA9IHF3KENsYXNzIERlcGxveW1lbnRTdGF0ZSBJbmNpZGVudFN0YXRlKTsKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICBteSAkQ2xhc3NQcmVmZXJlbmNlcyA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgTmFtZSAgPT4gJFJlbW90ZUNJRGF0YS0+e0NsYXNzfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRDbGFzc1ByZWZlcmVuY2VzLT57Q29uZmlnSXRlbUdyb3VwfSAmJiByZWYgJENsYXNzUHJlZmVyZW5jZXMtPntDb25maWdJdGVtR3JvdXB9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICRJdGVtR3JvdXBNb2RlID0gJENsYXNzUHJlZmVyZW5jZXMtPntDb25maWdJdGVtR3JvdXB9WzBdOwogICAgICAgICAgICBpZiAoICRJdGVtR3JvdXBNb2RlID09IDIgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBSZXF1aXJlZEF0dHJpYnV0ZXMsICJHcm91cCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbUdyb3VwTW9kZSA9PSAwICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSXRlbUdyb3VwSXNEaXNhYmxlZCIsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBObyBncm91cCBzaG91bGQgYmUgYXNzaWduZWQgYmVjYXVzZSBpdGVtIGdyb3VwIHBlcm1pc3Npb25zIGFyZSBkaXNhYmxlZCBmb3IgdGhlIGNsYXNzISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAgICAgZm9yIG15ICROZWVkZWQgKCBzb3J0IEBSZXF1aXJlZEF0dHJpYnV0ZXMgKSB7CgogICAgICAgICAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUmVtb3RlQ0lEYXRhLT57JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lk1pc3NpbmdQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogTmVlZCAkTmVlZGVkIGZvciBldmVyeSBDb25maWdJdGVtISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHdlYnNlcnZpY2UgY29uZmlndXJhdGlvbgogICAgbXkgJFdlYnNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpLT5XZWJzZXJ2aWNlR2V0KAogICAgICAgIElEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICk7CgogICAgIyBnZXQgb3BlcmF0aW9uIGNvbmZpZwogICAgbXkgJE9wZXJhdGlvbkNvbmZpZyA9ICRXZWJzZXJ2aWNlLT57Q29uZmlnfS0+e1Byb3ZpZGVyfS0+e09wZXJhdGlvbn0tPnsgJFNlbGYtPntPcGVyYXRpb259IH07CgogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgbXkgJUNJQ2xhc3NNYXBwaW5nID0gKAogICAgICAgIEluY2lkZW50U3RhdGUgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRGVwbG95bWVudFN0YXRlID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIENsYXNzICAgICAgICAgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGJ1aWxkIGR5bmFtaWMgZmllbGQgcmVmZXJlbmNlIGFuZCBsZW5zIGxvb2t1cAogICAgbXkgJURGUmVmTG9va3VwOwogICAgbXkgJURGTGVuc0xvb2t1cDsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ0lUU01Db25maWdJdGVtJ10sCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKSB8fCBbXTsKCiAgICBERkNPTkZJRzoKICAgIGZvciBteSAkREZDb25maWcgKCAkRHluYW1pY0ZpZWxkTGlzdC0+QCogKSB7CgogICAgICAgIG5leHQgREZDT05GSUcgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCRERkNvbmZpZyk7CgogICAgICAgIGlmICggJERGQ29uZmlnLT57RmllbGRUeXBlfSBlcSAnTGVucycgKSB7CiAgICAgICAgICAgICRERkxlbnNMb29rdXB7ICRERkNvbmZpZy0+e05hbWV9IH0gPSAkREZDb25maWc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRERkNvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNSZWZlcmVuY2VGaWVsZCcKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkREZSZWZMb29rdXB7ICRERkNvbmZpZy0+e05hbWV9IH0gPSAkREZDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgICMgc3RvcmUgZHluYW1pYyBmaWVsZCByZWZlcmVuY2UgYW5kIGxlbnMgdmFsdWVzIHRvIHNldCB0aGVtIGFmdGVyIGNvbmZpZyBpdGVtIGFkZCAvIHVwZGF0ZQogICAgbXkgJUFsbERGU2hpZnRlZFZhbHVlczsKCiAgICBteSAlR2VuZXJhbENhdGFsb2dJdGVtTG9va3VwOwogICAgbXkgQENJc0hhbmRsZWQ7CiAgICBDSToKICAgIGZvciBteSAkUmVtb3RlQ0lEYXRhICggQHsgJFBhcmFte0RhdGF9e0NvbmZpZ0l0ZW19IH0gKSB7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRSZW1vdGVDSURhdGEpICkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIHJlbW90ZSBDSSBzdHJ1Y3R1cmUgZm91bmQuIFNraXBwaW5nIGl0ZW0uIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ0k7CiAgICAgICAgfQoKICAgICAgICBteSAlUmVxdWlyZWRBdHRyaWJ1dGVzID0gbWFwIHsgJF8gPT4gJFJlbW90ZUNJRGF0YS0+eyRffSB9IHF3KENsYXNzIERlcGxveW1lbnRTdGF0ZSBJbmNpZGVudFN0YXRlKTsKCiAgICAgICAgIyBnZXQgSURzIGZvciBDbGFzcywgRGVwbC0gYW5kIEluY2lTdGF0ZQogICAgICAgIGZvciBteSAkQ3VycmVudENJICggc29ydCBrZXlzICVDSUNsYXNzTWFwcGluZyApIHsKCiAgICAgICAgICAgICMgY3JlYXRlL2dldCBsb29rdXAgZm9yIGdlbmVyYWwgY2F0YWxvZyBpdGVtcwogICAgICAgICAgICBteSAkR2VuZXJhbENhdGFsb2dJdGVtOwogICAgICAgICAgICBpZiAoICRHZW5lcmFsQ2F0YWxvZ0l0ZW1Mb29rdXB7ICRDSUNsYXNzTWFwcGluZ3skQ3VycmVudENJfSB9LT57ICRSZXF1aXJlZEF0dHJpYnV0ZXN7JEN1cnJlbnRDSX0gfSApIHsKICAgICAgICAgICAgICAgICRHZW5lcmFsQ2F0YWxvZ0l0ZW0gPSAkR2VuZXJhbENhdGFsb2dJdGVtTG9va3VweyAkQ0lDbGFzc01hcHBpbmd7JEN1cnJlbnRDSX0gfS0+eyAkUmVxdWlyZWRBdHRyaWJ1dGVzeyRDdXJyZW50Q0l9IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dJdGVtID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRDSUNsYXNzTWFwcGluZ3skQ3VycmVudENJfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkUmVxdWlyZWRBdHRyaWJ1dGVzeyRDdXJyZW50Q0l9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhSXNIYXNoUmVmV2l0aERhdGEoJEdlbmVyYWxDYXRhbG9nSXRlbSkKICAgICAgICAgICAgICAgICAgICB8fCAhSXNTdHJpbmdXaXRoRGF0YSggJEdlbmVyYWxDYXRhbG9nSXRlbS0+e0l0ZW1JRH0gKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgbG9va2luZyB1cCAkQ3VycmVudENJICckUmVxdWlyZWRBdHRyaWJ1dGVzeyRDdXJyZW50Q0l9Jy4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgdG8gbG9va3VwCiAgICAgICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dJdGVtTG9va3VweyAkQ0lDbGFzc01hcHBpbmd7JEN1cnJlbnRDSX0gfS0+eyAkUmVxdWlyZWRBdHRyaWJ1dGVzeyRDdXJyZW50Q0l9IH0gPSAkR2VuZXJhbENhdGFsb2dJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRSZXF1aXJlZEF0dHJpYnV0ZXN7ICRDdXJyZW50Q0kgLiAnSUQnIH0gPSAkR2VuZXJhbENhdGFsb2dJdGVtLT57SXRlbUlEfTsKICAgICAgICB9CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBnZXQgSUQgZm9yIHRoZSBHcm91cAogICAgICAgICMgdXNlcnMgZnJvbSB0aGUgaXRzbSBtYW5hZ2VtZW50IGdyb3VwIGNhbiBhc3NpZ24gdGhlIENJIHRvIGFueSBncm91cCwgb3RoZXJzIGNhbiBhc3NpZ24gb25seSB0byBvbmUgb2YgdGhlaXIgZ3JvdXBzCiAgICAgICAgIyBhdHRlbXB0aW5nIHRvIGFzc2lnbiBhIG5vbiBhdXRob3JpemVkIGdyb3VwIHJldHVybnMgdGhlIHNhbWUgcmVzdWx0IGFzIGFzc2lnbmluZyBhIG5vbiBleGlzdGluZyBncm91cAogICAgICAgIGlmICggJFJlbW90ZUNJRGF0YS0+e0dyb3VwfSApIHsKICAgICAgICAgICAgbXkgJUF1dGhHcm91cHM7CiAgICAgICAgICAgIG15ICRNYW5hZ2VtZW50R3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Db25maWdJdGVtTWFuYWdlbWVudEdyb3VwIik7CiAgICAgICAgICAgIG15ICVVc2VyR3JvdXBzTGlzdCAgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR3JvdXBHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAicnciLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRNYW5hZ2VtZW50R3JvdXAgJiYgZ3JlcCB7ICRfIGVxICRNYW5hZ2VtZW50R3JvdXAgfSB2YWx1ZXMgJVVzZXJHcm91cHNMaXN0ICkgewogICAgICAgICAgICAgICAgJUF1dGhHcm91cHMgPSAkR3JvdXBPYmplY3QtPkdyb3VwTGlzdCgKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICVBdXRoR3JvdXBzID0gJVVzZXJHcm91cHNMaXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVHcm91cHNNYXBwaW5nID0gcmV2ZXJzZSAlQXV0aEdyb3VwczsKICAgICAgICAgICAgJFJlcXVpcmVkQXR0cmlidXRlc3tHcm91cElEfSA9ICRHcm91cHNNYXBwaW5neyAkUmVtb3RlQ0lEYXRhLT57R3JvdXB9IH07CiAgICAgICAgICAgIGlmICggISRSZXF1aXJlZEF0dHJpYnV0ZXN7R3JvdXBJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5BY2Nlc3NEZW5pZWQiLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ2FuIG5vdCB3cml0ZSB1bmF1dGhvcml6ZWQgZ3JvdXAgdG8gY29uZmlndXJhdGlvbiBpdGVtISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAgICAgbXkgJElkZW50aWZpZXIgPSAkT3BlcmF0aW9uQ29uZmlnLT57ICdJZGVudGlmaWVyJyAuICRSZXF1aXJlZEF0dHJpYnV0ZXN7Q2xhc3NJRH0gfTsKICAgICAgICBpZiAoICEkSWRlbnRpZmllciApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOb3QgaW1wb3J0aW5nIGl0ZW1zIGluIGNsYXNzICRSZXF1aXJlZEF0dHJpYnV0ZXN7Q2xhc3N9IC0gc2tpcHBpbmcuIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQ0lzSGFuZGxlZCwge307CgogICAgICAgICAgICBuZXh0IENJOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoaXMgaXRlbSBleGlzdHMgKHVwZGF0ZSkgb3IgaXMgbmV3IChjcmVhdGUpCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRDsKCiAgICAgICAgIyBwcmVwYXJlIHNlYXJjaAogICAgICAgIG15ICVTZWFyY2hQYXJhbSA9ICgKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgUXVlcnlDb25kaXRpb24gPT4gMCwKICAgICAgICApOwogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoICRJZGVudGlmaWVyLT5AKiApIHsKCiAgICAgICAgICAgICMgaWYgbnVtYmVyIG9yIGNvbmZpZyBpdGVtIGlkIGFyZSBkZWZpbmVkIGFzIGlkZW50aWZpZXJzLCB1c2Ugb25seSB0aGlzCiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZSBlcSAnTnVtYmVyJyApIHsKICAgICAgICAgICAgICAgIGlmICggJFJlbW90ZUNJRGF0YS0+e051bWJlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRSZW1vdGVDSURhdGEtPntOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGFzdCBBVFRSSUJVVEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdDb25maWdJdGVtSUQnICkgewogICAgICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW0gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFJlbW90ZUNJRGF0YS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJENvbmZpZ0l0ZW0pICkgewogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtSUQgPSAkUmVtb3RlQ0lEYXRhLT57Q29uZmlnSXRlbUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtSUQgPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBsYXN0IEFUVFJJQlVURTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ0NsYXNzZXMnICkgewogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFte0NsYXNzZXN9ID0gWyAkUmVtb3RlQ0lEYXRhLT57Q2xhc3N9IF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdOYW1lJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbXtOYW1lfSA9ICRSZW1vdGVDSURhdGEtPntOYW1lfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ0RlcGxTdGF0ZXMnICkgewogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFte0RlcGxTdGF0ZXN9ID0gWyAkUmVtb3RlQ0lEYXRhLT57RGVwbG95bWVudFN0YXRlfSBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSA9fiAvXkR5bi8gKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW17JEF0dHJpYnV0ZX0gPSB7CiAgICAgICAgICAgICAgICAgICAgRXF1YWxzID0+ICRSZW1vdGVDSURhdGEtPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbm5vdCB1c2UgJEF0dHJpYnV0ZSBhcyBJZGVudGlmaWVyIC0gc2tpcHBpbmcuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBDSXNIYW5kbGVkLCB7fTsKCiAgICAgICAgICAgICAgICBuZXh0IENJOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICFkZWZpbmVkICRDb25maWdJdGVtSUQgKSB7CgogICAgICAgICAgICAjIGF2b2lkIGV4ZWN1dGluZyBhIHNlYXJjaCB3aXRoIGVtcHR5IHNlYXJjaCBwYXJhbXMgKGV4Y2x1ZGluZyAnUmVzdWx0ID0+ICJBUlJBWSInIGZyb20gbWVhbmluZ2Z1bCBwYXJhbXMpCiAgICAgICAgICAgIG15ICRQZXJmb3JtU2VhcmNoID0gMDsKICAgICAgICAgICAgU0VBUkNIUEFSQU1LRVk6CiAgICAgICAgICAgIGZvciBteSAkU2VhcmNoUGFyYW1LZXkgKCBrZXlzICVTZWFyY2hQYXJhbSApIHsKICAgICAgICAgICAgICAgIGlmICggJFNlYXJjaFBhcmFtS2V5IG5lICdSZXN1bHQnICYmICRTZWFyY2hQYXJhbXskU2VhcmNoUGFyYW1LZXl9ICkgewogICAgICAgICAgICAgICAgICAgICRQZXJmb3JtU2VhcmNoID0gMTsKCiAgICAgICAgICAgICAgICAgICAgbGFzdCBTRUFSQ0hQQVJBTUtFWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRQZXJmb3JtU2VhcmNoKSB7CgogICAgICAgICAgICAgICAgbXkgQENvbmZpZ0l0ZW1JRHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCglU2VhcmNoUGFyYW0pOwoKICAgICAgICAgICAgICAgIGlmICggc2NhbGFyIEBDb25maWdJdGVtSURzID4gMSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2VhcmNoUGFyYW1ldGVycyA9IGpvaW4oICc7JywgbWFwIHsiJF8gPT4gJFNlYXJjaFBhcmFteyRffSJ9IGtleXMgJVNlYXJjaFBhcmFtICk7CgogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbm5vdCB1c2UgYW1iaWd1b3VzIHNlYXJjaCByZXN1bHQgLSBza2lwcGluZy4gUGFyYW1ldGVyczogJFNlYXJjaFBhcmFtZXRlcnM7IiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHB1c2ggQENJc0hhbmRsZWQsIHt9OwoKICAgICAgICAgICAgICAgICAgICBuZXh0IENJOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbUlEc1swXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgIG15ICRQZXJtaXNzaW9uOwogICAgICAgIGlmICgkQ29uZmlnSXRlbUlEKSB7CiAgICAgICAgICAgICRQZXJtaXNzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQZXJtaXNzaW9uID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRSZXF1aXJlZEF0dHJpYnV0ZXN7Q2xhc3NJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFBlcm1pc3Npb24gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uQWNjZXNzRGVuaWVkIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogQ2FuIG5vdCB3cml0ZSBjb25maWd1cmF0aW9uIGl0ZW0hIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRDb25maWdJdGVtSUQgJiYgISRSZW1vdGVDSURhdGEtPntOYW1lfSApIHsKICAgICAgICAgICAgbXkgJE5vdGljZUluZm8gPSAkUmVtb3RlQ0lEYXRhLT57TnVtYmVyfSA/ICJOdW1iZXI6ICRSZW1vdGVDSURhdGEtPntOdW1iZXJ9OyIgOiAnJzsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTWlzc2luZyAnTmFtZScgcGFyYW1ldGVyIGZvciBjcmVhdGluZyBhIENJLiBTa2lwcGluZyBpdGVtLiAkTm90aWNlSW5mbyIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQENJc0hhbmRsZWQsIHt9OwoKICAgICAgICAgICAgbmV4dCBDSTsKICAgICAgICB9CgogICAgICAgIG15IEBBdHRhY2htZW50TGlzdDsKICAgICAgICBpZiAoIGRlZmluZWQgJFJlbW90ZUNJRGF0YS0+e0F0dGFjaG1lbnR9ICkgewoKICAgICAgICAgICAgIyBpc29sYXRlIEF0dGFjaG1lbnQgcGFyYW1ldGVyCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50ID0gJFJlbW90ZUNJRGF0YS0+e0F0dGFjaG1lbnR9OwoKICAgICAgICAgICAgIyBob21vZ2VuYXRlIGlucHV0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICggcmVmICRBdHRhY2htZW50IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRMaXN0LCAkQXR0YWNobWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBBdHRhY2htZW50TGlzdCA9IEB7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIEF0dGFjaG1lbnQgaW50ZXJuYWwgc3RydWN0dXJlCiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudEl0ZW0gKEBBdHRhY2htZW50TGlzdCkgewogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEF0dGFjaG1lbnRJdGVtKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENvbmZpZ0l0ZW0tPkF0dGFjaG1lbnQgcGFyYW1ldGVyIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJEF0dGFjaG1lbnRJdGVtLT4lKiApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFyZWZ0eXBlICRBdHRhY2htZW50SXRlbS0+eyRBdHRyaWJ1dGV9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgI3JlbW92ZSBsZWFkaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudEl0ZW0tPnskQXR0cmlidXRlfSA9fiBze1xBXHMrfXt9OwoKICAgICAgICAgICAgICAgICAgICAgICAgI3JlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnRJdGVtLT57JEF0dHJpYnV0ZX0gPX4gc3tccytcen17fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBBdHRhY2htZW50IGF0dHJpYnV0ZSB2YWx1ZXMKICAgICAgICAgICAgICAgIG15ICRBdHRhY2htZW50Q2hlY2sgPSAkU2VsZi0+X0NoZWNrQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+ICRBdHRhY2htZW50SXRlbSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJEF0dGFjaG1lbnRDaGVjay0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoICV7JEF0dGFjaG1lbnRDaGVja30gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaGlmdCBkeW5hbWljIGZpZWxkIHJlZmVyZW5jZSBhbmQgbGVucyB2YWx1ZXMgZnJvbSBjb25maWdpdGVtIGRhdGEgdG8gc2V0IHRoZW0gYWZ0ZXJ3YXJkcwogICAgICAgIG15ICVERlNoaWZ0ZWRWYWx1ZXM7CiAgICAgICAgREZOQU1FOgogICAgICAgIGZvciBteSAkREZOYW1lICgga2V5cyAlREZSZWZMb29rdXAsIGtleXMgJURGTGVuc0xvb2t1cCApIHsKCiAgICAgICAgICAgIG5leHQgREZOQU1FIHVubGVzcyBkZWZpbmVkICRSZW1vdGVDSURhdGEtPnsiRHluYW1pY0ZpZWxkXyRERk5hbWUifTsKCiAgICAgICAgICAgICRERlNoaWZ0ZWRWYWx1ZXN7JERGTmFtZX0gPSBkZWxldGUgJFJlbW90ZUNJRGF0YS0+eyJEeW5hbWljRmllbGRfJERGTmFtZSJ9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRDb25maWdJdGVtSUQpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICRSZW1vdGVDSURhdGEtPiUqLAogICAgICAgICAgICAgICAgJVJlcXVpcmVkQXR0cmlidXRlcywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICA9PiAkUmVxdWlyZWRBdHRyaWJ1dGVze0RlcGxveW1lbnRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgID0+ICRSZXF1aXJlZEF0dHJpYnV0ZXN7SW5jaWRlbnRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBFeHRlcm5hbFNvdXJjZSA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPkVycm9yKAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiRXJyb3Igd2hpbGUgdXBkYXRpbmcgQ29uZmlnSXRlbUlEICRDb25maWdJdGVtSUQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAgICAgICAgICRSZW1vdGVDSURhdGEtPiUqLAogICAgICAgICAgICAgICAgJVJlcXVpcmVkQXR0cmlidXRlcywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgID0+ICRSZXF1aXJlZEF0dHJpYnV0ZXN7RGVwbG95bWVudFN0YXRlSUR9LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgPT4gJFJlcXVpcmVkQXR0cmlidXRlc3tJbmNpZGVudFN0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIEV4dGVybmFsU291cmNlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkQ29uZmlnSXRlbUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FcnJvcigKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIGNyZWF0aW5nIENJIHdpdGggTmFtZSAnJFJlcXVpcmVkQXR0cmlidXRlc3tOYW1lfScsIENsYXNzICckUmVxdWlyZWRBdHRyaWJ1dGVze0NsYXNzfScgKENsYXNzSUQ6ICckUmVxdWlyZWRBdHRyaWJ1dGVze0NsYXNzSUR9JykuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRBbGxERlNoaWZ0ZWRWYWx1ZXN7JENvbmZpZ0l0ZW1JRH0gPSBcJURGU2hpZnRlZFZhbHVlczsKCiAgICAgICAgIyBoYW5kbGUgY29uZmlnIGl0ZW0gYXR0YWNobWVudHMKICAgICAgICBpZiAoQEF0dGFjaG1lbnRMaXN0KSB7CgogICAgICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkRmlsZW5hbWUgKEBFeGlzdGluZ0F0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkRGVsZXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSBkZWxldGluZyBleGlzdGluZyBhdHRhY2htZW50IHdpdGggTmFtZSAnJEZpbGVuYW1lJyBmb3IgQ29uZmlnSXRlbSBJRCAkQ29uZmlnSXRlbUlELiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudExpc3QpIHsKCiAgICAgICAgICAgICAgICAjIGRlbGV0ZSBhbGwgY29uZmlnIGl0ZW0gYXR0YWNobWVudHMKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+JSosCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIGFkZGluZyBhdHRhY2htZW50IHdpdGggTmFtZSAnJEF0dGFjaG1lbnQtPntGaWxlbmFtZX0nIGZvciBDb25maWdJdGVtIElEICRDb25maWdJdGVtSUQuIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBDSXNIYW5kbGVkLCB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFJlbW90ZUNJRGF0YS0+e05hbWV9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzZXQgZHluYW1pYyBmaWVsZCByZWZlcmVuY2UgYW5kIGxlbnMgdmFsdWVzIGFmdGVyIGFkZGluZyAvIHVwZGF0aW5nIGFsbCBjb25maWcgaXRlbXMKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ0lERlBhaXIgKCBwYWlycyAlQWxsREZTaGlmdGVkVmFsdWVzICkgewoKICAgICAgICBteSAoICRDb25maWdJdGVtSUQsICRERlZhbHVlcyApID0gJENJREZQYWlyLT5AKjsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCRERlZhbHVlcyk7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIGRhdGEgZm9yIHZlcnNpb24gaWQKICAgICAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGZpcnN0LCBzZXQgZHluYW1pYyBmaWVsZCByZWZlcmVuY2UgdmFsdWVzCiAgICAgICAgREZSRUY6CiAgICAgICAgZm9yIG15ICRERlJlZk5hbWUgKCBrZXlzICVERlJlZkxvb2t1cCApIHsKCiAgICAgICAgICAgIG5leHQgREZSRUYgdW5sZXNzIGV4aXN0cyAkREZWYWx1ZXMtPnskREZSZWZOYW1lfTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRERlJlZkxvb2t1cHskREZSZWZOYW1lfSwKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJERGVmFsdWVzLT57JERGUmVmTmFtZX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIEV4dGVybmFsU291cmNlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZWNvbmQsIHNldCBkeW5hbWljIGZpZWxkIGxlbnMgdmFsdWVzCiAgICAgICAgREZMRU5TOgogICAgICAgIGZvciBteSAkREZMZW5zTmFtZSAoIGtleXMgJURGTGVuc0xvb2t1cCApIHsKCiAgICAgICAgICAgIG5leHQgREZMRU5TIHVubGVzcyBleGlzdHMgJERGVmFsdWVzLT57JERGTGVuc05hbWV9OwoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJERGTGVuc0xvb2t1cHskREZMZW5zTmFtZX0sCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW0tPntWZXJzaW9uSUR9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRERlZhbHVlcy0+eyRERkxlbnNOYW1lfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRXh0ZXJuYWxTb3VyY2UgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIERhdGEgICAgPT4geyBDb25maWdJdGVtID0+IFxAQ0lzSGFuZGxlZCB9LAogICAgfTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentITSMConfigItemEdit.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICByZXR1cm4gYmxlc3MgeyVQYXJhbX0sICRUeXBlOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBteSBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBjb25maWdpdGVtIGlkIGFuZCBjbGFzcyBpZAogICAgbXkgJENvbmZpZ0l0ZW0gID0ge307CiAgICBteSAkRHVwbGljYXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRHVwbGljYXRlSUQnICkgfHwgMDsKICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb25maWdJdGVtSUQnICkgfHwgMDsKICAgICRDb25maWdJdGVtLT57Q2xhc3NJRH0gICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApICAgICAgfHwgMDsKCiAgICBteSAkSGFzQWNjZXNzOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICBteSAkR3JvdXBPYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IG5lZWRlZCBkYXRhCiAgICBpZiAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSAmJiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB7CgogICAgICAgICMgY2hlY2sgYWNjZXNzIGZvciBjb25maWcgaXRlbQogICAgICAgICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICAgICAgJENvbmZpZ0l0ZW0gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCREdXBsaWNhdGVJRCkgewoKICAgICAgICBteSAkVmVyc2lvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKTsKCiAgICAgICAgIyBUT0RPOiBDaGVjayBkdXBsaWNhdGlvbgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIHRvIGR1cGxpY2F0ZQogICAgICAgICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gJER1cGxpY2F0ZUlELAogICAgICAgICAgICBWZXJzaW9uSUQgICAgID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGFjY2VzcyBmb3IgY29uZmlnIGl0ZW0KICAgICAgICAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBjb25maWcgaXRlbSBpZCBhbmQgbnVtYmVyCiAgICAgICAgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ID0gJ05FVyc7CiAgICAgICAgJENvbmZpZ0l0ZW0tPntOdW1iZXJ9ICAgICAgID0gVHJhbnNsYXRhYmxlKCdOZXcnKTsKICAgIH0KICAgIGVsc2lmICggJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSApIHsKCiAgICAgICAgIyBzZXQgY29uZmlnIGl0ZW0gaWQgYW5kIG51bWJlcgogICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICdORVcnOwogICAgICAgICRDb25maWdJdGVtLT57TnVtYmVyfSAgICAgICA9IFRyYW5zbGF0YWJsZSgnTmV3Jyk7CgogICAgICAgICMgY2hlY2sgYWNjZXNzIGZvciBjb25maWcgaXRlbQogICAgICAgICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwogICAgICAgICRDb25maWdJdGVtLT57Q2xhc3N9ID0gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdXNlciBoYXMgbm8gYWNjZXNzIHJpZ2h0cyBzaG93IGVycm9yIHBhZ2UKICAgIGlmICggISRIYXNBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gYWNjZXNzIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEVkaXQgdGhlIGNvbmZpZyBpdGVtIHdpdGggdGhlIG5ld2VzdCBjb25maWcgaXRlbSBkZWZpbml0aW9uIG9mIHRoZSByZWxldmFudCBjbGFzcwogICAgbXkgJERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICApOwoKICAgICMgYWJvcnQsIGlmIG5vIGRlZmluaXRpb24gaXMgZGVmaW5lZAogICAgaWYgKCAhJERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnLCAkQ29uZmlnSXRlbS0+e0NsYXNzfSApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBmb3JtIGlkCiAgICBteSAkRm9ybUNhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyk7CgogICAgJFNlbGYtPntGb3JtSUR9ID0gJEZvcm1DYWNoZU9iamVjdC0+UHJlcGFyZUZvcm1JRCgKICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgKTsKCiAgICBteSAlR2V0UGFyYW07CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwogICAgbXkgJUFDTFJlZHVjaWJsZUR5bmFtaWNGaWVsZHM7CiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdDsKCiAgICAjIGdldCBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIGNvbmZpZ2l0ZW0KICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKICAgICAgICAkRHluYW1pY0ZpZWxkTGlzdCA9ICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfSA/IFsgdmFsdWVzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSogXSA6IFtdOwoKICAgICAgICBpZiAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1OYW1lOwoKICAgICAgICAgICAgaWYgKCREdXBsaWNhdGVJRCkgewoKICAgICAgICAgICAgICAgICMgZ2V0IERhdGEgZnJvbSBkdXBsaWNhdGUgQ0kKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIFZlcnNpb25TdHJpbmcgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIFZlcnNpb25TdHJpbmcgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24gR3JvdXBJRCkpIHsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gJENvbmZpZ0l0ZW0tPnskUGFyYW19OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTmFtZSA9ICRHZXRQYXJhbXtOYW1lfSAuICcgKENvcHkpJzsKCiAgICAgICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoICREeW5hbWljRmllbGRMaXN0LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICAgICAgICAgICAgICMgcGVyZm9ybSBBQ0xzIG9uIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQUNMUmVkdWNpYmxlRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT4lKiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBkZWxldGUgJEdldFBhcmFte0NvbmZpZ0l0ZW1JRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICAjIGdldCBnZW5lcmFsIGZvcm0gZGF0YQojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQojICAgICAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoTmFtZSBWZXJzaW9uU3RyaW5nIERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEIERlc2NyaXB0aW9uKSkgewogICAgICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIFZlcnNpb25TdHJpbmcgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24gR3JvdXBJRCkpIHsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkQ29uZmlnSXRlbS0+eyRQYXJhbX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCAkRHluYW1pY0ZpZWxkTGlzdC0+QCogKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkQ29uZmlnSXRlbS0+eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgICAgICAgICAjIHBlcmZvcm0gQUNMcyBvbiB2YWx1ZXMKICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJwogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJEFDTFJlZHVjaWJsZUR5bmFtaWNGaWVsZHN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBlbHNlIHsKICAgICAgICBteSAkQWN0aXZlRmllbGRzID0gJEZvcm1DYWNoZU9iamVjdC0+R2V0Rm9ybURhdGEoCiAgICAgICAgICAgIEZvcm1JRCAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ0FjdGl2ZUR5bmFtaWNGaWVsZHMnLAogICAgICAgICkgLy8gW107CgogICAgICAgIGZvciBteSAkRmllbGROYW1lICggJEFjdGl2ZUZpZWxkcy0+QCogKSB7CiAgICAgICAgICAgIHB1c2ggQHskRHluYW1pY0ZpZWxkTGlzdH0sICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfXskRmllbGROYW1lfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGdlbmVyYWwgZm9ybSBkYXRhCiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiMgICAgICAgIGZvciBteSAkUGFyYW0gKHF3KE5hbWUgVmVyc2lvblN0cmluZyBEZXBsU3RhdGVJRCBJbmNpU3RhdGVJRCBEZXNjcmlwdGlvbikpIHsKICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIFZlcnNpb25TdHJpbmcgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24gR3JvdXBJRCkpIHsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApOwogICAgICAgIH0KCiAgICAgICAgIyBzcGVjaWFsIGNhc2UgZm9yIGNsYXNzCiAgICAgICAgJEdldFBhcmFte0NsYXNzSUR9ID0gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfTsKCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggJER5bmFtaWNGaWVsZExpc3QtPkAqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcGVyZm9ybSBBQ0xzIG9uIHZhbHVlcwogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAkQUNMUmVkdWNpYmxlRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICBteSBAVXBkYXRhYmxlRmllbGRzID0gcXcoRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24pOwogICAgbXkgQFVwZGF0YWJsZUZpZWxkcyA9IHF3KERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEIERlc2NyaXB0aW9uIEdyb3VwSUQpOwojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsIGtleXMgJUFDTFJlZHVjaWJsZUR5bmFtaWNGaWVsZHM7CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGQgfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgYXR0YWNobWVudHMgb2YgZXhpc3RpbmcgY29uZmlnIGl0ZW0gbmVlZHMgdG8gYmUgbG9hZGVkIGluIHR3byBjYXNlczoKICAgICMgICAxLiBhbiBleGlzdGluZyBjb25maWcgaXRlbSBpcyBlZGl0ZWQgLSBubyBjbGFzcyBpZCBwcmVzZW50IGluIEdldFBhcmFtCiAgICAjICAgMi4gYW4gZXhpc3RpbmcgY29uZmlnIGl0ZW0gaXMgZHVwbGljYXRlZAogICAgaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICkgfHwgJER1cGxpY2F0ZUlEICkgewoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEV4aXN0aW5nQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJER1cGxpY2F0ZUlEIHx8ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNvcHkgYWxsIGV4aXN0aW5nIGF0dGFjaG1lbnRzIHRvIHVwbG9hZCBjYWNoZQogICAgICAgIEZJTEVOQU1FOgogICAgICAgIGZvciBteSAkRmlsZW5hbWUgKEBFeGlzdGluZ0F0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgZXhpc3RpbmcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkRHVwbGljYXRlSUQgfHwgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBhdHRhY2htZW50IHRvIHRoZSB1cGxvYWQgY2FjaGUKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57Q29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQXR0YWNobWVudERhdGEtPntDb250ZW50VHlwZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RmllbGRSZXN0cmljdGlvbnMnKTsKCiAgICBteSAkQXV0b3NlbGVjdCA9ICRDb25maWdPYmplY3QtPkdldCgnQ29uZmlnSXRlbUFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwogICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDb25maWdJdGVtQUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgIyBnZXQgY2FjaGVkIHByZXNlbGVjdGlvbiBydWxlcwogICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAnQ29uZmlnSXRlbUFDTCcsCiAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRXJyb3I7CiAgICBteSAkTmFtZUR1cGxpY2F0ZXM7CiAgICBteSAkQ0lOYW1lUmVnZXhFcnJvck1lc3NhZ2U7CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKICAgIG15ICVEeW5hbWljRmllbGRWaXNpYmlsaXR5OwoKICAgIG15ICVDbGFzc1ByZWZlcmVuY2VzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKCiAgICBteSAkTmFtZU1vZHVsZSA9ICRDbGFzc1ByZWZlcmVuY2Vze05hbWVNb2R1bGV9ID8gJENsYXNzUHJlZmVyZW5jZXN7TmFtZU1vZHVsZX1bMF0gOiAnJzsKICAgIGlmICgkTmFtZU1vZHVsZSkgewoKICAgICAgICAjIGNoZWNrIGlmIG5hbWUgbW9kdWxlIGV4aXN0cwogICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoIktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TmFtZTo6JE5hbWVNb2R1bGUiKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgbmFtZSBtb2R1bGUgZm9yIGNsYXNzICRDb25maWdJdGVtLT57Q2xhc3N9ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICROYW1lTW9kdWxlID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWZXJzaW9uU3RyaW5nTW9kdWxlID0gJENsYXNzUHJlZmVyZW5jZXN7VmVyc2lvblN0cmluZ01vZHVsZX0gPyAkQ2xhc3NQcmVmZXJlbmNlc3tWZXJzaW9uU3RyaW5nTW9kdWxlfVswXSA6ICcnOwogICAgaWYgKCRWZXJzaW9uU3RyaW5nTW9kdWxlKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBtb2R1bGUgZXhpc3RzCiAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpWZXJzaW9uU3RyaW5nOjokVmVyc2lvblN0cmluZ01vZHVsZSIpICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCB2ZXJzaW9uIHN0cmluZyBtb2R1bGUgZm9yIGNsYXNzICRDb25maWdJdGVtLT57Q2xhc3N9ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRWZXJzaW9uU3RyaW5nTW9kdWxlID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyBnZXQgdGhlIHVwbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICk7CgogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKCiAgICAgICAgICAgICMgYWRkIGF0dGFjaG1lbnQgdG8gdGhlIHVwbG9hZCBjYWNoZQogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEFsbFJlcXVpcmVkID0gMTsKCiAgICAgICAgIyBnZXQgZ2VuZXJhbCBmb3JtIGRhdGEKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24gR3JvdXBJRCkpIHsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAkQ29uZmlnSXRlbS0+eyRQYXJhbX0gPSAkR2V0UGFyYW17JFBhcmFtfTsKCiAgICAgICAgICAgIGlmICggISRDb25maWdJdGVtLT57JFBhcmFtfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXtEZXNjcmlwdGlvbn0gLy89ICcnOwoKICAgICAgICAjIGdldCBuYW1lIG9ubHkgaWYgaXQgaXMgbm90IGZpbGxlZCBieSBhIG1vZHVsZQogICAgICAgIGlmICggISROYW1lTW9kdWxlICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e05hbWV9ID0gJEdldFBhcmFte05hbWV9OwoKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntOYW1lfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHZlcnNpb24gc3RyaW5nIG9ubHkgaWYgaXQgaXMgbm90IGZpbGxlZCBieSBhIG1vZHVsZQogICAgICAgIGlmICggISRWZXJzaW9uU3RyaW5nTW9kdWxlICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e1ZlcnNpb25TdHJpbmd9ID0gJEdldFBhcmFte1ZlcnNpb25TdHJpbmd9OwoKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntWZXJzaW9uU3RyaW5nfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2ssIHdoZXRoZXIgdGhlIGZlYXR1cmUgdG8gY2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgaXMgZW5hYmxlZAogICAgICAgIGlmICgKICAgICAgICAgICAgSXNTdHJpbmdXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntOYW1lfSApCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVW5pcXVlQ0lOYW1lOjpFbmFibGVVbmlxdWVuZXNzQ2hlY2snKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDaGVja2luZyBmb3IgZHVwbGljYXRlIG5hbWVzIChDbGFzc0lEOiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIk5hbWU6ICRDb25maWdJdGVtLT57TmFtZX0sIENvbmZpZ0l0ZW1JRDogJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9KSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTmFtZUR1cGxpY2F0ZXMgPSAkQ29uZmlnSXRlbU9iamVjdC0+VW5pcXVlTmFtZUNoZWNrKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRDb25maWdJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHN0b3AgcHJvY2Vzc2luZyBpZiB0aGUgbmFtZSBpcyBub3QgdW5pcXVlCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCROYW1lRHVwbGljYXRlcykgKSB7CgogICAgICAgICAgICAgICAgJEFsbFJlcXVpcmVkID0gMDsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGEgc3RyaW5nIG9mIGFsbCBkdXBsaWNhdGUgSURzCiAgICAgICAgICAgICAgICBteSAkTmFtZUR1cGxpY2F0ZXNTdHJpbmcgPSBqb2luICcsICcsIEB7JE5hbWVEdXBsaWNhdGVzfTsKCiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgJENvbmZpZ0l0ZW0tPntOYW1lfSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbUlEKHMpOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5hbWVEdXBsaWNhdGVzU3RyaW5nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGNvbmZpZyBvcHRpb24gZm9yIHRoZSBuYW1lIHJlZ2V4IGNoZWNrcwogICAgICAgIG15ICRDSU5hbWVSZWdleENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkNJTmFtZVJlZ2V4Iik7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIENJIG5hbWUgaXMgZ2l2ZW4gYW5kIHNob3VsZCBiZSBjaGVja2VkIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRDb25maWdJdGVtLT57TmFtZX0gKSAmJiAkQ0lOYW1lUmVnZXhDb25maWcgKSB7CgogICAgICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjbGFzcyBuYW1lCiAgICAgICAgICAgIG15ICRDbGFzc05hbWUgPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtLT57Q2xhc3NJRH0gfSB8fCAnJzsKCiAgICAgICAgICAgICMgZ2V0IHRoZSByZWdleCBmb3IgdGhpcyBjbGFzcwogICAgICAgICAgICBteSAkQ0lOYW1lUmVnZXggPSAkQ0lOYW1lUmVnZXhDb25maWctPnsgJENsYXNzTmFtZSAuICc6OicgLiAnQ0lOYW1lUmVnZXgnIH0gfHwgJyc7CgogICAgICAgICAgICAjIGlmIGEgcmVnZXggaXMgZGVmaW5lZCBhbmQgdGhlIENJIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICAgICBpZiAoICRDSU5hbWVSZWdleCAmJiAkQ29uZmlnSXRlbS0+e05hbWV9ICF+IG17ICRDSU5hbWVSZWdleCB9eG1zICkgewoKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgY2xhc3MKICAgICAgICAgICAgICAgICRDSU5hbWVSZWdleEVycm9yTWVzc2FnZSA9ICRDSU5hbWVSZWdleENvbmZpZy0+eyAkQ2xhc3NOYW1lIC4gJzo6JyAuICdDSU5hbWVSZWdleEVycm9yTWVzc2FnZScgfSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2Zvcm0gZHluYW1pYyBmaWVsZCBkYXRhIGludG8gREZOYW1lID0+IERGTmFtZSBwYWlyCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEFjbCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntOYW1lfSB9ICREeW5hbWljRmllbGRMaXN0LT5AKjsKCiAgICAgICAgIyBjYWxsIHRpY2tldCBBQ0xzIGZvciBEeW5hbWljRmllbGRzIHRvIGNoZWNrIGZpZWxkIHZpc2liaWxpdHkKICAgICAgICBteSAkQUNMUmVzdWx0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BY2woCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0Zvcm0nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTFJlc3VsdCkgewogICAgICAgICAgICAlRHluYW1pY0ZpZWxkVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gPT4gMCB9ICREeW5hbWljRmllbGRMaXN0LT5AKjsKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFjbERhdGEoKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQWNsRGF0YSApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRmllbGQgfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVEeW5hbWljRmllbGRWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSA9PiAxIH0gJER5bmFtaWNGaWVsZExpc3QtPkAqOwogICAgICAgIH0KCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggJER5bmFtaWNGaWVsZExpc3QtPkAqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBpZiAoICRBQ0xSZWR1Y2libGVEeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbHRlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBwZXJmb3JtIHZhbGlkYXRpb24KICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkNvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSEiKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gICAgICAgICAgICAgICAgICAgICAgICA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRBbGxSZXF1aXJlZCA9ICVFcnJvciA/IDAgOiAxOwoKICAgICAgICAjIHNhdmUgdmVyc2lvbiB0byBkYXRhYmFzZQogICAgICAgIGlmICgkQWxsUmVxdWlyZWQpIHsKCiAgICAgICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBmcm9tIHVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIGEgbG9va3VwIGxvb2t1cCBoYXNoIG9mIHRoZSBuZXcgYXR0YWNobWVudHMKICAgICAgICAgICAgbXkgJU5ld0F0dGFjaG1lbnQ7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkQ29udGVudElECiAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb250ZW50SUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Rlc2NyaXB0aW9ufSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVAogICAgICAgICAgICAgICAgICAgICAgICBpZiAkR2V0UGFyYW17RGVzY3JpcHRpb259ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB0aGUga2V5IGlzIHRoZSBmaWxlbmFtZSArIGZpbGVzaXplICsgY29udGVudCB0eXBlCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJEF0dGFjaG1lbnQtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50LT57RmlsZXNpemV9CiAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIGFsbCBvZiB0aGUgbmV3IGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICAgICAgJE5ld0F0dGFjaG1lbnR7JEtleX0gPSAkQXR0YWNobWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0Rlc2NyaXB0aW9ufSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmb3IgZXhpc3RpbmcgQ29uZmlnSXRlbXMgY29tcGFyZSB3aXRoIHRoZSBjdXJyZW50IGRhdGEKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgZXhpc3RpbmcgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEZJTEVOQU1FOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBrZXkgaXMgdGhlIGZpbGVuYW1lICsgZmlsZXNpemUgKyBjb250ZW50IHR5cGUKICAgICAgICAgICAgICAgICAgICAjIChubyBjb250ZW50IGlkLCBhcyBleGlzdGluZyBhdHRhY2htZW50cyBkb24ndCBoYXZlIGl0KQogICAgICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkQXR0YWNobWVudERhdGEtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudERhdGEtPntGaWxlc2l6ZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudERhdGEtPntDb250ZW50VHlwZX07CgogICAgICAgICAgICAgICAgICAgICMgYXR0YWNobWVudCBpcyBhbHJlYWR5IGV4aXN0aW5nLCB3ZSBjYW4gZGVsZXRlIGl0IGZyb20gdGhlIG5ldyBhdHRhY2htZW50IGhhc2gKICAgICAgICAgICAgICAgICAgICBpZiAoICROZXdBdHRhY2htZW50eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJE5ld0F0dGFjaG1lbnR7JEtleX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGV4aXN0aW5nIGF0dGFjaG1lbnQgaXMgbm8gbG9uZ2VyIGluIG5ldyBhdHRhY2htZW50cyBoYXNoCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgZXhpc3RpbmcgYXR0YWNobWVudAogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGVsZXRlU3VjY2Vzc2Z1bCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3NmdWwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHZlcnNpb24gYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgICAgICAgICBteSBARXhpc3RpbmdWZXJzaW9uQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgIFZlcnNpb25JRCA9PiAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBGSUxFTkFNRToKICAgICAgICAgICAgICAgIGZvciBteSAkRmlsZW5hbWUgKEBFeGlzdGluZ1ZlcnNpb25BdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgZXhpc3RpbmcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BdHRhY2htZW50R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uSUQgPT4gJENvbmZpZ0l0ZW0tPntWZXJzaW9uSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgdGhlIGtleSBpcyB0aGUgZmlsZW5hbWUgKyBmaWxlc2l6ZSArIGNvbnRlbnQgdHlwZQogICAgICAgICAgICAgICAgICAgICMgKG5vIGNvbnRlbnQgaWQsIGFzIGV4aXN0aW5nIGF0dGFjaG1lbnRzIGRvbid0IGhhdmUgaXQpCiAgICAgICAgICAgICAgICAgICAgbXkgJEtleSA9ICRBdHRhY2htZW50RGF0YS0+e0ZpbGVuYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50RGF0YS0+e0ZpbGVzaXplfQogICAgICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50RGF0YS0+e0NvbnRlbnRUeXBlfTsKCiAgICAgICAgICAgICAgICAgICAgIyBhdHRhY2htZW50IGlzIGFscmVhZHkgZXhpc3RpbmcsIHdlIGNhbiBkZWxldGUgaXQgZnJvbSB0aGUgbmV3IGF0dGFjaG1lbnQgaGFzaAogICAgICAgICAgICAgICAgICAgIGlmICggJE5ld0F0dGFjaG1lbnR7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkTmV3QXR0YWNobWVudHskS2V5fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgZXhpc3RpbmcgYXR0YWNobWVudCBpcyBubyBsb25nZXIgaW4gbmV3IGF0dGFjaG1lbnRzIGhhc2gKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBleGlzdGluZyBhdHRhY2htZW50CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREZWxldGVTdWNjZXNzZnVsID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRDb25maWdJdGVtLT57VmVyc2lvbklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkRGVsZXRlU3VjY2Vzc2Z1bCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgVE9ETzogYmV0dGVyIGFsaWduIHdpdGggdGhlIGluaXRpYWwgRWRpdEZpZWxkVmFsdWVHZXQ/CiAgICAgICAgICAgICMgVE9ETzogVmlzaWJpbGl0eQogICAgICAgICAgICAjIHByZXBhcmUgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoICREeW5hbWljRmllbGRMaXN0LT5AKiApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGQtPntSZWFkb25seX07CgogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gZXEgJ05FVycgKSB7CgogICAgICAgICAgICAgICAgIyBkZWxldGUgdGVtcG9yYXJ5IG51bWJlciAjIFRPRE86IGNoZWNrLCB3aGV0aGVyIHNldHRpbmcgbmV3IGFzIG51bWJlciBpcyBuZWNlc3NhcnkgaW4gdGhlIGZpcnN0IHBsYWNlCiAgICAgICAgICAgICAgICBkZWxldGUgJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwoKICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT4lKiwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAoKICAgICAgICAgICAgICAgICAgICAjIERlZmluaXRpb25JRCA9PiAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0sICMgVE9ETzogdGhpcyBpcyBub3QgdXNlZCB5ZXQKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbS0+JSosCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmZXRjaCB1cGRhdGVkIGNvbmZpZyBpdGVtIGRhdGEgdG8gc2VjdXJlIHZlcnNpb24gaWQgYmVpbmcgcHJlc2VudAogICAgICAgICAgICBteSAkTmV3Q29uZmlnSXRlbURhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB3cml0ZSB0aGUgbmV3IGF0dGFjaG1lbnRzCiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoIHZhbHVlcyAlTmV3QXR0YWNobWVudCApIHsKCiAgICAgICAgICAgICAgICAjIGFkZCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICBpZiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259ICYmICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICROZXdDb25maWdJdGVtRGF0YS0+e1ZlcnNpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhbHNvIHdyaXRlIGF0dGFjaG1lbnRzIHRvIGxhc3QgdmVyc2lvbiBpZiBpdCBkaWZmZXJzIGJlY2F1c2Ugd2UgZGVsZXRlZCB0aGVtIHByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb25maWdJdGVtLT57VmVyc2lvbklEfSAmJiAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH0gIT0gJE5ld0NvbmZpZ0l0ZW1EYXRhLT57VmVyc2lvbklEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkF0dGFjaG1lbnRBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25JRCA9PiAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGZvcm0gZGF0YQogICAgICAgICAgICAkRm9ybUNhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gem9vbSBtYXNrCiAgICAgICAgICAgIG15ICRTY3JlZW5UeXBlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NjcmVlblR5cGUnICkgfHwgMDsKICAgICAgICAgICAgaWYgKCRTY3JlZW5UeXBlKSB7CgogICAgICAgICAgICAgICAgbXkgJFVSTCA9ICJBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Q29uZmlnSXRlbUlEPSRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSI7CgogICAgICAgICAgICAgICAgIyByZXR1cm4gdG8gb3ZlcnZpZXcgb3Igc2VhcmNoIHJlc3VsdHMgaW5zdGVhZCBpZiBjYWxsZWQgRHVwbGljYXRlIGZyb20gcm93IGFjdGlvbgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbn17TGFzdFNjcmVlblZpZXd9IGVxICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbScKICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e1Nlc3Npb259e0xhc3RTY3JlZW5WaWV3fSA9fiBte1xBIEFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtKD86IFNlYXJjaCk/O31tc3gKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFVSTCA9ICRTZWxmLT57U2Vzc2lvbn17TGFzdFNjcmVlblZpZXd9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAkVVJMLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApIHx8ICcnOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHMgPSAkRWxlbWVudENoYW5nZWQgPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gID0gMTAwOwoKICAgICAgICAjIGdldCB2YWx1ZXMgYW5kIHZpc2liaWxpdHkgb2YgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkdldEZpZWxkU3RhdGVzKAogICAgICAgICAgICBDb25maWdJdGVtT2JqZWN0ICAgICAgICAgID0+ICRDb25maWdJdGVtT2JqZWN0LAogICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAgICAgIyBvcHRpb25hbCB0byByZWR1Y2UgQUNMIGV2YWx1YXRpb24KICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4geyVHZXRQYXJhbX0sCiAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICAgICAgICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgIEFDTFByZXNlbGVjdGlvbiAgICAgICAgICAgPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gICAgICAgICAgICA9PiBcJExvb3BQcm90ZWN0aW9uLAogICAgICAgICk7CgogICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gewogICAgICAgICAgICAleyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSB9LAogICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgIH07CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICROYW1lICgga2V5cyAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9ICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9eyROYW1lfTsKCiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317TXVsdGlWYWx1ZX0gJiYgcmVmICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJE5hbWUifSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRpICggMCAuLiAkI3sgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kTmFtZSJ9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICAgICAgICAgICAgICA/ICggJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kTmFtZSJ9WyRpXSAvLyAnJyApCiAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gWyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyROYW1lIn1bJGldIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJE5hbWUgLiAnXycgLiAkaSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJE5hbWUifVskaV0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFkZCB0ZW1wbGF0ZSB2YWx1ZSBmb3Iga2VlcGluZyB0ZW1wbGF0ZXMgaW4gbGluZSB3aXRoIEFDTHMKICAgICAgICAgICAgICAgIGlmICggISREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtOb3RBQ0xSZWR1Y2libGV9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gKAogICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfVGVtcGxhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317RGVmYXVsdFZhbHVlfSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICAgICAgPyAoICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJE5hbWUifSAvLyAnJyApCiAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kTmFtZSJ9LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB8fCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICROYW1lLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyROYW1lIn0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkU2V0RmllbGQgKCB2YWx1ZXMgJER5bkZpZWxkU3RhdGVze1NldHN9LT4lKiApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZXRGaWVsZC0+e0R5bmFtaWNGaWVsZENvbmZpZ307CgogICAgICAgICAgICAjIHRoZSBmcm9udGVuZCBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBpbm5lciBmaWVsZCBpbmNsdWRpbmcgaXRzIGluZGV4IG9yIHRoZSAnX1RlbXBsYXRlJyBzdWZmaXgKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEZyb250ZW5kTmFtZSAoIGtleXMgJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9LT4lKiApIHsKCiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e011bHRpVmFsdWV9ICYmIHJlZiAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRpICggMCAuLiAkI3sgJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtOb3RBQ0xSZWR1Y2libGV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICggJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfVskaV0gLy8gJycgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+IFsgJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfVskaV0gXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRnJvbnRlbmROYW1lIC4gIl8kaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX1bJGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFkZCB0ZW1wbGF0ZSB2YWx1ZSBmb3Iga2VlcGluZyB0ZW1wbGF0ZXMgaW4gbGluZSB3aXRoIEFDTHMKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17Tm90QUNMUmVkdWNpYmxlfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfVGVtcGxhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtEZWZhdWx0VmFsdWV9IC8vICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICAgICAgICAgID8gKCAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9IC8vICcnICkKICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICRGcm9udGVuZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gKSApIHsKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzdHJpY3Rpb25zX1Zpc2liaWxpdHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICRMb29wUHJvdGVjdGlvbiA9IDEwMDsKCiAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bkZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgQ29uZmlnSXRlbU9iamVjdCAgICAgICAgICA9PiAkQ29uZmlnSXRlbU9iamVjdCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPT4gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgICAgID0+IHslR2V0UGFyYW19LAogICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgICAgICAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gICAgICAgICAgID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgIExvb3BQcm90ZWN0aW9uICAgICAgICAgICAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICApOwoKICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICB9OwoKICAgICAgICAlRHluYW1pY0ZpZWxkVmlzaWJpbGl0eSAgICAgPSAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0tPiUqOwogICAgICAgICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcyA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRffXtQb3NzaWJsZVZhbHVlc30gfSBrZXlzICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9LT4lKjsKICAgIH0KCiAgICBteSAkTmFtZUVkaXRhYmxlICAgPSAkTmFtZU1vZHVsZSA/IDAgOiAxOwogICAgbXkgJFJvd05hbWVJbnZhbGlkID0gJENvbmZpZ0l0ZW0tPntOYW1lfQoKICAgICAgICAjIElmIGEgbmFtZSBleGlzdHMgdGhlbiBtYXJrIHJlZ2V4IGFuZCBkdXBsaWNhdGUgZXJyb3JzLgogICAgICAgID8gKCAoICRDSU5hbWVSZWdleEVycm9yTWVzc2FnZSB8fCBJc0FycmF5UmVmV2l0aERhdGEoJE5hbWVEdXBsaWNhdGVzKSApID8gJ1NlcnZlckVycm9yJyA6IHVuZGVmICkKCiAgICAgICAgIyBJZiB0aGUgbmFtZSBkb2VzIG5vdCBleGlzdCBidXQgc2hvdWxkIGV4aXN0IHRoZW4gbWFyayBpdC4KICAgICAgICA6ICggKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICYmICROYW1lRWRpdGFibGUgKSA/ICdTZXJ2ZXJFcnJvcicgOiB1bmRlZiApOwoKICAgICMgb3V0cHV0IG5hbWUgYmxvY2sKICAgIGlmICggJENvbmZpZ0l0ZW0tPntOYW1lfSB8fCAkTmFtZUVkaXRhYmxlICkgewoKICAgICAgICAjIG91dHB1dCBuYW1lIGJsb2NrCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd05hbWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFJvd05hbWVJbnZhbGlkID0+ICRSb3dOYW1lSW52YWxpZCwKICAgICAgICAgICAgICAgIFJlYWRvbmx5ICAgICAgID0+ICEkTmFtZUVkaXRhYmxlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHNwZWNpZmljIGVycm9ycwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE5hbWVEdXBsaWNhdGVzKSApIHsKCiAgICAgICAgIyBidWlsZCBhcnJheSB3aXRoIENJLU51bWJlcnMKICAgICAgICBteSBATmFtZUR1cGxpY2F0ZXNCeUNJTnVtYmVyOwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHskTmFtZUR1cGxpY2F0ZXN9ICkgewoKICAgICAgICAgICAgIyBsb29rdXAgdGhlIENJIG51bWJlcgogICAgICAgICAgICBteSAkQ0lOdW1iZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBATmFtZUR1cGxpY2F0ZXNCeUNJTnVtYmVyLCAkQ0lOdW1iZXI7CiAgICAgICAgfQoKICAgICAgICBteSAkRHVwbGljYXRlU3RyaW5nID0gam9pbiAnLCAnLCBATmFtZUR1cGxpY2F0ZXNCeUNJTnVtYmVyOwoKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPntEZWJ1Z30gPiAwICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAiUmVuZGVyaW5nIGJsb2NrIGZvciBkdXBsaWNhdGVzIChDSS1OdW1iZXJzOiAkRHVwbGljYXRlU3RyaW5nKSBlcnJvciBtZXNzYWdlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3dOYW1lRXJyb3JEdXBsaWNhdGVzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEdXBsaWNhdGVzID0+ICREdXBsaWNhdGVTdHJpbmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgkQ0lOYW1lUmVnZXhFcnJvck1lc3NhZ2UpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93TmFtZUVycm9yUmVnRXgnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFJlZ0V4RXJyb3JNZXNzYWdlID0+ICRDSU5hbWVSZWdleEVycm9yTWVzc2FnZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCRSb3dOYW1lSW52YWxpZCkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVuZGVyaW5nIGRlZmF1bHQgZXJyb3IgYmxvY2siLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd05hbWVFcnJvckRlZmF1bHQnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFZlcnNpb25TdHJpbmdFZGl0YWJsZSAgID0gJFZlcnNpb25TdHJpbmdNb2R1bGUgPyAwIDogMTsKICAgIG15ICRWZXJzaW9uU3RyaW5nRHVwbGljYXRlcyA9IFtdOwogICAgbXkgJFJvd1ZlcnNpb25TdHJpbmdJbnZhbGlkID0gJENvbmZpZ0l0ZW0tPntWZXJzaW9uU3RyaW5nfQoKICAgICAgICAjIElmIGEgdmVyc2lvbiBzdHJpbmcgZXhpc3RzIHRoZW4gbWFyayBkdXBsaWNhdGUgZXJyb3JzLgogICAgICAgID8gKCBJc0FycmF5UmVmV2l0aERhdGEoJFZlcnNpb25TdHJpbmdEdXBsaWNhdGVzKSA/ICdTZXJ2ZXJFcnJvcicgOiB1bmRlZiApCgogICAgICAgICMgSWYgdGhlIHZlcnNpb24gc3RyaW5nIGRvZXMgbm90IGV4aXN0IGJ1dCBzaG91bGQgZXhpc3QgdGhlbiBtYXJrIGl0LgogICAgICAgIDogKCAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgJiYgJFZlcnNpb25TdHJpbmdFZGl0YWJsZSApID8gJ1NlcnZlckVycm9yJyA6IHVuZGVmICk7CgogICAgIyBvdXRwdXQgdmVyc2lvbiBzdHJpbmcgYmxvY2sKICAgIGlmICgkVmVyc2lvblN0cmluZ0VkaXRhYmxlKSB7CgogICAgICAgICMgb3V0cHV0IHZlcnNpb24gc3RyaW5nIGJsb2NrCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd1ZlcnNpb25TdHJpbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFJvd1ZlcnNpb25TdHJpbmdJbnZhbGlkID0+ICRSb3dWZXJzaW9uU3RyaW5nSW52YWxpZCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzcGVjaWZpYyBlcnJvcnMKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRWZXJzaW9uU3RyaW5nRHVwbGljYXRlcykgKSB7CgogICAgICAgICMgYnVpbGQgYXJyYXkgd2l0aCBDSS1OdW1iZXJzCiAgICAgICAgbXkgQFZlcnNpb25TdHJpbmdEdXBsaWNhdGVzQnlDSU51bWJlcjsKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JFZlcnNpb25TdHJpbmdEdXBsaWNhdGVzfSApIHsKCiAgICAgICAgICAgICMgbG9va3VwIHRoZSBDSSBudW1iZXIKICAgICAgICAgICAgbXkgJENJTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1Mb29rdXAoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQFZlcnNpb25TdHJpbmdEdXBsaWNhdGVzQnlDSU51bWJlciwgJENJTnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgbXkgJER1cGxpY2F0ZVN0cmluZyA9IGpvaW4gJywgJywgQFZlcnNpb25TdHJpbmdEdXBsaWNhdGVzQnlDSU51bWJlcjsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIlJlbmRlcmluZyBibG9jayBmb3IgZHVwbGljYXRlcyAoQ0ktTnVtYmVyczogJER1cGxpY2F0ZVN0cmluZykgZXJyb3IgbWVzc2FnZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93VmVyc2lvblN0cmluZ0Vycm9yRHVwbGljYXRlcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRHVwbGljYXRlcyA9PiAkRHVwbGljYXRlU3RyaW5nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoJFJvd1ZlcnNpb25TdHJpbmdJbnZhbGlkKSB7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZW5kZXJpbmcgZGVmYXVsdCBlcnJvciBibG9jayIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93VmVyc2lvblN0cmluZ0Vycm9yRGVmYXVsdCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZSBpbnZhbGlkIGJsb2NrCiAgICBteSAkUm93RGVwbFN0YXRlSW52YWxpZCA9ICcnOwogICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntEZXBsU3RhdGVJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKICAgICAgICAkUm93RGVwbFN0YXRlSW52YWxpZCA9ICcgU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2VuZXJhdGUgRGVwbFN0YXRlT3B0aW9uU3RyZwogICAgbXkgJERlcGxTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJERlcGxTdGF0ZUxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZXBsU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdGb3JtVXBkYXRlIFZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZScgLiAkUm93RGVwbFN0YXRlSW52YWxpZCwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0RlcGxTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZSBibG9jawogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUm93RGVwbFN0YXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRGVwbFN0YXRlT3B0aW9uU3RyZyA9PiAkRGVwbFN0YXRlT3B0aW9uU3RyZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdvcGVyYXRpb25hbCcsICdpbmNpZGVudCcgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBpbmNpZGVudCBzdGF0ZSBpbnZhbGlkIGJsb2NrCiAgICBteSAkUm93SW5jaVN0YXRlSW52YWxpZCA9ICcnOwogICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntJbmNpU3RhdGVJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKICAgICAgICAkUm93SW5jaVN0YXRlSW52YWxpZCA9ICcgU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2VuZXJhdGUgSW5jaVN0YXRlT3B0aW9uU3RyZwogICAgbXkgJEluY2lTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdJbmNpU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdGb3JtVXBkYXRlIFZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZScgLiAkUm93SW5jaVN0YXRlSW52YWxpZCwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0luY2lTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgaW5jaWRlbnQgc3RhdGUgYmxvY2sKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Jvd0luY2lTdGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2lTdGF0ZU9wdGlvblN0cmcgPT4gJEluY2lTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgfSwKICAgICk7CgojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgIyBvdXRwdXQgZ3JvdXAgYmxvY2sKICAgIG15ICRHcm91cENvbmZpZzsKICAgIGlmICggJENsYXNzUHJlZmVyZW5jZXN7Q29uZmlnSXRlbUdyb3VwfSAmJiAkQ2xhc3NQcmVmZXJlbmNlc3tDb25maWdJdGVtR3JvdXB9WzBdICkgewogICAgICAgICRHcm91cENvbmZpZyA9ICRDbGFzc1ByZWZlcmVuY2Vze0NvbmZpZ0l0ZW1Hcm91cH1bMF07CiAgICB9CiAgICBpZiAoJEdyb3VwQ29uZmlnKSB7CiAgICAgICAgbXkgJEdyb3VwTGlzdDsKICAgICAgICBteSAlQXV0aEdyb3Vwc0xpc3QgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gInJ3IiwKICAgICAgICApOwogICAgICAgIG15ICRNYW5hZ2VtZW50R3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Db25maWdJdGVtTWFuYWdlbWVudEdyb3VwIik7CiAgICAgICAgaWYgKCAkTWFuYWdlbWVudEdyb3VwICYmIGdyZXAgeyAkXyBlcSAkTWFuYWdlbWVudEdyb3VwIH0gdmFsdWVzICVBdXRoR3JvdXBzTGlzdCApIHsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc0xpc3QgPSAkR3JvdXBPYmplY3QtPkdyb3VwTGlzdCgKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHcm91cExpc3QgPSBcJUFsbEdyb3Vwc0xpc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR3JvdXBMaXN0ID0gXCVBdXRoR3JvdXBzTGlzdDsKICAgICAgICB9CgogICAgICAgIG15ICRWYWxpZEdyb3Vwc0xpc3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbmZpZ0l0ZW1NdWx0aXRlbmFuY3k6OlZhbGlkR3JvdXBzJyk7CiAgICAgICAgaWYgKCRWYWxpZEdyb3Vwc0xpc3QpIHsKICAgICAgICAgICAgZm9yIG15ICRHcm91cElEICgga2V5cyAkR3JvdXBMaXN0LT4lKiApIHsKICAgICAgICAgICAgICAgIGlmICggIWFueSB7ICRfIGVxICRHcm91cExpc3QtPnskR3JvdXBJRH0gfSAkVmFsaWRHcm91cHNMaXN0LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEdyb3VwTGlzdC0+eyRHcm91cElEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEludmFsaWRHcm91cHNMaXN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb25maWdJdGVtTXVsdGl0ZW5hbmN5OjpJbnZhbGlkR3JvdXBzJyk7CiAgICAgICAgaWYgKCRJbnZhbGlkR3JvdXBzTGlzdCkgewogICAgICAgICAgICBmb3IgbXkgJEdyb3VwSUQgKCBrZXlzICRHcm91cExpc3QtPiUqICkgewogICAgICAgICAgICAgICAgaWYgKCBhbnkgeyAkXyBlcSAkR3JvdXBMaXN0LT57JEdyb3VwSUR9IH0gJEludmFsaWRHcm91cHNMaXN0LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEdyb3VwTGlzdC0+eyRHcm91cElEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgZ3JvdXAgaW52YWxpZCBibG9jawogICAgICAgIG15ICRSb3dHcm91cEludmFsaWQgPSAnJzsKICAgICAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CiAgICAgICAgICAgIGlmICggJEdyb3VwQ29uZmlnID09IDIgJiYgISRDb25maWdJdGVtLT57R3JvdXBJRH0gKSB7CiAgICAgICAgICAgICAgICAkUm93R3JvdXBJbnZhbGlkID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ29uZmlnSXRlbS0+e0dyb3VwSUR9ICYmICFhbnkgeyAkXyBlcSAkQ29uZmlnSXRlbS0+e0dyb3VwSUR9IH0ga2V5cyAkR3JvdXBMaXN0LT4lKiApIHsKICAgICAgICAgICAgICAgICRSb3dHcm91cEludmFsaWQgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFZhbGlkYXRlUmVxdWlyZWQgPSAkR3JvdXBDb25maWcgPT0gMiA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcgOiAnJzsKCiAgICAgICAgIyBnZW5lcmF0ZSBHcm91cE9wdGlvblN0cmcKICAgICAgICBteSAkR3JvdXBPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkR3JvdXBMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0dyb3VwSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICJGb3JtVXBkYXRlICRWYWxpZGF0ZVJlcXVpcmVkIE1vZGVybml6ZSAkUm93R3JvdXBJbnZhbGlkIiwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtHcm91cElEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBncm91cCBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3dHcm91cCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgR3JvdXBPcHRpb25TdHJnID0+ICRHcm91cE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnlDbGFzcyAgPT4gJEdyb3VwQ29uZmlnID09IDIgPyAnTWFuZGF0b3J5JyA6ICcnLAogICAgICAgICAgICAgICAgTWFya2VyICAgICAgICAgID0+ICRHcm91cENvbmZpZyA9PSAyID8gJyonICAgICAgICAgOiAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgIyBnZW5lcmF0ZSBiYXNlIHVybAogICAgbXkgJFVSTCA9ICJBY3Rpb249UGljdHVyZVVwbG9hZDtGb3JtSUQ9JFNlbGYtPntGb3JtSUR9O0NvbnRlbnRJRD0iOwoKICAgICMgcmVwbGFjZSBsaW5rcyB0byBpbmxpbmUgaW1hZ2VzIGluIGh0bWwgY29udGVudAogICAgbXkgQElubGluZUF0dGFjaG1lbnRMaXN0OwogICAgaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB7CiAgICAgICAgQElubGluZUF0dGFjaG1lbnRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BdHRhY2htZW50TGlzdCgKICAgICAgICAgICAgVmVyc2lvbklEID0+ICRDb25maWdJdGVtLT57VmVyc2lvbklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggYXR0YWNobWVudCBkYXRhIGFuZCBzdG9yZSBpbiBoYXNoIGZvciBSaWNoVGV4dERvY3VtZW50U2VydmUKICAgIG15ICVJbmxpbmVBdHRhY2htZW50czsKICAgIEZJTEVOQU1FOgogICAgZm9yIG15ICRGaWxlbmFtZSAoQElubGluZUF0dGFjaG1lbnRMaXN0KSB7CiAgICAgICAgbXkgJEZpbGVEYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BdHRhY2htZW50R2V0KAogICAgICAgICAgICBWZXJzaW9uSUQgPT4gJENvbmZpZ0l0ZW0tPntWZXJzaW9uSUR9LAogICAgICAgICAgICBGaWxlbmFtZSAgPT4gJEZpbGVuYW1lLAogICAgICAgICk7CgogICAgICAgICRJbmxpbmVBdHRhY2htZW50c3sgJEZpbGVEYXRhLT57UHJlZmVyZW5jZXN9e0NvbnRlbnRJRH0gfSA9ICRGaWxlRGF0YTsKICAgICAgICAkSW5saW5lQXR0YWNobWVudHN7ICRGaWxlRGF0YS0+e1ByZWZlcmVuY2VzfXtDb250ZW50SUR9IH0tPntDb250ZW50SUR9ID0gJEZpbGVEYXRhLT57UHJlZmVyZW5jZXN9e0NvbnRlbnRJRH07CgogICAgICAgICMgYWRkIHVwbG9hZGVkIGZpbGUgdG8gdXBsb2FkIGNhY2hlCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlRGF0YS0+e0ZpbGVuYW1lfSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEZpbGVEYXRhLT57Q29udGVudH0sCiAgICAgICAgICAgIENvbnRlbnRJRCAgID0+ICRGaWxlRGF0YS0+e1ByZWZlcmVuY2VzfXtDb250ZW50SUR9LAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkRmlsZURhdGEtPntDb250ZW50VHlwZX0sCgogICAgICAgICAgICAjIGN1cnJlbnRseSwgb25seSBpbmxpbmUgaW1hZ2VzIGZvciBkZXNjcmlwdGlvbiBhcmUgc3RvcmVkIGF0IHRoZSBjb25maWdpdGVtIHZlcnNpb24KICAgICAgICAgICAgIyAgIHNvIHdlIGNhbiByZWx5IHVwb24gZGVhbGluZyB3aXRoIGlubGluZSBpbWFnZXMgaGVyZQogICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgbmVlZGVkIHRvIHByb3ZpZGUgbmVjZXNzYXJ5IHBhcmFtcyBmb3IgUmljaFRleHREb2N1bWVudFNlcnZlCiAgICBteSAkRmllbGRDb250ZW50ID0gJENvbmZpZ0l0ZW0tPntEZXNjcmlwdGlvbn07CiAgICBteSAlRGF0YSAgICAgICAgID0gKAogICAgICAgIENvbnRlbnQgICAgID0+ICRGaWVsZENvbnRlbnQgLy8gJycsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0idXRmLTgiJywKICAgICAgICBEaXNwb3NpdGlvbiA9PiAnaW5saW5lJywKICAgICk7CgogICAgIyByZWZvcm1hdCByaWNoIHRleHQgZG9jdW1lbnQgdG8gaGF2ZSBjb3JyZWN0IGNoYXJzZXQgYW5kIGxpbmtzIHRvCiAgICAjIGlubGluZSBkb2N1bWVudHMKICAgICVEYXRhID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudFNlcnZlKAogICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgVVJMICAgICAgICAgICAgICAgID0+ICRVUkwsCiAgICAgICAgQXR0YWNobWVudHMgICAgICAgID0+IFwlSW5saW5lQXR0YWNobWVudHMsCiAgICAgICAgTG9hZEV4dGVybmFsSW1hZ2VzID0+IDEsCiAgICApOwoKICAgICRGaWVsZENvbnRlbnQgPSAkRGF0YXtDb250ZW50fTsKCiAgICAjIHJlbW92ZSBhY3RpdmUgaHRtbCBjb250ZW50IChzY3JpcHRzLCBhcHBsZXRzLCBldGMuLi4pCiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwogICAgbXkgJVNhZmVDb250ZW50ICAgICA9ICRIVE1MVXRpbHNPYmplY3QtPlNhZmV0eSgKICAgICAgICBTdHJpbmcgICAgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICBOb0VtYmVkICAgICAgPT4gMSwKICAgICAgICBOb0ludFNyY0xvYWQgPT4gMCwKICAgICAgICBOb0V4dFNyY0xvYWQgPT4gMCwKICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICk7CgogICAgIyB0YWtlIHRoZSBzYWZlIGNvbnRlbnQgaWYgbmVjZXNzYXJ5CiAgICBpZiAoICRTYWZlQ29udGVudHtSZXBsYWNlfSApIHsKICAgICAgICAkRmllbGRDb250ZW50ID0gJFNhZmVDb250ZW50e1N0cmluZ307CiAgICB9CgogICAgIyBkZXRlY3QgYWxsIHBsYWluIHRleHQgbGlua3MgYW5kIHB1dCB0aGVtIGludG8gYW4gSFRNTCA8YT4gdGFnCiAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgIFN0cmluZyA9PiAkRmllbGRDb250ZW50LAogICAgKTsKCiAgICAjIHNldCB0YXJnZXQ9Il9ibGFuayIgYXR0cmlidXRlIHRvIGFsbCBIVE1MIDxhPiB0YWdzCiAgICAjIHRoZSBMaW5rUXVvdGUgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluCiAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgIFN0cmluZyAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgIFRhcmdldEFkZCA9PiAxLAogICAgKTsKCiAgICAjIGFkZCBuZWVkZWQgSFRNTCBoZWFkZXJzCiAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICBTdHJpbmcgID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgQ2hhcnNldCA9PiAndXRmLTgnLAogICAgKTsKCiAgICAjIGVzY2FwZSBzaW5nbGUgcXVvdGVzCiAgICAkRmllbGRDb250ZW50ID1+IHMvJy8mIzM5Oy9nOwoKICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICBteSAkRHluYW1pY0ZpZWxkSFRNTDsKICAgIG15ICVHcm91cExvb2t1cDsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICREZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0gKSAmJiAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9e1NlY3Rpb25zfSApIHsKCiAgICAgICAgIyBUT0RPOiBsb29rIHdoYXQgdGhpcyB3YXMvaXMgYWJvdXQKICAgICAgICAjICAgICAgICAkU2VsZi0+e0N1c3RvbWVyU2VhcmNoSXRlbUlEc30gPSBbXTsKCiAgICAgICAgIyBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHN3aXRjaCBiZXR3ZWVuIHBhZ2VzIGZvciB0aGUgZWRpdCBtYXNrLCB0b28uIEtlZXBpbmcgdGhlIGZpZWxkcyBpbiBzeW5jCiAgICAgICAgIyAgICAgICB3aGlsZSBlZGl0aW5nIG5lZWRzIGEgYml0IG1vcmUgcHJlcGFyYXRpb24gdGhvdWdoCiAgICAgICAgIyBUaHVzIGZvciBub3cgbWFrZSBzdXJlIHRvIHNob3cgZHluYW1pYyBmaWVsZHMgb25seSBvbmNlLCBldmVuIGlmIHByZXNlbnQgb24gbXVsdGlwbGUgcGFnZXMvc2VjdGlvbnMKICAgICAgICBteSAkRmllbGRzU2VlbiA9IHt9OwogICAgICAgIG15ICRTaG93RGVzY3JpcHRpb247CiAgICAgICAgbXkgQFBhZ2VIVE1MOwogICAgICAgIG15ICRTZWN0aW9uSGVhZGVyVGVtcGxhdGUgPSAnPGRpdiBjbGFzcz0iUm93IFJvd19TZWN0aW9uSGVhZGVyIj48aDM+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9oMz48L2Rpdj4nOwoKICAgICAgICBQQUdFOgogICAgICAgIGZvciBteSAkUGFnZSAoICREZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn17UGFnZXN9LT5AKiApIHsKCiAgICAgICAgICAgICMgSW50ZXJmYWNlcyBpcyBvcHRpb25hbCwgZWZmZWN0aXZlbHkgZGVmYXVsdCB0byBbICdBZ2VudCcgXQogICAgICAgICAgICBpZiAoICRQYWdlLT57SW50ZXJmYWNlc30gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFBBR0UgdW5sZXNzIGFueSB7ICRfIGVxICdBZ2VudCcgfSAkUGFnZS0+e0ludGVyZmFjZXN9LT5AKjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFnZS0+e0dyb3Vwc30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICElR3JvdXBMb29rdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgJUdyb3VwTG9va3VwID0gcmV2ZXJzZSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBncmFudCBhY2Nlc3MgdG8gdGhlIHBhZ2Ugb25seSB3aGVuIHRoZSB1c2VyIGlzIGluIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGdyb3VwcwogICAgICAgICAgICAgICAgbmV4dCBQQUdFIHVubGVzcyBhbnkgeyAkR3JvdXBMb29rdXB7JF99IH0gJFBhZ2UtPntHcm91cHN9LT5AKjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFBhZ2VEeW5hbWljRmllbGRIVE1MOwoKICAgICAgICAgICAgU0VDVElPTjoKICAgICAgICAgICAgZm9yIG15ICRTZWN0aW9uQ29uZmlnICggJFBhZ2UtPntDb250ZW50fS0+QCogKSB7CiAgICAgICAgICAgICAgICBteSAkU2VjdGlvbiA9ICREZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn17U2VjdGlvbnN9eyAkU2VjdGlvbkNvbmZpZy0+e1NlY3Rpb259IH07CgogICAgICAgICAgICAgICAgbmV4dCBTRUNUSU9OIHVubGVzcyAkU2VjdGlvbjsKICAgICAgICAgICAgICAgIGlmICggJFNlY3Rpb24tPntUeXBlfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWN0aW9uLT57VHlwZX0gZXEgJ0Rlc2NyaXB0aW9uJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNob3dEZXNjcmlwdGlvbiA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFNFQ1RJT047CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFNlY3Rpb24tPntUeXBlfSBuZSAnRHluYW1pY0ZpZWxkcycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgU0VDVElPTjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB3ZWVkIG91dCBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiBkeW5hbWljIGZpZWxkcyAtIHNlZSBjb21tZW50IGFib3ZlCiAgICAgICAgICAgICAgICAkU2VjdGlvbi0+e0NvbnRlbnR9ID0gJFNlbGYtPl9EaXNjYXJkRmllbGRzU2VlbigKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRTZWN0aW9uLT57Q29udGVudH0sCiAgICAgICAgICAgICAgICAgICAgU2VlbiAgICA9PiAkRmllbGRzU2VlbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBkbyBub3QgcHJvY2VlZCBpZiBjb250ZW50IGlzIGVtcHR5CiAgICAgICAgICAgICAgICBuZXh0IFNFQ1RJT04gdW5sZXNzICRTZWN0aW9uLT57Q29udGVudH0tPkAqOwoKICAgICAgICAgICAgICAgIG15ICRIVE1MID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkR5bmFtaWNGaWVsZDo6TWFzaycpLT5FZGl0U2VjdGlvblJlbmRlcigKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICA9PiAkU2VjdGlvbi0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+ICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfSwKICAgICAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgICAgICA9PiBcQFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZFZpc2liaWxpdHksCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzfSwKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0tPiUqLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgU0VDVElPTiB1bmxlc3MgJEhUTUwgPX4gL1x3LzsKCiAgICAgICAgICAgICAgICBteSAoJFNlY3Rpb25IZWFkZXIpID0gZ3JlcCB7ICRfLT57SGVhZGVyfSB9ICRTZWN0aW9uLT57Q29udGVudH0tPkAqOwogICAgICAgICAgICAgICAgaWYgKCRTZWN0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhZ2VEeW5hbWljRmllbGRIVE1MIC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlY3Rpb25IZWFkZXJUZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkU2VjdGlvbkhlYWRlci0+e0hlYWRlcn0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGFnZUR5bmFtaWNGaWVsZEhUTUwgLj0gJEhUTUw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgUEFHRSB1bmxlc3MgJFBhZ2VEeW5hbWljRmllbGRIVE1MOwoKICAgICAgICAgICAgcHVzaCBAUGFnZUhUTUwsIHsKICAgICAgICAgICAgICAgIEhUTUwgPT4gJFBhZ2VEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFnZS0+e05hbWV9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgQEFjdGl2ZUR5bmFtaWNGaWVsZHMgPSAoIGtleXMgJEZpZWxkc1NlZW4tPiUqICk7CgogICAgICAgICMgc3RvcmUgdGhlIGFjdGl2ZSBkeW5hbWljIGZpZWxkcywgdG8gb25seSB2YWxpZGF0ZSB0aG9zZQogICAgICAgICRGb3JtQ2FjaGVPYmplY3QtPlNldEZvcm1EYXRhKAogICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgS2V5ICAgICAgICAgID0+ICdBY3RpdmVEeW5hbWljRmllbGRzJywKICAgICAgICAgICAgVmFsdWUgICAgICAgID0+IFxAQWN0aXZlRHluYW1pY0ZpZWxkcywKICAgICAgICApOwoKICAgICAgICBpZiAoIHNjYWxhciBAUGFnZUhUTUwgPiAxICkgewogICAgICAgICAgICBteSAkSGVhZGVyVGVtcGxhdGUgPQogICAgICAgICAgICAgICAgJzxzdW1tYXJ5PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19QYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgICAgICA8aHIvPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc3VtbWFyeT4nOwoKICAgICAgICAgICAgZm9yIG15ICRQYWdlIChAUGFnZUhUTUwpIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MIC49ICc8ZGV0YWlscyBjbGFzcz0iUGFnZUNvbnRlbnQiPic7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEhlYWRlclRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFnZS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUwgLj0gJFBhZ2UtPntIVE1MfTsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MIC49ICc8L2RldGFpbHM+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRTaG93RGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MIC49ICc8ZGV0YWlscyBjbGFzcz0iUGFnZUNvbnRlbnQiPic7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEhlYWRlclRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmIChAUGFnZUhUTUwpIHsKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUwgLj0gJFBhZ2VIVE1MWzBde0hUTUx9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaG93RGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSb3dEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkRmllbGRDb250ZW50IC8vICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEFsbEF0dGFjaG1lbnRzTGlzdCA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgZXhjbHVkZSBpbmxpbmUgYXR0YWNobWVudHMgYXMgdGhleSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5CiAgICAkUGFyYW17QXR0YWNobWVudExpc3R9ID0gWyBncmVwIHsgJF8tPntEaXNwb3NpdGlvbn0gbmUgJ2lubGluZScgfSBAQWxsQXR0YWNobWVudHNMaXN0IF07CgogICAgIyBUT0RPIG1heWJlIHJlc3RyaWN0IHRoaXMgdG8gb25seSBpZiBkZiByaWNodGV4dCBhcmUgdG8gYmUgZGlzcGxheWVkCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkU2VsZi0+e0NvbmZpZ317UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gJiYgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IG5lICdORVcnICkgfHwgJER1cGxpY2F0ZUlEICkgewoKICAgICAgICAjIG91dHB1dCBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFydFNtYWxsJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdFbmRTbWFsbCcgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgcmV0dXJuIGpvaW4gJycsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRWRpdCcpLAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtRWRpdCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+ICREeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgICAgIER1cGxpY2F0ZUlEICAgICAgPT4gJER1cGxpY2F0ZUlELAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIE5lY2Vzc2FyeSBzdHVmZiBmb3IgQWRkIE5ldwogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCiAgICAgICAgZm9yIG15ICRDbGFzc0lEICggc29ydCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CiAgICAgICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBTY29wZSAgID0+ICdDbGFzcycsCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBkZWxldGUgJENsYXNzTGlzdC0+eyRDbGFzc0lEfSBpZiAhJEhhc0FjY2VzczsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1cxMDBwYycsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICk7CgogICAgICAgICMgRW5kIE5lY2Vzc2FyeSBzdHVmZiBmb3IgQWRkIE5ldwoKICAgICAgICAjIG91dHB1dCBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFydE5vcm1hbCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRW5kTm9ybWFsJyApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAgICAgJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFZGl0JyksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiAkRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgICAgICAgICBEdXBsaWNhdGVJRCAgICAgID0+ICREdXBsaWNhdGVJRCwKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZvb3RlcjsKICAgIH0KfQoKc3ViIF9EaXNjYXJkRmllbGRzU2VlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb250ZW50OwogICAgbXkgJFJlZiA9IHJlZiAkUGFyYW17Q29udGVudH07CgogICAgaWYgKCAkUmVmIGVxICdBUlJBWScgKSB7CiAgICAgICAgbXkgQENsZWFuZWRBcnJheTsKCiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCAkUGFyYW17Q29udGVudH0tPkAqICkgewogICAgICAgICAgICBteSAkUmVmRWxlbWVudCA9IHJlZiAkRWxlbWVudDsKCiAgICAgICAgICAgIGlmICggJFJlZkVsZW1lbnQgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQENsZWFuZWRBcnJheSwgJFNlbGYtPl9EaXNjYXJkRmllbGRzU2VlbigKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIFNlZW4gICAgPT4gJFBhcmFte1NlZW59LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2lmICggJFJlZkVsZW1lbnQgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgaWYgKCAhJEVsZW1lbnQtPntERn0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQ2xlYW5lZEFycmF5LCAkU2VsZi0+X0Rpc2NhcmRGaWVsZHNTZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICBTZWVuICAgID0+ICRQYXJhbXtTZWVufSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17U2Vlbn17ICRFbGVtZW50LT57REZ9IH0rKyApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQENsZWFuZWRBcnJheSwgJEVsZW1lbnQ7CiAgICAgICAgfQoKICAgICAgICAkQ29udGVudCA9IFxAQ2xlYW5lZEFycmF5OwogICAgfQoKICAgIGVsc2lmICggJFJlZiBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUNsZWFuZWRIYXNoOwoKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJFBhcmFte0NvbnRlbnR9LT4lKiApIHsKICAgICAgICAgICAgJENsZWFuZWRIYXNoeyRLZXl9ID0gJFNlbGYtPl9EaXNjYXJkRmllbGRzU2VlbigKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFBhcmFte0NvbnRlbnR9eyRLZXl9LAogICAgICAgICAgICAgICAgU2VlbiAgICA9PiAkUGFyYW17U2Vlbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQ29udGVudCA9IFwlQ2xlYW5lZEhhc2g7CiAgICB9CgogICAgZWxzZSB7CiAgICAgICAgJENvbnRlbnQgPSAkUGFyYW17Q29udGVudH07CiAgICB9CgogICAgcmV0dXJuICRDb250ZW50Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AgentITSMConfigItemSearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKdXNlIExpc3Q6OlV0aWwgcXcoYW55IHVuaXEpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgbmVjZXNzYXJ5IG9iamVjdHMKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFNlYXJjaFByb2ZpbGVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlYXJjaFByb2ZpbGUnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyB1c2UgY29sdW1uIGNvbmZpZ3MgZnJvbSBBZ2VudElUU01Db25maWdJdGVtCiAgICAkU2VsZi0+e0NvbmZpZ317Q2xhc3NDb2x1bW5zQXZhaWxhYmxlfSA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtJyktPntDbGFzc0NvbHVtbnNBdmFpbGFibGV9OwogICAgJFNlbGYtPntDb25maWd9e0NsYXNzQ29sdW1uc0RlZmF1bHR9ICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbScpLT57Q2xhc3NDb2x1bW5zRGVmYXVsdH07CgogICAgIyBnZXQgY29uZmlnIGRhdGEKICAgICRTZWxmLT57U3RhcnRIaXR9ICAgID0gaW50KCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhcnRIaXQnICkgfHwgMSApOwogICAgJFNlbGYtPntTZWFyY2hMaW1pdH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTZWFyY2hMaW1pdH0gfHwgMTAwMDA7CiAgICAkU2VsZi0+e1NvcnRCeX0gICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnTnVtYmVyJzsKICAgICRTZWxmLT57T3JkZXJCeX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ0Rvd24nOwogICAgJFNlbGYtPntQcm9maWxlfSAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJvZmlsZScgKSAgICAgfHwgJyc7CiAgICAkU2VsZi0+e1NhdmVQcm9maWxlfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTYXZlUHJvZmlsZScgKSB8fCAnJzsKICAgICRTZWxmLT57VGFrZUxhc3RTZWFyY2h9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Rha2VMYXN0U2VhcmNoJyApOwoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMgb24gdGhlIGNsYXNzZXMKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBkZWxldGUgJENsYXNzTGlzdC0+eyRDbGFzc0lEfSBpZiAhJEhhc0FjY2VzczsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBpZAogICAgbXkgJENsYXNzSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICAjIGNoZWNrIGlmIGNsYXNzIGlkIGlzIHZhbGlkCiAgICBpZiAoICRDbGFzc0lEICYmICEkQ2xhc3NMaXN0LT57JENsYXNzSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0ludmFsaWQgQ2xhc3NJRCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2luZ2xlIHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgbXkgJERlZmluaXRpb247CgogICAgaWYgKCRDbGFzc0lEKSB7CgogICAgICAgICMgc2V0IGZpbHRlciBwYXJhbXMgZm9yIHNob3dpbmcgY29ycmVjdCBjb2x1bW5zCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJENsYXNzTGlzdC0+eyRDbGFzc0lEfTsKICAgICAgICAkU2VsZi0+e0ZpbHRlcnN9LT4lKiA9IG1hcCB7CiAgICAgICAgICAgICRfID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJF8sCiAgICAgICAgICAgIH0KICAgICAgICB9IHZhbHVlcyAkQ2xhc3NMaXN0LT4lKjsKCiAgICAgICAgIyBnZXQgY3VycmVudCBkZWZpbml0aW9uCiAgICAgICAgJERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICAjIGFib3J0LCBpZiBubyBkZWZpbml0aW9uIGlzIGRlZmluZWQKICAgICAgICBpZiAoICEkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnLCAkQ2xhc3NJRCApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVNldElubmVyRmllbGRzOwogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0tPiUqICkgewoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gZXEgJ1NldCc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0FycmF5UmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0luY2x1ZGV9ICk7CgogICAgICAgICAgICAjIGl0ZXJhdGUgdGhlIGVudGlyZSBJbmNsdWRlIHN0cnVjdHVyZSB0byBnZXQgdGhlIHZlcnNpb25lZCBkeW5hbWljIGZpZWxkIGNvbmZpZ3MKICAgICAgICAgICAgSU5DTFVERUVMRU1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkSW5jbHVkZUVsZW1lbnQgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtJbmNsdWRlfS0+QCogKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkSW5jbHVkZUVsZW1lbnQtPntERn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEluY2x1ZGVFbGVtZW50LT57RGVmaW5pdGlvbn17TGFiZWx9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICkgLiAnOjonCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSW5jbHVkZUVsZW1lbnQtPntEZWZpbml0aW9ufXtMYWJlbH0gKTsKICAgICAgICAgICAgICAgICAgICAkU2V0SW5uZXJGaWVsZHN7ICRJbmNsdWRlRWxlbWVudC0+e0RGfSB9ID0gJEluY2x1ZGVFbGVtZW50LT57RGVmaW5pdGlvbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRJbmNsdWRlRWxlbWVudC0+e0dyaWR9ICkgewoKICAgICAgICAgICAgICAgICAgICBuZXh0IElOQ0xVREVFTEVNRU5UIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSggJEluY2x1ZGVFbGVtZW50LT57R3JpZH0gKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IElOQ0xVREVFTEVNRU5UIHVubGVzcyBJc0FycmF5UmVmV2l0aERhdGEoICRJbmNsdWRlRWxlbWVudC0+e0dyaWR9e1Jvd3N9ICk7CgogICAgICAgICAgICAgICAgICAgIFJPVzoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJvdyAoICRJbmNsdWRlRWxlbWVudC0+e0dyaWR9e1Jvd3N9LT5AKiApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUk9XIHVubGVzcyBJc0FycmF5UmVmV2l0aERhdGEoJFJvdyk7CgogICAgICAgICAgICAgICAgICAgICAgICBST1dFTEVNRU5UOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJvd0VsZW1lbnQgKCAkUm93LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFJvd0VsZW1lbnQtPntERn0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJvd0VsZW1lbnQtPntEZWZpbml0aW9ufXtMYWJlbH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSAuICc6OicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRSb3dFbGVtZW50LT57RGVmaW5pdGlvbn17TGFiZWx9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNldElubmVyRmllbGRzeyAkUm93RWxlbWVudC0+e0RGfSB9ID0gJFJvd0VsZW1lbnQtPntEZWZpbml0aW9ufTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9ID0gewogICAgICAgICAgICAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0tPiUqLAogICAgICAgICAgICAlU2V0SW5uZXJGaWVsZHMsCiAgICAgICAgfTsKCiAgICAgICAgIyBsb2FkIHByb2ZpbGVzIHN0cmluZyBwYXJhbXMKICAgICAgICBpZiAoICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdMb2FkUHJvZmlsZScgJiYgJFNlbGYtPntQcm9maWxlfSApIHx8ICRTZWxmLT57VGFrZUxhc3RTZWFyY2h9ICkgewogICAgICAgICAgICAlR2V0UGFyYW0gPSAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZUdldCgKICAgICAgICAgICAgICAgIEJhc2UgICAgICA9PiAnQ29uZmlnSXRlbVNlYXJjaCcgLiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1Nob3duQXR0cmlidXRlc30gJiYgcmVmICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSA9IGpvaW4gJzsnLCBAeyAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBkZWZhdWx0IHBhcmFtcyBvZiBkZWZhdWx0IGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9ICkgewogICAgICAgICAgICAgICAgS0VZOgogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9LT57JEtleX07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnRHluYW1pY0ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkS2V5ID1+IC9eKENvbmZpZ0l0ZW0pKENyZWF0ZXxDaGFuZ2UpLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEl0ZW1zID0gc3BsaXQgLzsvLCAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9LT57JEtleX07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQEl0ZW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoICRLZXksICRWYWx1ZSApID0gc3BsaXQgLz0vLCAkSXRlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSB8fD0gJFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gfHw9ICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30tPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBzZWFyY2ggc3RyaW5nIHBhcmFtcyAoZ2V0IHN1Ym1pdHRlZCBwYXJhbXMpCiAgICAgICAgICAgIGZvciBteSAkS2V5IChxdyhOdW1iZXIgTmFtZSBQcmV2aW91c1ZlcnNpb25TZWFyY2ggUmVzdWx0Rm9ybSBTaG93bkF0dHJpYnV0ZXMpKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgc2VhcmNoIHN0cmluZyBwYXJhbXMgKGdldCBzdWJtaXR0ZWQgcGFyYW1zKQogICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIG9uIHRoZSBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPX4gcy9ccyskLy9nOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9fiBzL15ccysvL2c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFycmF5IHBhcmFtcwogICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoRGVwbFN0YXRlSURzIEluY2lTdGF0ZUlEcykpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBzZWFyY2ggYXJyYXkgcGFyYW1zIChnZXQgc3VibWl0dGVkIHBhcmFtcykKICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAgICAgICAgIGlmIChAQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSBcQEFycmF5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBEeW5hbWljIGZpZWxkcyBmcm9tIHBhcmFtIG9iamVjdAogICAgICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSogKSB7CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkU2VsZi0+e0NvbmZpZ317RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICAgICAgICAgIyBnZXQgc2VhcmNoIGZpZWxkIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgICAgICAgICAgZm9yIG15ICRQcmVmZXJlbmNlICggQHskU2VhcmNoRmllbGRQcmVmZXJlbmNlc30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Qcm9maWxlU3RydWN0dXJlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICA9PiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHRoZSBjb21wbGV0ZSB2YWx1ZSBzdHJ1Y3R1cmUgaW4gR2V0UGFyYW0gdG8gc3RvcmUgaXQgbGF0ZXIgaW4gdGhlIHNlYXJjaCBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJXskRHluYW1pY0ZpZWxkVmFsdWV9ICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlIHNlYXJjaCBwcm9maWxlcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhQcm9maWxlRGVsZXRlJyApIHsKCiAgICAgICAgIyByZW1vdmUgb2xkIHByb2ZpbGUgc3R1ZmYKICAgICAgICAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZURlbGV0ZSgKICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IDEsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbml0IHNlYXJjaCBkaWFsb2cgKHNlbGVjdCBjbGFzcykKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYJyApIHsKCiAgICAgICAgbXkgJEVtcHR5U2VhcmNoID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VtcHR5U2VhcmNoJyApOwogICAgICAgIGlmICggISRTZWxmLT57UHJvZmlsZX0gKSB7CiAgICAgICAgICAgICRFbXB0eVNlYXJjaCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBkZWZhdWx0IHBhcmFtcyBvZiBkZWZhdWx0IGF0dHJpYnV0ZXMKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30gKSB7CgogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9LT57JEtleX07CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdEeW5hbWljRmllbGQnOwoKICAgICAgICAgICAgICAgIGlmICggJEtleSA9fiAvXihDb25maWdJdGVtKShDcmVhdGV8Q2hhbmdlKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEl0ZW1zID0gc3BsaXQgLzsvLCAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9LT57JEtleX07CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtIChASXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCAkS2V5LCAkVmFsdWUgKSA9IHNwbGl0IC89LywgJEl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSB8fD0gJFZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSB8fD0gJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfS0+eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIGRyb3Bkb3duIGZvciBzZWxlY3RpbmcgdGhlIGNsYXNzCiAgICAgICAgIyBhdXRvbWF0aWNhbGx5IHNob3cgc2VhcmNoIG1hc2sgYWZ0ZXIgc2VsZWN0aW5nIGEgY2xhc3MgdmlhIEFKQVgKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlYXJjaENsYXNzSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzc0lEIHx8ICcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgaHRtbCBzZWFyY2ggbWFzayBvdXRwdXQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoQUpBWCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIEVtcHR5U2VhcmNoICAgICA9PiAkRW1wdHlTZWFyY2gsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGVtcGxhdGUKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNldCBzZWFyY2ggZmllbGRzIGZvciBzZWxlY3RlZCBjbGFzcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnIHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTG9hZFByb2ZpbGUnICkgewoKICAgICAgICAjIENsYXNzSUQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzZWFyY2ggbWFzayBhbmQgZm9yIGFjdHVhbCBzZWFyY2hpbmcKICAgICAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENsYXNzSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHVzZXIgaXMgYWxsb3dlZCB0byBzZWFyY2ggY2xhc3MKICAgICAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbgogICAgICAgIGlmICggISRIYXNBY2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVmYXVsdCBwYXJhbXMgb2YgZGVmYXVsdCBhdHRyaWJ1dGVzCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9ICkgewoKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfS0+eyRLZXl9OwogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnRHluYW1pY0ZpZWxkJzsKCiAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL14oQ29uZmlnSXRlbSkoQ3JlYXRlfENoYW5nZSkvICkgewogICAgICAgICAgICAgICAgICAgIG15IEBJdGVtcyA9IHNwbGl0IC87LywgJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQEl0ZW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICggJEtleSwgJFZhbHVlICkgPSBzcGxpdCAvPS8sICRJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gfHw9ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gfHw9ICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30tPnskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb252ZXJ0IGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSAmJiByZWYgJEdldFBhcmFte1Nob3duQXR0cmlidXRlc30gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9ID0gam9pbiAnOycsIEB7ICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9IH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgVE9ETyBtYXliZSBuaWNlciB0byBoYXZlIHRoaXMgYWxzbyBpbiBhIHN5c2NvbmZpZyBzZXR0aW5nCiAgICAgICAgIyBpbml0aWFsaXppbmcgd2l0aCBjb21tb24gYXR0cmlidXRlcwogICAgICAgIG15IEBBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTnVtYmVyJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTmFtZScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRGVwbG95bWVudCBTdGF0ZScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnSW5jaWRlbnQgU3RhdGUnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHdhbGsgdGhyb3VnaCBkZWZpbml0aW9uIHRvIGNoZWNrIHBlcm1pc3Npb25zIG9uIHBhZ2VzIHdoaWNoIGNvbnRhaW4gZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICVQZXJtaXR0ZWREeW5hbWljRmllbGRzOwogICAgICAgIG15ICVHcm91cExvb2t1cDsKCiAgICAgICAgUEFHRToKICAgICAgICBmb3IgbXkgJFBhZ2UgKCAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9e1BhZ2VzfS0+QCogKSB7CgogICAgICAgICAgICAjIEludGVyZmFjZXMgaXMgb3B0aW9uYWwsIGVmZmVjdGl2ZWx5IGRlZmF1bHQgdG8gWyAnQWdlbnQnIF0KICAgICAgICAgICAgaWYgKCAkUGFnZS0+e0ludGVyZmFjZXN9ICkgewogICAgICAgICAgICAgICAgbmV4dCBQQUdFIHVubGVzcyBhbnkgeyAkXyBlcSAnQWdlbnQnIH0gJFBhZ2UtPntJbnRlcmZhY2VzfS0+QCo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhZ2UtPntHcm91cHN9ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJUdyb3VwTG9va3VwICkgewogICAgICAgICAgICAgICAgICAgICVHcm91cExvb2t1cCA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ3JhbnQgYWNjZXNzIHRvIHRoZSBwYWdlIG9ubHkgd2hlbiB0aGUgdXNlciBpcyBpbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBncm91cHMKICAgICAgICAgICAgICAgIG5leHQgUEFHRSB1bmxlc3MgYW55IHsgJEdyb3VwTG9va3VweyRffSB9ICRQYWdlLT57R3JvdXBzfS0+QCo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFNFQ1RJT046CiAgICAgICAgICAgIGZvciBteSAkU2VjdGlvbkNvbmZpZyAoICRQYWdlLT57Q29udGVudH0tPkAqICkgewogICAgICAgICAgICAgICAgbXkgJFNlY3Rpb24gPSAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9e1NlY3Rpb25zfXsgJFNlY3Rpb25Db25maWctPntTZWN0aW9ufSB9OwoKICAgICAgICAgICAgICAgIG5leHQgU0VDVElPTiB1bmxlc3MgJFNlY3Rpb247CiAgICAgICAgICAgICAgICBpZiAoICRTZWN0aW9uLT57VHlwZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VjdGlvbi0+e1R5cGV9IG5lICdEeW5hbWljRmllbGRzJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBTRUNUSU9OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBwcm9jZWVkIGlmIGNvbnRlbnQgaXMgZW1wdHkKICAgICAgICAgICAgICAgIG5leHQgU0VDVElPTiB1bmxlc3MgJFNlY3Rpb24tPntDb250ZW50fS0+QCo7CgogICAgICAgICAgICAgICAgbXkgJFNlY3Rpb25ERnMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0TWFzaygKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRTZWN0aW9uLT57Q29udGVudH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRTZWN0aW9uREZzKSApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERGTmFtZSAoICRTZWN0aW9uREZzLT5AKiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBlcm1pdHRlZER5bmFtaWNGaWVsZHN7JERGTmFtZX0gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhbHNvIGluY2x1ZGUgU2V0LWlubmVyIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfXskREZOYW1lfXtGaWVsZFR5cGV9IGVxICdTZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNldElubmVyRmllbGRzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdE1hc2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn17JERGTmFtZX17Q29uZmlnfXtJbmNsdWRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJFNldElubmVyRmllbGRzKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElubmVyREYgKCAkU2V0SW5uZXJGaWVsZHMtPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGVybWl0dGVkRHluYW1pY0ZpZWxkc3skSW5uZXJERn0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICREeW5hbWljRmllbGRTZXBhcmF0b3IgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBkeW5hbWljIGZpZWxkcyBzZWFyY2ggb3B0aW9ucyBmb3IgYXR0cmlidXRlIHNlbGVjdAogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgZGVmaW5pdGlvbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHNvcnQgeyAkYS0+e0xhYmVsfSBjbXAgJGItPntMYWJlbH0gfSB2YWx1ZXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9LT4lKiApIHsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRTZWxmLT57Q29uZmlnfXtEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRQZXJtaXR0ZWREeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgICAgICMgY3JlYXRlIGEgc2VwYXJhdG9yIGZvciBkeW5hbWljIGZpZWxkcyBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGlmICgkRHluYW1pY0ZpZWxkU2VwYXJhdG9yKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzLCAoCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJy0nLAogICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFNlcGFyYXRvciA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBmaWVsZCBwcmVmZXJlbmNlcwogICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgICMgdHJhbnNsYXRlIHRoZSBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgICAgIG15ICRUcmFuc2xhdGVkRHluYW1pY0ZpZWxkTGFiZWwgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgUFJFRkVSRU5DRToKICAgICAgICAgICAgZm9yIG15ICRQcmVmZXJlbmNlICggQHskU2VhcmNoRmllbGRQcmVmZXJlbmNlc30gKSB7CgogICAgICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIHN1ZmZpeAogICAgICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWRTdWZmaXggPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJFByZWZlcmVuY2UtPntMYWJlbFN1ZmZpeH0sCiAgICAgICAgICAgICAgICApIHx8ICcnOwoKICAgICAgICAgICAgICAgIGlmICgkVHJhbnNsYXRlZFN1ZmZpeCkgewogICAgICAgICAgICAgICAgICAgICRUcmFuc2xhdGVkU3VmZml4ID0gJyAoJyAuICRUcmFuc2xhdGVkU3VmZml4IC4gJyknOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsICgKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9PiAnU2VhcmNoX0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVHJhbnNsYXRlZER5bmFtaWNGaWVsZExhYmVsIC4gJFRyYW5zbGF0ZWRTdWZmaXgsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIEhUTUwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSogKSB7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkU2VsZi0+e0NvbmZpZ317RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkUGVybWl0dGVkRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGhpc3RvcmljYWwgdmFsdWVzIGZyb20gZGF0YWJhc2UKICAgICAgICAgICAgICAgICAgICBteSAkSGlzdG9yaWNhbFZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5IaXN0b3JpY2FsVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAkRGF0YSA9ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgaGlzdG9yaWMgdmFsdWVzIHRvIGN1cnJlbnQgdmFsdWVzIChpZiB0aGV5IGRvbid0IGV4aXN0IGFueW1vcmUpCiAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkSGlzdG9yaWNhbFZhbHVlcykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEhpc3RvcmljYWxWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJERhdGEtPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YS0+eyRLZXl9ID0gJEhpc3RvcmljYWxWYWx1ZXMtPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JERhdGF9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkRGF0YS0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBmaWVsZCBwcmVmZXJlbmNlcwogICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgIFBSRUZFUkVOQ0U6CiAgICAgICAgICAgIGZvciBteSAkUHJlZmVyZW5jZSAoIEB7JFNlYXJjaEZpZWxkUHJlZmVyZW5jZXN9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGZpZWxkIEhUTUwKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAkUHJlZmVyZW5jZS0+e1R5cGV9IH0gPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBhdHRyaWJ1dGVzIHN0cmluZyBmb3IgYXR0cmlidXRlcyBsaXN0CiAgICAgICAgJFBhcmFte0F0dHJpYnV0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAQXR0cmlidXRlcywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdBdHRyaWJ1dGUnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgYXR0cmlidXRlcyBzdHJpbmcgZm9yIHJlY292ZXJ5IG9uIGFkZCBvciBzdWJ0cmFjdCBzZWFyY2ggZmllbGRzCiAgICAgICAgJFBhcmFte0F0dHJpYnV0ZXNPcmlnU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQEF0dHJpYnV0ZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQXR0cmlidXRlT3JpZycsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVByb2ZpbGVzID0gJFNlYXJjaFByb2ZpbGVPYmplY3QtPlNlYXJjaFByb2ZpbGVMaXN0KAogICAgICAgICAgICBCYXNlICAgICAgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnIC4gJENsYXNzSUQsCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte1Byb2ZpbGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUHJvZmlsZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUHJvZmlsZScsCiAgICAgICAgICAgIElEICAgICAgICAgICA9PiAnU2VhcmNoUHJvZmlsZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBkcm9wZG93biBmb3Igc2VsZWN0aW5nIHRoZSB3YW50ZWQgZGVwbG95bWVudCBzdGF0ZXMKICAgICAgICBteSAkQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdEZXBsU3RhdGVJRHMnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtEZXBsU3RhdGVJRHN9IHx8IFtdLAogICAgICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICAgICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBkcm9wZG93biBmb3Igc2VsZWN0aW5nIHRoZSB3YW50ZWQgaW5jaWRlbnQgc3RhdGVzCiAgICAgICAgbXkgJEN1ckluY2lTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkSW5jaVN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17SW5jaVN0YXRlSURzfSB8fCBbXSwKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBQcmV2aW91c1ZlcnNpb25PcHRpb25TdHJnCiAgICAgICAgbXkgJFByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSA9PiAnUHJldmlvdXNWZXJzaW9uU2VhcmNoJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAwID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgICAgIDEgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17UHJldmlvdXNWZXJzaW9uU2VhcmNofSB8fCAnMCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBvdXRwdXQgZm9ybWF0IHN0cmluZwogICAgICAgICRQYXJhbXtSZXN1bHRGb3JtU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOb3JtYWwgPT4gVHJhbnNsYXRhYmxlKCdOb3JtYWwnKSwKICAgICAgICAgICAgICAgIFByaW50ICA9PiBUcmFuc2xhdGFibGUoJ1ByaW50JyksCiAgICAgICAgICAgICAgICBDU1YgICAgPT4gVHJhbnNsYXRhYmxlKCdDU1YnKSwKICAgICAgICAgICAgICAgIEV4Y2VsICA9PiBUcmFuc2xhdGFibGUoJ0V4Y2VsJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1Jlc3VsdEZvcm0nLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtSZXN1bHRGb3JtfSB8fCAnTm9ybWFsJywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQUpBWENvbnRlbnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgICAgICAgICAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVPcHRpb25TdHJnICAgID0+ICRDdXJEZXBsU3RhdGVPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlT3B0aW9uU3RyZyAgICA9PiAkQ3VySW5jaVN0YXRlT3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcgPT4gJFByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzU3RyZyAgICAgICAgICAgID0+ICRQYXJhbXtBdHRyaWJ1dGVzU3RyZ30sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzT3JpZ1N0cmcgICAgICAgID0+ICRQYXJhbXtBdHRyaWJ1dGVzT3JpZ1N0cmd9LAogICAgICAgICAgICAgICAgUmVzdWx0Rm9ybVN0cmcgICAgICAgICAgICA9PiAkUGFyYW17UmVzdWx0Rm9ybVN0cmd9LAogICAgICAgICAgICAgICAgUHJvZmlsZXNTdHJnICAgICAgICAgICAgICA9PiAkUGFyYW17UHJvZmlsZXNTdHJnfSwKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte051bWJlcn0gfHwgJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtOYW1lfSAgIHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IER5bmFtaWMgZmllbGRzIGJsb2NrcwogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSogKSB7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkU2VsZi0+e0NvbmZpZ317RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkUGVybWl0dGVkRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICAgICAjIGdldCBzZWFyY2ggZmllbGQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyk7CgogICAgICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgICAgICBmb3IgbXkgJFByZWZlcmVuY2UgKCBAeyRTZWFyY2hGaWVsZFByZWZlcmVuY2VzfSApIHsKCiAgICAgICAgICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgICAgICAgICBuZXh0IFBSRUZFUkVOQ0UgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAkUHJlZmVyZW5jZS0+e1R5cGV9IH0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAkUHJlZmVyZW5jZS0+e1R5cGV9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAkUHJlZmVyZW5jZS0+e1R5cGV9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRyaWJ1dGVzIGZvciBzZWFyY2gKICAgICAgICBteSBAU2VhcmNoQXR0cmlidXRlczsKCiAgICAgICAgbXkgJUdldFBhcmFtQmFja3VwID0gJUdldFBhcmFtOwoKICAgICAgICAjIHNob3cgYXR0cmlidXRlcwogICAgICAgIG15IEBTaG93bkF0dHJpYnV0ZXM7CiAgICAgICAgaWYgKCAkR2V0UGFyYW1CYWNrdXB7U2hvd25BdHRyaWJ1dGVzfSApIHsKICAgICAgICAgICAgQFNob3duQXR0cmlidXRlcyA9IHNwbGl0IC87LywgJEdldFBhcmFtQmFja3Vwe1Nob3duQXR0cmlidXRlc307CiAgICAgICAgfQogICAgICAgIG15ICVBbHJlYWR5U2hvd247CgogICAgICAgIGlmICgkQ2xhc3NJRCkgewogICAgICAgICAgICBJVEVNOgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKEBBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJEl0ZW0tPntLZXl9OwogICAgICAgICAgICAgICAgbmV4dCBJVEVNIGlmICEkS2V5OwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgc2hvd24KICAgICAgICAgICAgICAgIGlmIChAU2hvd25BdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFNob3cgPSAwOwogICAgICAgICAgICAgICAgICAgIFNIT1dOX0FUVFJJQlVURToKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFNob3duQXR0cmlidXRlIChAU2hvd25BdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJ0xhYmVsJyAuICRLZXkgZXEgJFNob3duQXR0cmlidXRlICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNob3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBTSE9XTl9BVFRSSUJVVEU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJVEVNIGlmICEkU2hvdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICMgU2tpcCB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICBuZXh0IElURU0gaWYgIWRlZmluZWQgJEdldFBhcmFtQmFja3VweyRLZXl9OwoKICAgICAgICAgICAgICAgICAgICAjIFNraXAgZW1wdHkgc3RyaW5ncwogICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTSBpZiAkR2V0UGFyYW1CYWNrdXB7JEtleX0gZXEgJyc7CgogICAgICAgICAgICAgICAgICAgICMgU2tpcCBlbXB0eSBhcnJheXMKICAgICAgICAgICAgICAgICAgICBpZiAoIHJlZiAkR2V0UGFyYW1CYWNrdXB7JEtleX0gZXEgJ0FSUkFZJyAmJiAhQHsgJEdldFBhcmFtQmFja3VweyRLZXl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzaG93IGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgbmV4dCBJVEVNIGlmICRBbHJlYWR5U2hvd257JEtleX07CiAgICAgICAgICAgICAgICAkQWxyZWFkeVNob3dueyRLZXl9ID0gMTsKCiAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hBdHRyaWJ1dGVzLCAkS2V5OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIE5vIHByb2ZpbGUsIHNob3cgZGVmYXVsdCBzY3JlZW4KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgTWVyZ2UgcmVndWxhciBzaG93L2hpZGUgc2V0dGluZ3MgYW5kIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICVEZWZhdWx0cyA9ICV7ICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30gfHwge30gfTsKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRzICggc29ydCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfXtEeW5hbWljRmllbGR9IHx8IHt9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfXtEeW5hbWljRmllbGR9LT57JER5bmFtaWNGaWVsZHN9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgJERlZmF1bHRzeyJTZWFyY2hfRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRzIn0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAT3JkZXJlZERlZmF1bHRzOwogICAgICAgICAgICBpZiAoJURlZmF1bHRzKSB7CgogICAgICAgICAgICAgICAgIyBvcmRlcmluZyBhdHRyaWJ1dGVzIG9uIHRoZSBzYW1lIG9yZGVyIGxpa2UgaW4gQXR0cmlidXRlcwogICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtIChAQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICAgIG15ICRLZXlBdHIgPSAkSXRlbS0+e0tleX07CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJURlZmF1bHRzICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRLZXkgZXEgJEtleUF0ciApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQE9yZGVyZWREZWZhdWx0cywgJEtleTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBLRVk6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAoQE9yZGVyZWREZWZhdWx0cykgewogICAgICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0R5bmFtaWNGaWVsZCc7ICAgICMgSWdub3JlIGVudHJ5IGZvciBERiBjb25maWcKICAgICAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkQWxyZWFkeVNob3dueyRLZXl9OwogICAgICAgICAgICAgICAgICAgICRBbHJlYWR5U2hvd257JEtleX0gPSAxOwoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hBdHRyaWJ1dGVzLCAkS2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIElmIG5vIGF0dHJpYnV0ZSBpcyBzaG93biwgc2hvdyBmdWxsdGV4dCBzZWFyY2guCiAgICAgICAgICAgIGlmICggIWtleXMgJUFscmVhZHlTaG93biApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEF0dHJpYnV0ZXMsICdGdWxsdGV4dCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15IEBQcm9maWxlQXR0cmlidXRlczsKCiAgICAgICAgIyBzaG93IGF0dHJpYnV0ZXMKICAgICAgICBteSAkQXR0cmlidXRlSXNVc2VkID0gMDsKICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUdldFBhcmFtICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAhJEtleTsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgIWRlZmluZWQgJEdldFBhcmFteyRLZXl9OwogICAgICAgICAgICBuZXh0IEtFWSBpZiAkR2V0UGFyYW17JEtleX0gZXEgJyc7CiAgICAgICAgICAgIG5leHQgS0VZIGlmIHJlZiAkR2V0UGFyYW17JEtleX0gZXEgJ0FSUkFZJyAmJiAhJEdldFBhcmFteyRLZXl9LT5AKjsKCiAgICAgICAgICAgICRBdHRyaWJ1dGVJc1VzZWQgPSAxOwoKICAgICAgICAgICAgcHVzaCBAUHJvZmlsZUF0dHJpYnV0ZXMsICRLZXk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGF0dHJpYnV0ZSBpcyBzaG93biwgc2hvdyBjb25maWdpdGVtIG51bWJlcgogICAgICAgIGlmICggISRTZWxmLT57UHJvZmlsZX0gKSB7CgogICAgICAgICAgICAjIG1lcmdlIHNlYXJjaCBhbmQgcHJvZmlsZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGlmIChAU2VhcmNoQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgQFByb2ZpbGVBdHRyaWJ1dGVzID0gdW5pcSggQFByb2ZpbGVBdHRyaWJ1dGVzLCBAU2VhcmNoQXR0cmlidXRlcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgQFByb2ZpbGVBdHRyaWJ1dGVzID0gdW5pcSggQFByb2ZpbGVBdHRyaWJ1dGVzLCAnTnVtYmVyJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNU2VhcmNoUHJvZmlsZUF0dHJpYnV0ZXMnLAogICAgICAgICAgICBWYWx1ZSA9PiBcQFByb2ZpbGVBdHRyaWJ1dGVzLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRlbXBsYXRlCiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICAgICAgQUpBWCAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgcGVyZm9ybSBzZWFyY2gKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZWFyY2gnICkgewoKICAgICAgICBteSAkU2VhcmNoRGlhbG9nID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlYXJjaERpYWxvZycgKTsKCiAgICAgICAgIyBmaWxsIHVwIHByb2ZpbGUgbmFtZSAoZS5nLiB3aXRoIGxhc3Qtc2VhcmNoKQogICAgICAgIGlmICggISRTZWxmLT57UHJvZmlsZX0gfHwgISRTZWxmLT57U2F2ZVByb2ZpbGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e1Byb2ZpbGV9ID0gJ2xhc3Qtc2VhcmNoJzsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgbGFzdCBvdmVydmlldyBzY3JlZW4KICAgICAgICBteSAkVVJMID0gIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtU2VhcmNoO1Byb2ZpbGU9JFNlbGYtPntQcm9maWxlfTsiCiAgICAgICAgICAgIC4gIlRha2VMYXN0U2VhcmNoPTE7U3RhcnRIaXQ9JFNlbGYtPntTdGFydEhpdH07U3ViYWN0aW9uPVNlYXJjaDsiCiAgICAgICAgICAgIC4gIk9yZGVyQnk9JFNlbGYtPntPcmRlckJ5fTtTb3J0Qnk9JFNlbGYtPntTb3J0Qnl9IjsKCiAgICAgICAgaWYgKCRDbGFzc0lEKSB7CiAgICAgICAgICAgICRVUkwgLj0gIjtDbGFzc0lEPSRDbGFzc0lEIjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlc3Npb24gb2JqZWN0CiAgICAgICAgbXkgJFNlc3Npb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKTsKCiAgICAgICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVSTCwKICAgICAgICApOwogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVSTCwKICAgICAgICApOwoKICAgICAgICAjIENsYXNzSUQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzZWFyY2ggbWFzayBhbmQgZm9yIGFjdHVhbCBzZWFyY2hpbmcKICAgICAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENsYXNzSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHVzZXIgaXMgYWxsb3dlZCB0byBzZWFyY2ggY2xhc3MKICAgICAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbgogICAgICAgIGlmICggISRIYXNBY2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3VycmVudCBkZWZpbml0aW9uCiAgICAgICAgbXkgJERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICAjIGFib3J0LCBpZiBubyBkZWZpbml0aW9uIGlzIGRlZmluZWQKICAgICAgICBpZiAoICEkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnLCAkQ2xhc3NJRCApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgICAgICBteSAlU2V0SW5uZXJGaWVsZHM7CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSogKSB7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57RmllbGRUeXBlfSBlcSAnU2V0JzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317SW5jbHVkZX0gKTsKCiAgICAgICAgICAgICMgaXRlcmF0ZSB0aGUgZW50aXJlIEluY2x1ZGUgc3RydWN0dXJlIHRvIGdldCB0aGUgdmVyc2lvbmVkIGR5bmFtaWMgZmllbGQgY29uZmlncwogICAgICAgICAgICBJTkNMVURFRUxFTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRJbmNsdWRlRWxlbWVudCAoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0luY2x1ZGV9LT5AKiApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRJbmNsdWRlRWxlbWVudC0+e0RGfSApIHsKICAgICAgICAgICAgICAgICAgICAkSW5jbHVkZUVsZW1lbnQtPntEZWZpbml0aW9ufXtMYWJlbH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSAuICc6OicKICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJbmNsdWRlRWxlbWVudC0+e0RlZmluaXRpb259e0xhYmVsfSApOwogICAgICAgICAgICAgICAgICAgICRTZXRJbm5lckZpZWxkc3sgJEluY2x1ZGVFbGVtZW50LT57REZ9IH0gPSAkSW5jbHVkZUVsZW1lbnQtPntEZWZpbml0aW9ufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEluY2x1ZGVFbGVtZW50LT57R3JpZH0gKSB7CgogICAgICAgICAgICAgICAgICAgIG5leHQgSU5DTFVERUVMRU1FTlQgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSggJEluY2x1ZGVFbGVtZW50LT57R3JpZH0gKTsKCiAgICAgICAgICAgICAgICAgICAgUk9XOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUm93ICggJEluY2x1ZGVFbGVtZW50LT57R3JpZH17Um93c30tPkAqICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBST1cgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSgkUm93KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIFJPV0VMRU1FTlQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUm93RWxlbWVudCAoICRSb3ctPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUm93RWxlbWVudC0+e0RGfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUm93RWxlbWVudC0+e0RlZmluaXRpb259e0xhYmVsfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApIC4gJzo6JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFJvd0VsZW1lbnQtPntEZWZpbml0aW9ufXtMYWJlbH0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2V0SW5uZXJGaWVsZHN7ICRSb3dFbGVtZW50LT57REZ9IH0gPSAkUm93RWxlbWVudC0+e0RlZmluaXRpb259OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0gPSB7CiAgICAgICAgICAgICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSosCiAgICAgICAgICAgICVTZXRJbm5lckZpZWxkcywKICAgICAgICB9OwoKICAgICAgICAjIHdhbGsgdGhyb3VnaCBkZWZpbml0aW9uIHRvIGNoZWNrIHBlcm1pc3Npb25zIG9uIHBhZ2VzIHdoaWNoIGNvbnRhaW4gZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlUGVybWl0dGVkRHluYW1pY0ZpZWxkczsKICAgICAgICBteSAlR3JvdXBMb29rdXA7CgogICAgICAgIFBBR0U6CiAgICAgICAgZm9yIG15ICRQYWdlICggJERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfXtQYWdlc30tPkAqICkgewoKICAgICAgICAgICAgIyBJbnRlcmZhY2VzIGlzIG9wdGlvbmFsLCBlZmZlY3RpdmVseSBkZWZhdWx0IHRvIFsgJ0FnZW50JyBdCiAgICAgICAgICAgIGlmICggJFBhZ2UtPntJbnRlcmZhY2VzfSApIHsKICAgICAgICAgICAgICAgIG5leHQgUEFHRSB1bmxlc3MgYW55IHsgJF8gZXEgJ0FnZW50JyB9ICRQYWdlLT57SW50ZXJmYWNlc30tPkAqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYWdlLT57R3JvdXBzfSApIHsKICAgICAgICAgICAgICAgIGlmICggISVHcm91cExvb2t1cCApIHsKICAgICAgICAgICAgICAgICAgICAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdyYW50IGFjY2VzcyB0byB0aGUgcGFnZSBvbmx5IHdoZW4gdGhlIHVzZXIgaXMgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZ3JvdXBzCiAgICAgICAgICAgICAgICBuZXh0IFBBR0UgdW5sZXNzIGFueSB7ICRHcm91cExvb2t1cHskX30gfSAkUGFnZS0+e0dyb3Vwc30tPkAqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBTRUNUSU9OOgogICAgICAgICAgICBmb3IgbXkgJFNlY3Rpb25Db25maWcgKCAkUGFnZS0+e0NvbnRlbnR9LT5AKiApIHsKICAgICAgICAgICAgICAgIG15ICRTZWN0aW9uID0gJERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfXtTZWN0aW9uc317ICRTZWN0aW9uQ29uZmlnLT57U2VjdGlvbn0gfTsKCiAgICAgICAgICAgICAgICBuZXh0IFNFQ1RJT04gdW5sZXNzICRTZWN0aW9uOwogICAgICAgICAgICAgICAgaWYgKCAkU2VjdGlvbi0+e1R5cGV9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFNlY3Rpb24tPntUeXBlfSBuZSAnRHluYW1pY0ZpZWxkcycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgU0VDVElPTjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBkbyBub3QgcHJvY2VlZCBpZiBjb250ZW50IGlzIGVtcHR5CiAgICAgICAgICAgICAgICBuZXh0IFNFQ1RJT04gdW5sZXNzICRTZWN0aW9uLT57Q29udGVudH0tPkAqOwoKICAgICAgICAgICAgICAgIG15ICRTZWN0aW9uREZzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdE1hc2soCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkU2VjdGlvbi0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2VjdGlvbkRGcykgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRERk5hbWUgKCAkU2VjdGlvbkRGcy0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQZXJtaXR0ZWREeW5hbWljRmllbGRzeyRERk5hbWV9ID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWxzbyBpbmNsdWRlIFNldC1pbm5lciBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn17JERGTmFtZX17RmllbGRUeXBlfSBlcSAnU2V0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTZXRJbm5lckZpZWxkcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RNYXNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9eyRERk5hbWV9e0NvbmZpZ317SW5jbHVkZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRTZXRJbm5lckZpZWxkcykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJbm5lckRGICggJFNldElubmVyRmllbGRzLT5AKiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBlcm1pdHRlZER5bmFtaWNGaWVsZHN7JElubmVyREZ9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY29udmVydCBhdHRyaWJ1dGVzCiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSAmJiByZWYgJEdldFBhcmFte1Nob3duQXR0cmlidXRlc30gZXEgJycgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9ID0gWyBzcGxpdCAvOy8sICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9IF07CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgc2VhcmNoIHByb2ZpbGUgKHVuZGVyIGxhc3Qtc2VhcmNoIG9yIHJlYWwgcHJvZmlsZSBuYW1lKQogICAgICAgICRTZWxmLT57U2F2ZVByb2ZpbGV9ID0gMTsKCiAgICAgICAgIyByZW1lbWJlciBsYXN0IHNlYXJjaCB2YWx1ZXMgb25seSBpZiBzZWFyY2ggaXMgY2FsbGVkIGZyb20gYSBzZWFyY2ggZGlhbG9nCiAgICAgICAgIyBub3QgZnJvbSByZXN1bHRzIHBhZ2UKICAgICAgICBpZiAoICRTZWxmLT57U2F2ZVByb2ZpbGV9ICYmICRTZWxmLT57UHJvZmlsZX0gJiYgJFNlYXJjaERpYWxvZyApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIG9sZCBwcm9maWxlIHN0dWZmCiAgICAgICAgICAgICRTZWFyY2hQcm9maWxlT2JqZWN0LT5TZWFyY2hQcm9maWxlRGVsZXRlKAogICAgICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpbnNlcnQgbmV3IHByb2ZpbGUgcGFyYW1zCiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyRLZXl9ICYmICRLZXkgbmUgJ1doYXQnICkgewogICAgICAgICAgICAgICAgICAgICRTZWFyY2hQcm9maWxlT2JqZWN0LT5TZWFyY2hQcm9maWxlQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBCYXNlICAgICAgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnIC4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQXR0cmlidXRlTG9va3VwOwoKICAgICAgICAjIGNyZWF0ZSBhdHRyaWJ1dGUgbG9va3VwIHRhYmxlCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBAeyAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSB8fCBbXSB9ICkgewogICAgICAgICAgICAkQXR0cmlidXRlTG9va3VweyRBdHRyaWJ1dGV9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgZHluYW1pYyBmaWVsZHMgc2VhcmNoIHBhcmFtZXRlcnMgZm9yIHRpY2tldCBzZWFyY2gKICAgICAgICBteSAlRHluYW1pY0ZpZWxkU2VhcmNoUGFyYW1ldGVyczsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9LT4lKiApIHsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRTZWxmLT57Q29uZmlnfXtEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRQZXJtaXR0ZWREeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBmaWVsZCBwcmVmZXJlbmNlcwogICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgIFBSRUZFUkVOQ0U6CiAgICAgICAgICAgIGZvciBteSAkUHJlZmVyZW5jZSAoIEB7JFNlYXJjaEZpZWxkUHJlZmVyZW5jZXN9ICkgewoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhJEF0dHJpYnV0ZUxvb2t1cHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0xhYmVsU2VhcmNoX0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkUHJlZmVyZW5jZS0+e1R5cGV9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFBSRUZFUkVOQ0U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHByb2ZpbGUKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hQYXJhbWV0ZXIgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQYXJhbWV0ZXJCdWlsZCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgPT4gJFByZWZlcmVuY2UtPntUeXBlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgc2VhcmNoIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRTZWFyY2hQYXJhbWV0ZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFNlYXJjaFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFNlYXJjaFBhcmFtZXRlci0+e1BhcmFtZXRlcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15IEBTZWFyY2hSZXN1bHRMaXN0OwoKICAgICAgICAjIHN0YXJ0IHNlYXJjaCBpZiBjYWxsZWQgZnJvbSBhIHNlYXJjaCBkaWFsb2cgb3IgZnJvbSBhIHJlc3VsdHMgcGFnZQogICAgICAgIGlmICggJFNlYXJjaERpYWxvZyB8fCAkU2VsZi0+e1Rha2VMYXN0U2VhcmNofSApIHsKCiAgICAgICAgICAgICMgc3RhcnQgc2VhcmNoCiAgICAgICAgICAgIEBTZWFyY2hSZXN1bHRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRHluYW1pY0ZpZWxkU2VhcmNoUGFyYW1ldGVycywKICAgICAgICAgICAgICAgIE9yZGVyQnkgID0+IFsgJFNlbGYtPntPcmRlckJ5fSBdLAogICAgICAgICAgICAgICAgU29ydEJ5ICAgPT4gWyAkU2VsZi0+e1NvcnRCeX0gXSwKICAgICAgICAgICAgICAgIExpbWl0ICAgID0+ICRTZWxmLT57U2VhcmNoTGltaXR9LAogICAgICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyRDbGFzc0lEXSwKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBjb25mY29uZmlnIGl0ZW0gZHluYW1pYyBmaWVsZHMgZm9yIENTViBkaXNwbGF5CiAgICAgICAgbXkgJENTVkR5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydJVFNNQ29uZmlnSXRlbSddLAogICAgICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0NvbmZpZ317U2VhcmNoQ1NWRHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICAgICApOwoKICAgICAgICAjIENTViBvdXRwdXQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnQ1NWJwogICAgICAgICAgICB8fAogICAgICAgICAgICAkR2V0UGFyYW17UmVzdWx0Rm9ybX0gZXEgJ0V4Y2VsJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGNyZWF0ZSBoZWFkIChhY3R1YWwgaGVhZCBhbmQgaGVhZCBmb3IgZGF0YSBmaWxsKQogICAgICAgICAgICBteSBAVG1wQ1NWSGVhZCA9IEB7ICRTZWxmLT57Q29uZmlnfXtTZWFyY2hDU1ZEYXRhfSB9OwogICAgICAgICAgICBteSBAQ1NWSGVhZCAgICA9IEB7ICRTZWxmLT57Q29uZmlnfXtTZWFyY2hDU1ZEYXRhfSB9OwoKICAgICAgICAgICAgIyBpbmNsdWRlIHRoZSBzZWxlY3RlZCBkeW5hbWljIGZpZWxkcyBpbiBDVlMgcmVzdWx0cwogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskQ1NWRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gZXEgJyc7CgogICAgICAgICAgICAgICAgcHVzaCBAVG1wQ1NWSGVhZCwgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgICAgICAgICAgICAgcHVzaCBAQ1NWSGVhZCwgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQENTVkRhdGE7CgogICAgICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAU2VhcmNoUmVzdWx0TGlzdCkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMKICAgICAgICAgICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJEhhc0FjY2VzczsKCiAgICAgICAgICAgICAgICAjIGdldCB2ZXJzaW9uCiAgICAgICAgICAgICAgICBteSAkTGFzdFZlcnNpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNzdiBxdW90ZQogICAgICAgICAgICAgICAgaWYgKCAhQENTVkhlYWQgKSB7CiAgICAgICAgICAgICAgICAgICAgQENTVkhlYWQgPSBAeyAkU2VsZi0+e0NvbmZpZ30tPntTZWFyY2hDU1ZEYXRhfSB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc3RvcmUgZGF0YQogICAgICAgICAgICAgICAgbXkgQERhdGE7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEhlYWRlciAoQFRtcENTVkhlYWQpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBoZWFkZXIgaXMgYSBkeW5hbWljIGZpZWxkIGFuZCBnZXQgdGhlIHZhbHVlIGZyb20gZHluYW1pYyBmaWVsZAogICAgICAgICAgICAgICAgICAgICMgYmFja2VuZAogICAgICAgICAgICAgICAgICAgIGlmICggJEhlYWRlciA9fiBte1xBIER5bmFtaWNGaWVsZF8gKCBbYS16QS1aXGRcLV0rICkgXHp9eG1zICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBsb29wIG92ZXIgdGhlIGR5bmFtaWMgZmllbGRzIGNvbmZpZ3VyZWQgZm9yIENTViBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JENTVkR5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBhbGwgZmllbGRzIHRoYXQgZG9lcyBub3QgbWF0Y2ggd2l0aCBjdXJyZW50IGZpZWxkIG5hbWUgKCQxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aXRoIG91dCB0aGUgJ0R5bmFtaWNGaWVsZF8nIHByZWZpeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IG5lICQxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSB2YWx1ZSBhcyBmb3IgcHJpbnQgKHRvIGNvcnJlY3RseSBkaXNwbGF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRCYWNrZW5kT2JqZWN0LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRMYXN0VmVyc2lvbi0+eyRIZWFkZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERhdGEsICRWYWx1ZVN0cmctPntWYWx1ZX07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXJtaW5hdGUgdGhlIERZTkFNSUNGSUVMRCBsb29wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IERZTkFNSUNGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0cmlldmUgZGF0YSBmcm9tIGFydGljbGUKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF0YSwgJExhc3RWZXJzaW9uLT57JEhlYWRlcn07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaCBAQ1NWRGF0YSwgXEBEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNzdiBxdW90ZQogICAgICAgICAgICAjIHRyYW5zbGF0ZSBub24gZXhpc3RpbmcgaGVhZGVyIG1heSByZXN1bHQgaW4gYSBnYXJiYWdlIGZpbGUKICAgICAgICAgICAgaWYgKCAhQENTVkhlYWQgKSB7CiAgICAgICAgICAgICAgICBAQ1NWSGVhZCA9IEB7ICRTZWxmLT57Q29uZmlnfS0+e1NlYXJjaENTVkRhdGF9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdHJhbnNsYXRlIGhlYWRlcnMKICAgICAgICAgICAgZm9yIG15ICRIZWFkZXIgKEBDU1ZIZWFkKSB7CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIENvbmZpZ0l0ZW1OdW1iZXIgaGVhZGVyIHdpdGggdGhlIGN1cnJlbnQgQ29uZmlnSXRlbU51bWJlciBob29rIGZyb20gc3lzY29uZmlnCiAgICAgICAgICAgICAgICBpZiAoICRIZWFkZXIgZXEgJ0NvbmZpZ0l0ZW1OdW1iZXInICkgewogICAgICAgICAgICAgICAgICAgICRIZWFkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpIb29rJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkSGVhZGVyID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRIZWFkZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCBTZXBhcmF0b3IgZnJvbSBsYW5ndWFnZSBmaWxlLgogICAgICAgICAgICBteSAkVXNlckNTVlNlcGFyYXRvciA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPntTZXBhcmF0b3J9OwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1ByZWZlcmVuY2VzR3JvdXBzJyktPntDU1ZTZXBhcmF0b3J9LT57QWN0aXZlfSApIHsKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlckNTVlNlcGFyYXRvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJDU1ZTZXBhcmF0b3IgPSAkVXNlckRhdGF7VXNlckNTVlNlcGFyYXRvcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDU1ZPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDU1YnKTsKICAgICAgICAgICAgbXkgJEN1clN5c0RUT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1Jlc3VsdEZvcm19IGVxICdDU1YnICkgewoKICAgICAgICAgICAgICAgICMgQXNzZW1ibGUgQ1NWIGRhdGEuCiAgICAgICAgICAgICAgICBteSAkQ1NWID0gJENTVk9iamVjdC0+QXJyYXkyQ1NWKAogICAgICAgICAgICAgICAgICAgIEhlYWQgICAgICA9PiBcQENTVkhlYWQsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgID0+IFxAQ1NWRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZXBhcmF0b3IgPT4gJFVzZXJDU1ZTZXBhcmF0b3IsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUmV0dXJuIENTViB0byBkb3dubG9hZC4KICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGFuZ2Vfc2VhcmNoXyVzLmNzdicsCiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJTeXNEVE9iamVjdC0+Rm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclRl8lSC0lTScsCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAidGV4dC9jc3Y7IGNoYXJzZXQ9IiAuICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJENTViwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17UmVzdWx0Rm9ybX0gZXEgJ0V4Y2VsJyApIHsKCiAgICAgICAgICAgICAgICAjIEFzc2VtYmxlIEV4Y2VsIGRhdGEuCiAgICAgICAgICAgICAgICBteSAkRXhjZWwgPSAkQ1NWT2JqZWN0LT5BcnJheTJDU1YoCiAgICAgICAgICAgICAgICAgICAgSGVhZCAgID0+IFxAQ1NWSGVhZCwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgPT4gXEBDU1ZEYXRhLAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAnRXhjZWwnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFJldHVybiBFeGNlbCB0byBkb3dubG9hZC4KICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGFuZ2Vfc2VhcmNoXyVzLnhsc3gnLAogICAgICAgICAgICAgICAgICAgICAgICAkQ3VyU3lzRFRPYmplY3QtPkZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAnJUZfJUgtJU0nLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IiwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRXhjZWwsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHByaW50IFBERiBvdXRwdXQKICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnUHJpbnQnICkgewoKICAgICAgICAgICAgbXkgQFBERkRhdGE7CgogICAgICAgICAgICAjIGdldCBwZGYgb2JqZWN0CiAgICAgICAgICAgIG15ICRQREZPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyk7CgogICAgICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAU2VhcmNoUmVzdWx0TGlzdCkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMKICAgICAgICAgICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBTY29wZSAgPT4gJ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJEhhc0FjY2VzczsKCiAgICAgICAgICAgICAgICAjIGdldCB2ZXJzaW9uCiAgICAgICAgICAgICAgICBteSAkTGFzdFZlcnNpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgcGRmIHJvd3MKICAgICAgICAgICAgICAgIG15IEBQREZSb3c7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFN0b3JlRGF0YSAocXcoQ2xhc3MgSW5jaVN0YXRlIE5hbWUgTnVtYmVyIERlcGxTdGF0ZSBWZXJzaW9uSUQgQ3JlYXRlVGltZSkpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBQREZSb3csICRMYXN0VmVyc2lvbi0+eyRTdG9yZURhdGF9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaCBAUERGRGF0YSwgXEBQREZSb3c7CgogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFBERiBPdXRwdXQKICAgICAgICAgICAgbXkgJFRpdGxlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDb25maWd1cmF0aW9uIEl0ZW0nKSAuICcgJwogICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NlYXJjaCcpOwogICAgICAgICAgICBteSAkUHJpbnRlZEJ5ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdwcmludGVkIGJ5Jyk7CiAgICAgICAgICAgIG15ICRQYWdlICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1BhZ2UnKTsKICAgICAgICAgICAgbXkgJFRpbWUgICAgICA9ICRMYXlvdXRPYmplY3QtPntUaW1lfTsKCiAgICAgICAgICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCiAgICAgICAgICAgIG15ICRNYXhQYWdlcyA9ICRDb25maWdPYmplY3QtPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgICAgICBpZiAoICEkTWF4UGFnZXMgfHwgJE1heFBhZ2VzIDwgMSB8fCAkTWF4UGFnZXMgPiAxMDAwICkgewogICAgICAgICAgICAgICAgJE1heFBhZ2VzID0gMTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSB0aGUgaGVhZGVyCiAgICAgICAgICAgIG15ICRDZWxsRGF0YTsKCiAgICAgICAgICAgICMgb3V0cHV0ICdObyBSZXN1bHQnLCBpZiBubyBjb250ZW50IHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoQFBERkRhdGEpIHsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMF0tPntDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ2xhc3MnKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMF0tPntGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMV0tPntDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSW5jaWRlbnQgU3RhdGUnKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMV0tPntGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMl0tPntDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTmFtZScpOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlsyXS0+e0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlszXS0+e0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdOdW1iZXInKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bM10tPntGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bNF0tPntDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGVwbG95bWVudCBTdGF0ZScpOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPls0XS0+e0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPls1XS0+e0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdWZXJzaW9uJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzVdLT57Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzZdLT57Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZSBUaW1lJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzZdLT57Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgdGhlIGNvbnRlbnQgYXJyYXkKICAgICAgICAgICAgICAgIG15ICRDb3VudGVyUm93ID0gMTsKICAgICAgICAgICAgICAgIGZvciBteSAkUm93IChAUERGRGF0YSkgewogICAgICAgICAgICAgICAgICAgIG15ICRDb3VudGVyQ29sdW1uID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENvbnRlbnQgKCBAeyRSb3d9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlskQ291bnRlclJvd10tPlskQ291bnRlckNvbHVtbl0tPntDb250ZW50fSA9ICRDb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRlckNvbHVtbisrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQ291bnRlclJvdysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlswXS0+e0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBSZXN1bHQhJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcGFnZSBwYXJhbXMKICAgICAgICAgICAgbXkgJVBhZ2VQYXJhbTsKICAgICAgICAgICAgJFBhZ2VQYXJhbXtQYWdlT3JpZW50YXRpb259ID0gJ2xhbmRzY2FwZSc7CiAgICAgICAgICAgICRQYWdlUGFyYW17TWFyZ2luVG9wfSAgICAgICA9IDMwOwogICAgICAgICAgICAkUGFnZVBhcmFte01hcmdpblJpZ2h0fSAgICAgPSA0MDsKICAgICAgICAgICAgJFBhZ2VQYXJhbXtNYXJnaW5Cb3R0b219ICAgID0gNDA7CiAgICAgICAgICAgICRQYWdlUGFyYW17TWFyZ2luTGVmdH0gICAgICA9IDQwOwogICAgICAgICAgICAkUGFnZVBhcmFte0hlYWRlclJpZ2h0fSAgICAgPSAkVGl0bGU7CgogICAgICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICAgICBteSAlVGFibGVQYXJhbTsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9ICAgICAgICAgICAgPSAkQ2VsbERhdGE7CiAgICAgICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgID0gNjsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgPSAwOwogICAgICAgICAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JFdmVufSA9ICcjREREREREJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICAgICAgPSAxOwogICAgICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAgICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgID0gMzsKCiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBwZGYgZG9jdW1lbnQKICAgICAgICAgICAgJFBERk9iamVjdC0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgICAgICBUaXRsZSAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9kdWN0JykgLiAnOiAnIC4gJFRpdGxlLAogICAgICAgICAgICAgICAgRW5jb2RlID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHN0YXJ0IHRhYmxlIG91dHB1dAogICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJVBhZ2VQYXJhbSwKICAgICAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdlIC4gJyAxJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgdGl0bGUKICAgICAgICAgICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICAgICAgICAgIFRleHQgICAgID0+ICRUaXRsZSwKICAgICAgICAgICAgICAgIEZvbnRTaXplID0+IDEzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCAicHJpbnRlZCBieSIKICAgICAgICAgICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFByaW50ZWRCeSAuICcgJwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRnVsbG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkVGltZSwKICAgICAgICAgICAgICAgIEZvbnRTaXplID0+IDksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAtMTQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBQQUdFOgogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMiAuLiAkTWF4UGFnZXMgKSB7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICAgICAlVGFibGVQYXJhbSA9ICRQREZPYmplY3QtPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIGFub3RoZXIgcGFnZQogICAgICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJVBhZ2VQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2UgLiAnICcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZXR1cm4gdGhlIHBkZiBkb2N1bWVudAogICAgICAgICAgICBteSAkQ3VycmVudFN5c3RlbURUT2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgICAgIG15ICRQREZTdHJpbmcgICAgICAgICAgPSAkUERGT2JqZWN0LT5Eb2N1bWVudE91dHB1dCgpOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZ2l0ZW1fc2VhcmNoXyVzXyVzLnBkZicsCiAgICAgICAgICAgICAgICAgICAgJEN1cnJlbnRTeXN0ZW1EVE9iai0+Rm9ybWF0KCBGb3JtYXQgPT4gJyVGXyVILSVNJyApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJFBERlN0cmluZywKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBub3JtYWwgSFRNTCBvdXRwdXQKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc3RhcnQgaHRtbCBwYWdlCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIHVzZSBjbGFzc25hbWUgYXMgZmlsdGVyCiAgICAgICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0gICAgICAgICAgICAgICAgICAgIHx8ICdBbGwnOwogICAgICAgICAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSB8fCAnJzsKCiAgICAgICAgICAgICMgc2hvdyBjb25maWcgaXRlbXMKICAgICAgICAgICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAgICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgICAgICAgICAgLiAnO1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1NvcnRCeX0gKQogICAgICAgICAgICAgICAgLiAnO09yZGVyQnk9JwogICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57T3JkZXJCeX0gKQogICAgICAgICAgICAgICAgLiAnO1Byb2ZpbGU9JyAuICRTZWxmLT57UHJvZmlsZX0gLiAnO1Rha2VMYXN0U2VhcmNoPTE7U3ViYWN0aW9uPVNlYXJjaCcKICAgICAgICAgICAgICAgIC4gJztDbGFzc0lEPScgLiAkQ2xhc3NJRAogICAgICAgICAgICAgICAgLiAnOyc7CiAgICAgICAgICAgIG15ICRMaW5rU29ydCA9ICdGaWx0ZXI9JwogICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAgICAgICAgIC4gJztQcm9maWxlPScgLiAkU2VsZi0+e1Byb2ZpbGV9IC4gJztUYWtlTGFzdFNlYXJjaD0xO1N1YmFjdGlvbj1TZWFyY2gnCiAgICAgICAgICAgICAgICAuICc7Q2xhc3NJRD0nIC4gJENsYXNzSUQKICAgICAgICAgICAgICAgIC4gJzsnOwogICAgICAgICAgICBteSAkTGlua0ZpbHRlciA9ICdUYWtlTGFzdFNlYXJjaD0xO1N1YmFjdGlvbj1TZWFyY2g7UHJvZmlsZT0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntQcm9maWxlfSApCiAgICAgICAgICAgICAgICAuICc7Q2xhc3NJRD0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJENsYXNzSUQgKQogICAgICAgICAgICAgICAgLiAnOyc7CiAgICAgICAgICAgIG15ICRMaW5rQmFjayA9ICdTdWJhY3Rpb249TG9hZFByb2ZpbGU7UHJvZmlsZT0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntQcm9maWxlfSApCiAgICAgICAgICAgICAgICAuICc7Q2xhc3NJRD0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJENsYXNzSUQgKQogICAgICAgICAgICAgICAgLiAnO1Rha2VMYXN0U2VhcmNoPTE7JzsKCiAgICAgICAgICAgIG15ICRDbGFzc05hbWUgPSAkQ2xhc3NMaXN0LT57JENsYXNzSUR9OwogICAgICAgICAgICBteSAkVGl0bGUgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDb25maWcgSXRlbSBTZWFyY2ggUmVzdWx0cycpCiAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NsYXNzJykKICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkQ2xhc3NOYW1lKTsKCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1MaXN0U2hvdygKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRHMgPT4gXEBTZWFyY2hSZXN1bHRMaXN0LAogICAgICAgICAgICAgICAgVG90YWwgICAgICAgICA9PiBzY2FsYXIgQFNlYXJjaFJlc3VsdExpc3QsCiAgICAgICAgICAgICAgICBWaWV3ICAgICAgICAgID0+ICRTZWxmLT57Vmlld30sCiAgICAgICAgICAgICAgICBGaWx0ZXIgICAgICAgID0+ICRDbGFzc05hbWUsCiAgICAgICAgICAgICAgICBFbnYgICAgICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICAgICAgTGlua1BhZ2UgICAgICA9PiAkTGlua1BhZ2UsCiAgICAgICAgICAgICAgICBMaW5rU29ydCAgICAgID0+ICRMaW5rU29ydCwKICAgICAgICAgICAgICAgIExpbmtGaWx0ZXIgICAgPT4gJExpbmtGaWx0ZXIsCiAgICAgICAgICAgICAgICBMaW5rQmFjayAgICAgID0+ICRMaW5rQmFjaywKICAgICAgICAgICAgICAgIFByb2ZpbGUgICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgICAgIFRpdGxlTmFtZSAgICAgPT4gJFRpdGxlLAogICAgICAgICAgICAgICAgU29ydEJ5ICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57U29ydEJ5fSApLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57T3JkZXJCeX0gKSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICBSZXF1ZXN0VVJMICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgICAgIEJ1bGsgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ29uZmlnSXRlbVNlYXJjaCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCBmb290ZXIKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhbGwgc2VhcmNoIGRpYWxvZyBmcm9tIHNlYXJjaCBlbXB0eSBzY3JlZW4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIHNob3cgZGVmYXVsdCBzZWFyY2ggc2NyZWVuCiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ29uZmlnSXRlbU9wZW5TZWFyY2hEaWFsb2cnLAogICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICBQcm9maWxlID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGVtcGxhdGUKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentITSMConfigItemZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICByZXR1cm4gYmxlc3MgeyVQYXJhbX0sICRUeXBlOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkQ29uZmlnSXRlbUlEICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApOwogICAgbXkgJEdldFBhcmFtVmVyc2lvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ29uZmlnSXRlbUlEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdAogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCiAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259IiktPntQZXJtaXNzaW9ufSwKICAgICk7CgogICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKCiAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15ICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFZlcnNpb25JRCAgICAgPT4gJEdldFBhcmFtVmVyc2lvbklELAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CiAgICBpZiAoICEkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NvbmZpZ0l0ZW0gbm90IGZvdW5kIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uIGxpc3QKICAgIG15ICRWZXJzaW9uTGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uWm9vbUxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmVyc2lvbkxpc3QpICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyB2ZXJzaW9ucyBmb3VuZCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBUT0RPOiBDb21wYXJlIHdpdGggbGVnYWN5IGNvZGUgdG8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgZ29vZCBwbGFjZS4gTGluZSAyNTYgdGhyb3dzIGFuIGVycm9yIGlmIG5vdCBzZXQsIGVsc2UKICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH07CgogICAgIyBydW4gY29uZmlnIGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkU2VsZi0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IGNsYXNzZXMKICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ1BvcFVwJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e01lbnVDbGFzc30gPSAnQXNQb3B1cCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ0JhY2snICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVudXN7JE1lbnV9LT57TWVudUNsYXNzfSA9ICdIaXN0b3J5QmFjayc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRDb25maWdJdGVtLAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgICAgIE1lbnVJRCAgICAgPT4gJE1lbnUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICBUcmFuc2xhdGFibGUoJ29wZXJhdGlvbmFsJykgPT4gJ2dyZWVubGVkJywKICAgICAgICBUcmFuc2xhdGFibGUoJ3dhcm5pbmcnKSAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgVHJhbnNsYXRhYmxlKCdpbmNpZGVudCcpICAgID0+ICdyZWRsZWQnLAogICAgKTsKCiAgICAjIHRvIHN0b3JlIHRoZSBjb2xvciBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzCiAgICBteSAlRGVwbFNpZ25hbHM7CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgbGlzdCBvZiBkZXBsb3ltZW50IHN0YXRlcwogICAgbXkgJERlcGxveW1lbnRTdGF0ZXNMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgIyBzZXQgZGVwbG95bWVudCBzdHlsZSBjb2xvcnMKICAgIG15ICRTdHlsZUNsYXNzZXMgPSAnJzsKCiAgICBJVEVNSUQ6CiAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQga2V5cyAleyREZXBsb3ltZW50U3RhdGVzTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgcHJlZmVyZW5jZXMKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgYSBjb2xvciBpcyBkZWZpbmVkIGluIHByZWZlcmVuY2VzCiAgICAgICAgbmV4dCBJVEVNSUQgdW5sZXNzICRQcmVmZXJlbmNlc3tDb2xvcn07CiAgICAgICAgbXkgKCRDb2xvcikgPSAkUHJlZmVyZW5jZXN7Q29sb3J9LT5AKjsKICAgICAgICBuZXh0IElURU1JRCB1bmxlc3MgJENvbG9yOwoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlCiAgICAgICAgbXkgJERlcGxTdGF0ZSA9ICREZXBsb3ltZW50U3RhdGVzTGlzdC0+eyRJdGVtSUR9OwoKICAgICAgICAjIHJlbW92ZSBhbnkgbm9uIGFzY2lpIHdvcmQgY2hhcmFjdGVycwogICAgICAgICREZXBsU3RhdGUgPX4gc3sgW15hLXpBLVowLTldIH17X31tc3hnOwoKICAgICAgICAjIHN0b3JlIHRoZSBvcmlnaW5hbCBkZXBsb3ltZW50IHN0YXRlIGFzIGtleQogICAgICAgICMgYW5kIHRoZSBzcyBzYWZlIGNvdmVydGVkIGRlcGxveW1lbnQgc3RhdGUgYXMgdmFsdWUKICAgICAgICAkRGVwbFNpZ25hbHN7ICREZXBsb3ltZW50U3RhdGVzTGlzdC0+eyRJdGVtSUR9IH0gPSAkRGVwbFN0YXRlOwoKICAgICAgICAjIGNvdmVydCB0byBsb3dlciBjYXNlCiAgICAgICAgbXkgJERlcGxTdGF0ZUNvbG9yID0gbGMoJENvbG9yKSA9fiBzL1teMC05YS1mXS8vbXNncjsKCiAgICAgICAgIyBhZGQgdG8gc3R5bGUgY2xhc3NlcyBzdHJpbmcKICAgICAgICAkU3R5bGVDbGFzc2VzIC49ICIKICAgICAgICAgICAgLkZsYWcgc3Bhbi4kRGVwbFN0YXRlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMkRGVwbFN0YXRlQ29sb3I7CiAgICAgICAgICAgIH0KICAgICAgICAiOwogICAgfQoKICAgICMgd3JhcCBpbnRvIHN0eWxlIHRhZ3MKICAgIGlmICgkU3R5bGVDbGFzc2VzKSB7CiAgICAgICAgJFN0eWxlQ2xhc3NlcyA9ICI8c3R5bGU+JFN0eWxlQ2xhc3Nlczwvc3R5bGU+IjsKICAgIH0KCiAgICAjIGJ1aWxkIHZlcnNpb24gc2VsZWN0aW9uCiAgICBteSAkQmFzZUxpbmsgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJ1slIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTsnCiAgICAgICAgICAgIC4gIkNvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH07IgogICAgKTsKCiAgICBteSBAVmVyc2lvblNlbGVjdGlvbkRhdGEgPSBtYXAgewogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gKCAkQmFzZUxpbmsgLiAiVmVyc2lvbklEPSRfLT57VmVyc2lvbklEfSIgKSwKICAgICAgICAgICAgVmFsdWUgPT4gKAogICAgICAgICAgICAgICAgIlZlcnNpb24gIiAuICggJF8tPntWZXJzaW9uU3RyaW5nfSB8fCAkXy0+e1ZlcnNpb25JRH0gKQogICAgICAgICAgICApLAogICAgICAgIH0KICAgIH0gJFZlcnNpb25MaXN0LT5AKjsKCiAgICBteSAkVmVyc2lvblNlbGVjdGlvbiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcQFZlcnNpb25TZWxlY3Rpb25EYXRhLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnVmVyc2lvblNlbGVjdGlvbicsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbklEID8gJEJhc2VMaW5rIC4gIlZlcnNpb25JRD0kVmVyc2lvbklEIiA6IHVuZGVmLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTZWxlY3Rpb25Sb3cnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uU2VsZWN0aW9uID0+ICRWZXJzaW9uU2VsZWN0aW9uLAogICAgICAgIH0sCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVmFsdWUgPT4gIkNJIyRDb25maWdJdGVtLT57TnVtYmVyfSIgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgaWYgYSB2ZXJzaW9uIGFscmVhZHkgZXhpc3RzIChUT0RPOiBXaGVuIGRvZXMgaXQgbm90PykKICAgIGlmICggJENvbmZpZ0l0ZW0tPntOYW1lfSApIHsKCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgIG15ICRDb25maWdJdGVtTmFtZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRDb25maWdJdGVtLT57TmFtZX0sCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbmFtZQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ05hbWUnKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbScpLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lLAogICAgICAgICAgICAgICAgSWRlbnRhdGlvbiAgPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0RlcGxveW1lbnQgU3RhdGUnKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbScpLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT57RGVwbFN0YXRlfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBJZGVudGF0aW9uID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGluY2lkZW50IHN0YXRlCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnSW5jaWRlbnQgU3RhdGUnKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nKSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0luY2lTdGF0ZX0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgSWRlbnRhdGlvbiA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW0tPntEZWZpbml0aW9uSUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVHcm91cExvb2t1cDsKICAgICAgICBteSBAUGFnZXM7CiAgICAgICAgbXkgJFBhZ2VTaG93bjsKICAgICAgICBteSAkUGFnZVJlcXVlc3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQYWdlJyApOwogICAgICAgIFBBR0U6CiAgICAgICAgZm9yIG15ICRQYWdlICggJERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfXtQYWdlc30tPkAqICkgewoKICAgICAgICAgICAgIyBJbnRlcmZhY2VzIGlzIG9wdGlvbmFsLCBlZmZlY3RpdmVseSBkZWZhdWx0IHRvIFsgJ0FnZW50JyBdCiAgICAgICAgICAgIGlmICggJFBhZ2UtPntJbnRlcmZhY2VzfSApIHsKICAgICAgICAgICAgICAgIG5leHQgUEFHRSB1bmxlc3MgYW55IHsgJF8gZXEgJ0FnZW50JyB9ICRQYWdlLT57SW50ZXJmYWNlc30tPkAqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYWdlLT57R3JvdXBzfSApIHsKICAgICAgICAgICAgICAgIGlmICggISVHcm91cExvb2t1cCApIHsKICAgICAgICAgICAgICAgICAgICAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdyYW50IGFjY2VzcyB0byB0aGUgcGFnZSBvbmx5IHdoZW4gdGhlIHVzZXIgaXMgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZ3JvdXBzCiAgICAgICAgICAgICAgICBuZXh0IFBBR0UgdW5sZXNzIGFueSB7ICRHcm91cExvb2t1cHskX30gfSAkUGFnZS0+e0dyb3Vwc30tPkAqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBQYWdlcywgJFBhZ2U7CgogICAgICAgICAgICBpZiAoICRQYWdlUmVxdWVzdGVkICYmICRQYWdlLT57TmFtZX0gZXEgJFBhZ2VSZXF1ZXN0ZWQgKSB7CiAgICAgICAgICAgICAgICAkUGFnZVNob3duID0gJFBhZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAkUGFnZVNob3duIC8vPSBAUGFnZXMgPyAkUGFnZXNbMF0gOiB1bmRlZjsKCiAgICAgICAgaWYgKCBzY2FsYXIgQFBhZ2VzID09IDEgKSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VOYW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFBhZ2VOYW1lID0+ICRQYWdlc1swXXtOYW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgbXkgJFBhZ2UgKEBQYWdlcykgewoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUGFnZU5hbWUgICAgID0+ICRQYWdlLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25JRCAgICA9PiAkR2V0UGFyYW1WZXJzaW9uSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkICAgICA9PiAkUGFnZS0+e05hbWV9IGVxICRQYWdlU2hvd24tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKEBQYWdlcykgewogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0R5bmFtaWNGaWVsZEhUTUx9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpEeW5hbWljRmllbGQnKS0+UGFnZVJlbmRlcigKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJENvbmZpZ0l0ZW0sCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uLAogICAgICAgICAgICAgICAgUGFnZVJlZiAgICA9PiAkUGFnZVNob3duIC8vICRQYWdlc1swXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBnZXQgY3JlYXRlICYgY2hhbmdlIHVzZXIgZGF0YQogICAgZm9yIG15ICRLZXkgKHF3KENyZWF0ZSBDaGFuZ2UpKSB7CiAgICAgICAgJENvbmZpZ0l0ZW0tPnsgJEtleSAuICdCeVVzZXJGdWxsTmFtZScgfSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRDb25maWdJdGVtLT57ICRLZXkgLiAnQnknIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBtZXRhIGJsb2NrCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgIEN1ckRlcGxTaWduYWwgPT4gJERlcGxTaWduYWxzeyAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZX0gfSwKICAgICAgICB9LAogICAgKTsKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICMgZGlzcGxheSBjb25maWcgaXRlbSBwZXJtaXNzaW9uIGdyb3VwIGluIHRoZSBtZXRhIGJsb2NrIGlmIHRoYXQgZmVhdHVyZSBpcyBlbmFibGVkIGZvciB0aGUgY2xhc3MKICAgIG15ICVDbGFzc1ByZWZlcmVuY2VzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKICAgIGlmICggJENsYXNzUHJlZmVyZW5jZXN7Q29uZmlnSXRlbUdyb3VwfSAmJiAkQ2xhc3NQcmVmZXJlbmNlc3tDb25maWdJdGVtR3JvdXB9WzBdICkgewogICAgICAgIG15ICRHcm91cE5hbWU7CiAgICAgICAgaWYgKCRDb25maWdJdGVtLT57R3JvdXBJRH0pIHsKICAgICAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgICAgIG15ICVHcm91cHMgICAgICA9ICRHcm91cE9iamVjdC0+R3JvdXBMaXN0KAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdyb3VwTmFtZSA9ICRHcm91cHN7ICRDb25maWdJdGVtLT57R3JvdXBJRH0gfTsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjcmVhdGUgdGhlIGxpbmsgdGFibGUKICAgIG15ICRMaW5rVGFibGVTdHJnID0gJExheW91dE9iamVjdC0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgT2JqZWN0ICAgICAgICAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyBvdXRwdXQgdGhlIGxpbmsgdGFibGUKICAgIGlmICgkTGlua1RhYmxlU3RyZykgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGUnIC4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExpbmtUYWJsZVN0cmcgPT4gJExpbmtUYWJsZVN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSBAQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICBteSBATm9uSW5saW5lQXR0YWNobWVudHM7CgogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICMgZ2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgY3VycmVudCBhdHRhY2htZW50CiAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRBdHRhY2htZW50LAogICAgICAgICk7CiAgICAgICAgcHVzaCBATm9uSW5saW5lQXR0YWNobWVudHMsICRBdHRhY2htZW50RGF0YTsKICAgIH0KCiAgICBpZiAoQE5vbklubGluZUF0dGFjaG1lbnRzKSB7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50cycsCiAgICAgICAgKTsKCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnREYXRhIChATm9uSW5saW5lQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgICAgIEZpbGVzaXplICAgICA9PiAkQXR0YWNobWVudERhdGEtPntGaWxlc2l6ZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBEb3dubG9hZEF0dGFjaG1lbnQKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZEF0dGFjaG1lbnQnICkgewoKICAgICAgICAjIGdldCBkYXRhIGZvciBhdHRhY2htZW50CiAgICAgICAgbXkgJEZpbGVuYW1lICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbGVuYW1lJyApOwogICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIEZpbGVuYW1lICAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgICAgIGlmICggISRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkRmlsZW5hbWUpISIsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAleyRBdHRhY2htZW50RGF0YX0sCiAgICAgICAgICAgIFR5cGUgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnVXNlckNvbmZpZ0l0ZW1ab29tVGFibGVIZWlnaHQnLAogICAgICAgIFZhbHVlID0+ICRTZWxmLT57U2Vzc2lvbn17VXNlckNvbmZpZ0l0ZW1ab29tVGFibGVIZWlnaHR9LAogICAgKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgcmV0dXJuIGpvaW4gJycsCiAgICAgICAgJE91dHB1dCwKICAgICAgICAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPiUqLAogICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTaWduYWwgPT4gJERlcGxTaWduYWxzeyAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZX0gfSwKICAgICAgICAgICAgICAgIFN0eWxlQ2xhc3NlcyAgPT4gJFN0eWxlQ2xhc3NlcywKICAgICAgICAgICAgfSwKICAgICAgICApLAogICAgICAgICRMYXlvdXRPYmplY3QtPkZvb3RlcjsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/CustomerITSMConfigItem.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9DdXN0b21lcklUU01Db25maWdJdGVtLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lcklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKdXNlIExpc3Q6OlV0aWwgcXcoYW55IG5vbmUpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCBkZWJ1ZwogICAgJFNlbGYtPntEZWJ1Z30gPSAwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAkU29ydEJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRDb25maWctPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnQWdlJzsKCiAgICBpZiAoICRTb3J0QnkgZXEgJ0xhc3RDaGFuZ2VkJyApIHsKICAgICAgICAkU29ydEJ5ID0gJ0NoYW5nZWQnOwogICAgfQoKICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IG9yZGVyaW5nIHRvIGJlIHVzZWQuCiAgICBteSAkRGVmYXVsdE9yZGVyQnkgPSAkQ29uZmlnLT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgICMgU2V0IHRoZSBzb3J0IG9yZGVyIGZyb20gdGhlIHJlcXVlc3QgcGFyYW1ldGVycywgb3IgdGFrZSB0aGUgZGVmYXVsdC4KICAgIG15ICRPcmRlckJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyQnknICkKICAgICAgICB8fCAkRGVmYXVsdE9yZGVyQnk7CgogICAgIyBnZXQgc2Vzc2lvbiBvYmplY3QKICAgIG15ICRTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CgogICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgZ2V0IGZpbHRlciBmcm9tIHdlYiByZXF1ZXN0CiAgICBteSAkRmlsdGVyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnJzsKCiAgICAjIGdldCBmaWx0ZXJzIHN0b3JlZCBpbiB0aGUgdXNlciBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJFN0b3JlZEZpbHRlcnNLZXkgPSAnVXNlclN0b3JlZEZpbHRlckNvbHVtbnMtJyAuICRTZWxmLT57QWN0aW9ufSAuICctJyAuICRGaWx0ZXI7CiAgICBteSAkSlNPTk9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CiAgICBteSAkU3RvcmVkRmlsdGVycyAgICA9ICRKU09OT2JqZWN0LT5EZWNvZGUoCiAgICAgICAgRGF0YSA9PiAkUHJlZmVyZW5jZXN7JFN0b3JlZEZpbHRlcnNLZXl9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBzdG9yZWQgZmlsdGVycyBpZiBuZWVkZWQKICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0RlbGV0ZUZpbHRlcnMnICkgKSB7CiAgICAgICAgJFN0b3JlZEZpbHRlcnMgPSB7fTsKICAgIH0KCiAgICAjIGdldCB0aGUgY29sdW1uIGZpbHRlcnMgZnJvbSB0aGUgd2ViIHJlcXVlc3Qgb3IgdXNlciBwcmVmZXJlbmNlcwogICAgbXkgJUNvbHVtbkZpbHRlcjsKICAgIG15ICVHZXRDb2x1bW5GaWx0ZXI7CiAgICBDT0xVTU5OQU1FOgogICAgZm9yIG15ICRDb2x1bW5OYW1lICgKICAgICAgICBxdyhEZXBsU3RhdGUgQ3VyRGVwbFN0YXRlIEluY2lTdGF0ZSBDdXJJbmNpU3RhdGUgQ2xhc3MpCiAgICAgICAgKQogICAgewogICAgICAgICMgZ2V0IGNvbHVtbiBmaWx0ZXIgZnJvbSB3ZWIgcmVxdWVzdAogICAgICAgIG15ICRGaWx0ZXJWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb2x1bW5GaWx0ZXInIC4gJENvbHVtbk5hbWUgKQogICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgIyBpZiBmaWx0ZXIgaXMgbm90IHByZXNlbnQgaW4gdGhlIHdlYiByZXF1ZXN0LCB0cnkgd2l0aCB0aGUgdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICggJEZpbHRlclZhbHVlIGVxICcnICkgewogICAgICAgICAgICAkRmlsdGVyVmFsdWUgPSAkU3RvcmVkRmlsdGVycy0+eyAkQ29sdW1uTmFtZSAuICdJRHMnIH0tPlswXSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICRGaWx0ZXJWYWx1ZSBlcSAnJzsKICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgJEZpbHRlclZhbHVlIGVxICdEZWxldGVGaWx0ZXInOwoKICAgICAgICBwdXNoIEB7ICRDb2x1bW5GaWx0ZXJ7ICRDb2x1bW5OYW1lIC4gJ0lEcycgfSB9LCAkRmlsdGVyVmFsdWU7CiAgICAgICAgJEdldENvbHVtbkZpbHRlcnskQ29sdW1uTmFtZX0gPSAkRmlsdGVyVmFsdWU7CiAgICB9CgogICAgIyBnZXQgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydJVFNNQ29uZmlnSXRlbSddLAogICAgKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwoKICAgICAgICAjIGdldCBmaWx0ZXIgZnJvbSB3ZWIgcmVxdWVzdAogICAgICAgIG15ICRGaWx0ZXJWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdDb2x1bW5GaWx0ZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfQogICAgICAgICk7CgogICAgICAgICMgaWYgbm8gZmlsdGVyIGZyb20gd2ViIHJlcXVlc3QsIHRyeSBmcm9tIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBpZiAoICFkZWZpbmVkICRGaWx0ZXJWYWx1ZSB8fCAkRmlsdGVyVmFsdWUgZXEgJycgKSB7CiAgICAgICAgICAgICRGaWx0ZXJWYWx1ZSA9ICRTdG9yZWRGaWx0ZXJzLT57ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LT57RXF1YWxzfTsKICAgICAgICB9CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICRGaWx0ZXJWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRmlsdGVyVmFsdWUgZXEgJyc7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJEZpbHRlclZhbHVlIGVxICdEZWxldGVGaWx0ZXInOwoKICAgICAgICAkQ29sdW1uRmlsdGVyeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9IHsKICAgICAgICAgICAgRXF1YWxzID0+ICRGaWx0ZXJWYWx1ZSwKICAgICAgICB9OwogICAgICAgICRHZXRDb2x1bW5GaWx0ZXJ7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJEZpbHRlclZhbHVlOwogICAgfQoKICAgICMgYnVpbGQgTmF2aWdhdGlvbkJhciAmIHRvIGdldCB0aGUgb3V0cHV0IGZhc3RlciEKICAgIG15ICRSZWZyZXNoID0gJyc7CiAgICBpZiAoICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSApIHsKICAgICAgICAkUmVmcmVzaCA9IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJE91dHB1dDsKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IG5lICdBSkFYRmlsdGVyVXBkYXRlJyApIHsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgIFJlZnJlc2ggPT4gJFJlZnJlc2gsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNvcnQgb24gZGVmYXVsdCBieSB1c2luZyBib3RoIChQcmlvcml0eSwgQWdlKSBlbHNlIHVzZSBvbmx5IG9uZSBzb3J0IGFyZ3VtZW50CiAgICBteSAlU29ydDsKCiAgICAjIGdldCBpZiBzZWFyY2ggcmVzdWx0IHNob3VsZCBiZSBwcmUtc29ydGVkIGJ5IHByaW9yaXR5CiAgICBteSAkUHJlU29ydEJ5UHJpb3JpdHkgPSAkQ29uZmlnLT57J1ByZVNvcnQ6OkJ5UHJpb3JpdHknfTsKICAgIGlmICggISRQcmVTb3J0QnlQcmlvcml0eSApIHsKICAgICAgICAlU29ydCA9ICgKICAgICAgICAgICAgU29ydEJ5ICA9PiAkU29ydEJ5LAogICAgICAgICAgICBPcmRlckJ5ID0+ICRPcmRlckJ5LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAlU29ydCA9ICgKICAgICAgICAgICAgU29ydEJ5ICA9PiBbICdQcmlvcml0eScsICRTb3J0QnkgXSwKICAgICAgICAgICAgT3JkZXJCeSA9PiBbICdEb3duJywgICAgICRPcmRlckJ5IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG15IGNvbmZpZyBpdGVtIG9iamVjdAogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAjIHRvIHN0b3JlIHRoZSBOYXZCYXIgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgbXkgQFZpZXdhYmxlRGVwbFN0YXRlSURzOwogICAgbXkgQFZpZXdhYmxlQ2xhc3NJRHM7CgogICAgIyBmZXRjaCBmaWx0ZXJzIGZyb20gY29uZmlnCiAgICBteSAkUGVybWlzc2lvbkNvbmRpdGlvbnNDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpDb25maWdJdGVtOjpQZXJtaXNzaW9uQ29uZGl0aW9ucycpOwogICAgbXkgJUdyb3VwTG9va3VwOwoKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBlcm1pc3Npb25Db25kaXRpb25zQ29uZmlnKSApIHsKICAgICAgICBQRVJNQ09ORjoKICAgICAgICBmb3IgbXkgJENvbmZpZ0NvdW50ZXIgKCAxIC4uIDUgKSB7CiAgICAgICAgICAgIG15ICRDb25maWdJZGVudGlmaWVyICAgICAgICAgID0gc3ByaW50ZiggIiUwMmQiLCAkQ29uZmlnQ291bnRlciApOwogICAgICAgICAgICBteSAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZyA9ICRQZXJtaXNzaW9uQ29uZGl0aW9uc0NvbmZpZy0+eyRDb25maWdJZGVudGlmaWVyfTsKICAgICAgICAgICAgbmV4dCBQRVJNQ09ORiB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJFBlcm1pc3Npb25Db25kaXRpb25Db25maWcpOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZ3JvdXAgcGVybWlzc2lvbgogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntHcm91cHN9ICkgKSB7CgogICAgICAgICAgICAgICAgIyBwcmVwYXJlIGdyb3VwIGxvb2t1cCBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgICAgIGlmICggISVHcm91cExvb2t1cCApIHsKICAgICAgICAgICAgICAgICAgICAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAwOwogICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwTmFtZSAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57R3JvdXBzfS0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEdyb3VwTG9va3VweyRHcm91cE5hbWV9OwoKICAgICAgICAgICAgICAgICAgICAkQWNjZXNzT2sgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG5leHQgUEVSTUNPTkYgdW5sZXNzICRBY2Nlc3NPazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgYXMgc2VsZWN0ZWQgZmlsdGVyIGlmIG5vdCBwcmVzZW50CiAgICAgICAgICAgICRGaWx0ZXIgfHw9ICRDb25maWdJZGVudGlmaWVyOwoKICAgICAgICAgICAgIyBjb2xsZWN0IGR5bmFtaWMgZmllbGQgc2VhcmNoIHBhcmFtcwogICAgICAgICAgICBteSAlREZTZWFyY2hQYXJhbXM7CiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfSApICkgewogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgICAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGROYW1lICgga2V5cyAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0R5bmFtaWNGaWVsZFZhbHVlc30tPiUqICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEeW5hbWljRmllbGRWYWx1ZXN9eyRGaWVsZE5hbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkREZTZWFyY2hQYXJhbXN7IkR5bmFtaWNGaWVsZF8kRmllbGROYW1lIn0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEeW5hbWljRmllbGRWYWx1ZXN9eyRGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfXskRmllbGROYW1lfSBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERGU2VhcmNoUGFyYW1zeyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHkgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVQZXJtaXNzaW9uQ29uZGl0aW9uU2VhcmNoUGFyYW1zOwogICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57Q3VzdG9tZXJDb21wYW55RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uQ29uZGl0aW9uU2VhcmNoUGFyYW1zeyJEeW5hbWljRmllbGRfJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDdXN0b21lckNvbXBhbnlEeW5hbWljRmllbGR9In0gPSB7CiAgICAgICAgICAgICAgICAgICAgRXF1YWxzID0+ICRTZWxmLT57Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDdXN0b21lclVzZXJEeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICAgICAgJFBlcm1pc3Npb25Db25kaXRpb25TZWFyY2hQYXJhbXN7IkR5bmFtaWNGaWVsZF8kUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0N1c3RvbWVyVXNlckR5bmFtaWNGaWVsZH0ifSA9IHsKICAgICAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJUZpbHRlclNlYXJjaCA9ICgKICAgICAgICAgICAgICAgIENsYXNzZXMgICAgPT4gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDbGFzc2VzfSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZXMgPT4gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEZXBsb3ltZW50U3RhdGVzfSwKICAgICAgICAgICAgICAgICVERlNlYXJjaFBhcmFtcywKICAgICAgICAgICAgICAgICVQZXJtaXNzaW9uQ29uZGl0aW9uU2VhcmNoUGFyYW1zLAogICAgICAgICAgICAgICAgJVNvcnQsCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAkU2VsZi0+e1NlYXJjaExpbWl0fSAvLyAnMTAwMCcsCiAgICAgICAgICAgICk7CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckdyb3VwU3VwcG9ydCcpICkgewogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyR3JvdXBPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKICAgICAgICAgICAgICAgIG15ICVBdXRob3JpemVkR3JvdXBzSGFzaCA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15IEBBdXRob3JpemVkR3JvdXBJRHMgPSBrZXlzICVBdXRob3JpemVkR3JvdXBzSGFzaDsKICAgICAgICAgICAgICAgICRGaWx0ZXJTZWFyY2h7R3JvdXBJRHN9ID0gXEBBdXRob3JpemVkR3JvdXBJRHM7CiAgICAgICAgICAgIH0KIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAjIGFwcGx5IGZpbHRlciByZXN0cmljdGlvbnMgdG8gc2VhcmNoIGZvcgogICAgICAgICAgICBpZiAoICRHZXRDb2x1bW5GaWx0ZXJ7Q2xhc3N9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0NsYXNzZXN9LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGFueSB7ICRDbGFzc0xpc3QtPnsgJEdldENvbHVtbkZpbHRlcntDbGFzc30gfSBlcSAkXyB9ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57Q2xhc3Nlc30tPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICBAVmlld2FibGVDbGFzc0lEcyA9ICggJEdldENvbHVtbkZpbHRlcntDbGFzc30gKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEZpbHRlclNlYXJjaHtDbGFzc2VzfSA9IFsgJENsYXNzTGlzdC0+eyAkR2V0Q29sdW1uRmlsdGVye0NsYXNzfSB9IF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQFZpZXdhYmxlQ2xhc3NJRHMgPSAoICRHZXRDb2x1bW5GaWx0ZXJ7Q2xhc3N9ICk7CiAgICAgICAgICAgICAgICAgICAgJEZpbHRlclNlYXJjaHtDbGFzc2VzfSA9IFsgJENsYXNzTGlzdC0+eyAkR2V0Q29sdW1uRmlsdGVye0NsYXNzfSB9IF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBAVmlld2FibGVDbGFzc0lEcyA9IHNvcnQga2V5cyAkQ2xhc3NMaXN0LT4lKjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRHZXRDb2x1bW5GaWx0ZXJ7RGVwbFN0YXRlfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEZXBsb3ltZW50U3RhdGVzfS0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBhbnkgeyAkRGVwbFN0YXRlTGlzdC0+eyAkR2V0Q29sdW1uRmlsdGVye0RlcGxTdGF0ZX0gfSBlcSAkXyB9ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RGVwbG95bWVudFN0YXRlc30tPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICBAVmlld2FibGVEZXBsU3RhdGVJRHMgPSAoICRHZXRDb2x1bW5GaWx0ZXJ7RGVwbFN0YXRlfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkRmlsdGVyU2VhcmNoe0RlcGxTdGF0ZXN9ID0gWyAkRGVwbFN0YXRlTGlzdC0+eyAkR2V0Q29sdW1uRmlsdGVye0RlcGxTdGF0ZX0gfSBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIEBWaWV3YWJsZURlcGxTdGF0ZUlEcyA9ICggJEdldENvbHVtbkZpbHRlcntEZXBsU3RhdGV9ICk7CiAgICAgICAgICAgICAgICAgICAgJEZpbHRlclNlYXJjaHtEZXBsU3RhdGVzfSA9IFsgJERlcGxTdGF0ZUxpc3QtPnsgJEdldENvbHVtbkZpbHRlcntEZXBsU3RhdGV9IH0gXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBWaWV3YWJsZURlcGxTdGF0ZUlEcyA9IHNvcnQga2V5cyAkRGVwbFN0YXRlTGlzdC0+JSo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgICAgIGlmICggQFZpZXdhYmxlQ2xhc3NJRHMgJiYgQFZpZXdhYmxlRGVwbFN0YXRlSURzICkgewogICAgICAgICAgICAgICAgJENvdW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgICAgICAgICAgICAgJUZpbHRlclNlYXJjaCwKICAgICAgICAgICAgICAgICAgICAlQ29sdW1uRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEZpbHRlcnN7JENvbmZpZ0lkZW50aWZpZXJ9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBQcmlvICAgPT4gJFByaW9Db3VudGVyLAogICAgICAgICAgICAgICAgQ291bnQgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiBcJUZpbHRlclNlYXJjaCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRGaWx0ZXIgPSAkRmlsdGVyTmFtZTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAkRmlsdGVyICYmICFleGlzdHMgJEZpbHRlcnN7JEZpbHRlcn0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdJbnZhbGlkIEZpbHRlcjogJXMhJywgJEZpbHRlciApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGhlYWRlciBmaWx0ZXIKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlsdGVySGVhZGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyAkRmlsdGVyc3skS2V5fSB9LAogICAgICAgICAgICAgICAgRmlsdGVyID0+ICRLZXksCiAgICAgICAgICAgICAgICBDbGFzc0EgPT4gJEtleSBlcSAkRmlsdGVyID8gJ1NlbGVjdGVkJyA6ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGZpbHRlciBkZWxldGUgaWYgbmVlZGVkCiAgICBpZiAoJUdldENvbHVtbkZpbHRlcikgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGaWx0ZXJEZWxldGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFZpZXcgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSB8fCAnJzsKCiAgICAjIGxvb2t1cCBsYXRlc3QgdXNlZCB2aWV3IG1vZGUKICAgIGlmICggISRWaWV3ICYmICRTZWxmLT57ICdVc2VyQ29uZmlnSXRlbU92ZXJ2aWV3JyAuICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICRWaWV3ID0gJFNlbGYtPnsgJ1VzZXJDb25maWdJdGVtT3ZlcnZpZXcnIC4gJFNlbGYtPntBY3Rpb259IH07CiAgICB9CgogICAgIyBvdGhlcndpc2UgdXNlIFByZXZpZXcgYXMgZGVmYXVsdCBhcyBpbiBMYXlvdXRDb25maWdJdGVtCiAgICAkVmlldyB8fD0gJ1NtYWxsJzsKCiAgICAjIENoZWNrIGlmIHNlbGVjdGVkIHZpZXcgaXMgYXZhaWxhYmxlLgogICAgbXkgJEJhY2tlbmRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkN1c3RvbWVyT3ZlcnZpZXcnKTsKICAgIGlmICggISRCYWNrZW5kcy0+eyRWaWV3fSApIHsKCiAgICAgICAgIyBUcnkgdG8gZmluZCBmYWxsYmFjaywgdGFrZSBmaXJzdCBjb25maWd1cmVkIHZpZXcgbW9kZS4KICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQmFja2VuZHN9ICkgewogICAgICAgICAgICAkVmlldyA9ICRLZXk7CiAgICAgICAgICAgIGxhc3QgS0VZOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwZXJzb25hbCBwYWdlIHNob3duIGNvdW50CiAgICBteSAkUGFnZVNob3duUHJlZmVyZW5jZXNLZXkgPSAnVXNlckNvbmZpZ0l0ZW1PdmVydmlldycgLiAkVmlldyAuICdQYWdlU2hvd24nOwogICAgbXkgJFBhZ2VTaG93biAgICAgICAgICAgICAgID0gJFNlbGYtPnskUGFnZVNob3duUHJlZmVyZW5jZXNLZXl9IHx8IDEwOwogICAgbXkgJVBhZ2VOYXY7CgogICAgIyBkbyBzaG93biBjb25maWcgaXRlbSBsb29rdXAKICAgIG15ICRMaW1pdCA9IDFfMDAwOwoKICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKSB8fCAnJzsKICAgIG15ICRIZWFkZXJDb2x1bW4gICA9ICRFbGVtZW50Q2hhbmdlZDsKICAgICRIZWFkZXJDb2x1bW4gPX4gc3tcQSBDb2x1bW5GaWx0ZXIgfXt9bXN4ZzsKCiAgICAjIGdldCBkYXRhICh2aWV3YWJsZSBjb25maWcgaXRlbXMuLi4pCiAgICAjIHNlYXJjaCBhbGwgY29uZmlnIGl0ZW1zCiAgICBteSBAVmlld2FibGVDb25maWdJdGVtczsKICAgIG15IEBPcmlnaW5hbFZpZXdhYmxlQ29uZmlnSXRlbXM7CgogICAgIyBidWlsZCBsaW5rcwogICAgbXkgJENvbHVtbkZpbHRlckxpbmsgPSAnJzsKICAgIENPTFVNTk5BTUU6CiAgICBmb3IgbXkgJENvbHVtbk5hbWUgKCBzb3J0IGtleXMgJUdldENvbHVtbkZpbHRlciApIHsKICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgISRDb2x1bW5OYW1lOwogICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhZGVmaW5lZCAkR2V0Q29sdW1uRmlsdGVyeyRDb2x1bW5OYW1lfTsKICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgJEdldENvbHVtbkZpbHRlcnskQ29sdW1uTmFtZX0gZXEgJyc7CiAgICAgICAgJENvbHVtbkZpbHRlckxpbmsKICAgICAgICAgICAgLj0gJzsnIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAnQ29sdW1uRmlsdGVyJyAuICRDb2x1bW5OYW1lICkKICAgICAgICAgICAgLiAnPScgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCAkR2V0Q29sdW1uRmlsdGVyeyRDb2x1bW5OYW1lfSApOwogICAgfQoKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkRmlsdGVyICkKICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkVmlldyApCiAgICAgICAgLiAnO1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICc7T3JkZXJCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAkQ29sdW1uRmlsdGVyTGluawogICAgICAgIC4gJzsnOwoKICAgIG15ICRMaW5rU29ydCA9ICdWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRWaWV3ICkKICAgICAgICAuICc7RmlsdGVyPScKICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEZpbHRlciApCiAgICAgICAgLiAkQ29sdW1uRmlsdGVyTGluawogICAgICAgIC4gJzsnOwoKICAgIG15ICRMaW5rRmlsdGVyID0gJ1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICc7T3JkZXJCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFZpZXcgKQogICAgICAgIC4gJzsnOwoKICAgIG15ICRMYXN0Q29sdW1uRmlsdGVyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xhc3RDb2x1bW5GaWx0ZXInICkgfHwgJyc7CgogICAgaWYgKCAhJExhc3RDb2x1bW5GaWx0ZXIgJiYgJENvbHVtbkZpbHRlckxpbmsgKSB7CgogICAgICAgICMgaXMgcGxhbm5lZCB0byBoYXZlIGEgbGluayB0byBnbyBiYWNrIGhlcmUKICAgICAgICAkTGFzdENvbHVtbkZpbHRlciA9IDE7CiAgICB9CgogICAgaWYgKCBAVmlld2FibGVEZXBsU3RhdGVJRHMgJiYgQFZpZXdhYmxlQ2xhc3NJRHMgKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIHZhbHVlcwogICAgICAgIGlmICgKICAgICAgICAgICAgIUlzU3RyaW5nV2l0aERhdGEoJEhlYWRlckNvbHVtbikKICAgICAgICAgICAgfHwgKAogICAgICAgICAgICAgICAgSXNTdHJpbmdXaXRoRGF0YSgkSGVhZGVyQ29sdW1uKQogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnT25seVZhbHVlc09uQ29uZmlnSXRlbScpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgQE9yaWdpbmFsVmlld2FibGVDb25maWdJdGVtcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgICAgICAlQ29sdW1uRmlsdGVyLAogICAgICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN0YXJ0SGl0ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0SGl0JyApIHx8IDE7CgogICAgICAgICAgICAlUGFnZU5hdiA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgPT4gMTAwMDAsCiAgICAgICAgICAgICAgICBTdGFydEhpdCAgPT4gJFN0YXJ0SGl0LAogICAgICAgICAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgICAgICAgICBBbGxIaXRzICAgPT4gc2NhbGFyIEBPcmlnaW5hbFZpZXdhYmxlQ29uZmlnSXRlbXMsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0FjdGlvbj1DdXN0b21lcklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgIExpbmsgICAgICA9PiAkTGlua1BhZ2UsCiAgICAgICAgICAgICAgICBJRFByZWZpeCAgPT4gJ0N1c3RvbWVySVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgQFZpZXdhYmxlQ29uZmlnSXRlbXMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICAgICAgJUNvbHVtbkZpbHRlciwKICAgICAgICAgICAgICAgIExpbWl0ICA9PiAkU3RhcnRIaXQgKyAkUGFnZVNob3duIC0gMSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgIyBUT0RPIE1heWJlIHRoZXJlIGlzIGEgbW9yZSBlbGVnYW50IHdheSB0byBkbyB0aGlzPwogICAgJFNlbGYtPntGaWx0ZXJ9ICA9ICRGaWx0ZXI7CiAgICAkU2VsZi0+e0ZpbHRlcnN9ID0gXCVGaWx0ZXJzOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYRmlsdGVyVXBkYXRlJyApIHsKCiAgICAgICAgbXkgJEZpbHRlckNvbnRlbnQgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbUxpc3RTaG93KAogICAgICAgICAgICBGaWx0ZXJDb250ZW50T25seSAgICAgPT4gMSwKICAgICAgICAgICAgSGVhZGVyQ29sdW1uICAgICAgICAgID0+ICRIZWFkZXJDb2x1bW4sCiAgICAgICAgICAgIEVsZW1lbnRDaGFuZ2VkICAgICAgICA9PiAkRWxlbWVudENoYW5nZWQsCiAgICAgICAgICAgIE9yaWdpbmFsQ29uZmlnSXRlbUlEcyA9PiBcQE9yaWdpbmFsVmlld2FibGVDb25maWdJdGVtcywKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICdDdXN0b21lcklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgRW52ICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICBWaWV3ICAgICAgICAgICAgICAgICAgPT4gJFZpZXcsCiAgICAgICAgICAgIEVuYWJsZUNvbHVtbkZpbHRlcnMgICA9PiAxLAogICAgICAgICAgICBGcm9udGVuZCAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgRmlsdGVyICAgICAgICAgICAgICAgID0+ICRGaWx0ZXIsCiAgICAgICAgICAgIEZpbHRlcnMgICAgICAgICAgICAgICA9PiBcJUZpbHRlcnMsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJEZpbHRlckNvbnRlbnQgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NhblwndCBnZXQgZmlsdGVyIGNvbnRlbnQgZGF0YSBvZiAlcyEnLCAkSGVhZGVyQ29sdW1uICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsdGVyQ29udGVudCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHN0b3JlIGNvbHVtbiBmaWx0ZXJzCiAgICAgICAgbXkgJFN0b3JlZEZpbHRlcnMgPSBcJUNvbHVtbkZpbHRlcjsKCiAgICAgICAgbXkgJFN0b3JlZEZpbHRlcnNLZXkgPSAnVXNlclN0b3JlZEZpbHRlckNvbHVtbnMtJyAuICRTZWxmLT57QWN0aW9ufSAuICctJyAuICRTZWxmLT57RmlsdGVyfTsKCiAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBLZXkgICAgPT4gJFN0b3JlZEZpbHRlcnNLZXksCiAgICAgICAgICAgIFZhbHVlICA9PiAkSlNPTk9iamVjdC0+RW5jb2RlKCBEYXRhID0+ICRTdG9yZWRGaWx0ZXJzICksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ291bnRUb3RhbCA9IDA7CiAgICBteSAlTmF2QmFyRmlsdGVyOwogICAgZm9yIG15ICRGaWx0ZXJDb2x1bW4gKCBzb3J0IGtleXMgJUZpbHRlcnMgKSB7CiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICBpZiAoQFZpZXdhYmxlRGVwbFN0YXRlSURzKSB7CiAgICAgICAgICAgICRDb3VudCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlckNvbHVtbn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgICAgICAlQ29sdW1uRmlsdGVyLAogICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgICAgICkgfHwgMDsKICAgICAgICB9CgogICAgICAgIGlmICggJEZpbHRlckNvbHVtbiBlcSAkRmlsdGVyICkgewogICAgICAgICAgICAkQ291bnRUb3RhbCA9ICRDb3VudDsKICAgICAgICB9CgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJDb2x1bW59LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgQ291bnQgID0+ICRDb3VudCwKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXJDb2x1bW4sCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJDb2x1bW59IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNob3cgY29uZmlnIGl0ZW1zCiAgICBteSAkQ29uZmlnSXRlbUxpc3RIVE1MID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1MaXN0U2hvdygKICAgICAgICBGaWx0ZXIgICAgICAgICAgICAgICAgPT4gJEZpbHRlciwKICAgICAgICBGaWx0ZXJzICAgICAgICAgICAgICAgPT4gXCVOYXZCYXJGaWx0ZXIsCiAgICAgICAgQ29uZmlnSXRlbUlEcyAgICAgICAgID0+IFxAVmlld2FibGVDb25maWdJdGVtcywKICAgICAgICBPcmlnaW5hbENvbmZpZ0l0ZW1JRHMgPT4gXEBPcmlnaW5hbFZpZXdhYmxlQ29uZmlnSXRlbXMsCiAgICAgICAgR2V0Q29sdW1uRmlsdGVyICAgICAgID0+IFwlR2V0Q29sdW1uRmlsdGVyLAogICAgICAgIExhc3RDb2x1bW5GaWx0ZXIgICAgICA9PiAkTGFzdENvbHVtbkZpbHRlciwKICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFRvdGFsICAgICAgICAgICAgICAgICA9PiAkQ291bnRUb3RhbCwKICAgICAgICBSZXF1ZXN0ZWRVUkwgICAgICAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgIFZpZXcgICAgICAgICAgICAgICAgICA9PiAkVmlldywKICAgICAgICBUaXRsZU5hbWUgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdPdmVydmlldzogSVRTTSBDb25maWdJdGVtJyksCiAgICAgICAgVGl0bGVWYWx1ZSAgICAgICAgICAgID0+ICRTZWxmLT57RmlsdGVyc317JEZpbHRlcn0tPntOYW1lfSwKICAgICAgICBFbnYgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgICAgICAgICAgICAgID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCAgICAgICAgICAgICAgPT4gJExpbmtTb3J0LAogICAgICAgIExpbmtGaWx0ZXIgICAgICAgICAgICA9PiAkTGlua0ZpbHRlciwKICAgICAgICBPcmRlckJ5ICAgICAgICAgICAgICAgPT4gJE9yZGVyQnksCiAgICAgICAgU29ydEJ5ICAgICAgICAgICAgICAgID0+ICRTb3J0QnksCiAgICAgICAgRW5hYmxlQ29sdW1uRmlsdGVycyAgID0+IDEsCiAgICAgICAgQ29sdW1uRmlsdGVyRm9ybSAgICAgID0+IHsKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXIgfHwgJycsCiAgICAgICAgfSwKICAgICAgICBGcm9udGVuZCA9PiAnQ3VzdG9tZXInLAoKICAgICAgICAjIGRvIG5vdCBwcmludCB0aGUgcmVzdWx0IGVhcmxpZXIsIGJ1dCByZXR1cm4gY29tcGxldGUgY29udGVudAogICAgICAgIE91dHB1dCA9PiAxLAogICAgKTsKCiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckZyb250ZW5kOjpNb2R1bGUiKS0+eyJDdXN0b21lcklUU01Db25maWdJdGVtU2VhcmNoIn0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEJveCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVySVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIElUU01Db25maWdJdGVtTGlzdEhUTUwgPT4gJENvbmZpZ0l0ZW1MaXN0SFRNTCwKICAgICAgICAgICAgJVBhZ2VOYXYsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBidWlsZCBOYXZpZ2F0aW9uQmFyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTmF2aWdhdGlvbkJhcigpOwoKICAgICMgZ2V0IHBhZ2UgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/CustomerITSMConfigItemSearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9DdXN0b21lcklUU01Db25maWdJdGVtU2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lcklUU01Db25maWdJdGVtU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKdXNlIExpc3Q6OlV0aWwgcXcoYW55KTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFNlc3Npb25PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0lUU01Db25maWdJdGVtJ10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0sCiAgICApOwoKICAgIG15IEBTZXRJbm5lckZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gZXEgJ1NldCc7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317SW5jbHVkZX0gKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgbGlzdCBvZiBpbmNsdWRlZCBkeW5hbWljIGZpZWxkIG5hbWVzIHRvIGdldCB0aGUgY29uZmlncwogICAgICAgIG15ICRTZXRJbm5lckZpZWxkTmFtZXMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0TWFzaygKICAgICAgICAgICAgQ29udGVudCA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtJbmNsdWRlfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2V0SW5uZXJGaWVsZE5hbWVzKSApIHsKICAgICAgICAgICAgbXkgJElubmVyRmllbGRDb25maWdzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGaWVsZEZpbHRlciA9PiB7IG1hcCB7ICggJF8gPT4gMSApIH0gJFNldElubmVyRmllbGROYW1lcy0+QCogfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRJbm5lckZpZWxkQ29uZmlncykgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJElubmVyRmllbGRDb25maWdSZWYgKCAkSW5uZXJGaWVsZENvbmZpZ3MtPkAqICkgewoKICAgICAgICAgICAgICAgICAgICAjIG5lY2Vzc2FyeSB0byBub3Qgb3ZlcndyaXRlIGNhY2hlZCBkYXRhIG9mIGZpZWxkIGNvbmZpZyBieSBhbHRlcmluZyB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUlubmVyRmllbGRDb25maWcgPSAkSW5uZXJGaWVsZENvbmZpZ1JlZi0+JSo7CgogICAgICAgICAgICAgICAgICAgICRJbm5lckZpZWxkQ29uZmlne0xhYmVsfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApIC4gJzo6JwogICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJElubmVyRmllbGRDb25maWd7TGFiZWx9ICk7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2V0SW5uZXJGaWVsZHMsIFwlSW5uZXJGaWVsZENvbmZpZzsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVzaCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSwgQFNldElubmVyRmllbGRzOwoKICAgICMgYnVpbGQgTmF2aWdhdGlvbkJhciAmIHRvIGdldCB0aGUgb3V0cHV0IGZhc3RlciEKICAgIG15ICRSZWZyZXNoID0gJyc7CiAgICBpZiAoICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSApIHsKICAgICAgICAkUmVmcmVzaCA9IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9OwogICAgfQoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICBSZWZyZXNoID0+ICRSZWZyZXNoLAogICAgKTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgZmlsdGVyIGZyb20gd2ViIHJlcXVlc3QKICAgIG15ICRGaWx0ZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUGVybWlzc2lvbkNvbmRpdGlvbicgKSB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICcnOwoKICAgICMgZmV0Y2ggZmlsdGVycyBmcm9tIGNvbmZpZwogICAgbXkgJFBlcm1pc3Npb25Db25kaXRpb25Db25maWdzID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6Q29uZmlnSXRlbTo6UGVybWlzc2lvbkNvbmRpdGlvbnMnKTsKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlncykgKSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgIG15ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnID0gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWdzLT57IHNwcmludGYoICIlMDJkIiwgJEZpbHRlciApIH07CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZykgKSB7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnRmlsdGVyIGludmFsaWQhJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgZ3JvdXAgcGVybWlzc2lvbiBjaGVjawogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57R3JvdXBzfSApICkgewogICAgICAgIG15ICRBY2Nlc3NPayA9IDA7CgogICAgICAgICMgZmV0Y2ggZ3JvdXBzIG9mIGN1c3RvbWVyIHVzZXIKICAgICAgICBteSAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgR1JPVVA6CiAgICAgICAgZm9yIG15ICRQZXJtaXNzaW9uR3JvdXAgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0dyb3Vwc30tPkAqICkgewogICAgICAgICAgICBpZiAoICRHcm91cExvb2t1cHskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3NPayA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24nKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgfQoKICAgIG15ICVQYWdlTmF2OwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaEFjdGlvbicgKSB7CgogICAgICAgIG15ICRTb3J0QnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU29ydEJ5JyApCiAgICAgICAgICAgIHx8ICRDb25maWctPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICAgICAgfHwgJ0FnZSc7CgogICAgICAgIGlmICggJFNvcnRCeSBlcSAnTGFzdENoYW5nZWQnICkgewogICAgICAgICAgICAkU29ydEJ5ID0gJ0NoYW5nZWQnOwogICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgb3JkZXJpbmcgdG8gYmUgdXNlZC4KICAgICAgICBteSAkRGVmYXVsdE9yZGVyQnkgPSAkQ29uZmlnLT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICAgICAgfHwgJ1VwJzsKCiAgICAgICAgIyBTZXQgdGhlIHNvcnQgb3JkZXIgZnJvbSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzLCBvciB0YWtlIHRoZSBkZWZhdWx0LgogICAgICAgIG15ICRPcmRlckJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyQnknICkKICAgICAgICAgICAgfHwgJERlZmF1bHRPcmRlckJ5OwoKICAgICAgICAjIHNvcnQgb24gZGVmYXVsdCBieSB1c2luZyBib3RoIChQcmlvcml0eSwgQWdlKSBlbHNlIHVzZSBvbmx5IG9uZSBzb3J0IGFyZ3VtZW50CiAgICAgICAgbXkgJVNvcnQ7CgogICAgICAgICMgZ2V0IGlmIHNlYXJjaCByZXN1bHQgc2hvdWxkIGJlIHByZS1zb3J0ZWQgYnkgcHJpb3JpdHkKICAgICAgICBteSAkUHJlU29ydEJ5UHJpb3JpdHkgPSAkQ29uZmlnLT57J1ByZVNvcnQ6OkJ5UHJpb3JpdHknfTsKICAgICAgICBpZiAoICEkUHJlU29ydEJ5UHJpb3JpdHkgKSB7CiAgICAgICAgICAgICVTb3J0ID0gKAogICAgICAgICAgICAgICAgU29ydEJ5ICA9PiAkU29ydEJ5LAogICAgICAgICAgICAgICAgT3JkZXJCeSA9PiAkT3JkZXJCeSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVTb3J0ID0gKAogICAgICAgICAgICAgICAgU29ydEJ5ICA9PiBbICdQcmlvcml0eScsICRTb3J0QnkgXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgPT4gWyAnRG93bicsICAgICAkT3JkZXJCeSBdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFZpZXcgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSB8fCAnJzsKCiAgICAgICAgIyBsb29rdXAgbGF0ZXN0IHVzZWQgdmlldyBtb2RlCiAgICAgICAgaWYgKCAhJFZpZXcgJiYgJFNlbGYtPnsgJ1VzZXJDb25maWdJdGVtT3ZlcnZpZXcnIC4gJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgICRWaWV3ID0gJFNlbGYtPnsgJ1VzZXJDb25maWdJdGVtT3ZlcnZpZXcnIC4gJFNlbGYtPntBY3Rpb259IH07CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSB1c2UgUHJldmlldyBhcyBkZWZhdWx0IGFzIGluIExheW91dENvbmZpZ0l0ZW0KICAgICAgICAkVmlldyB8fD0gJ1NtYWxsJzsKCiAgICAgICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkRmlsdGVyICkKICAgICAgICAgICAgLiAnO1N1YmFjdGlvbj0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1N1YmFjdGlvbn0gKQogICAgICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkVmlldyApCiAgICAgICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICk7CgogICAgICAgIG15ICRMaW5rU29ydCA9ICdGaWx0ZXI9JwogICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEZpbHRlciApCiAgICAgICAgICAgIC4gJztTdWJhY3Rpb249JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntTdWJhY3Rpb259ICkKICAgICAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFZpZXcgKTsKCiAgICAgICAgIyBnZXQgc2VhcmNoIHBhcmFtcyBmcm9tIHdlYiByZXF1ZXN0CiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkU2VhcmNoUGFyYW0gKHF3KE51bWJlciBOYW1lKSkgewoKICAgICAgICAgICAgIyBmZXRjaCBzaW5nbGUgdmFsdWUgcGFyYW1zCiAgICAgICAgICAgICRHZXRQYXJhbXskU2VhcmNoUGFyYW19ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFNlYXJjaFBhcmFtICk7CiAgICAgICAgICAgICRMaW5rUGFnZSAuPSAiOyRTZWFyY2hQYXJhbT0iIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17JFNlYXJjaFBhcmFtfSApOwogICAgICAgICAgICAkTGlua1NvcnQgLj0gIjskU2VhcmNoUGFyYW09IiAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFteyRTZWFyY2hQYXJhbX0gKTsKICAgICAgICB9CgogICAgICAgIG15IEBBcnJheVNlYXJjaFBhcmFtcyA9IHF3KENsYXNzSURzKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57RGVwbG95bWVudFN0YXRlfSApIHsKICAgICAgICAgICAgcHVzaCBAQXJyYXlTZWFyY2hQYXJhbXMsICdEZXBsU3RhdGVJRHMnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnLT57SW5jaWRlbnRTdGF0ZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQEFycmF5U2VhcmNoUGFyYW1zLCAnSW5jaVN0YXRlSURzJzsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkU2VhcmNoUGFyYW1BcnJheSAoQEFycmF5U2VhcmNoUGFyYW1zKSB7CgogICAgICAgICAgICAjIGZldGNoIG11bHRpIHZhbHVlIHBhcmFtcwogICAgICAgICAgICBteSBAQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkU2VhcmNoUGFyYW1BcnJheSApOwogICAgICAgICAgICBpZiAoIGdyZXAgeyRffSBAQXJyYXkgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFNlYXJjaFBhcmFtQXJyYXl9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgICRMaW5rUGFnZSAuPSBqb2luKCAnJywgbWFwIHsgIjskU2VhcmNoUGFyYW1BcnJheT0iIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkXyApIH0gQEFycmF5ICk7CiAgICAgICAgICAgICAgICAkTGlua1NvcnQgLj0gam9pbiggJycsIG1hcCB7ICI7JFNlYXJjaFBhcmFtQXJyYXk9IiAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJF8gKSB9IEBBcnJheSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlU2VhcmNoQ29uZmlnOwogICAgICAgIG15ICVEeW5hbWljRmllbGRTZWFyY2hQYXJhbWV0ZXJzOwoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIGdldCBzZWFyY2ggZmllbGQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyk7CgogICAgICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgICAgICBmb3IgbXkgJFByZWZlcmVuY2UgKCBAeyRTZWFyY2hGaWVsZFByZWZlcmVuY2VzfSApIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBSZXR1cm5Qcm9maWxlU3RydWN0dXJlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgPT4gJFByZWZlcmVuY2UtPntUeXBlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGhlIGNvbXBsZXRlIHZhbHVlIHN0cnVjdHVyZSBpbiBHZXRQYXJhbSB0byBzdG9yZSBpdCBsYXRlciBpbiB0aGUgc2VhcmNoCiAgICAgICAgICAgICAgICAjIHByb2ZpbGUKICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJXskRHluYW1pY0ZpZWxkVmFsdWV9ICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHByb2ZpbGUKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hQYXJhbWV0ZXIgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQYXJhbWV0ZXJCdWlsZCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgPT4gJFByZWZlcmVuY2UtPntUeXBlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgc2VhcmNoIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRTZWFyY2hQYXJhbWV0ZXIgKSB7CgogICAgICAgICAgICAgICAgICAgICMgYXBwZW5kIHNlYXJjaCBwYXJhbXMgdG8gbGlua3MKICAgICAgICAgICAgICAgICAgICBpZiAoIHJlZiAkU2VhcmNoUGFyYW1ldGVyLT57UGFyYW1ldGVyfXtFcXVhbHN9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rUGFnZSAuPSBqb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAgeyAiO1NlYXJjaF9EeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9PSIgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRfICkgfSAkU2VhcmNoUGFyYW1ldGVyLT57UGFyYW1ldGVyfXtFcXVhbHN9LT5AKgogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkTGlua1NvcnQgLj0gam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwIHsgIjtTZWFyY2hfRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfT0iIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkXyApIH0gJFNlYXJjaFBhcmFtZXRlci0+e1BhcmFtZXRlcn17RXF1YWxzfS0+QCoKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rUGFnZSAuPSAiO1NlYXJjaF9EeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9PSIgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWFyY2hQYXJhbWV0ZXItPntQYXJhbWV0ZXJ9e0VxdWFsc30gKTsKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtTb3J0IC49ICI7U2VhcmNoX0R5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX09IiAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlYXJjaFBhcmFtZXRlci0+e1BhcmFtZXRlcn17RXF1YWxzfSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkU2VhcmNoUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkU2VhcmNoUGFyYW1ldGVyLT57UGFyYW1ldGVyfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkTGlua1BhZ2UgLj0gJzsnOwogICAgICAgICRMaW5rU29ydCAuPSAnOyc7CgogICAgICAgICVTZWFyY2hDb25maWcgPSAoCiAgICAgICAgICAgICVTZWFyY2hDb25maWcsCiAgICAgICAgICAgICVEeW5hbWljRmllbGRTZWFyY2hQYXJhbWV0ZXJzLAogICAgICAgICAgICAlU29ydCwKICAgICAgICApOwoKICAgICAgICAjIG1lcmdlIGZpbHRlcmVkIGNsYXNzZXMgd2l0aCBwZXJtaXNzaW9uIGNvbmRpdGlvbiBjbGFzc2VzCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRHZXRQYXJhbXtDbGFzc0lEc30gKSApIHsKICAgICAgICAgICAgbXkgQFNlYXJjaENsYXNzZXM7CiAgICAgICAgICAgIGZvciBteSAkQ2xhc3NJRCAoICRHZXRQYXJhbXtDbGFzc0lEc30tPkAqICkgewogICAgICAgICAgICAgICAgaWYgKCBhbnkgeyAkXyBlcSAkQ2xhc3NMaXN0LT57JENsYXNzSUR9IH0gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDbGFzc2VzfS0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoQ2xhc3NlcywgJENsYXNzTGlzdC0+eyRDbGFzc0lEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VhcmNoQ29uZmlne0NsYXNzZXN9ID0gXEBTZWFyY2hDbGFzc2VzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlYXJjaENvbmZpZ3tDbGFzc2VzfSA9ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57Q2xhc3Nlc307CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkU2VhcmNoQ29uZmlne0NsYXNzZXN9LT5AKiApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbicpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgbWVyZ2UgZmlsdGVyZWQgZGVwbG95bWVudCBzdGF0ZXMgd2l0aCBwZXJtaXNzaW9uIGNvbmRpdGlvbiBkZXBsb3ltZW50IHN0YXRlcwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkR2V0UGFyYW17RGVwbFN0YXRlSURzfSApICkgewogICAgICAgICAgICBteSBAU2VhcmNoRGVwbFN0YXRlczsKICAgICAgICAgICAgZm9yIG15ICREZXBsU3RhdGVJRCAoICRHZXRQYXJhbXtEZXBsU3RhdGVJRHN9LT5AKiApIHsKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0RlcGxveW1lbnRTdGF0ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBhbnkgeyAkXyBlcSAkRGVwbFN0YXRlTGlzdC0+eyREZXBsU3RhdGVJRH0gfSAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0RlcGxveW1lbnRTdGF0ZXN9LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRGVwbFN0YXRlcywgJERlcGxTdGF0ZUxpc3QtPnskRGVwbFN0YXRlSUR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaERlcGxTdGF0ZXMsICREZXBsU3RhdGVMaXN0LT57JERlcGxTdGF0ZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhQFNlYXJjaERlcGxTdGF0ZXMgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlYXJjaENvbmZpZ3tEZXBsU3RhdGVzfSA9IFxAU2VhcmNoRGVwbFN0YXRlczsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RGVwbG95bWVudFN0YXRlc30gKSApIHsKICAgICAgICAgICAgJFNlYXJjaENvbmZpZ3tEZXBsU3RhdGVzfSA9ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RGVwbG95bWVudFN0YXRlc307CiAgICAgICAgfQoKICAgICAgICAjIG1hcCBmaWx0ZXJlZCBpbmNpZGVudCBzdGF0ZSBpZHMKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJEdldFBhcmFte0luY2lTdGF0ZUlEc30gKSApIHsKICAgICAgICAgICAgbXkgQFNlYXJjaEluY2lTdGF0ZXMgPSBtYXAgeyAkSW5jaVN0YXRlTGlzdC0+eyRffSB9ICRHZXRQYXJhbXtJbmNpU3RhdGVJRHN9LT5AKjsKICAgICAgICAgICAgJFNlYXJjaENvbmZpZ3tJbmNpU3RhdGVzfSA9IFxAU2VhcmNoSW5jaVN0YXRlczsKICAgICAgICB9CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyR3JvdXBTdXBwb3J0JykgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckdyb3VwT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyk7CiAgICAgICAgICAgIG15ICVBdXRob3JpemVkR3JvdXBzSGFzaCA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBAQXV0aG9yaXplZEdyb3VwSURzID0ga2V5cyAlQXV0aG9yaXplZEdyb3Vwc0hhc2g7CiAgICAgICAgICAgICRTZWFyY2hDb25maWd7R3JvdXBJRHN9ID0gXEBBdXRob3JpemVkR3JvdXBJRHM7CiAgICAgICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgICAgICRTZWFyY2hDb25maWd7TnVtYmVyfSA9ICRHZXRQYXJhbXtOdW1iZXJ9ID8gJEdldFBhcmFte051bWJlcn0gOiB1bmRlZjsKICAgICAgICAkU2VhcmNoQ29uZmlne05hbWV9ICAgPSAkR2V0UGFyYW17TmFtZX0gICA/ICRHZXRQYXJhbXtOYW1lfSAgIDogdW5kZWY7CgogICAgICAgICMgY29sbGVjdCBkeW5hbWljIGZpZWxkIHNlYXJjaCBwYXJhbXMKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0R5bmFtaWNGaWVsZFZhbHVlc30gKSApIHsKCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZE5hbWUgKCBrZXlzICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfS0+JSogKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0R5bmFtaWNGaWVsZFZhbHVlc317JEZpZWxkTmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaENvbmZpZ3siRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgRXF1YWxzID0+ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfXskRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0R5bmFtaWNGaWVsZFZhbHVlc317JEZpZWxkTmFtZX0gZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaENvbmZpZ3siRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHkgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlc3RyaWN0IHNlYXJjaCBieSBwZXJtaXNzaW9uIGNvbmRpdGlvbiBjdXN0b21lciBjb21wYW55IGFuZCBjdXN0b21lciB1c2VyCiAgICAgICAgIyBOT1RFIHRoaXMgb3ZlcndyaXRlcyBwcmV2aW91c2x5IHNldCBzZWFyY2ggcGFyYW1zIGZvciB0aGUgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgICAgIGlmICggJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDdXN0b21lckNvbXBhbnlEeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICAkU2VhcmNoQ29uZmlneyJEeW5hbWljRmllbGRfJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDdXN0b21lckNvbXBhbnlEeW5hbWljRmllbGR9In0gPSB7CiAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJFNlbGYtPntDdXN0b21lcklEfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0N1c3RvbWVyVXNlckR5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICRTZWFyY2hDb25maWd7IkR5bmFtaWNGaWVsZF8kUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0N1c3RvbWVyVXNlckR5bmFtaWNGaWVsZH0ifSA9IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAlRmlsdGVycyA9ICgKICAgICAgICAgICAgJEZpbHRlciA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICAgICAgU2VhcmNoID0+IFwlU2VhcmNoQ29uZmlnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggISVTZWFyY2hDb25maWcgKSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NlYXJjaCBwYXJhbXMgaW52YWxpZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIHNlbGVjdGVkIHZpZXcgaXMgYXZhaWxhYmxlLgogICAgICAgIG15ICRCYWNrZW5kcyA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpDdXN0b21lck92ZXJ2aWV3Jyk7CiAgICAgICAgaWYgKCAhJEJhY2tlbmRzLT57JFZpZXd9ICkgewoKICAgICAgICAgICAgIyBUcnkgdG8gZmluZCBmYWxsYmFjaywgdGFrZSBmaXJzdCBjb25maWd1cmVkIHZpZXcgbW9kZS4KICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRCYWNrZW5kc30gKSB7CiAgICAgICAgICAgICAgICAkVmlldyA9ICRLZXk7CiAgICAgICAgICAgICAgICBsYXN0IEtFWTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFBhZ2VTaG93blByZWZlcmVuY2VzS2V5ID0gJ1VzZXJDb25maWdJdGVtT3ZlcnZpZXcnIC4gJFZpZXcgLiAnUGFnZVNob3duJzsKICAgICAgICBteSAkUGFnZVNob3duICAgICAgICAgICAgICAgPSAkU2VsZi0+eyRQYWdlU2hvd25QcmVmZXJlbmNlc0tleX0gfHwgMTA7CgogICAgICAgICMgZG8gc2hvd24gY29uZmlnIGl0ZW0gbG9va3VwCiAgICAgICAgbXkgJExpbWl0ID0gMV8wMDA7CgogICAgICAgICMgZ2V0IGRhdGEgKHZpZXdhYmxlIGNvbmZpZyBpdGVtcy4uLikKICAgICAgICAjIHNlYXJjaCBhbGwgY29uZmlnIGl0ZW1zCiAgICAgICAgbXkgQE9yaWdpbmFsVmlld2FibGVDb25maWdJdGVtcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgICAgICAlU2VhcmNoQ29uZmlnLAogICAgICAgICAgICBMaW1pdCAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJywKICAgICAgICApOwoKICAgICAgICBteSAkVG90YWwgPSBzY2FsYXIgQE9yaWdpbmFsVmlld2FibGVDb25maWdJdGVtczsKCiAgICAgICAgbXkgJFN0YXJ0SGl0ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0SGl0JyApIHx8IDE7CgogICAgICAgIG15IEBWaWV3YWJsZUNvbmZpZ0l0ZW1zID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgICAgICVTZWFyY2hDb25maWcsCiAgICAgICAgICAgIExpbWl0ICA9PiAkU3RhcnRIaXQgKyAkUGFnZVNob3duIC0gMSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgKTsKCiAgICAgICAgJVBhZ2VOYXYgPSAkTGF5b3V0T2JqZWN0LT5QYWdlTmF2QmFyKAogICAgICAgICAgICBMaW1pdCAgICAgPT4gMTAwMDAsCiAgICAgICAgICAgIFN0YXJ0SGl0ICA9PiAkU3RhcnRIaXQsCiAgICAgICAgICAgIFBhZ2VTaG93biA9PiAkUGFnZVNob3duLAogICAgICAgICAgICBBbGxIaXRzICAgPT4gc2NhbGFyIEBPcmlnaW5hbFZpZXdhYmxlQ29uZmlnSXRlbXMsCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnQWN0aW9uPUN1c3RvbWVySVRTTUNvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICAgICBMaW5rICAgICAgPT4gJExpbmtQYWdlLAogICAgICAgICAgICBJRFByZWZpeCAgPT4gJ0N1c3RvbWVySVRTTUNvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICk7CgogICAgICAgICMgVE9ETyBNYXliZSB0aGVyZSBpcyBhIG1vcmUgZWxlZ2FudCB3YXkgdG8gZG8gdGhpcz8KICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gID0gJEZpbHRlcjsKICAgICAgICAkU2VsZi0+e0ZpbHRlcnN9ID0gXCVGaWx0ZXJzOwoKICAgICAgICAjIHNob3cgY29uZmlnIGl0ZW1zCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1MaXN0SFRNTCA9ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtTGlzdFNob3coCiAgICAgICAgICAgIEZpbHRlciAgICAgICAgICAgICAgICA9PiAkRmlsdGVyLAogICAgICAgICAgICBDb25maWdJdGVtSURzICAgICAgICAgPT4gXEBWaWV3YWJsZUNvbmZpZ0l0ZW1zLAogICAgICAgICAgICBPcmlnaW5hbENvbmZpZ0l0ZW1JRHMgPT4gXEBPcmlnaW5hbFZpZXdhYmxlQ29uZmlnSXRlbXMsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIExpbmtQYWdlICAgICAgICAgICAgICA9PiAkTGlua1BhZ2UsCiAgICAgICAgICAgIExpbmtTb3J0ICAgICAgICAgICAgICA9PiAkTGlua1NvcnQsCiAgICAgICAgICAgIEVuYWJsZUNvbHVtbkZpbHRlciAgICA9PiAwLAogICAgICAgICAgICBWaWV3ICAgICAgICAgICAgICAgICAgPT4gJFZpZXcsCiAgICAgICAgICAgIFRvdGFsICAgICAgICAgICAgICAgICA9PiAkVG90YWwsCiAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICA9PiAkT3JkZXJCeSwKICAgICAgICAgICAgU29ydEJ5ICAgICAgICAgICAgICAgID0+ICRTb3J0QnksCiAgICAgICAgICAgIEVudiAgICAgICAgICAgICAgICAgICA9PiAkU2VsZiwKICAgICAgICAgICAgRnJvbnRlbmQgICAgICAgICAgICAgID0+ICdDdXN0b21lcicsCgogICAgICAgICAgICAjIGRvIG5vdCBwcmludCB0aGUgcmVzdWx0IGVhcmxpZXIsIGJ1dCByZXR1cm4gY29tcGxldGUgY29udGVudAogICAgICAgICAgICBPdXRwdXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoUmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBJVFNNQ29uZmlnSXRlbUxpc3RIVE1MID0+ICRDb25maWdJdGVtTGlzdEhUTUwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlIiktPnsiQ3VzdG9tZXJJVFNNQ29uZmlnSXRlbVNlYXJjaCJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEJveCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewoKICAgICAgICAjIHN0b3JlIGRyb3Bkb3duIHJlc3RyaWN0aW9ucyBmcm9tIHBlcm1pc3Npb24gY29uZGl0aW9uCiAgICAgICAgbXkgJVNlYXJjaGFibGVQYXJhbXMgPSAoCiAgICAgICAgICAgIEluY2lTdGF0ZSA9PiAkSW5jaVN0YXRlTGlzdCwKICAgICAgICApOwoKICAgICAgICAjIHNldCBzZWFyY2hhYmxlIHBhcmFtcwogICAgICAgIG15ICVDbGFzc0xvb2t1cCA9IHJldmVyc2UgJENsYXNzTGlzdC0+JSo7CiAgICAgICAgJFNlYXJjaGFibGVQYXJhbXN7Q2xhc3N9ID0gewogICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgJENsYXNzTG9va3VweyRffQogICAgICAgICAgICAgICAgICAgID8gKCAkQ2xhc3NMb29rdXB7JF99ID0+ICRfICkKICAgICAgICAgICAgICAgICAgICA6ICgpCiAgICAgICAgICAgIH0gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDbGFzc2VzfS0+QCoKICAgICAgICB9OwoKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEZXBsb3ltZW50U3RhdGVzfSApICkgewogICAgICAgICAgICBteSAlRGVwbFN0YXRlTG9va3VwID0gcmV2ZXJzZSAkRGVwbFN0YXRlTGlzdC0+JSo7CiAgICAgICAgICAgICRTZWFyY2hhYmxlUGFyYW1ze0RlcGxTdGF0ZX0gPSB7CiAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICREZXBsU3RhdGVMb29rdXB7JF99CiAgICAgICAgICAgICAgICAgICAgICAgID8gKCAkRGVwbFN0YXRlTG9va3VweyRffSA9PiAkXyApCiAgICAgICAgICAgICAgICAgICAgICAgIDogKCkKICAgICAgICAgICAgICAgIH0gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEZXBsb3ltZW50U3RhdGVzfS0+QCoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWFyY2hhYmxlUGFyYW1ze0RlcGxTdGF0ZX0gPSAkRGVwbFN0YXRlTGlzdDsKICAgICAgICB9CgogICAgICAgIG15ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlncyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXI6OkNvbmZpZ0l0ZW06OlBlcm1pc3Npb25Db25kaXRpb25zJyk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlncykgKSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEZvcm0nLAogICAgICAgICk7CgogICAgICAgIG15ICVEZWZhdWx0czsKICAgICAgICBpZiAoICRDb25maWctPntEZWZhdWx0c30gKSB7CiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJENvbmZpZy0+e0RlZmF1bHRzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRDb25maWctPntEZWZhdWx0c30tPnskS2V5fTsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0R5bmFtaWNGaWVsZCc7CgogICAgICAgICAgICAgICAgaWYgKCAkS2V5ID1+IC9eQ29uZmlnSXRlbShDcmVhdGV8Q2hhbmdlKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEl0ZW1zID0gc3BsaXQgLzsvLCAkQ29uZmlnLT57RGVmYXVsdHN9LT57JEtleX07CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtIChASXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCAkS2V5LCAkVmFsdWUgKSA9IHNwbGl0IC89LywgJEl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICREZWZhdWx0c3skS2V5fSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGVmYXVsdHN7JEtleX0gPSAkQ29uZmlnLT57RGVmYXVsdHN9LT57JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgcGVybWlzc2lvbiBjb25kaXRpb24KICAgICAgICBteSAlUGVybWlzc2lvbkNvbmRpdGlvbkRhdGEgPSBtYXAgeyBpbnQoJF8pID0+ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlncy0+eyRffS0+e05hbWV9IH0ga2V5cyAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZ3MtPiUqOwogICAgICAgIG15ICRQZXJtaXNzaW9uQ29uZGl0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVBlcm1pc3Npb25Db25kaXRpb25EYXRhLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUGVybWlzc2lvbkNvbmRpdGlvbicsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRGaWx0ZXIgfHwgJycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQZXJtaXNzaW9uQ29uZGl0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBQZXJtaXNzaW9uQ29uZGl0aW9uU3RyZyA9PiAkUGVybWlzc2lvbkNvbmRpdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGhpc3RvcmljYWwgdmFsdWVzIGZyb20gZGF0YWJhc2UKICAgICAgICAgICAgICAgICAgICBteSAkSGlzdG9yaWNhbFZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5IaXN0b3JpY2FsVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAkRGF0YSA9ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgaGlzdG9yaWMgdmFsdWVzIHRvIGN1cnJlbnQgdmFsdWVzIChpZiB0aGV5IGRvbid0IGV4aXN0IGFueW1vcmUpCiAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkSGlzdG9yaWNhbFZhbHVlcykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEhpc3RvcmljYWxWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJERhdGEtPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YS0+eyRLZXl9ID0gJEhpc3RvcmljYWxWYWx1ZXMtPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JERhdGF9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICREYXRhLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc2VhcmNoIGZpZWxkIHByZWZlcmVuY2VzCiAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZFByZWZlcmVuY2VzID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZpZWxkUHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0FycmF5UmVmV2l0aERhdGEoJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMpOwoKICAgICAgICAgICAgUFJFRkVSRU5DRToKICAgICAgICAgICAgZm9yIG15ICRQcmVmZXJlbmNlICggQHskU2VhcmNoRmllbGRQcmVmZXJlbmNlc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZmllbGQgSFRNTAogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSAgICAgICAgICAgICAgPT4ge30sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICAgICAgICAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZy0+e0RlZmF1bHRzfXtEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFByZWZlcmVuY2UtPntUeXBlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTnVtYmVyJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTmFtZScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENsYXNzU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlYXJjaGFibGVQYXJhbXN7Q2xhc3N9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzSURzJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJERlZmF1bHRze0NsYXNzSURzfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NTdHJnID0+ICRDbGFzc1N0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57RGVwbG95bWVudFN0YXRlfSApIHsKCiAgICAgICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgd2FudGVkIGRlcGxveW1lbnQgc3RhdGVzCiAgICAgICAgICAgIG15ICRDdXJEZXBsU3RhdGVPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlYXJjaGFibGVQYXJhbXN7RGVwbFN0YXRlfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVmYXVsdHN7RGVwbG95bWVudFN0YXRlSURzfSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcgPT4gJEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnLT57SW5jaWRlbnRTdGF0ZX0gKSB7CgogICAgICAgICAgICAjIGdlbmVyYXRlIGRyb3Bkb3duIGZvciBzZWxlY3RpbmcgdGhlIHdhbnRlZCBpbmNpZGVudCBzdGF0ZXMKICAgICAgICAgICAgbXkgJEN1ckluY2lTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VhcmNoYWJsZVBhcmFtc3tJbmNpU3RhdGV9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdJbmNpU3RhdGVJRHMnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICREZWZhdWx0c3tJbmNpZGVudFN0YXRlSURzfSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZU9wdGlvblN0cmcgPT4gJEN1ckluY2lTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbiEnKSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lcklUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFnZU5hdiwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGJ1aWxkIE5hdmlnYXRpb25CYXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZXQgcGFnZSBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentITSMConfigItemEdit.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXJ0Tm9ybWFsIikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkVkaXQiKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZSgiQ29uZmlnIEl0ZW0iKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZShEYXRhLk51bWJlcikgfCBodG1sICVdIC0gWyUgVHJhbnNsYXRlKCJDbGFzcyIpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKERhdGEuQ2xhc3MpIHwgaHRtbCAlXTwvaDE+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXJ0Tm9ybWFsIikgJV0KICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iQ2xhc3NJdGVtIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyIgaWQ9IkNsYXNzSXRlbSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXJ0U21hbGwiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJFZGl0IikgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoIkNvbmZpZyBJdGVtIikgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoRGF0YS5OdW1iZXIpIHwgaHRtbCAlXSAtIFslIFRyYW5zbGF0ZSgiQ2xhc3MiKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZShEYXRhLkNsYXNzKSB8IGh0bWwgJV08L2gxPgogICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FuY2VsQ2xvc2VQb3B1cCIgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJDYW5jZWwgJiBjbG9zZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNjcmVlblR5cGUiIHZhbHVlPSJQb3B1cCIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhcnRTbWFsbCIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2F2ZSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzSUQiIHZhbHVlPSJbJSBEYXRhLkNsYXNzSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29uZmlnSXRlbUlEIiB2YWx1ZT0iWyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRHVwbGljYXRlSUQiIHZhbHVlPSJbJSBEYXRhLkR1cGxpY2F0ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93TmFtZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5hbWUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIGlkPSJOYW1lIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5Sb3dOYW1lSW52YWxpZCB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMjUwIiB2YWx1ZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSIpIHwgaHRtbCAlXSJbJSBJRiBEYXRhLlJlYWRvbmx5ICVdIHJlYWRvbmx5WyUgRU5EICVdLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dOYW1lRXJyb3JEZWZhdWx0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dOYW1lRXJyb3JEZWZhdWx0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93TmFtZUVycm9yRHVwbGljYXRlcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIk5hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzIiwgRGF0YS5EdXBsaWNhdGVzKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dOYW1lRXJyb3JEdXBsaWNhdGVzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93TmFtZUVycm9yUmVnRXgiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKERhdGEuUmVnRXhFcnJvck1lc3NhZ2UpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd05hbWVFcnJvclJlZ0V4IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd05hbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dWZXJzaW9uU3RyaW5nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVmVyc2lvblN0cmluZyI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJWZXJzaW9uIE51bWJlciIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlZlcnNpb25TdHJpbmciIGlkPSJWZXJzaW9uU3RyaW5nIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5Sb3dWZXJzaW9uU3RyaW5nSW52YWxpZCB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMjUwIiB2YWx1ZT0iWyUgRGF0YS5WZXJzaW9uU3RyaW5nIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBjb25maWcgaXRlbSIpIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlZlcnNpb25TdHJpbmdFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dWZXJzaW9uU3RyaW5nRXJyb3JEZWZhdWx0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlZlcnNpb25TdHJpbmdTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dWZXJzaW9uU3RyaW5nRXJyb3JEZWZhdWx0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93VmVyc2lvblN0cmluZ0Vycm9yRHVwbGljYXRlcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJWZXJzaW9uU3RyaW5nU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlZlcnNpb24gTnVtYmVyIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyIsIERhdGEuRHVwbGljYXRlcykgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93VmVyc2lvblN0cmluZ0Vycm9yRHVwbGljYXRlcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dWZXJzaW9uU3RyaW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93RGVwbFN0YXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iRGVwbFN0YXRlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiRGVwbG95bWVudCBTdGF0ZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5EZXBsU3RhdGVPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXBsU3RhdGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXBsU3RhdGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd0RlcGxTdGF0ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd0luY2lTdGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkluY2lTdGF0ZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIkluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkluY2lTdGF0ZU9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkluY2lTdGF0ZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkluY2lTdGF0ZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93SW5jaVN0YXRlIikgJV0KCiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5ClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd0dyb3VwIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJbJSBEYXRhLk1hbmRhdG9yeUNsYXNzIHwgaHRtbCAlXSIgZm9yPSJHcm91cElEIj48c3BhbiBjbGFzcz0iTWFya2VyIj5bJSBEYXRhLk1hcmtlciB8IGh0bWwgJV08L3NwYW4+IFslIFRyYW5zbGF0ZSgiR3JvdXAiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuR3JvdXBPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJHcm91cElERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ikdyb3VwSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dHcm91cCIpICVdCiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKWyUgRGF0YS5EeW5hbWljRmllbGRIVE1MICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dEZXNjcmlwdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZXNjcmlwdGlvbiI+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRGaWVsZCIgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iRGVzY3JpcHRpb24iIGNsYXNzPSJSaWNoVGV4dCBbJSBEYXRhLlJpY2hUZXh0SW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IkRlc2NyaXB0aW9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgfCBodG1sICVdIj5bJSBEYXRhLkRlc2NyaXB0aW9uIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93RGVzY3JpcHRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0F0dGFjaG1lbnRMaXN0LnR0IiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5hbWU9IlN1Ym1pdCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9IlN1Ym1pdEJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJDYW5jZWxCdXR0b24iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtQWRkIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRW5kU21hbGwiKSAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkVuZFNtYWxsIikgJV0KICAgICAgICA8L2Zvcm0+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVuZE5vcm1hbCIpICVdCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJFbmROb3JtYWwiKSAlXQo=</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentITSMConfigItemZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyTGVmdCI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJIZWFkbGluZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkN1ckluY2lTdGF0ZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VySW5jaVNpZ25hbCB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aDEgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ29uZmlndXJhdGlvbiBJdGVtIikgfCBodG1sICVdOiBbJSBEYXRhLk51bWJlciB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLk5hbWUgfCB0cnVuY2F0ZSg0MCkgfCBodG1sICVdIj4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDb25maWd1cmF0aW9uIEl0ZW0iKSB8IGh0bWwgJV06IFslIERhdGEuTnVtYmVyIHwgaHRtbCAlXSA8c3Bhbj4mbWRhc2g7PC9zcGFuPiBbJSBEYXRhLk5hbWUgfCB0cnVuY2F0ZSg2MCkgfCBodG1sICVdCiAgICAgICAgPC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KCiAgICAgICAgWyUgRGF0YS5TdHlsZUNsYXNzZXMgJV0KCiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGEiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgVGlnaHQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ2xhc3MiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5DbGFzcykgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoMjUpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ3VyRGVwbFN0YXRlKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VyRGVwbFNpZ25hbCB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuQ3VyRGVwbFN0YXRlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1cnJlbnQgSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DdXJJbmNpU3RhdGUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DdXJJbmNpU2lnbmFsIHwgaHRtbCAlXSI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5DdXJJbmNpU3RhdGUpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJHcm91cCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkdyb3VwIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5Hcm91cE5hbWUgfCB0cnVuY2F0ZSgyNSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJHcm91cCIpICVdCiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIGJ5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNyZWF0ZUJ5VXNlckZ1bGxOYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxhc3QgY2hhbmdlZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMYXN0IGNoYW5nZWQgYnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlQnlVc2VyRnVsbE5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudHMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50cyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7RmlsZW5hbWU9WyUgRGF0YS5GaWxlbmFtZSB8IHVyaSAlXTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWyUgRGF0YS5GaWxlc2l6ZSB8IExvY2FsaXplKCdGaWxlc2l6ZScpIHwgaHRtbCAlXSkKWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRzIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBEb250UHJpbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaW5rZWQgT2JqZWN0cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udHJvbFJvdyI+CiAgICAgICAgICAgICAgICA8aDI+PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIGlkPSJNZW51WyUgRGF0YS5NZW51SUQgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5NZW51Q2xhc3MgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuRGVzY3JpcHRpb24pIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJNZW51IikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZWxlY3Rpb25Sb3ciKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJTZWxlY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPGRpdiBpZD0iUGFnZVNlbGVjdGlvbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlBhZ2VOYW1lIikgJV0KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuUGFnZU5hbWUpIHwgaHRtbCAlXTwvaDI+ClslIFJlbmRlckJsb2NrRW5kKCJQYWdlTmFtZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlBhZ2VMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCB1cmkgJV07VmVyc2lvbklEPVslIERhdGEuVmVyc2lvbklEIHwgdXJpICVdO1BhZ2U9WyUgRGF0YS5QYWdlTmFtZSB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im9vb1MgUGFnZVNlbGVjdGlvbkJ1dHRvbiBDYWxsRm9yQWN0aW9uWyUgSUYgRGF0YS5EaXNhYmxlZCAlXSBEaXNhYmxlZFslIEVMU0lGIERhdGEuU2VsZWN0ZWQgJV0gU2VsZWN0ZWRbJSBFTkQgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlBhZ2VOYW1lKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJQYWdlTGluayIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iVmVyc2lvblNlbGVjdGlvbkNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WZXJzaW9uU2VsZWN0aW9uICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTZWxlY3Rpb25Sb3ciKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJJVFNNSXRlbXMiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5EeW5hbWljRmllbGRIVE1MICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkxpbmtUYWJsZVN0cmcgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Location="Custom/Kernel/System/Console/Command/Maint/Elasticsearch/Migration.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBlNmEyNTZhMDAyOTA1NGJhY2M5NDZkMjdlMGRiZTUwOGYwMGU2NzQ2IC0gS2VybmVsL1N5c3RlbS9Db25zb2xlL0NvbW1hbmQvTWFpbnQvRWxhc3RpY3NlYXJjaC9NaWdyYXRpb24ucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OkVsYXN0aWNzZWFyY2g6Ok1pZ3JhdGlvbjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQpOwoKIyBjb3JlIG1vZHVsZXMKdXNlIFRpbWU6OkhpUmVzKCk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlBlcmw6OkZvcmVhY2hUb0ZvcikKCiMgSW5mb3JtIHRoZSBvYmplY3QgbWFuYWdlciBhYm91dCB0aGUgaGFyZCBkZXBlbmRlbmNpZXMuCiMgVGhpcyBtb2R1bGUgbXVzdCBiZSBkaXNjYXJkZWQgd2hlbiBvbmUgb2YgdGhlIGhhcmQgZGVwZW5kZW5jaWVzIGhhcyBiZWVuIGRpc2NhcmRlZC4Kb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbGFzdGljc2VhcmNoJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UnLAopOwoKIyBJbmZvcm0gdGhlIENvZGVQb2xpY3kgYWJvdXQgdGhlIHNvZnQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGludGVudGlvbmFsbHkgbm90IGluIEBPYmplY3REZXBlbmRlbmNpZXMuCiMgU29mdCBkZXBlbmRlbmNpZXMgYXJlIG1vZHVsZXMgdGhhdCB1c2VkIGJ5IHRoaXMgb2JqZWN0LCBidXQgd2hvIGRvbid0IGFmZmVjdCB0aGUgc3RhdGUgb2YgdGhpcyBvYmplY3QuCiMgVGhlcmUgaXMgbm8gbmVlZCB0byBkaXNjYXJkIHRoaXMgbW9kdWxlIHdoZW4gb25lIG9mIHRoZSBzb2Z0IGRlcGVuZGVuY2llcyBpcyBkaXNjYXJkZWQuCm91ciBAU29mdE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCik7CgpzdWIgQ29uZmlndXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdNaWdyYXRlIGV4aXN0aW5nIHRpY2tldHMsIGN1c3RvbWVycyBhbmQgY3VzdG9tZXIgdXNlcnMgdG8gRWxhc3RpY3NlYXJjaC4nKTsKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3RhcmdldCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgIlNwZWNpZnkgd2hpY2ggb2JqZWN0cyB3aWxsIGJlIG1pZ3JhdGVkLiB0OiBUaWNrZXRzOyB1OiBDdXN0b21lclVzZXJzOyBjOiBDdXN0b21lckNvbXBhbmllczsgaTogSVRTTUNvbmZpZ0l0ZW1zOyBJZiBub3Qgc3BlY2lmaWVkLCAndHVjaScgKGFsbCBmb3VyKSB3aWxsIGJlIGhhbmRsZWQuIiwKICAgICAgICBSZXF1aXJlZCAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggPT4gcXIvXlt0dWNpXSskL3NteCwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdtaWNyby1zbGVlcCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNwZWNpZnkgbWljcm9zZWNvbmRzIHRvIHNsZWVwIGFmdGVyIGV2ZXJ5IHRpY2tldCB0byByZWR1Y2Ugc3lzdGVtIGxvYWQgKGUuZy4gMTAwMCkuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvXlxkKyQvc214LAogICAgKTsKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3VzZS1jdXN0b21lci1iYXRjaGVzJywKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAiU29tZSBMREFQIG9yIEFEIHNlcnZlcnMgbGltaXQgdGhlIHJldHVybiBvZiByZXN1bHRzLiBJbiB0aGlzIGNhc2Ugd2UgY2FuIHN0aWxsIGdldCBhbGwgdGhlIHJlc3VsdHMgYnkgc3BsaXR0aW5nIHRoZSBxdWVyaWVzLiAxOiBzcGxpdHMgdGhlIHF1ZXJpZXMgaW50byBzZWFyY2hlcyBmb3IgYS16LCBhMC16OSwgMC05LiAyOiBhYS16eiwgYTAtejkgYW5kIDAtOS4iLAogICAgICAgIFJlcXVpcmVkICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCA9PiBxci9eXGQkL3NteCwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB3aGV0aGVyIGVsYXN0aWMgc2VhcmNoIHdlYiBzZXJ2aWNlIGlzIGVuYWJsZWQgYW5kIGlmIG5vdCwgYWN0aXZhdGUgaXQKICAgIG15ICRXZWJzZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnKTsKCiAgICBteSAkRVNXZWJzZXJ2aWNlID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VHZXQoCiAgICAgICAgTmFtZSA9PiAnRWxhc3RpY3NlYXJjaCcsCiAgICApOwoKICAgIGlmICggISRFU1dlYnNlcnZpY2UgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPkVsYXN0aWNzZWFyY2ggd2Vic2VydmljZSBub3QgZm91bmQhIFVuYWJsZSB0byBjb250aW51ZS48L3JlZD5cbiIpOwogICAgICAgIGRpZTsKICAgIH0KCiAgICBpZiAoICRFU1dlYnNlcnZpY2UtPntWYWxpZElEfSAhPSAxICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+RWxhc3RpY3NlYXJjaCB3ZWJzZXJ2aWNlIGlzIG5vdyBhY3RpdmF0ZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIGtlZXAgaXQgZW5hYmxlZCwgcGxlYXNlIGRpc2FibGUgaXQgbWFudWFsbHkgaW4gdGhlIGFkbWluIGludGVyZmFjZSwgYWZ0ZXIgdGhlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS48L3llbGxvdz5cbiIKICAgICAgICApOwogICAgICAgIG15ICRTdWNjZXNzID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VVcGRhdGUoCiAgICAgICAgICAgICV7JEVTV2Vic2VydmljZX0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+RWxhc3RpY3NlYXJjaCB3ZWJzZXJ2aWNlIGNvdWxkIG5vdCBiZSBhY3RpdmF0ZWQhIFVuYWJsZSB0byBjb250aW51ZS48L3JlZD5cbiIpOwogICAgICAgICAgICBkaWU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRFU09iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVsYXN0aWNzZWFyY2gnKTsKICAgIG15ICRDb25maWcgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpBcnRpY2xlSW5kZXhDcmVhdGlvblNldHRpbmdzJyk7CiAgICBteSAkQ29uZmlnSW5kZXhTZXR0aW5ncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6SW5kZXhTZXR0aW5ncycpOwogICAgbXkgJEluZGV4VGVtcGxhdGVzICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkluZGV4VGVtcGxhdGUnKTsKCiAgICAjIHByZWZlciBFbGFzdGljc2VhcmNoOjpJbmRleFNldHRpbmdzIyMjRGVmYXVsdCBvdmVyIEVsYXN0aWNzZWFyY2g6OkFydGljbGVJbmRleENyZWF0aW9uU2V0dGluZ3MKICAgIGlmICggJENvbmZpZ0luZGV4U2V0dGluZ3MgJiYgJENvbmZpZ0luZGV4U2V0dGluZ3MtPntEZWZhdWx0fSApIHsKICAgICAgICAkQ29uZmlnID0gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntEZWZhdWx0fTsKICAgIH0KCiAgICAjIHRlc3QgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlcgogICAgaWYgKCAhJEVTT2JqZWN0LT5UZXN0Q29ubmVjdGlvbigpICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5Db25uZWN0aW9uIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCE8L3JlZD5cbiIpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSAkVGFyZ2V0cyAgICAgICAgICAgID0gJFNlbGYtPkdldE9wdGlvbigndGFyZ2V0JykgfHwgJ3R1Y2knOwogICAgbXkgJE1pY3JvU2xlZXAgICAgICAgICA9ICRTZWxmLT5HZXRPcHRpb24oJ21pY3JvLXNsZWVwJyk7CiAgICBteSAkQ3VzdG9tZXJMaW1pdExldmVsID0gJFNlbGYtPkdldE9wdGlvbigndXNlLWN1c3RvbWVyLWJhdGNoZXMnKSB8fCAnMCc7CgogICAgaWYgKCAkVGFyZ2V0cyA9fiBtL3R8aS8gKSB7CiAgICAgICAgJFNlbGYtPkNyZWF0ZUF0dGFjaG1lbnRQaXBlbGluZSgKICAgICAgICAgICAgRVNPYmplY3QgPT4gJEVTT2JqZWN0LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkNyZWF0ZVRtcEF0dGFjaG1lbnRzSW5kZXgoCiAgICAgICAgICAgIEVTT2JqZWN0ID0+ICRFU09iamVjdCwKICAgICAgICAgICAgQ29uZmlnICAgPT4gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntUbXBBdHRhY2htZW50c30gLy8gJENvbmZpZywKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGVzLT57VG1wQXR0YWNobWVudHN9ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRUYXJnZXRzID1+IG0vYy8gKSB7CiAgICAgICAgJFNlbGYtPk1pZ3JhdGVDb21wYW5pZXMoCiAgICAgICAgICAgIEVTT2JqZWN0ID0+ICRFU09iamVjdCwKICAgICAgICAgICAgQ29uZmlnICAgPT4gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntDdXN0b21lcn0gLy8gJENvbmZpZywKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGVzLT57Q3VzdG9tZXJ9ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgID0+ICRNaWNyb1NsZWVwLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVGFyZ2V0cyA9fiAvdS8gKSB7CiAgICAgICAgJFNlbGYtPk1pZ3JhdGVDdXN0b21lclVzZXJzKAogICAgICAgICAgICBFU09iamVjdCAgID0+ICRFU09iamVjdCwKICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkQ29uZmlnSW5kZXhTZXR0aW5ncy0+e0N1c3RvbWVyVXNlcn0gLy8gJENvbmZpZywKICAgICAgICAgICAgVGVtcGxhdGUgICA9PiAkSW5kZXhUZW1wbGF0ZXMtPntDdXN0b21lclVzZXJ9ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgICAgPT4gJE1pY3JvU2xlZXAsCiAgICAgICAgICAgIExpbWl0TGV2ZWwgPT4gJEN1c3RvbWVyTGltaXRMZXZlbAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVGFyZ2V0cyA9fiAvdC8gKSB7CiAgICAgICAgJFNlbGYtPk1pZ3JhdGVUaWNrZXRzKAogICAgICAgICAgICBFU09iamVjdCA9PiAkRVNPYmplY3QsCiAgICAgICAgICAgIENvbmZpZyAgID0+ICRDb25maWdJbmRleFNldHRpbmdzLT57VGlja2V0fSAvLyAkQ29uZmlnLAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZXMtPntUaWNrZXR9ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgID0+ICRNaWNyb1NsZWVwLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVGFyZ2V0cyA9fiAvaS8gKSB7CiAgICAgICAgJFNlbGYtPk1pZ3JhdGVDb25maWdJdGVtcygKICAgICAgICAgICAgRVNPYmplY3QgPT4gJEVTT2JqZWN0LAogICAgICAgICAgICBDb25maWcgICA9PiAkQ29uZmlnSW5kZXhTZXR0aW5ncy0+e0NvbmZpZ0l0ZW19IC8vICRDb25maWcsCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlcy0+e0NvbmZpZ0l0ZW19ICAgICAgLy8gJEluZGV4VGVtcGxhdGVzLT57RGVmYXVsdH0sCiAgICAgICAgICAgIFNsZWVwICAgID0+ICRNaWNyb1NsZWVwLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7Cn0KCnN1YiBDcmVhdGVBdHRhY2htZW50UGlwZWxpbmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldHVwIHRoZSBhdHRhY2htZW50IHBpcGVsaW5lCiAgICBteSAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkRlbGV0ZVBpcGVsaW5lKCk7CgogICAgbXkgJVBpcGVsaW5lID0gKAogICAgICAgIGRlc2NyaXB0aW9uID0+ICJFeHRyYWN0IGV4dGVybmFsIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24iLAogICAgICAgIHByb2Nlc3NvcnMgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQgICAgID0+ICJBdHRhY2htZW50cyIsCiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZmllbGQgPT4gIl9pbmdlc3QuX3ZhbHVlLmF0dGFjaG1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgICAgICAgID0+ICJfaW5nZXN0Ll92YWx1ZS5kYXRhIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoID0+IHsKICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICAgPT4gIkF0dGFjaG1lbnRzIiwKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4gIl9pbmdlc3QuX3ZhbHVlLmRhdGEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICApOwoKICAgICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+Q3JlYXRlUGlwZWxpbmUoCiAgICAgICAgUmVxdWVzdCA9PiBcJVBpcGVsaW5lLAogICAgKTsKCiAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5BdHRhY2htZW50IHBpcGVsaW5lIHNldCB1cC48L2dyZWVuPlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+QXR0YWNobWVudCBwaXBlbGluZSBjb3VsZCBub3QgYmUgc2V0IHVwITwvcmVkPlxuIik7CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgQ3JlYXRlVG1wQXR0YWNobWVudHNJbmRleCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVJbmRleE5hbWUgPSAoCiAgICAgICAgaW5kZXggPT4gJ3RtcGF0dGFjaG1lbnRzJywKICAgICk7CiAgICBteSAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkRyb3BJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICApOwogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAiPHllbGxvdz5UaGUgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXMgYXJlIGxpa2VseSB0aGUgcmVzdWx0IG9mIHRyeWluZyB0byBkcm9wIGEgbm9uZXhpc3RlbnQgaW5kZXggYW5kIGNhbiB0aGVuIGJlIGlnbm9yZWQuPC95ZWxsb3c+XG4iCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSW5kZXhTZXR0aW5ncyA9ICRQYXJhbXtFU09iamVjdH0tPkluZGV4U2V0dGluZ3NHZXQoJVBhcmFtKTsKICAgIGlmICggISRJbmRleFNldHRpbmdzICkgewoKICAgICAgICAjIEVycm9yIGlzIHNob3duIGluIEluZGV4U2V0dGluZ3NHZXQKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSAlUmVxdWVzdCA9ICgKICAgICAgICBzZXR0aW5ncyA9PiAkSW5kZXhTZXR0aW5ncywKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5DcmVhdGVJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICk7CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+VGVtcG9yYXJ5IGF0dGFjaG1lbnRzIGluZGV4IGNyZWF0ZWQuPC9ncmVlbj5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPlRlbXBvcmFyeSBhdHRhY2htZW50cyBpbmRleCBjb3VsZCBub3QgYmUgY3JlYXRlZCE8L3JlZD5cbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgTWlncmF0ZUNvbXBhbmllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDdXN0b21lckNvbXBhbnlPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55Jyk7CiAgICBteSAlQ3VzdG9tZXJDb21wYW55TGlzdCAgID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55TGlzdCgKICAgICAgICBMaW1pdCA9PiAwLAogICAgKTsKCiAgICBteSAlSW5kZXhOYW1lID0gKAogICAgICAgIGluZGV4ID0+ICdjdXN0b21lcicsCiAgICApOwogICAgbXkgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5Ecm9wSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgKTsKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+VGhlIHByZXZpb3VzIGVycm9yIG1lc3NhZ2VzIGFyZSBsaWtlbHkgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gZHJvcCBhIG5vbmV4aXN0ZW50IGluZGV4IGFuZCBjYW4gdGhlbiBiZSBpZ25vcmVkLjwveWVsbG93PlxuIgogICAgICAgICk7CiAgICB9CgogICAgbXkgJEluZGV4U2V0dGluZ3MgPSAkUGFyYW17RVNPYmplY3R9LT5JbmRleFNldHRpbmdzR2V0KCVQYXJhbSk7CiAgICBpZiAoICEkSW5kZXhTZXR0aW5ncyApIHsKCiAgICAgICAgIyBFcnJvciBpcyBzaG93biBpbiBJbmRleFNldHRpbmdzR2V0CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJVJlcXVlc3QgPSAoCiAgICAgICAgc2V0dGluZ3MgPT4gJEluZGV4U2V0dGluZ3MsCiAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICBwcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2tleXdvcmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICApOwoKICAgICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+Q3JlYXRlSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3QsCiAgICApOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkN1c3RvbWVyIGluZGV4IGNyZWF0ZWQuPC9ncmVlbj5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPkN1c3RvbWVyIGluZGV4IGNvdWxkIG5vdCBiZSBjcmVhdGVkITwvcmVkPlxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgIyByZXR1cm4gaWYgbm8gU3RvcmVGaWVsZHMgYXJlIGRlZmluZWQKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6Q3VzdG9tZXJDb21wYW55U3RvcmVGaWVsZHMnKSApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Tm8gQ3VzdG9tZXJDb21wYW55U3RvcmVGaWVsZHMgYXJlIGRlZmluZWQuPC95ZWxsb3c+XG4iKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJENvdW50ICAgICAgICAgPSAwOwogICAgbXkgJEN1c3RvbWVyQ291bnQgPSBzY2FsYXIga2V5cyAlQ3VzdG9tZXJDb21wYW55TGlzdDsKCiAgICBteSAkRXJyb3JzID0gMDsKICAgIENVU1RPTUVSSUQ6CiAgICBmb3IgbXkgJEN1c3RvbWVySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVyQ29tcGFueUxpc3QgKSB7CgogICAgICAgICRDb3VudCsrOwoKICAgICAgICAjIGNyZWF0ZSB0aGUgY29tcGFueSBpbiBFbGFzdGljc2VhcmNoCiAgICAgICAgaWYgKCAhJFBhcmFte0VTT2JqZWN0fS0+Q3VzdG9tZXJDb21wYW55QWRkKCBDdXN0b21lcklEID0+ICRDdXN0b21lcklEICkgKSB7CiAgICAgICAgICAgICRFcnJvcnMrKzsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBwcm9ncmVzcyBhbmQgcG90ZW50aWFsbHkgc2xlZXAKICAgICAgICBpZiAoICRDb3VudCAlIDUwMCA9PSAwICkgewogICAgICAgICAgICBteSAkUGVyY2VudCA9IGludCggJENvdW50IC8gKCAkQ3VzdG9tZXJDb3VudCAvIDEwMCApICk7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICI8eWVsbG93PiRDb3VudDwveWVsbG93PiBvZiA8eWVsbG93PiRDdXN0b21lckNvdW50PC95ZWxsb3c+IHByb2Nlc3NlZCAoPHllbGxvdz4kUGVyY2VudCAlPC95ZWxsb3c+IGRvbmUpLlxuIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgVGltZTo6SGlSZXM6OnVzbGVlcCggJFBhcmFte1NsZWVwfSApIGlmICRQYXJhbXtTbGVlcH07CiAgICB9CgogICAgaWYgKCRFcnJvcnMpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Q3VzdG9tZXJDb21wYW55IHRyYW5zZmVyIGNvbXBsZXRlLiAkRXJyb3JzIGVycm9yKHMpIG9jY3VycmVkITwveWVsbG93PlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5DdXN0b21lckNvbXBhbnkgdHJhbnNmZXIgY29tcGxldGUuIFRyYW5zZmVycmVkICRDb3VudCBjb21wYW5pZXMuPC9ncmVlbj5cbiIpOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgTWlncmF0ZUN1c3RvbWVyVXNlcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJUN1c3RvbWVyVXNlckxpc3Q7CiAgICBteSAkQ3VzdG9tZXJMaW1pdExldmVsID0gJFBhcmFte0xpbWl0TGV2ZWx9OwoKICAgICMgTm8gc3BlY2lhbCBzZWFyY2gsIHNlYXJjaCBhbGwgY3VzdG9tZXJzIHRvZ2V0aGVyCiAgICBpZiAoICRDdXN0b21lckxpbWl0TGV2ZWwgPT0gMCApIHsKICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJyonLAogICAgICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICAgICAgTGltaXQgID0+IDRfMDAwXzAwMCwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkQ3VzdG9tZXJMaW1pdExldmVsID49IDEgKSB7CgogICAgICAgICMgU2VhcmNoIHdpdGggQ3VzdG9tZXJVc2VyTGltaXQgeCBhLi56CiAgICAgICAgZm9yIG15ICRMZXR0ZXIgKCAiYSIgeCAkQ3VzdG9tZXJMaW1pdExldmVsIC4uICJ6IiB4ICRDdXN0b21lckxpbWl0TGV2ZWwsICdhMCcgLi4gJ3o5JywgJzAnIC4uICc5JyApIHsKCiAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICI8Z3JlZW4+U2VhcmNoIGZvciBhbGwgY3VzdG9tZXJ1c2VyIGxpa2U6ICRMZXR0ZXIqLjwvZ3JlZW4+XG4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdE5ldyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgU2VhcmNoID0+ICRMZXR0ZXIgLiAnKicsCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICAgICAgICAgIExpbWl0ICA9PiA0XzAwMF8wMDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICggJUN1c3RvbWVyVXNlckxpc3QsICVDdXN0b21lclVzZXJMaXN0TmV3ICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICVJbmRleE5hbWUgPSAoCiAgICAgICAgaW5kZXggPT4gJ2N1c3RvbWVydXNlcicsCiAgICApOwogICAgbXkgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5Ecm9wSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lCiAgICApOwogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAiPHllbGxvdz5QcmV2aW91cyBlcnJvciBtZXNzYWdlcyBhcmUgbGlrZWx5IHRoZSByZXN1bHQgb2YgdHJ5aW5nIHRvIGRyb3AgYSBub25leGlzdGVudCBpbmRleCBhbmQgY2FuIHRoZW4gYmUgaWdub3JlZC48L3llbGxvdz5cbiIKICAgICAgICApOwogICAgfQoKICAgIG15ICRJbmRleFNldHRpbmdzID0gJFBhcmFte0VTT2JqZWN0fS0+SW5kZXhTZXR0aW5nc0dldCglUGFyYW0pOwogICAgaWYgKCAhJEluZGV4U2V0dGluZ3MgKSB7CgogICAgICAgICMgRXJyb3IgaXMgc2hvd24gaW4gSW5kZXhTZXR0aW5nc0dldAogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG15ICVSZXF1ZXN0ID0gKAogICAgICAgIHNldHRpbmdzID0+ICRJbmRleFNldHRpbmdzLAogICAgICAgIG1hcHBpbmdzID0+IHsKICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2tleXdvcmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5DcmVhdGVJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICk7CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+Q3VzdG9tZXJVc2VyIGluZGV4IGNyZWF0ZWQuPC9ncmVlbj5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPkN1c3RvbWVyVXNlciBpbmRleCBjb3VsZCBub3QgYmUgY3JlYXRlZCE8L3JlZD5cbiIpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAjIHJldHVybiBpZiBubyBTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZAogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpDdXN0b21lclVzZXJTdG9yZUZpZWxkcycpICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5ObyBDdXN0b21lclVzZXJTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZC48L3llbGxvdz5cbiIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRDb3VudCAgICAgICAgICAgICA9IDA7CiAgICBteSAkQ3VzdG9tZXJVc2VyQ291bnQgPSBzY2FsYXIga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdDsKCiAgICBteSAkRXJyb3JzID0gMDsKICAgIENVU1RPTUVSVVNFUklEOgogICAgZm9yIG15ICRDdXN0b21lclVzZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKCiAgICAgICAgJENvdW50Kys7CgogICAgICAgICMgY3JlYXRlIHRoZSBjdXN0b21lciB1c2VyIGluIEVsYXN0aWNzZWFyY2gKICAgICAgICBpZiAoICEkUGFyYW17RVNPYmplY3R9LT5DdXN0b21lclVzZXJBZGQoIFVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VySUQgKSApIHsKICAgICAgICAgICAgJEVycm9ycysrOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHByb2dyZXNzIGFuZCBwb3RlbnRpYWxseSBzbGVlcAogICAgICAgIGlmICggJENvdW50ICUgNTAwID09IDAgKSB7CiAgICAgICAgICAgIG15ICRQZXJjZW50ID0gaW50KCAkQ291bnQgLyAoICRDdXN0b21lclVzZXJDb3VudCAvIDEwMCApICk7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICI8eWVsbG93PiRDb3VudDwveWVsbG93PiBvZiA8eWVsbG93PiRDdXN0b21lclVzZXJDb3VudDwveWVsbG93PiBwcm9jZXNzZWQgKDx5ZWxsb3c+JFBlcmNlbnQgJTwveWVsbG93PiBkb25lKS5cbiIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIFRpbWU6OkhpUmVzOjp1c2xlZXAoICRQYXJhbXtTbGVlcH0gKSBpZiAkUGFyYW17U2xlZXB9OwogICAgfQoKICAgIGlmICgkRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PkN1c3RvbWVyVXNlciB0cmFuc2ZlciBjb21wbGV0ZS4gJEVycm9ycyBlcnJvcihzKSBvY2N1cnJlZCE8L3llbGxvdz5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+Q3VzdG9tZXJVc2VyIHRyYW5zZmVyIGNvbXBsZXRlLiBUcmFuc2ZlcnJlZCAkQ291bnQgY3VzdG9tZXIgdXNlcnMuPC9ncmVlbj5cbiIpOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgTWlncmF0ZVRpY2tldHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGlja2V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgIG15IEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICk7CgogICAgIyBEcm9wIGV4aXN0aW5nIHRpY2tldCBpbmRleAogICAgbXkgJUluZGV4TmFtZSA9ICgKICAgICAgICBpbmRleCA9PiAndGlja2V0JywKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5Ecm9wSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgKTsKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+UHJldmlvdXMgZXJyb3IgbWVzc2FnZXMgYXJlIGxpa2VseSB0aGUgcmVzdWx0IG9mIHRyeWluZyB0byBkcm9wIGEgbm9uZXhpc3RlbnQgaW5kZXggYW5kIGNhbiB0aGVuIGJlIGlnbm9yZWQuPC95ZWxsb3c+XG4iCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSW5kZXhTZXR0aW5ncyA9ICRQYXJhbXtFU09iamVjdH0tPkluZGV4U2V0dGluZ3NHZXQoJVBhcmFtKTsKICAgIGlmICggISRJbmRleFNldHRpbmdzICkgewoKICAgICAgICAjIEVycm9yIGlzIHNob3duIGluIEluZGV4U2V0dGluZ3NHZXQKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSAlUmVxdWVzdCA9ICgKICAgICAgICBzZXR0aW5ncyA9PiAkSW5kZXhTZXR0aW5ncywKICAgICAgICBtYXBwaW5ncyA9PiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAna2V5d29yZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2tleXdvcmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5DcmVhdGVJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICk7CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+VGlja2V0IGluZGV4IGNyZWF0ZWQuPC9ncmVlbj5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPlRpY2tldCBpbmRleCBjb3VsZCBub3QgYmUgY3JlYXRlZCE8L3JlZD5cbiIpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAjIHJldHVybiBpZiBubyBTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZAogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpUaWNrZXRTdG9yZUZpZWxkcycpICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5ObyBUaWNrZXRTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZC48L3llbGxvdz5cbiIpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkQ291bnQgICAgID0gMDsKICAgIG15ICRQZXJjZW50MTAgPSAoIHNvcnQgeyAkYSA8PT4gJGIgfSAoIDEwLCBpbnQoICQjVGlja2V0SURzIC8gMTAgKSApIClbMV07CiAgICBteSAkUGVyY2VudDEgID0gKCBzb3J0IHsgJGEgPD0+ICRiIH0gKCAxLCAgaW50KCAkI1RpY2tldElEcyAvIDEwMCApICkgKVsxXTsKCiAgICBpZiAoICQjVGlja2V0SURzID4gMTAwICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+VGlja2V0cyBhcmUgdHJhbnNmZXJlZC4gVGhpcyBjYW4gdGFrZSBzZXZlcmFsIGhvdXJzLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0aWNrZXRzLjwveWVsbG93PlxuIgogICAgICAgICk7CiAgICB9CgogICAgbXkgJEVycm9ycyA9IDA7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRJRHMpIHsKCiAgICAgICAgJENvdW50Kys7CgogICAgICAgICMgY3JlYXRlIHRoZSB0aWNrZXQKICAgICAgICBpZiAoICEkUGFyYW17RVNPYmplY3R9LT5UaWNrZXRDcmVhdGUoIFRpY2tldElEID0+ICRUaWNrZXRJRCApICkgewogICAgICAgICAgICAkRXJyb3JzKys7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSB0aGUgYXJ0aWNsZXMKICAgICAgICBteSBAQXJ0aWNsZUxpc3QgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwogICAgICAgIGZvciBteSAkQXJ0aWNsZSAoQEFydGljbGVMaXN0KSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGUtPntBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRXJyb3JzKysgaWYgISRTdWNjZXNzOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHByb2dyZXNzIGFuZCBwb3RlbnRpYWxseSBzbGVlcAogICAgICAgIGlmICggJENvdW50ICUgJFBlcmNlbnQxMCA9PSAwICkgewogICAgICAgICAgICBteSAkUGVyY2VudCA9IGludCggJENvdW50IC8gKCAkI1RpY2tldElEcyAvIDEwMCApICk7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICI8eWVsbG93PiRDb3VudDwveWVsbG93PiBvZiA8eWVsbG93PiQjVGlja2V0SURzPC95ZWxsb3c+IHByb2Nlc3NlZCAoPHllbGxvdz4kUGVyY2VudCAlPC95ZWxsb3c+IGRvbmUpLlxuIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICQjVGlja2V0SURzID4gNTAgJiYgJENvdW50ICUgJFBlcmNlbnQxID09IDAgKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgnLiAnKTsKICAgICAgICAgICAgc2VsZWN0KCktPmZsdXNoKCk7ICAgICMgc2hvdyB0aGUgZG90IGltbWVkaWF0ZWx5CiAgICAgICAgfQoKICAgICAgICBUaW1lOjpIaVJlczo6dXNsZWVwKCAkUGFyYW17U2xlZXB9ICkgaWYgJFBhcmFte1NsZWVwfTsKICAgIH0KCiAgICBpZiAoJEVycm9ycykgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5UaWNrZXQgdHJhbnNmZXIgY29tcGxldGUuICRFcnJvcnMgZXJyb3Iocykgb2NjdXJyZWQhPC95ZWxsb3c+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPlRpY2tldCB0cmFuc2ZlciBjb21wbGV0ZS4gVHJhbnNmZXJyZWQgJENvdW50IHRpY2tldHMuPC9ncmVlbj5cbiIpOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgTWlncmF0ZUNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB3aGV0aGVyIElUU01Db25maWd1cmF0aW9uTWFuYWdtZW50IGlzIGluc3RhbGxlZAogICAgbXkgJFBhY2thZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UGFja2FnZScpOwogICAgbXkgJElzSW5zdGFsbGVkICAgPSAkUGFja2FnZU9iamVjdC0+UGFja2FnZUlzSW5zdGFsbGVkKAogICAgICAgIE5hbWUgPT4gJ0lUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudCcsCiAgICApOwogICAgaWYgKCAhJElzSW5zdGFsbGVkICkgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPlNraXBwaW5nIElUU01Db25maWdJdGVtcyAoSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ21lbnQgbm90IGluc3RhbGxlZCkuLi48L2dyZWVuPlxuIik7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJENsYXNzTGlzdCAgICAgICAgICAgID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgIG15ICRFeGNsdWRlZENsYXNzZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkV4Y2x1ZGVkQ0lDbGFzc2VzJyk7CiAgICAkRXhjbHVkZWRDbGFzc2VzID0geyBtYXAgeyAkXyA9PiAxIH0gQHskRXhjbHVkZWRDbGFzc2VzfSB9OwoKICAgIG15IEBBY3RpdmVDbGFzc2VzOwogICAgQ0xBU1M6CiAgICBmb3IgbXkgJENsYXNzICgga2V5cyAleyRDbGFzc0xpc3R9ICkgewogICAgICAgIG5leHQgQ0xBU1MgaWYgJEV4Y2x1ZGVkQ2xhc3Nlcy0+eyRDbGFzc307CiAgICAgICAgcHVzaCBAQWN0aXZlQ2xhc3NlcywgJENsYXNzOwogICAgfQoKICAgIG15ICVJbmRleE5hbWUgPSAoCiAgICAgICAgaW5kZXggPT4gJ2NvbmZpZ2l0ZW0nLAogICAgKTsKICAgIG15ICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+RHJvcEluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICk7CiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICI8eWVsbG93PlRoZSBwcmV2aW91cyBlcnJvciBtZXNzYWdlcyBhcmUgbGlrZWx5IHRoZSByZXN1bHQgb2YgdHJ5aW5nIHRvIGRyb3AgYSBub25leGlzdGVudCBpbmRleCBhbmQgY2FuIHRoZW4gYmUgaWdub3JlZC48L3llbGxvdz5cbiIKICAgICAgICApOwogICAgfQoKICAgIG15ICRJbmRleFNldHRpbmdzID0gJFBhcmFte0VTT2JqZWN0fS0+SW5kZXhTZXR0aW5nc0dldCglUGFyYW0pOwogICAgaWYgKCAhJEluZGV4U2V0dGluZ3MgKSB7CgogICAgICAgICMgRXJyb3IgaXMgc2hvd24gaW4gSW5kZXhTZXR0aW5nc0dldAogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG15ICVSZXF1ZXN0ID0gKAogICAgICAgIHNldHRpbmdzID0+ICRJbmRleFNldHRpbmdzLAogICAgICAgIG1hcHBpbmdzID0+IHsKICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgIH0sCiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAgICAgICAgICAgICBHcm91cElEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgIH0sCiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICApOwoKICAgICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+Q3JlYXRlSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3QsCiAgICApOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkNvbmZpZ0l0ZW0gaW5kZXggY3JlYXRlZC48L2dyZWVuPlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+Q29uZmlnSXRlbSBpbmRleCBjb3VsZCBub3QgYmUgY3JlYXRlZCE8L3JlZD5cbiIpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAjIHJldHVybiBpZiBubyBTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZAogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU3RvcmVGaWVsZHMnKSApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Tm8gQ29uZmlnSXRlbVN0b3JlRmllbGRzIGFyZSBkZWZpbmVkLjwveWVsbG93PlxuIik7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgaWYgY3VycmVudGx5IG5vIGFjdGl2ZSBjbGFzc2VzIGFyZSBkZWZpbmVkLCByZXR1cm4KICAgIHJldHVybiAxIGlmICFAQWN0aXZlQ2xhc3NlczsKCiAgICBteSBAQ29uZmlnSXRlbXMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICBDbGFzc0lEcyA9PiBbQEFjdGl2ZUNsYXNzZXNdLAogICAgICAgIFJlc3VsdCAgID0+ICdBUlJBWScsCiAgICApOwoKICAgIG15ICRDb3VudCAgID0gMDsKICAgIG15ICRDSUNvdW50ID0gc2NhbGFyIEBDb25maWdJdGVtczsKCiAgICBteSAkRXJyb3JzID0gMDsKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbXMpIHsKCiAgICAgICAgJENvdW50Kys7CgogICAgICAgICMgY3JlYXRlIHRoZSBjb25maWcgaXRlbSBpbiBFbGFzdGljc2VhcmNoCiAgICAgICAgaWYgKCAhJFBhcmFte0VTT2JqZWN0fS0+Q29uZmlnSXRlbUNyZWF0ZSggQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQgKSApIHsKICAgICAgICAgICAgJEVycm9ycysrOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHByb2dyZXNzIGFuZCBwb3RlbnRpYWxseSBzbGVlcAogICAgICAgIGlmICggJENvdW50ICUgMTAwMCA9PSAwICkgewogICAgICAgICAgICBteSAkUGVyY2VudCA9IGludCggJENvdW50IC8gKCAkQ0lDb3VudCAvIDEwMCApICk7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICI8eWVsbG93PiRDb3VudDwveWVsbG93PiBvZiA8eWVsbG93PiRDSUNvdW50PC95ZWxsb3c+IHByb2Nlc3NlZCAoPHllbGxvdz4kUGVyY2VudCAlPC95ZWxsb3c+IGRvbmUpLlxuIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgVGltZTo6SGlSZXM6OnVzbGVlcCggJFBhcmFte1NsZWVwfSApIGlmICRQYXJhbXtTbGVlcH07CiAgICB9CgogICAgaWYgKCRFcnJvcnMpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Q29uZmlnSXRlbSB0cmFuc2ZlciBjb21wbGV0ZS4gJEVycm9ycyBlcnJvcihzKSBvY2N1cnJlZCE8L3llbGxvdz5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+Q29uZmlnSXRlbSB0cmFuc2ZlciBjb21wbGV0ZS4gVHJhbnNmZXJyZWQgJENvdW50IGNvbmZpZyBpdGVtcy48L2dyZWVuPlxuIik7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/Elasticsearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAxMmIzMDVhMDJlY2QzZDY1YWY1YzY1MWI0NGIzZTUyYzIyODI2MGQ2IC0gS2VybmVsL1N5c3RlbS9FbGFzdGljc2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkVsYXN0aWNzZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoIDphbGwgKTsKCiMgSW5mb3JtIHRoZSBvYmplY3QgbWFuYWdlciBhYm91dCB0aGUgaGFyZCBkZXBlbmRlbmNpZXMuCiMgVGhpcyBtb2R1bGUgbXVzdCBiZSBkaXNjYXJkZWQgd2hlbiBvbmUgb2YgdGhlIGhhcmQgZGVwZW5kZW5jaWVzIGhhcyBiZWVuIGRpc2NhcmRlZC4Kb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKIyBJbmZvcm0gdGhlIENvZGVQb2xpY3kgYWJvdXQgdGhlIHNvZnQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGludGVudGlvbmFsbHkgbm90IGluIEBPYmplY3REZXBlbmRlbmNpZXMuCiMgU29mdCBkZXBlbmRlbmNpZXMgYXJlIG1vZHVsZXMgdGhhdCB1c2VkIGJ5IHRoaXMgb2JqZWN0LCBidXQgd2hvIGRvbid0IGFmZmVjdCB0aGUgc3RhdGUgb2YgdGhpcyBvYmplY3QuCiMgVGhlcmUgaXMgbm8gbmVlZCB0byBkaXNjYXJkIHRoaXMgbW9kdWxlIHdoZW4gb25lIG9mIHRoZSBzb2Z0IGRlcGVuZGVuY2llcyBpcyBkaXNjYXJkZWQuCm91ciBAU29mdE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkVsYXN0aWNzZWFyY2ggLSBFbGFzdGljc2VhcmNoIEJhY2tlbmQKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBtb2R1bGUgcHJvY2Vzc2VzIHNlYXJjaCBjYWxscyBmb3IgdmFyaW91cyBvdG9ibyBjbGFzc2VzIHRvIGNhbGwgdGhlIGdlbmVyaWMgRWxhc3RpY3NlYXJjaCBzZWFyY2ggaW52b2tlcgoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gRWxhc3RpY3NlYXJjaCBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIG15ICRFU09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbGFzdGljc2VhcmNoJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHt9LCAkVHlwZTsKCiAgICAjIGdldCB0aGUgRWxhc3RpY3NlYXJjaCB3ZWJzZXJ2aWNlIGlkCiAgICBteSAkV2Vic2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJyk7CiAgICBteSAkV2Vic2VydmljZSAgICAgICA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlR2V0KAogICAgICAgIE5hbWUgPT4gJ0VsYXN0aWNzZWFyY2gnLAogICAgKTsKCiAgICAkU2VsZi0+e1dlYnNlcnZpY2VJRH0gPSAkV2Vic2VydmljZS0+e0lEfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBUaWNrZXRTZWFyY2goKQoKUGVyZm9ybXMgYSB0aWNrZXQgc2VhcmNoIHZpYSBFbGFzdGljc2VhcmNoLgoKICAgIG15IEBUaWNrZXRJRHMgPSAkRVNPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICAjIHJlc3VsdCAocmVxdWlyZWQpCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScgfHwgJ0hBU0gnIHx8ICdDT1VOVCcgfHwgJ0ZVTEwnLAoKICAgICAgICAjIHVzZXIgc2VhcmNoIChVc2VySUQgaXMgcmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICA9PiAxMjMsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nIHx8ICdydycsCgogICAgICAgICMgY3VzdG9tZXIgc2VhcmNoIChDdXN0b21lclVzZXJJRCBpcyByZXF1aXJlZCkKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAxMjMsCiAgICAgICAgUGVybWlzc2lvbiAgICAgPT4gJ3JvJyB8fCAncncnLAoKICAgICAgICAjIHJlc3VsdCBsaW1pdAogICAgICAgIExpbWl0ID0+IDEwMCwKCiAgICAgICAgIyBDdXN0b21lcklEIChvcHRpb25hbCkgYXMgU1RSSU5HIG9yIGFzIEFSUkFZUkVGCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAnMTIzJywKICAgICAgICBDdXN0b21lcklEID0+IFsnMTIzJywgJ0FCQyddLAoKICAgICAgICAjIEN1c3RvbWVySURSYXcgKG9wdGlvbmFsKSBhcyBTVFJJTkcgb3IgYXMgQVJSQVlSRUYKICAgICAgICAjIEN1c3RvbWVySUQgd2l0aG91dCBRdWVyeUNvbmRpdGlvbiBjaGVja2luZwogICAgICAgICNUaGUgcmF3IHZhbHVlIHdpbGwgYmUgdXNlZCBpZiBpcyBzZXQgdGhpcyBwYXJhbWV0ZXIKICAgICAgICBDdXN0b21lcklEUmF3ID0+ICcxMjMgKyAzNDUnLAogICAgICAgIEN1c3RvbWVySURSYXcgPT4gWycxMjMnLCAnQUJDJywnMTIzICYmIDQ1NicsJ0FCQyAlIGVmZyddLAoKICAgICAgICAjIEN1c3RvbWVyVXNlckxvZ2luIChvcHRpb25hbCkgYXMgU1RSSU5HIGFzIEFSUkFZUkVGCiAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJ3VpZDEyMycsCiAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gWyd1aWQxMjMnLCAndWlkNzc3J10sCgogICAgICAgICMgQ3VzdG9tZXJVc2VyTG9naW5SYXcgKG9wdGlvbmFsKSBhcyBTVFJJTkcgYXMgQVJSQVlSRUYKICAgICAgICAjVGhlIHJhdyB2YWx1ZSB3aWxsIGJlIHVzZWQgaWYgaXMgc2V0IHRoaXMgcGFyYW1ldGVyCiAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW5SYXcgPT4gJ3VpZCcsCiAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW5SYXcgPT4gJ3VpZCArIDEyMycsCiAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW5SYXcgPT4gWyd1aWQgIC0gIDEyMycsICd1aWQgIyA3NzcgKyAzMjEnXSwKCiAgICAgICAgIyBPcmRlckJ5IGFuZCBTb3J0QnkgKG9wdGlvbmFsKQogICAgICAgIE9yZGVyQnkgPT4gJ0Rvd24nLCAgIyBEb3dufFVwCiAgICAgICAgU29ydEJ5ICA9PiAnQWdlJywgICAjIFNjb3JlfEFnZQoKICAgICAgICAjIENhY2hlVFRMLCBjYWNoZSBzZWFyY2ggcmVzdWx0IGluIHNlY29uZHMgKG9wdGlvbmFsKQogICAgICAgIENhY2hlVFRMID0+IDYwICogMTUsCiAgICApOwoKPWN1dAoKc3ViIFRpY2tldFNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFJlc3VsdFR5cGUgICA9ICRQYXJhbXtSZXN1bHR9ICB8fCAnQVJSQVknOwogICAgbXkgJE9yZGVyQnkgICAgICA9ICRQYXJhbXtPcmRlckJ5fSB8fCBbICdEb3duJywgICdEb3duJyBdOwogICAgbXkgJFNvcnRCeSAgICAgICA9ICRQYXJhbXtTb3J0Qnl9ICB8fCBbICdTY29yZScsICdBZ2UnIF07CiAgICBteSAkTGltaXQgICAgICAgID0gJFBhcmFte0xpbWl0fSAgIHx8IDEwMDAwOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSAmJiAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIG9yIEN1c3RvbWVyVXNlcklEIHBhcmFtcyBmb3IgcGVybWlzc2lvbiBjaGVjayEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2F0aGVyIHRoZSBpbmZvIGZvciB0aGUgRWxhc3RpY3NlYXJjaCBxdWVyeSBwcmVwYXJhdGlvbgogICAgIyBNdXN0IGlzIHJlYWQgYXMgYWxsIGNvbmRpdGlvbnMgaGF2ZSB0byBiZSBtZXQsIFNob3VsZCBpcyByZWFkIGFzIGF0IGxlYXN0IG9uZSBjb25kaXRpb24gaGFzIHRvIGJlIG1ldAogICAgbXkgKCBARmlsdGVycywgQE11c3RzICk7CgogICAgIyB1c2VyIGdyb3VwcwogICAgaWYgKCAkUGFyYW17VXNlcklEfSAmJiAkUGFyYW17VXNlcklEfSAhPSAxICkgewoKICAgICAgICAjIGdldCB1c2VycyBncm91cHMKICAgICAgICBteSAlR3JvdXBMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkUGFyYW17UGVybWlzc2lvbn0gfHwgJ3JvJywKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBpZiB3ZSBoYXZlIG5vIHBlcm1pc3Npb25zCiAgICAgICAgcmV0dXJuIGlmICElR3JvdXBMaXN0OwoKICAgICAgICAjIGFkZCBwZXJtaXNzaW9uIHJlc3RyaWN0aW9ucwogICAgICAgIHB1c2ggQEZpbHRlcnMsIHsKICAgICAgICAgICAgdGVybXMgPT4gewogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiBbIGtleXMgJUdyb3VwTGlzdCBdLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBjdXN0b21lciBncm91cHMKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICBteSAlR3JvdXBMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtQZXJtaXNzaW9ufSB8fCAncm8nLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIGlmIHdlIGhhdmUgbm8gcGVybWlzc2lvbnMKICAgICAgICByZXR1cm4gaWYgISVHcm91cExpc3Q7CgogICAgICAgICMgZ2V0IGFsbCBjdXN0b21lciBpZHMKICAgICAgICBteSBAQ3VzdG9tZXJJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVySURzKAogICAgICAgICAgICBVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIGNvbWJpbmF0aW9uIG9mIGN1c3RvbWVyPC0+Z3JvdXAgYWNjZXNzCiAgICAgICAgIyBhZGQgZGVmYXVsdCBjb21iaW5hdGlvbiBmaXJzdCAoIEN1c3RvbWVySURzICsgQ3VzdG9tZXJVc2VySUQgPC0+IHJ3IGFjY2VzcyBncm91cHMgKQogICAgICAgICMgdGhpcyBncm91cCB3aWxsIGFsd2F5cyBiZSBhZGRlZCAoZW5zdXJlcyBwcmV2aW91cyBiZWhhdmlvcikKICAgICAgICBteSBAQ3VzdG9tZXJHcm91cFBlcm1pc3Npb247CiAgICAgICAgcHVzaCBAQ3VzdG9tZXJHcm91cFBlcm1pc3Npb24sIHsKICAgICAgICAgICAgQ3VzdG9tZXJJRHMgICAgPT4gXEBDdXN0b21lcklEcywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgR3JvdXBJRHMgICAgICAgPT4gWyBzb3J0IGtleXMgJUdyb3VwTGlzdCBdLAogICAgICAgIH07CgogICAgICAgICMgYWRkIGFsbCBjb21iaW5hdGlvbnMgYmFzZWQgb24gZ3JvdXAgYWNjZXNzIGZvciBvdGhlciBDdXN0b21lcklEcyAoaWYgYXZhaWxhYmxlKQogICAgICAgICMgb25seSBhY3RpdmUgaWYgY3VzdG9tZXIgZ3JvdXAgc3VwcG9ydCBhbmQgZXh0cmEgcGVybWlzc2lvbiBjb250ZXh0IGFyZSBlbmFibGVkCiAgICAgICAgbXkgJEN1c3RvbWVyR3JvdXBPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcpOwogICAgICAgIG15ICRFeHRyYVBlcm1pc3Npb25Db250ZXh0ID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ29udGV4dE5hbWVHZXQoCiAgICAgICAgICAgIFN5c0NvbmZpZ05hbWUgPT4gJzEwMC1DdXN0b21lcklELW90aGVyJywKICAgICAgICApOwogICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDdXN0b21lckdyb3VwU3VwcG9ydCcpICYmICRFeHRyYVBlcm1pc3Npb25Db250ZXh0ICkgewoKICAgICAgICAgICAgIyBhZGQgbG9va3VwIGZvciBDdXN0b21lcklECiAgICAgICAgICAgIG15ICVDdXN0b21lcklEc0xvb2t1cCA9IG1hcCB7ICRfID0+ICRfIH0gQEN1c3RvbWVySURzOwoKICAgICAgICAgICAgIyBmb3IgYWxsIEN1c3RvbWVySURzIGdldCBncm91cHMgd2l0aCBhY2Nlc3MgdG8gb3RoZXIgQ3VzdG9tZXJJRHMKICAgICAgICAgICAgbXkgJUV4dHJhUGVybWlzc2lvbkdyb3VwczsKICAgICAgICAgICAgQ1VTVE9NRVJJRDoKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lcklEIChAQ3VzdG9tZXJJRHMpIHsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lcklERXh0cmFQZXJtaXNzaW9uR3JvdXBzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ3VzdG9tZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICA9PiAkUGFyYW17UGVybWlzc2lvbn0gfHwgJ3JvJywKICAgICAgICAgICAgICAgICAgICBDb250ZXh0ICAgID0+ICRFeHRyYVBlcm1pc3Npb25Db250ZXh0LAogICAgICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJJRCBpZiAhJUN1c3RvbWVySURFeHRyYVBlcm1pc3Npb25Hcm91cHM7CgogICAgICAgICAgICAgICAgIyBhZGQgdG8gZ3JvdXBzCiAgICAgICAgICAgICAgICAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzID0gKAogICAgICAgICAgICAgICAgICAgICVFeHRyYVBlcm1pc3Npb25Hcm91cHMsCiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVySURFeHRyYVBlcm1pc3Npb25Hcm91cHMsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBhbGwgdW5pcXVlIGFjY2Vzc2libGUgR3JvdXA8LT5DdXN0b21lciBjb21iaW5hdGlvbnMgdG8gcXVlcnkKICAgICAgICAgICAgIyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBhbGwgZ3JvdXBzIGNvcnJlc3BvbnNpbmcgd2l0aCBhIHVuaXF1ZSBjdXN0b21lciBpZCBjb21iaW5hdGlvbgogICAgICAgICAgICAjICAgd2lsbCBiZSBjb21iaW5lZCBpbnRvIG9uZSBwYXJ0CiAgICAgICAgICAgIG15ICVDdXN0b21lcklEQ29tYmluYXRpb25zOwogICAgICAgICAgICBHUk9VUElEOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwSUQgKCBzb3J0IGtleXMgJUV4dHJhUGVybWlzc2lvbkdyb3VwcyApIHsKICAgICAgICAgICAgICAgIG15IEBFeHRyYUN1c3RvbWVySURzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ3VzdG9tZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGFyYW17UGVybWlzc2lvbn0gfHwgJ3JvJywKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBHUk9VUElEIGlmICFARXh0cmFDdXN0b21lcklEczsKCiAgICAgICAgICAgICAgICAjIGV4Y2x1ZGUgb3duIEN1c3RvbWVySURzIGZvciBwZXJmb3JtYW5jZSByZWFzb25zCiAgICAgICAgICAgICAgICBteSBATWVyZ2VkQ3VzdG9tZXJJRHMgPSBncmVwIHsgISRDdXN0b21lcklEc0xvb2t1cHskX30gfSBARXh0cmFDdXN0b21lcklEczsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVBJRCBpZiAhQE1lcmdlZEN1c3RvbWVySURzOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgY29tYmluYXRpb24KICAgICAgICAgICAgICAgIG15ICRDdXN0b21lcklEU3RyaW5nID0gam9pbiAnLCcsIHNvcnQgQE1lcmdlZEN1c3RvbWVySURzOwogICAgICAgICAgICAgICAgaWYgKCAhJEN1c3RvbWVySURDb21iaW5hdGlvbnN7JEN1c3RvbWVySURTdHJpbmd9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lcklEQ29tYmluYXRpb25zeyRDdXN0b21lcklEU3RyaW5nfSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRHMgPT4gXEBNZXJnZWRDdXN0b21lcklEcywKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaCBAeyAkQ3VzdG9tZXJJRENvbWJpbmF0aW9uc3skQ3VzdG9tZXJJRFN0cmluZ30tPntHcm91cElEc30gfSwgJEdyb3VwSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIHRvIHF1ZXJ5IGNvbWJpbmF0aW9ucwogICAgICAgICAgICBwdXNoIEBDdXN0b21lckdyb3VwUGVybWlzc2lvbiwgc29ydCB2YWx1ZXMgJUN1c3RvbWVySURDb21iaW5hdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAjIG5vdyBhZGQgYWxsIGNvbWJpbmF0aW9ucyB0byBxdWVyeToKICAgICAgICAjIHRoaXMgd2lsbCBjb21waWxlIGEgc2VhcmNoIHJlc3RyaWN0aW9uIGJhc2VkIG9uIGN1c3RvbWVyX2lkL2N1c3RvbWVyX3VzZXJfaWQgYW5kIGdyb3VwCiAgICAgICAgIyAgIGFuZCB3aWxsIG1hdGNoIGlmIGFueSBvZiB0aGUgcGVybWlzc2lvbiBjb21iaW5hdGlvbiBpcyBtZXQKICAgICAgICAjIGEgcGVybWlzc2lvbiBjb21iaW5hdGlvbiBjb3VsZCBiZToKICAgICAgICAjICAgICAoIDxDdXN0b21lclVzZXJJRD4gT1IgPENVU1RPTUVSSUQxPiApIEFORCAoIDxHUk9VUElEMT4gKQogICAgICAgICMgb3IKICAgICAgICAjICAgICAoIDxDdXN0b21lcklEMT4gT1IgPENVU1RPTUVSSUQyPiBPUiA8Q1VTVE9NRVJJRDM+ICkgQU5EICggPEdST1VQSUQxPiBPUiA8R1JPVVBJRDI+ICkKICAgICAgICBteSBAQ3VzdG9tZXJJREdyb3VwQ29tYmluYXRpb25zOwogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckdyb3VwUGVybWlzc2lvbikgewogICAgICAgICAgICBteSAkRGlyZWN0Q29uZGl0aW9uczsKICAgICAgICAgICAgbXkgQEN1c3RvbWVySURzOwoKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRFbnRyeS0+e0N1c3RvbWVySURzfSApICkgewogICAgICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJJRHMsIEB7ICRFbnRyeS0+e0N1c3RvbWVySURzfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2luUmF3fSB8fCAoICRFbnRyeS0+e0N1c3RvbWVyVXNlcklEfSAmJiAhQEN1c3RvbWVySURzICkgKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0Q29uZGl0aW9ucyA9IHsKICAgICAgICAgICAgICAgICAgICB0ZXJtID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte0N1c3RvbWVyVXNlckxvZ2luUmF3fSAvLyAkRW50cnktPntDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBAQ3VzdG9tZXJJRHMgJiYgJEVudHJ5LT57Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgJERpcmVjdENvbmRpdGlvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgYm9vbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRFbnRyeS0+e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gXEBDdXN0b21lcklEcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoQEN1c3RvbWVySURzKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0Q29uZGl0aW9ucyA9IHsKICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gXEBDdXN0b21lcklEcywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURHcm91cENvbWJpbmF0aW9ucywgewogICAgICAgICAgICAgICAgYm9vbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgJERpcmVjdENvbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRFbnRyeS0+e0dyb3VwSURzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CgogICAgICAgIH0KCiAgICAgICAgaWYgKCBzY2FsYXIgQEN1c3RvbWVySURHcm91cENvbWJpbmF0aW9ucyA9PSAxICkgewogICAgICAgICAgICBwdXNoIEBGaWx0ZXJzLCAkQ3VzdG9tZXJJREdyb3VwQ29tYmluYXRpb25zWzBdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBARmlsdGVycywgewogICAgICAgICAgICAgICAgYm9vbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgc2hvdWxkID0+IFxAQ3VzdG9tZXJJREdyb3VwQ29tYmluYXRpb25zLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgfQoKICAgICMgZnVsbHRleHQgc2VhcmNoCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Z1bGx0ZXh0fSApIHsKCiAgICAgICAgIyBnZXQgZmllbGRzIHRvIHNlYXJjaAogICAgICAgIG15ICRGdWxsdGV4dEZpZWxkcyA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6VGlja2V0U2VhcmNoRmllbGRzJyk7CiAgICAgICAgbXkgQFNlYXJjaEZpZWxkcyAgID0gQHsgJEZ1bGx0ZXh0RmllbGRzLT57VGlja2V0fSB9OwogICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgKCBtYXAgeyJBcnRpY2xlc0V4dGVybmFsLiRfIn0gQHsgJEZ1bGx0ZXh0RmllbGRzLT57QXJ0aWNsZX0gfSApOwogICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgKCAiQXR0YWNobWVudHNFeHRlcm5hbC5Db250ZW50IiwgIkF0dGFjaG1lbnRzRXh0ZXJuYWwuRmlsZW5hbWUiICk7CgogICAgICAgICMgYWRkIGludGVybmFsIGZpZWxkcwogICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgKCBtYXAgeyJBcnRpY2xlc0ludGVybmFsLiRfIn0gQHsgJEZ1bGx0ZXh0RmllbGRzLT57QXJ0aWNsZX0gfSApOwogICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICggIkF0dGFjaG1lbnRzSW50ZXJuYWwuQ29udGVudCIsICJBdHRhY2htZW50c0ludGVybmFsLkZpbGVuYW1lIiApOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICAgICAgICAgIG15ICRab29tQ29uZmlnICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0Wm9vbScpIHx8IHt9OwogICAgICAgICAgICBteSAkQ3VzdG9tZXJGaWVsZHMgICAgID0gJFpvb21Db25maWctPntEeW5hbWljRmllbGR9OwoKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBAeyAkRnVsbHRleHRGaWVsZHMtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGQpOwoKICAgICAgICAgICAgICAgICMgYWdlbnQgc2VhcmNoCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBhbGwgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgIkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBhcnRpY2xlIGR5bmFtaWNmaWVsZHMgZm9yIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsIGFydGljbGVzCiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFydGljbGVzRXh0ZXJuYWwuRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJ0aWNsZXNJbnRlcm5hbC5EeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGN1c3RvbWVyIHNlYXJjaAogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBkeW5hbWljIGZpZWxkIGlzIHZpc2libGUgZm9yIGN1c3RvbWVycwogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggISRDdXN0b21lckZpZWxkcyB8fCAhJEN1c3RvbWVyRmllbGRzLT57JER5bmFtaWNGaWVsZE5hbWV9ICk7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgYXJ0aWNsZSBkeW5hbWljZmllbGRzIGZvciBleHRlcm5hbCBhcnRpY2xlcwogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoIkFydGljbGVzRXh0ZXJuYWwuRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBxdWV1ZSByZXN0cmljdGlvbnMKICAgICAgICBwdXNoIEBNdXN0cywgewogICAgICAgICAgICBxdWVyeV9zdHJpbmcgPT4gewogICAgICAgICAgICAgICAgZmllbGRzID0+IFxAU2VhcmNoRmllbGRzLAogICAgICAgICAgICAgICAgcXVlcnkgID0+ICIqJFBhcmFte0Z1bGx0ZXh0fSoiLAogICAgICAgICAgICB9LAogICAgICAgIH07CgogICAgfQoKICAgICMgZGVmaW5lIHRoZSByZXR1cm4gdHlwZQogICAgbXkgJFJldHVybiA9ICggJFJlc3VsdFR5cGUgZXEgJ0hBU0gnICkgPyBbcXcoVGlja2V0SUQgVGlja2V0TnVtYmVyKV0gOgogICAgICAgICggJFJlc3VsdFR5cGUgZXEgJ0ZVTEwnICkgPyAnJyA6ICdUaWNrZXRJRCc7CgogICAgIyBkZWZpbmUgdGhlIHNvcnRpbmcKICAgIG15IEBTb3J0OwogICAgbXkgJU8yRSA9IHF3KERvd24gZGVzYyBVcCBhc2MpOwogICAgaWYgKCAhcmVmKCRTb3J0QnkpICkgewogICAgICAgICRTb3J0QnkgID0gWyRTb3J0QnldOwogICAgICAgICRPcmRlckJ5ID0gWyRPcmRlckJ5XTsKICAgIH0KICAgIGZvciBteSAkaSAoIDAgLi4gJCN7JFNvcnRCeX0gKSB7CgogICAgICAgICMgc2NvcmUgaXMgRWxhc3RpY3NlYXJjaCBzcGVjaWZpYwogICAgICAgIGlmICggJFNvcnRCeS0+WyRpXSBlcSAnU2NvcmUnICkgeyAkU29ydEJ5LT5bJGldID0gJ19zY29yZScgfQoKICAgICAgICAjIGFnZSBpcyBub3Qgc3RvcmVkIGluIEVsYXN0aWNzZWFyY2gKICAgICAgICBpZiAoICRTb3J0QnktPlskaV0gZXEgJ0FnZScgKSB7CiAgICAgICAgICAgICRTb3J0QnktPlskaV0gID0gJ0NyZWF0ZWQnOwogICAgICAgICAgICAkT3JkZXJCeS0+WyRpXSA9ICRPcmRlckJ5LT5bJGldIGVxICdVcCcgPyAnVXAnIDogJ0Rvd24nOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAU29ydCwgeyAkU29ydEJ5LT5bJGldID0+ICRPMkV7ICRPcmRlckJ5LT5bJGldIH0gfTsKICAgIH0KCiAgICAjIGNhbGwgdGhlIEVsYXN0aWNzZWFyY2ggd2Vic2VydmljZQogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnU2VhcmNoJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4gJ3RpY2tldCcsCiAgICAgICAgICAgIE11c3QgICAgICA9PiBcQE11c3RzLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gXEBGaWx0ZXJzLAogICAgICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXR1cm4gICAgPT4gJFJldHVybiwKICAgICAgICAgICAgU29ydCAgICAgID0+IFxAU29ydCwKICAgICAgICB9CiAgICApOwoKICAgICMgY29udmVydCB0aGUgRWxhc3RpY3NlYXJjaCByZXR1cm4gdG8gdGhlIG5lZWRlZCBPVE9CTyBzdHJ1Y3R1cmUgYW5kIHJldHVybgogICAgaWYgKCAkUmVzdWx0VHlwZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgbWFwIHsKICAgICAgICAgICAgICAgIHsgJF8tPntUaWNrZXRJRH0gPT4gJF8tPntUaWNrZXROdW1iZXJ9IH0KICAgICAgICAgICAgfSBAeyAkUmVzdWx0LT57RGF0YX0gfQogICAgICAgICk7CiAgICB9CgogICAgZWxzaWYgKCAkUmVzdWx0VHlwZSBlcSAnQVJSQVknICkgewogICAgICAgIHJldHVybiAoIG1hcCB7ICRfLT57VGlja2V0SUR9IH0gQHsgJFJlc3VsdC0+e0RhdGF9IH0gKTsKICAgIH0KCiAgICBlbHNpZiAoICRSZXN1bHRUeXBlIGVxICdGVUxMJyApIHsKCiAgICAgICAgIyBhZ2UgaGFzIHRvIGJlIGNhbHVsYXRlZAogICAgICAgIG15ICROb3cgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJwogICAgICAgICktPlRvRXBvY2goKTsKCiAgICAgICAgZm9yIG15ICREYXRhICggQHsgJFJlc3VsdC0+e0RhdGF9IH0gKSB7CiAgICAgICAgICAgICREYXRhLT57QWdlfSA9ICROb3cgLSAkRGF0YS0+e0NyZWF0ZWR9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgeyAkXy0+e1RpY2tldElEfSA9PiAkXyB9CiAgICAgICAgICAgIH0gQHsgJFJlc3VsdC0+e0RhdGF9IH0KICAgICAgICApOwogICAgfQoKICAgIGVsc2lmICggJFJlc3VsdFR5cGUgZXEgJ0NPVU5UJyApIHsKICAgICAgICByZXR1cm4gc2NhbGFyIEB7ICRSZXN1bHQtPntEYXRhfSB9OwogICAgfQoKfQoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUmVzdWx0VHlwZSAgID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKICAgIG15ICRMaW1pdCAgICAgICAgPSAkUGFyYW17TGltaXR9ICB8fCAxMDAwMDsKCiAgICBteSAoIEBNdXN0cywgQEZpbHRlcnMgKTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17RnVsbHRleHR9ICkgewoKICAgICAgICBteSAkRnVsbHRleHRGaWVsZHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcycpOwoKICAgICAgICBwdXNoIEBNdXN0cywgewogICAgICAgICAgICBxdWVyeV9zdHJpbmcgPT4gewogICAgICAgICAgICAgICAgZmllbGRzID0+ICRGdWxsdGV4dEZpZWxkcywKICAgICAgICAgICAgICAgIHF1ZXJ5ICA9PiAiKiRQYXJhbXtGdWxsdGV4dH0qIiwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgdGhlIHJldHVybiB1c3VhbGx5IHdpbGwgYmUgQ3VzdG9tZXJJRCwgYnV0IGl0IGNhbiBiZSBkaWZmZXJlbnQgZm9yIGN1c3RvbSBiYWNrZW5kcwogICAgbXkgJFJldHVybiA9ICdDdXN0b21lckNvbXBhbnlLZXknOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1NlYXJjaCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgIE11c3QgICAgICA9PiBcQE11c3RzLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gXEBGaWx0ZXJzLAogICAgICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXR1cm4gICAgPT4gJFJldHVybiwKICAgICAgICB9CiAgICApOwoKICAgIGlmICggJFJlc3VsdFR5cGUgZXEgJ0FSUkFZJyApIHsKICAgICAgICByZXR1cm4gKCBtYXAgeyAkXy0+e0N1c3RvbWVyQ29tcGFueUtleX0gfSBAeyAkUmVzdWx0LT57RGF0YX0gfSApOwogICAgfQogICAgZWxzaWYgKCAkUmVzdWx0VHlwZSBlcSAnQ09VTlQnICkgewogICAgICAgIHJldHVybiBzY2FsYXIgQHsgJFJlc3VsdC0+e0RhdGF9IH07CiAgICB9Cgp9CgpzdWIgQ3VzdG9tZXJVc2VyU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRSZXN1bHRUeXBlICAgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwogICAgbXkgJExpbWl0ICAgICAgICA9ICRQYXJhbXtMaW1pdH0gIHx8IDEwMDAwOwoKICAgIG15ICggQE11c3RzLCBARmlsdGVycyApOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtGdWxsdGV4dH0gKSB7CgogICAgICAgIG15ICRGdWxsdGV4dEZpZWxkcyA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzJyk7CgogICAgICAgIHB1c2ggQE11c3RzLCB7CiAgICAgICAgICAgIHF1ZXJ5X3N0cmluZyA9PiB7CiAgICAgICAgICAgICAgICBmaWVsZHMgPT4gJEZ1bGx0ZXh0RmllbGRzLAogICAgICAgICAgICAgICAgcXVlcnkgID0+ICIqJFBhcmFte0Z1bGx0ZXh0fSoiLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyB0aGUgcmV0dXJuIHVzdWFsbHkgd2lsbCBiZSBVc2VyTG9naW4sIGJ1dCBpdCBjYW4gYmUgZGlmZmVyZW50IGZvciBjdXN0b20gYmFja2VuZHMKICAgIG15ICRSZXR1cm4gPSAoICRSZXN1bHRUeXBlIGVxICdIQVNIJyApID8gW3F3KEN1c3RvbWVyS2V5IFVzZXJGdWxsbmFtZSldIDogJ0N1c3RvbWVyS2V5JzsKCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdTZWFyY2gnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiAnY3VzdG9tZXJ1c2VyJywKICAgICAgICAgICAgTXVzdCAgICAgID0+IFxATXVzdHMsCiAgICAgICAgICAgIEZpbHRlciAgICA9PiBcQEZpbHRlcnMsCiAgICAgICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgICAgIFJldHVybiAgICA9PiAkUmV0dXJuLAogICAgICAgIH0KICAgICk7CiAgICBpZiAoICRSZXN1bHRUeXBlIGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgeyAkXy0+e0N1c3RvbWVyS2V5fSA9PiAkXy0+e1VzZXJGdWxsbmFtZX0gfQogICAgICAgICAgICB9IEB7ICRSZXN1bHQtPntEYXRhfSB9CiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFJlc3VsdFR5cGUgZXEgJ0FSUkFZJyApIHsKICAgICAgICByZXR1cm4gKCBtYXAgeyAkXy0+e0N1c3RvbWVyS2V5fSB9IEB7ICRSZXN1bHQtPntEYXRhfSB9ICk7CiAgICB9CiAgICBlbHNpZiAoICRSZXN1bHRUeXBlIGVxICdDT1VOVCcgKSB7CiAgICAgICAgcmV0dXJuIHNjYWxhciBAeyAkUmVzdWx0LT57RGF0YX0gfTsKICAgIH0KfQoKPWhlYWQyIENvbmZpZ0l0ZW1TZWFyY2goKQoKUGVyZm9ybXMgYSBjb25maWcgaXRlbSBzZWFyY2ggdmlhIEVsYXN0aWNzZWFyY2guCgogICAgJEVTT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIEZ1bGx0ZXh0ID0+ICRTdHJpbmcsCiAgICAgICAgTGltaXQgICAgPT4gMjAsICAgICAjIG9wdGlvbmFsCiAgICAgICAgUmVzdWx0ICAgPT4gQVJSQVksICAjIG9wdGlvbmFsLCBBUlJBWSAoZGVmYXVsdCkgfCBGVUxMCgogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRSZXN1bHRUeXBlICAgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwogICAgbXkgJExpbWl0ICAgICAgICA9ICRQYXJhbXtMaW1pdH0gIHx8IDEwMDAwOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvVXNlcklEIEZ1bGx0ZXh0LykgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICggQE11c3RzLCBARmlsdGVycyApOwoKICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtIG9iamVjdAogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzIG9uIHRoZSBjbGFzc2VzCiAgICBmb3IgbXkgJENsYXNzSUQgKCBzb3J0IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKICAgICAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGRlbGV0ZSAkQ2xhc3NMaXN0LT57JENsYXNzSUR9IGlmICEkSGFzQWNjZXNzOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICAjIHNldCB1cCBjbGFzcyBmaWx0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWNjZXNzIHJpZ2h0cwojICAgIHB1c2ggQEZpbHRlcnMsIHsKIyAgICAgICAgYm9vbCA9PiB7CiMgICAgICAgICAgICBmaWx0ZXIgPT4gWwojICAgICAgICAgICAgICAgIHsKIyAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewojICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiBbIGtleXMgJXskQ2xhc3NMaXN0fSBdLAojICAgICAgICAgICAgICAgICAgICB9LAojICAgICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICBdLAojICAgICAgICB9LAojICAgIH07CiMKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgbXkgJUdyb3VwTGlzdDsKICAgIG15ICVBdXRoR3JvdXBzTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblVzZXJHcm91cEdldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICJybyIsCiAgICApOwogICAgbXkgJE1hbmFnZW1lbnRHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW1NYW5hZ2VtZW50R3JvdXAiKTsKICAgIGlmICggJE1hbmFnZW1lbnRHcm91cCAmJiBncmVwIHsgJF8gZXEgJE1hbmFnZW1lbnRHcm91cCB9IHZhbHVlcyAlQXV0aEdyb3Vwc0xpc3QgKSB7CiAgICAgICAgJUdyb3VwTGlzdCA9ICRHcm91cE9iamVjdC0+R3JvdXBMaXN0KAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAlR3JvdXBMaXN0ID0gJUF1dGhHcm91cHNMaXN0OwogICAgfQoKICAgICMgc2V0IHVwIGNsYXNzIGFuZCBncm91cCBmaWx0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWNjZXNzIHJpZ2h0cwogICAgIyBjbGFzc2VzIHdpdGggbm8gZ3JvdXAgcmVzdHJpY3Rpb25zIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhlIGdyb3VwIGZpbHRlcmluZwogICAgIyBmb3IgdGhlc2UgY2xhc3NlcyB0aGUgc2VhcmNoIGluY2x1ZGVzIGl0ZW1zIHdob3NlIEdyb3VwSUQgaXMgbnVsbAogICAgcHVzaCBARmlsdGVycywgewogICAgICAgIGJvb2w9PiB7CiAgICAgICAgICAgIGZpbHRlciA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0lEID0+IFsga2V5cyAleyRDbGFzc0xpc3R9IF0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBib29sID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gWyBrZXlzICVHcm91cExpc3QgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3Rfbm90ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4gJ0dyb3VwSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0KICAgIH07CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Z1bGx0ZXh0fSApIHsKCiAgICAgICAgbXkgJEZ1bGx0ZXh0RmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU2VhcmNoRmllbGRzJyk7CiAgICAgICAgbXkgQFNlYXJjaEZpZWxkcyAgID0gKAogICAgICAgICAgICBAeyAkRnVsbHRleHRGaWVsZHMtPntCYXNpY30gLy8gW10gfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0F0dGFjaG1lbnRzfSApIHsKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoICdBdHRhY2htZW50cy5Db250ZW50JywgJ0F0dGFjaG1lbnRzLkZpbGVuYW1lJyApOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIEB7ICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCk7CgogICAgICAgICAgICAgICAgIyBhZGQgYWxsIGNvbmZpZyBpdGVtIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnSVRTTUNvbmZpZ0l0ZW0nICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgIkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQE11c3RzLCB7CiAgICAgICAgICAgIHF1ZXJ5X3N0cmluZyA9PiB7CiAgICAgICAgICAgICAgICBmaWVsZHMgPT4gXEBTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgICAgICBxdWVyeSAgPT4gIiokUGFyYW17RnVsbHRleHR9KiIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGRlZmluZSB0aGUgcmV0dXJuIHR5cGUKICAgIG15ICRSZXR1cm4gPSAoICRSZXN1bHRUeXBlIGVxICdGVUxMJyApID8gJycgOiAnQ29uZmlnSXRlbUlEJzsKCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdTZWFyY2gnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiAnY29uZmlnaXRlbScsCiAgICAgICAgICAgIE11c3QgICAgICA9PiBcQE11c3RzLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gXEBGaWx0ZXJzLAogICAgICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXR1cm4gICAgPT4gJFJldHVybiwKICAgICAgICB9CiAgICApOwoKICAgIGlmICggJFJlc3VsdFR5cGUgZXEgJ0ZVTEwnICkgewogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICB7ICRfLT57Q29uZmlnSXRlbUlEfSA9PiAkXyB9CiAgICAgICAgICAgIH0gQHsgJFJlc3VsdC0+e0RhdGF9IH0KICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICggbWFwIHsgJF8tPntDb25maWdJdGVtSUR9IH0gQHsgJFJlc3VsdC0+e0RhdGF9IH0gKTsKICAgIH0KCn0KCj1oZWFkMiBUaWNrZXRDcmVhdGUoKQoKRXhwbGljaXRseSBjcmVhdGVzIGEgdGlja2V0IGluIHRoZSBFbGFzdGljc2VhcmNoIGRhdGFiYXNlLiBIYXBwZW5zIGV2ZW50IGJhc2VkIGluIGEgcHJvZHVjdGl2ZSBzeXN0ZW0uCkUuZy4gd2hlbiBhIFRpY2tldCBpcyByZXN0b3JlZCBmcm9tIHRoZSBhcmNoaXZlIG9yIHdoZW4gd2hlbiBhIHRpY2tldCBpcyBtb3ZlZCBmcm9tIGFuIGV4Y2x1ZGVkIHF1ZXVlLgoKICAgICRFU09iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICk7Cgo9Y3V0CgpzdWIgVGlja2V0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnVGlja2V0TWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgPT4gJ1RpY2tldENyZWF0ZScsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9OwoKfQoKPWhlYWQyIEFydGljbGVDcmVhdGUoKQoKRXhwbGljaXRseSBjcmVhdGVzIGFuIGFydGljbGUgaW4gdGhlIEVsYXN0aWNzZWFyY2ggZGF0YWJhc2UuIEhhcHBlbnMgZXZlbnQgYmFzZWQgaW4gYSBwcm9kdWN0aXZlIHN5c3RlbS4KCiAgICAkRVNPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICk7Cgo9Y3V0CgpzdWIgQXJ0aWNsZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1RpY2tldE1hbmFnZW1lbnQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQXJ0aWNsZUNyZWF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9OwoKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUFkZCgpCgpFeHBsaWNpdGx5IGNyZWF0ZXMgYSBjdXN0b21lciBjb21wYW55IGluIHRoZSBFbGFzdGljc2VhcmNoIGRhdGFiYXNlLiBIYXBwZW5zIGV2ZW50IGJhc2VkIGluIGEgcHJvZHVjdGl2ZSBzeXN0ZW0uCgogICAgJEVTT2JqZWN0LT5DdXN0b21lckNvbXBhbnlBZGQoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJDb21wYW55QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKICAgIG15ICVDdXN0b21lckNvbXBhbnkgICAgICAgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJJRH0sCiAgICApOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueU1hbmFnZW1lbnQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueUFkZCcsCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBOZXdEYXRhICAgID0+IFwlQ3VzdG9tZXJDb21wYW55LAogICAgICAgIH0KICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQtPntTdWNjZXNzfTsKCn0KCj1oZWFkMiBDdXN0b21lclVzZXJBZGQoKQoKRXhwbGljaXRseSBjcmVhdGVzIGEgY3VzdG9tZXIgY29tcGFueSBpbiB0aGUgRWxhc3RpY3NlYXJjaCBkYXRhYmFzZS4gSGFwcGVucyBldmVudCBiYXNlZCBpbiBhIHByb2R1Y3RpdmUgc3lzdGVtLgoKICAgICRFU09iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJUN1c3RvbWVyVXNlciAgICAgICA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICk7CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnQ3VzdG9tZXJVc2VyTWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICA9PiAnQ3VzdG9tZXJVc2VyQWRkJywKICAgICAgICAgICAgTmV3RGF0YSA9PiBcJUN1c3RvbWVyVXNlciwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0LT57U3VjY2Vzc307Cgp9Cgo9aGVhZDIgQ29uZmlnSXRlbUNyZWF0ZSgpCgpFeHBsaWNpdGx5IGNyZWF0ZXMgYSBjb25maWcgaXRlbSBpbiB0aGUgRWxhc3RpY3NlYXJjaCBkYXRhYmFzZS4gSGFwcGVucyBtb3N0bHkgZXZlbnQgYmFzZWQgaW4gYSBwcm9kdWN0aXZlIHN5c3RlbS4KCiAgICAkRVNPYmplY3QtPkNvbmZpZ0l0ZW1DcmVhdGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1DcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvQ29uZmlnSXRlbUlELykgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRSZXF1ZXN0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjcmVhdGUgdGhlIGNvbmZpZyBpdGVtCiAgICBteSAkUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdDb25maWdJdGVtTWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIH0KICAgICk7CiAgICByZXR1cm4gaWYgISRSZXN1bHQtPntTdWNjZXNzfTsKCiAgICAjIHVwZGF0ZSB0aGUgYXR0YWNobWVudHMKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkNvbmZpZ0l0ZW1TZWFyY2hGaWVsZHMnKQogICAgICAgICYmCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU2VhcmNoRmllbGRzJyktPnsnQXR0YWNobWVudHMnfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50TmFtZSAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgIG15ICRBdHRhY2htZW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRBdHRhY2htZW50TmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXN1bHQgPSAkUmVxdWVzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgSW52b2tlciAgICAgID0+ICdDb25maWdJdGVtTWFuYWdlbWVudCcsCiAgICAgICAgICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdBdHRhY2htZW50QWRkUG9zdCcsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKCn0KCj1oZWFkMiBUZXN0Q29ubmVjdGlvbigpCgpUZXN0IHRoZSBjb25uZWN0aW9uIHRvIHRoZSBFbGFzdGljc2VhcmNoIHNlcnZlci4KCiAgICBteSAkU3VjY2VzcyA9ICRFU09iamVjdC0+VGVzdENvbm5lY3Rpb24oKTsKCj1jdXQKCnN1YiBUZXN0Q29ubmVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEdW1teUluZGV4ID0gKAogICAgICAgIGluZGV4ID0+ICcnLAogICAgKTsKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1V0aWxzX0dFVCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+IFwlRHVtbXlJbmRleCwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0LT57U3VjY2Vzc307Cn0KCj1oZWFkMiBDcmVhdGVJbmRleCgpCgpDcmVhdGUgYSBuZXcgaW5kZXguCgogICAgbXkgJFN1Y2Nlc3MgPSAkRVNPYmplY3QtPkNyZWF0ZUluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiB7CiAgICAgICAgICAgIG5hbWUgPT4gJ3NvbWV0aGluZycsCiAgICAgICAgfSwKICAgICAgICBSZXF1ZXN0ICAgPT4gewogICAgICAgICAgICBzZXR0aW5ncyA9PiB7IC4uLiB9LAogICAgICAgICAgICBtYXBwaW5ncyA9PiB7IC4uLiB9LAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUluZGV4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnVXRpbHNfUFVUJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4gJFBhcmFte0luZGV4TmFtZX0sCiAgICAgICAgICAgIFJlcXVlc3QgICA9PiAkUGFyYW17UmVxdWVzdH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9Owp9Cgo9aGVhZDIgRHJvcEluZGV4KCkKCkRyb3AgYSBjb21wbGV0ZSBpbmRleC4KCiAgICAkRVNPYmplY3QtPkRyb3BJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gJ25hbWUnLAogICAgKTsKCj1jdXQKCnN1YiBEcm9wSW5kZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdVdGlsc19ERUxFVEUnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiAkUGFyYW17SW5kZXhOYW1lfSwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0LT57U3VjY2Vzc307Cn0KCnN1YiBEZWxldGVQaXBlbGluZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1V0aWxzUGlwZWxpbmVfREVMRVRFJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4ge30sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9Owp9CgpzdWIgQ3JlYXRlUGlwZWxpbmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdVdGlsc1BpcGVsaW5lX1BVVCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+ICcnLAogICAgICAgICAgICBSZXF1ZXN0ICAgPT4gJFBhcmFte1JlcXVlc3R9LAogICAgICAgIH0KICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQtPntTdWNjZXNzfTsKCn0KCj1oZWFkMiBJbmRleFNldHRpbmdzR2V0KCkKCkdldCBzZXR0aW5ncyBmb3IgYSBjZXJ0YWluIGluZGV4CgogICAgbXkgJFNldHRpbmdzID0gJEVTT2JqZWN0LT5JbmRleFNldHRpbmdzR2V0KAogICAgICAgIENvbmZpZyAgID0+ICRDb25maWcsCiAgICAgICAgVGVtcGxhdGUgPT4gJFRlbXBsYXRlLAogICAgOykKCj1jdXQKCnN1YiBJbmRleFNldHRpbmdzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZyA9ICRQYXJhbXtDb25maWd9OwoKICAgIG15ICRTZXR0aW5ncyA9ICRTZWxmLT5fRXhwYW5kVGVtcGxhdGUoCiAgICAgICAgSXRlbSAgICAgICAgID0+ICRQYXJhbXtUZW1wbGF0ZX0sCiAgICAgICAgQ29uZmlnICAgICAgID0+ICRDb25maWcsCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgcmV0dXJuICRTZXR0aW5nczsKfQoKc3ViIF9FeHBhbmRUZW1wbGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWcgPSAkUGFyYW17Q29uZmlnfTsKICAgIG15ICROb2RlICAgPSAkUGFyYW17SXRlbX07CgogICAgaWYgKCByZWYgJE5vZGUgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVFeHBhbmRlZDsKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMoICV7JE5vZGV9ICkgKSB7CiAgICAgICAgICAgICRFeHBhbmRlZHskS2V5fSA9ICRTZWxmLT5fRXhwYW5kVGVtcGxhdGUoCiAgICAgICAgICAgICAgICBJdGVtICAgICAgICAgPT4gJE5vZGUtPnskS2V5fSwKICAgICAgICAgICAgICAgIENvbmZpZyAgICAgICA9PiAkQ29uZmlnLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRQYXJhbXtMYXlvdXRPYmplY3R9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFwlRXhwYW5kZWQ7CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkTm9kZSBlcSAnQVJSQVknICkgewogICAgICAgIG15IEBFeHBhbmRlZDsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyROb2RlfSApIHsKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBFeHBhbmRlZCwKICAgICAgICAgICAgICAgICRTZWxmLT5fRXhwYW5kVGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgICA9PiAkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkUGFyYW17TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQEV4cGFuZGVkOwogICAgfQogICAgZWxzaWYgKCAhZGVmaW5lZCgkTm9kZSkgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZWxzaWYgKCBJc051bWJlcigkTm9kZSkgKSB7CiAgICAgICAgcmV0dXJuICROb2RlOwogICAgfQogICAgZWxzaWYgKCBJc1N0cmluZygkTm9kZSkgKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICROb2RlLAogICAgICAgICAgICBEYXRhICAgICA9PiAkQ29uZmlnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJE5vZGU7CiAgICB9Cn0KCj1oZWFkMiBJbml0aWFsU2V0dXAoKQoKVGhpcyBtZXRob2QgaXMgdXNlZCBieSBJPGluc3RhbGxlci5wbD4gYW5kIGJ5IGFsdGVybmF0aXZlIGluc3RhbGwgc2NyaXB0cyB0byBnZXQgYSB3b3JraW5nCmluaXRpYWwgc2V0dXAuCgogICAgbXkgKCRTdWNjZXNzLCAkRmF0YWxFcnJvcikgPSAkRVNPYmplY3QtPkluaXRpYWxTZXR1cCgpCgo9Y3V0CgpzdWIgSW5pdGlhbFNldHVwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFN5c0NvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKTsKCiAgICAjIGFjdGl2YXRlIEVsYXN0aWNzZWFyY2ggaW4gdGhlIFN5c0NvbmZpZwogICAgewogICAgICAgIG15ICRFeGNsdXNpdmVMb2NrR1VJRCA9ICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdMb2NrKAogICAgICAgICAgICBMb2NrQWxsID0+IDEsCiAgICAgICAgICAgIEZvcmNlICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VwZGF0ZSgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJ0VsYXN0aWNzZWFyY2g6OkFjdGl2ZScsCiAgICAgICAgICAgIElzVmFsaWQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEV4Y2x1c2l2ZUxvY2tHVUlEID0+ICRFeGNsdXNpdmVMb2NrR1VJRCwKICAgICAgICApOwogICAgICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdVbmxvY2soCiAgICAgICAgICAgIFVubG9ja0FsbCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgVE9ETzogaGFuZGxlIGVycm9ycwogICAgfQoKICAgIG15ICRTdWNjZXNzID0gMTsKCiAgICAjIGluaXRpYWxpemUgc3RhbmRhcmQgaW5kaWNlcwogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgbXkgJEVycm9yczsKICAgICAgICBteSAkSW5kZXhDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkluZGV4U2V0dGluZ3MnKTsKICAgICAgICBteSAkRGVmYXVsdENvbmZpZzsKICAgICAgICBpZiAoJEluZGV4Q29uZmlnKSB7CiAgICAgICAgICAgICREZWZhdWx0Q29uZmlnID0gJEluZGV4Q29uZmlnLT57RGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGVmYXVsdENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6QXJ0aWNsZUluZGV4Q3JlYXRpb25TZXR0aW5ncycpOwogICAgICAgIH0KCiAgICAgICAgIyB0aHJvdyBhbiBmYXRhbCBlcnJvciB3aGVuIHdlIGFyZSBpbiBhIHdlYiBjb250ZXh0CiAgICAgICAgcmV0dXJuIDAsIDEgdW5sZXNzICREZWZhdWx0Q29uZmlnOwoKICAgICAgICBteSAkRGVmYXVsdFRlbXBsYXRlOwogICAgICAgIG15ICRJbmRleFRlbXBsYXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpJbmRleFRlbXBsYXRlJyk7CiAgICAgICAgaWYgKCRJbmRleFRlbXBsYXRlKSB7CiAgICAgICAgICAgICREZWZhdWx0VGVtcGxhdGUgPSAkSW5kZXhUZW1wbGF0ZS0+e0RlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgdGhyb3cgYW4gZmF0YWwgZXJyb3Igd2hlbiB3ZSBhcmUgaW4gYSB3ZWIgY29udGV4dAogICAgICAgICAgICByZXR1cm4gMCwgMTsKICAgICAgICB9CgogICAgICAgICMgQ3JlYXRlIHBpcGVsaW5lcy4KICAgICAgICAjIFdyaXRpbmcgdGhlIHN0cmluZyAnZm9yZWFjaCcgaW4gYSBmdW5ueSB3YXksIGFzIHNvbWUgdmVyc2lvbnMgb2YgdGhlIENvZGVQb2xpY3kKICAgICAgICAjIHJlcGxhY2VkIGl0IHdpdGggdGhlIHN0cmluZyAnZm9yJy4KICAgICAgICBteSAlUGlwZWxpbmUgPSAoCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0+ICJFeHRyYWN0IGV4dGVybmFsIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24iLAogICAgICAgICAgICBwcm9jZXNzb3JzICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcXtmb3JlYWNofSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkICAgICA9PiAiQXR0YWNobWVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2ZpZWxkID0+ICJfaW5nZXN0Ll92YWx1ZS5hdHRhY2htZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICAgICAgPT4gIl9pbmdlc3QuX3ZhbHVlLmRhdGEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHF7Zm9yZWFjaH0gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICAgPT4gIkF0dGFjaG1lbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4gIl9pbmdlc3QuX3ZhbHVlLmRhdGEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+Q3JlYXRlUGlwZWxpbmUoCiAgICAgICAgICAgIFJlcXVlc3QgPT4gXCVQaXBlbGluZSwKICAgICAgICApOwogICAgICAgICRFcnJvcnMrKyB1bmxlc3MgJFN1Y2Nlc3M7CgogICAgICAgICMgY3JlYXRlIGluZGV4IGZvciBjdXN0b21lcgogICAgICAgIG15ICVSZXF1ZXN0Q3VzdG9tZXIgPSAoCiAgICAgICAgICAgIHNldHRpbmdzID0+ICRTZWxmLT5JbmRleFNldHRpbmdzR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEluZGV4Q29uZmlnLT57Q3VzdG9tZXJ9ICAgLy8gJERlZmF1bHRDb25maWcsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZS0+e0N1c3RvbWVyfSAvLyAkRGVmYXVsdFRlbXBsYXRlLAogICAgICAgICAgICApLAogICAgICAgICAgICBtYXBwaW5ncyA9PiB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAna2V5d29yZCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTdWNjZXNzID0gJFNlbGYtPkNyZWF0ZUluZGV4KAogICAgICAgICAgICBJbmRleE5hbWUgPT4geyBpbmRleCA9PiAnY3VzdG9tZXInIH0sCiAgICAgICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3RDdXN0b21lciwKICAgICAgICApOwogICAgICAgICRFcnJvcnMrKyB1bmxlc3MgJFN1Y2Nlc3M7CgogICAgICAgICMgY3JlYXRlIGluZGV4IGZvciBjdXN0b21lciB1c2VycwogICAgICAgIG15ICVSZXF1ZXN0Q3VzdG9tZXJVc2VyID0gKAogICAgICAgICAgICBzZXR0aW5ncyA9PiAkU2VsZi0+SW5kZXhTZXR0aW5nc0dldCgKICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRJbmRleENvbmZpZy0+e0N1c3RvbWVyVXNlcn0gICAvLyAkRGVmYXVsdENvbmZpZywKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlLT57Q3VzdG9tZXJVc2VyfSAvLyAkRGVmYXVsdFRlbXBsYXRlLAogICAgICAgICAgICApLAogICAgICAgICAgICBtYXBwaW5ncyA9PiB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdrZXl3b3JkJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+Q3JlYXRlSW5kZXgoCiAgICAgICAgICAgIEluZGV4TmFtZSA9PiB7IGluZGV4ID0+ICdjdXN0b21lcnVzZXInIH0sCiAgICAgICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3RDdXN0b21lclVzZXIsCiAgICAgICAgKTsKICAgICAgICAkRXJyb3JzKysgdW5sZXNzICRTdWNjZXNzOwoKICAgICAgICAjIGNyZWF0ZSBpbmRleCBmb3IgdGlja2V0cwogICAgICAgIG15ICVSZXF1ZXN0VGlja2V0ID0gKAogICAgICAgICAgICBzZXR0aW5ncyA9PiAkU2VsZi0+SW5kZXhTZXR0aW5nc0dldCgKICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRJbmRleENvbmZpZy0+e1RpY2tldH0gICAvLyAkRGVmYXVsdENvbmZpZywKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlLT57VGlja2V0fSAvLyAkRGVmYXVsdFRlbXBsYXRlLAogICAgICAgICAgICApLAogICAgICAgICAgICBtYXBwaW5ncyA9PiB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAna2V5d29yZCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2tleXdvcmQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT5DcmVhdGVJbmRleCgKICAgICAgICAgICAgSW5kZXhOYW1lID0+IHsgaW5kZXggPT4gJ3RpY2tldCcgfSwKICAgICAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdFRpY2tldCwKICAgICAgICApOwogICAgICAgICRFcnJvcnMrKyB1bmxlc3MgJFN1Y2Nlc3M7CgogICAgICAgICMgY3JlYXRlIGluZGV4IGZvciB0bXBhdHRhY2htZW50cwogICAgICAgIG15ICVSZXF1ZXN0VG1wQXR0YWNobWVudHMgPSAoCiAgICAgICAgICAgIHNldHRpbmdzID0+ICRTZWxmLT5JbmRleFNldHRpbmdzR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEluZGV4Q29uZmlnLT57VG1wQXR0YWNobWVudHN9ICAgLy8gJERlZmF1bHRDb25maWcsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZS0+e1RtcEF0dGFjaG1lbnRzfSAvLyAkRGVmYXVsdFRlbXBsYXRlLAogICAgICAgICAgICApLAogICAgICAgICk7CiAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+Q3JlYXRlSW5kZXgoCiAgICAgICAgICAgIEluZGV4TmFtZSA9PiB7IGluZGV4ID0+ICd0bXBhdHRhY2htZW50cycgfSwKICAgICAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdFRtcEF0dGFjaG1lbnRzLAogICAgICAgICk7CiAgICAgICAgJEVycm9ycysrIHVubGVzcyAkU3VjY2VzczsKCiAgICAgICAgJFN1Y2Nlc3MgPSAwIGlmICRFcnJvcnM7CiAgICB9CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgbXkgJEV4Y2x1c2l2ZUxvY2tHVUlEID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ0xvY2soCiAgICAgICAgICAgIExvY2tBbGwgPT4gMSwKICAgICAgICAgICAgRm9yY2UgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAlU2V0dGluZyA9ICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zyb250ZW5kOjpUb29sQmFyTW9kdWxlIyMjMjUwLVRpY2tldDo6RWxhc3RpY3NlYXJjaEZ1bGx0ZXh0JywKICAgICAgICApOwogICAgICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdVcGRhdGUoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdGcm9udGVuZDo6VG9vbEJhck1vZHVsZSMjIzI1MC1UaWNrZXQ6OkVsYXN0aWNzZWFyY2hGdWxsdGV4dCcsCiAgICAgICAgICAgIElzVmFsaWQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEV4Y2x1c2l2ZUxvY2tHVUlEID0+ICRFeGNsdXNpdmVMb2NrR1VJRCwKICAgICAgICAgICAgRWZmZWN0aXZlVmFsdWUgICAgPT4gJFNldHRpbmd7RWZmZWN0aXZlVmFsdWV9LAogICAgICAgICk7CiAgICAgICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VubG9jaygKICAgICAgICAgICAgVW5sb2NrQWxsID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgZGlzYWJsZSBpbiBjYXNlIG9mIGZhaWx1cmUKICAgICAgICBteSAkV2Vic2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJyk7CiAgICAgICAgbXkgJEVTV2Vic2VydmljZSAgICAgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAnRWxhc3RpY3NlYXJjaCcsCiAgICAgICAgKTsKCiAgICAgICAgJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VVcGRhdGUoCiAgICAgICAgICAgICV7JEVTV2Vic2VydmljZX0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgU3lzQ29uZmlnCiAgICAgICAgbXkgJEV4Y2x1c2l2ZUxvY2tHVUlEID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ0xvY2soCiAgICAgICAgICAgIExvY2tBbGwgPT4gMSwKICAgICAgICAgICAgRm9yY2UgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nVXBkYXRlKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnRWxhc3RpY3NlYXJjaDo6QWN0aXZlJywKICAgICAgICAgICAgSXNWYWxpZCAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgRXhjbHVzaXZlTG9ja0dVSUQgPT4gJEV4Y2x1c2l2ZUxvY2tHVUlELAogICAgICAgICk7CiAgICAgICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VubG9jaygKICAgICAgICAgICAgVW5sb2NrQWxsID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjICdSZWJ1aWxkJyB0aGUgY29uZmlndXJhdGlvbi4KICAgICRTeXNDb25maWdPYmplY3QtPkNvbmZpZ3VyYXRpb25EZXBsb3koCiAgICAgICAgQ29tbWVudHMgICAgPT4gIlF1aWNrIHNldHVwIG9mIEVsYXN0aWNzZWFyY2giLAogICAgICAgIEFsbFNldHRpbmdzID0+IDEsCiAgICAgICAgRm9yY2UgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3MsIDA7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/ITSMConfigItem.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKdXNlIHV0Zjg7Cgp1c2UgcGFyZW50IHF3KAogICAgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcgogICAgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpDb25maWdJdGVtQUNMCiAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1TZWFyY2gKICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbgogICAgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpIaXN0b3J5CiAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkxpbmsKICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyCiAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb24KICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6VmVyc2lvbgopOwoKIyBjb3JlIG1vZHVsZXMKdXNlIFN0b3JhYmxlICAgICAgIHF3KGRjbG9uZSk7CnVzZSBMaXN0OjpBbGxVdGlscyBxdyhmaXJzdCB0cnVlKTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJywKICAgICdLZXJuZWw6OlN5c3RlbTo6WE1MJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0gLSBsaWJyYXJ5IGZvciBJVFNNIGNvbmZpZyBpdGVtcy4KCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGNvbmZpZyBpdGVtIGZ1bmN0aW9ucy4gTm90ZSB0aGF0IGFkZGl0aW9uYWwgcGFyZW50IG1vZHVsZXMgYXJlIGxvYWRlZAp3aGljaCBlZmZlY3RpdmVseSBhZGQgbW9yZSBtZXRob2RzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKCiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICgkVHlwZSkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnSVRTTUNvbmZpZ0l0ZW06OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1Db3VudCgpCgpjb3VudCBhbGwgcHJvZHVjdGl2ZSBjb25maWcgaXRlbXMgb2YgYSBjb25maWcgaXRlbSBjbGFzcwoKICAgIG15ICRDb3VudCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQ291bnQoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1Db3VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgbGlzdCBvZiBwcm9kdWN0aXZlIGRlcGxveW1lbnQgc3RhdGVzCiAgICBteSAkU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdwcmVwcm9kdWN0aXZlJywgJ3Byb2R1Y3RpdmUnIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDAgaWYgISV7JFN0YXRlTGlzdH07CgogICAgIyBjcmVhdGUgc3RhdGUgc3RyaW5nCiAgICBteSAkRGVwbFN0YXRlU3RyaW5nID0gam9pbiBxeywgfSwga2V5cyAleyRTdGF0ZUxpc3R9OwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICBteSAoJENvdW50KSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TZWxlY3RSb3dBcnJheSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBjb25maWdpdGVtIFdIRVJFIGNsYXNzX2lkID0gPyBBTkQgIgogICAgICAgICAgICAuICJjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSIsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRDb3VudDsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1SZXN1bHRMaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYXJyYXkgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbUxpc3RSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVJlc3VsdExpc3QoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICAgICAgU3RhcnQgICA9PiAxMDAsCiAgICAgICAgTGltaXQgICA9PiA1MCwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVJlc3VsdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzc0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJFN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAncHJlcHJvZHVjdGl2ZScsICdwcm9kdWN0aXZlJyBdLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY3JlYXRlIHN0YXRlIHN0cmluZwogICAgbXkgJERlcGxTdGF0ZVN0cmluZyA9IGpvaW4gcXssIH0sIGtleXMgJXskU3RhdGVMaXN0fTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtICIKICAgICAgICAgICAgLiAiV0hFUkUgY2xhc3NfaWQgPSA/IEFORCBjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSAiCiAgICAgICAgICAgIC4gIk9SREVSIEJZIGNoYW5nZV90aW1lIERFU0MiLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc0lEfSBdLAogICAgICAgIFN0YXJ0ID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlETGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlETGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIGdldCBsYXN0IHZlcnNpb25zIGRhdGEKICAgIG15IEBDb25maWdJdGVtTGlzdDsKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbUlETGlzdCkgewoKICAgICAgICAjIGdldCB2ZXJzaW9uIGRhdGEKICAgICAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBDb25maWdJdGVtTGlzdCwgJENvbmZpZ0l0ZW07CiAgICB9CgogICAgcmV0dXJuIFxAQ29uZmlnSXRlbUxpc3Q7Cn0KCj1oZWFkMiBDb25maWdJdGVtR2V0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGFzIGEgaGFzaCByZWZlcmVuY2UuIFRoZSBsYXRlc3QgdmVyc2lvbiBpcyByZXRyaWV2ZWQgd2hlbiBDPENvbmZpZ0l0ZW1JRD4gaXMgcGFzc2VkIGFzIHBhcmFtZXRlci4KCiAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gMTIzLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgKTsKCkEgc3BlY2lmaWMgdmVyc2lvbiBpcyByZXR1cm5lZCB3aGVuIHRoZSBDPFZlcnNpb25JRD4gaXMgcGFzc2VkLgoKICAgIG15ICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgVmVyc2lvbklEICAgICA9PiAyNDMsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCiAgICApOwoKV2hlbiBib3RoIEM8Q29uZmlnSXRlbUlEPiBhbmQgQzxWZXJzaW9uSUQ+IGFyZSBwYXNzZWQsIHRoZW4gYSBjb25zaXN0ZW5jeSBjaGVjayBpcyBwZXJmb3JtZWQKYW5kIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWMgdmVyc2lvbiBpcyByZXR1cm5lZC4KCkVycm9yIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkIGlmIHRoZSBwYXJhbWV0ZXIgQzxTaWxlbnQ+IGlzIHBhc3NlZC4KCiAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIFZlcnNpb25JRCAgICAgPT4gMjQzLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgICAgIFNpbGVudCAgICAgICAgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgKTsKCkEgaGFzaHJlZiB3aXRoIHRoZSBmb2xsb3dpbmcga2V5cyBpcyByZXR1cm5lZDoKCj1vdmVyIDQKCj1pdGVtIENvbmZpZ0l0ZW1JRAoKPWl0ZW0gTnVtYmVyCgo9aXRlbSBDbGFzc0lECgo9aXRlbSBDbGFzcwoKPWl0ZW0gTGFzdFZlcnNpb25JRAoKPWl0ZW0gQ3VyRGVwbFN0YXRlSUQKCj1pdGVtIEN1ckRlcGxTdGF0ZQoKPWl0ZW0gQ3VyRGVwbFN0YXRlVHlwZQoKPWl0ZW0gQ3VySW5jaVN0YXRlSUQKCj1pdGVtIEN1ckluY2lTdGF0ZQoKPWl0ZW0gQ3VySW5jaVN0YXRlVHlwZQoKPWl0ZW0gVmVyc2lvbklECgo9aXRlbSBOYW1lCgo9aXRlbSBWZXJzaW9uU3RyaW5nCgo9aXRlbSBEZXNjcmlwdGlvbgoKPWl0ZW0gRGVmaW5pdGlvbklECgo9aXRlbSBEZXBsU3RhdGVJRAoKPWl0ZW0gRGVwbFN0YXRlCgo9aXRlbSBEZXBsU3RhdGVUeXBlCgo9aXRlbSBJbmNpU3RhdGVJRAoKPWl0ZW0gSW5jaVN0YXRlCgo9aXRlbSBJbmNpU3RhdGVUeXBlCgo9aXRlbSBDcmVhdGVUaW1lCgo9aXRlbSBDcmVhdGVCeQoKPWl0ZW0gQ2hhbmdlVGltZQoKPWl0ZW0gQ2hhbmdlQnkKCj1iYWNrCgpDYWNoaW5nIGNhbid0IGJlIHR1cm5lZCBvZmYuCgpXaGVuIHRoZSBwYXJhbWV0ZXIgQzxEeW5hbWljRmllbGRzPiBpcyBwYXNzZWQgdGhlbiB0aGUgZHluYW1pYyBmaWVsZHMgYXJlIHJldHVybmVkIGFkZGl0aW9uYWxseS4KCj1jdXQKCnN1YiBDb25maWdJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB3aGV0aGVyIHRvIHN1cHByZXNzIGVycm9yIG1lc3NhZ2VzCiAgICBteSAkU2lsZW50ID0gJFBhcmFte1NpbGVudH0gPyAxIDogMDsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW1JRH0gJiYgISRQYXJhbXtWZXJzaW9uSUR9ICkgewogICAgICAgIGlmICggISRTaWxlbnQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCBvciBWZXJzaW9uSUQhJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlnbm9yZSBEeW5hbWljRmllbGRzIHBlciBkZWZhdWx0LAogICAgIyBtYWtlIHN1cmUgdGhhdCB0aGUgdmFyaWFibGUgaXMgZWl0aGVyIDAgb3IgMSwgYXMgaXQgaXMgdXNlZCBmb3IgdGhlIGNhY2hlIGtleQogICAgbXkgJERGRGF0YSA9ICRQYXJhbXtEeW5hbWljRmllbGRzfSA/IDEgOiAwOwoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkLCBjb25zaWRlcmluZyB0aGUgRHluYW1pY0ZpZWxkcyBwYXJhbWV0ZXIKICAgIG15ICRDYWNoZUtleSA9ICRQYXJhbXtWZXJzaW9uSUR9CiAgICAgICAgPwogICAgICAgIGpvaW4oCiAgICAgICAgICAgICc6OicsICdDb25maWdJdGVtR2V0JywKICAgICAgICAgICAgVmVyc2lvbklEID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgICAgICAgICBERkRhdGEgICAgPT4gJERGRGF0YQogICAgICAgICkKICAgICAgICA6CiAgICAgICAgam9pbigKICAgICAgICAgICAgJzo6JywgJ0NvbmZpZ0l0ZW1HZXQnLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIERGRGF0YSAgICAgICA9PiAkREZEYXRhCiAgICAgICAgKTsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIG15ICRDYWNoZSAgICAgICA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICBpZiAoJENhY2hlKSB7CiAgICAgICAgaWYgKCAkUGFyYW17VmVyc2lvbklEfSAmJiAkUGFyYW17Q29uZmlnSXRlbUlEfSAmJiAkUGFyYW17Q29uZmlnSXRlbUlEfSBuZSAkQ2FjaGUtPntDb25maWdJdGVtSUR9ICkgewogICAgICAgICAgICBpZiAoICEkU2lsZW50ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVmVyc2lvbklEICRQYXJhbXtWZXJzaW9uSUR9IGlzIG5vdCBhIHZlcnNpb24gb2YgQ29uZmlnSXRlbUlEICRQYXJhbXtDb25maWdJdGVtSUR9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZGNsb25lKCRDYWNoZSkgaWYgJENhY2hlOwogICAgfQoKICAgICMgZ2V0IHNwZWNpZmljIENvbmZpZ0l0ZW1WZXJzaW9uCiAgICAjIFRoZSBwYXJhbWV0ZXIgVmVyc2lvbklEIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBDb25maWdJdGVtSUQKICAgIG15IEBSb3c7CiAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICkgewojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQojICAgICAgICBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlNlbGVjdFJvd0FycmF5KAojICAgICAgICAgICAgU1FMID0+IDw8J0VORF9TUUwnLAojU0VMRUNUIGNpLmlkLCBjaS5jb25maWdpdGVtX251bWJlciwgY2kuY2xhc3NfaWQsIGNpLmxhc3RfdmVyc2lvbl9pZCwKIyAgICBjaS5jdXJfZGVwbF9zdGF0ZV9pZCwgY2kuY3VyX2luY2lfc3RhdGVfaWQsCiMgICAgdi5pZCwgdi5uYW1lLCB2LnZlcnNpb25fc3RyaW5nLCB2LmRlZmluaXRpb25faWQsIHYuZGVwbF9zdGF0ZV9pZCwgdi5pbmNpX3N0YXRlX2lkLCB2LmRlc2NyaXB0aW9uLAojICAgIHYuY3JlYXRlX3RpbWUsIHYuY3JlYXRlX2J5LCB2LmNoYW5nZV90aW1lLCB2LmNoYW5nZV9ieQojICBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiB2CiMgIElOTkVSIEpPSU4gY29uZmlnaXRlbSBjaQojICAgIE9OIHYuY29uZmlnaXRlbV9pZCA9IGNpLmlkCiMgIFdIRVJFIHYuaWQgPSA/CiNFTkRfU1FMCiMgICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VmVyc2lvbklEfSBdLAojICAgICAgICAgICAgTGltaXQgPT4gMSwKIyAgICAgICAgKTsKICAgICAgICBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlNlbGVjdFJvd0FycmF5KAogICAgICAgICAgICBTUUwgPT4gPDwnRU5EX1NRTCcsClNFTEVDVCBjaS5pZCwgY2kuY29uZmlnaXRlbV9udW1iZXIsIGNpLmNsYXNzX2lkLCBjaS5sYXN0X3ZlcnNpb25faWQsCiAgICBjaS5jdXJfZGVwbF9zdGF0ZV9pZCwgY2kuY3VyX2luY2lfc3RhdGVfaWQsCiAgICB2LmlkLCB2Lm5hbWUsIHYudmVyc2lvbl9zdHJpbmcsIHYuZGVmaW5pdGlvbl9pZCwgdi5kZXBsX3N0YXRlX2lkLCB2LmluY2lfc3RhdGVfaWQsIHYuZGVzY3JpcHRpb24sCiAgICB2LmNyZWF0ZV90aW1lLCB2LmNyZWF0ZV9ieSwgdi5jaGFuZ2VfdGltZSwgdi5jaGFuZ2VfYnksIGNpLmdyb3VwX2lkCiAgRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gdgogIElOTkVSIEpPSU4gY29uZmlnaXRlbSBjaQogICAgT04gdi5jb25maWdpdGVtX2lkID0gY2kuaWQKICBXSEVSRSB2LmlkID0gPwpFTkRfU1FMCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtWZXJzaW9uSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgfQoKICAgICMgZ2V0IGxhdGVzdCBDb25maWdJdGVtVmVyc2lvbgogICAgZWxzZSB7CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiMgICAgICAgIEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+U2VsZWN0Um93QXJyYXkoCiMgICAgICAgICAgICBTUUwgPT4gPDwnRU5EX1NRTCcsCiNTRUxFQ1QgY2kuaWQsIGNpLmNvbmZpZ2l0ZW1fbnVtYmVyLCBjaS5jbGFzc19pZCwgY2kubGFzdF92ZXJzaW9uX2lkLAojICAgIGNpLmN1cl9kZXBsX3N0YXRlX2lkLCBjaS5jdXJfaW5jaV9zdGF0ZV9pZCwKIyAgICB2LmlkLCB2Lm5hbWUsIHYudmVyc2lvbl9zdHJpbmcsIHYuZGVmaW5pdGlvbl9pZCwgdi5kZXBsX3N0YXRlX2lkLCB2LmluY2lfc3RhdGVfaWQsIHYuZGVzY3JpcHRpb24sCiMgICAgY2kuY3JlYXRlX3RpbWUsIGNpLmNyZWF0ZV9ieSwgY2kuY2hhbmdlX3RpbWUsIGNpLmNoYW5nZV9ieQojICBGUk9NIGNvbmZpZ2l0ZW0gY2kKIyAgTEVGVCBKT0lOIGNvbmZpZ2l0ZW1fdmVyc2lvbiB2CiMgICAgT04gY2kubGFzdF92ZXJzaW9uX2lkID0gdi5pZAojICBXSEVSRSBjaS5pZCA9ID8KI0VORF9TUUwKIyAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiMgICAgICAgICAgICBMaW1pdCA9PiAxLAojICAgICAgICApOwogICAgICAgIEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+U2VsZWN0Um93QXJyYXkoCiAgICAgICAgICAgIFNRTCA9PiA8PCdFTkRfU1FMJywKU0VMRUNUIGNpLmlkLCBjaS5jb25maWdpdGVtX251bWJlciwgY2kuY2xhc3NfaWQsIGNpLmxhc3RfdmVyc2lvbl9pZCwKICAgIGNpLmN1cl9kZXBsX3N0YXRlX2lkLCBjaS5jdXJfaW5jaV9zdGF0ZV9pZCwKICAgIHYuaWQsIHYubmFtZSwgdi52ZXJzaW9uX3N0cmluZywgdi5kZWZpbml0aW9uX2lkLCB2LmRlcGxfc3RhdGVfaWQsIHYuaW5jaV9zdGF0ZV9pZCwgdi5kZXNjcmlwdGlvbiwKICAgIGNpLmNyZWF0ZV90aW1lLCBjaS5jcmVhdGVfYnksIGNpLmNoYW5nZV90aW1lLCBjaS5jaGFuZ2VfYnksIGNpLmdyb3VwX2lkCiAgRlJPTSBjb25maWdpdGVtIGNpCiAgTEVGVCBKT0lOIGNvbmZpZ2l0ZW1fdmVyc2lvbiB2CiAgICBPTiBjaS5sYXN0X3ZlcnNpb25faWQgPSB2LmlkCiAgV0hFUkUgY2kuaWQgPSA/CkVORF9TUUwKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlQ29uZmlnSXRlbTsKICAgICRDb25maWdJdGVte0NvbmZpZ0l0ZW1JRH0gICA9ICRSb3dbMF07CiAgICAkQ29uZmlnSXRlbXtOdW1iZXJ9ICAgICAgICAgPSAkUm93WzFdOwogICAgJENvbmZpZ0l0ZW17Q2xhc3NJRH0gICAgICAgID0gJFJvd1syXTsKICAgICRDb25maWdJdGVte0xhc3RWZXJzaW9uSUR9ICA9ICRSb3dbM107CiAgICAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVJRH0gPSAkUm93WzRdOwogICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlSUR9ID0gJFJvd1s1XTsKICAgICRDb25maWdJdGVte1ZlcnNpb25JRH0gICAgICA9ICRSb3dbNl07CiAgICAkQ29uZmlnSXRlbXtOYW1lfSAgICAgICAgICAgPSAkUm93WzddOwogICAgJENvbmZpZ0l0ZW17VmVyc2lvblN0cmluZ30gID0gJFJvd1s4XTsKICAgICRDb25maWdJdGVte0RlZmluaXRpb25JRH0gICA9ICRSb3dbOV07CiAgICAkQ29uZmlnSXRlbXtEZXBsU3RhdGVJRH0gICAgPSAkUm93WzEwXTsKICAgICRDb25maWdJdGVte0luY2lTdGF0ZUlEfSAgICA9ICRSb3dbMTFdOwogICAgJENvbmZpZ0l0ZW17RGVzY3JpcHRpb259ICAgID0gJFJvd1sxMl07CiAgICAkQ29uZmlnSXRlbXtDcmVhdGVUaW1lfSAgICAgPSAkUm93WzEzXTsKICAgICRDb25maWdJdGVte0NyZWF0ZUJ5fSAgICAgICA9ICRSb3dbMTRdOwogICAgJENvbmZpZ0l0ZW17Q2hhbmdlVGltZX0gICAgID0gJFJvd1sxNV07CiAgICAkQ29uZmlnSXRlbXtDaGFuZ2VCeX0gICAgICAgPSAkUm93WzE2XTsKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICRDb25maWdJdGVte0dyb3VwSUR9ID0gJFJvd1sxN107CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICAjIGNoZWNrIGNvbmZpZyBpdGVtCiAgICBpZiAoICEkQ29uZmlnSXRlbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgIGlmICggISRTaWxlbnQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIENvbmZpZ0l0ZW1JRCAoJFBhcmFte0NvbmZpZ0l0ZW1JRH0pISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICYmICRQYXJhbXtDb25maWdJdGVtSUR9ICYmICRQYXJhbXtDb25maWdJdGVtSUR9IG5lICRDb25maWdJdGVte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgaWYgKCAhJFNpbGVudCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlZlcnNpb25JRCAkUGFyYW17VmVyc2lvbklEfSBpcyBub3QgYSB2ZXJzaW9uIG9mIENvbmZpZ0l0ZW1JRCAkUGFyYW17Q29uZmlnSXRlbUlEfSEiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgbmVlZCB0byByZXR1cm4gRHluYW1pY0ZpZWxkcwogICAgaWYgKCAkREZEYXRhICYmICRDb25maWdJdGVte0RlZmluaXRpb25JRH0gKSB7CgogICAgICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0cwogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRTZWxmLT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW17RGVmaW5pdGlvbklEfSwKICAgICAgICApOwoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9LT4lKiApIHsKCiAgICAgICAgICAgICMgdmFsaWRhdGUgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAjIGdldCB0aGUgY3VycmVudCB2YWx1ZSBmb3IgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRDb25maWdJdGVte1ZlcnNpb25JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCB0aGUgZHluYW1pYyBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBpbnRvIHRoZSB0aWNrZXQgaGFzaAogICAgICAgICAgICAkQ29uZmlnSXRlbXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICMgYWRkIHRoZSBDbGFzcywgYmFzZWQgb24gdGhlIENsYXNzSUQKICAgIHsKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAkQ29uZmlnSXRlbXtDbGFzc30gPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVte0NsYXNzSUR9IH07CiAgICB9CgogICAgIyBBZGQgbW9yZSByZWFkYWJsZSBuYW1lcyBmb3IgdGhlIHZhcmlvdXMgc3RhdGVzLgogICAgIyBBZGQgdGhlIHN0YXRlIHR5cGVzLgogICAgU1RBVEU6CiAgICBmb3IgbXkgJFN0YXRlIChxdy9EZXBsU3RhdGUgQ3VyRGVwbFN0YXRlIEluY2lTdGF0ZSBDdXJJbmNpU3RhdGUvKSB7CiAgICAgICAgbmV4dCBTVEFURSB1bmxlc3MgJENvbmZpZ0l0ZW17ICRTdGF0ZSAuICdJRCcgfTsKCiAgICAgICAgbXkgJEl0ZW0gPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbXsgJFN0YXRlIC4gJ0lEJyB9LAogICAgICAgICk7CgogICAgICAgICRDb25maWdJdGVteyRTdGF0ZX0gPSAkSXRlbS0+e05hbWV9OwogICAgICAgICRDb25maWdJdGVteyAkU3RhdGUgLiAnVHlwZScgfSA9ICRJdGVtLT57RnVuY3Rpb25hbGl0eX1bMF0gLy8gJyc7CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IGRjbG9uZSggXCVDb25maWdJdGVtICksCiAgICApOwoKICAgIHJldHVybiBcJUNvbmZpZ0l0ZW07Cn0KCj1oZWFkMiBDb25maWdJdGVtQWRkKCkKCmFkZCBhIG5ldyBjb25maWcgaXRlbS4gVGhpcyBpbXBsaWVzIHRoYXQgYW4gaW5pdGlhbCB2ZXJzaW9uIGlzIGNyZWF0ZWQgYXMgd2VsbC4KCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgQ2xhc3NJRCAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdOYW1lJywgICAgIyBvcHRpb25hbCB3aGVuIGEgbmFtZSBtb2R1bGUgaXMgY29uZmlndXJlZCBmb3IgdGhlIGNsYXNzCiAgICAgICAgVmVyc2lvblN0cmluZyAgPT4gJ1ZlcnNpb24nLCAjIG9wdGlvbmFsIHdoZW4gYSB2ZXJzaW9uIG51bWJlciBtb2R1bGUgaXMgY29uZmlndXJlZCBmb3IgdGhlIGNsYXNzCiAgICAgICAgRGVwbFN0YXRlSUQgICAgPT4gMywKICAgICAgICBJbmNpU3RhdGVJRCAgICA9PiAyLAogICAgICAgIERlc2NyaXB0aW9uICAgID0+ICdBQkNEJywKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgIE51bWJlciAgICAgICAgID0+ICcxMTEnLCAgICAjIG9wdGlvbmFsLCBhIG51bWJlciB3aWxsIGdlbmVyYXRlZCB3aGVuIG5vIG51bWJlciBpcyBwYXNzZWQKICAgICAgICBEeW5hbWljRmllbGRfWCA9PiAkVmFsdWUsICAgIyBvcHRpb25hbAogICAgKTsKCk5vIGNvbmZpZyBpdGVtIHdpbGwgYmUgY3JlYXRlZCB3aGVuIGFuIGFscmVhZHkgZXhpc3RpbmcgTnVtYmVyIGlzIHBhc3NlZC4KCj1jdXQKCnN1YiBDb25maWdJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzSUQgVXNlcklEIERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgcmV0dXJuIHVubGVzcyAkQ2xhc3NMaXN0OwogICAgcmV0dXJuIHVubGVzcyByZWYgJENsYXNzTGlzdCBlcSAnSEFTSCc7CgogICAgIyBjaGVjayB0aGUgY2xhc3MgaWQKICAgIGlmICggISRDbGFzc0xpc3QtPnsgJFBhcmFte0NsYXNzSUR9IH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdObyB2YWxpZCBjbGFzcyBpZCBnaXZlbiEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgcmV0dXJuIHVubGVzcyAkRGVwbFN0YXRlTGlzdDsKICAgIHJldHVybiB1bmxlc3MgcmVmICREZXBsU3RhdGVMaXN0IGVxICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBkZXBsb3ltZW50IHN0YXRlIGlkCiAgICBpZiAoICEkRGVwbFN0YXRlTGlzdC0+eyAkUGFyYW17RGVwbFN0YXRlSUR9IH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdObyB2YWxpZCBkZXBsb3ltZW50IHN0YXRlIGlkIGdpdmVuIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgIHJldHVybiB1bmxlc3MgJEluY2lTdGF0ZUxpc3Q7CiAgICByZXR1cm4gdW5sZXNzIHJlZiAkSW5jaVN0YXRlTGlzdCBlcSAnSEFTSCc7CgogICAgIyBjaGVjayB0aGUgaW5jaWRlbnQgc3RhdGUgaWQKICAgIGlmICggISRJbmNpU3RhdGVMaXN0LT57ICRQYXJhbXtJbmNpU3RhdGVJRH0gfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIHZhbGlkIGluY2lkZW50IHN0YXRlIGlkIGdpdmVuIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVDbGFzc1ByZWZlcmVuY2VzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICApOwoKICAgICMgY3JlYXRlIGNvbmZpZyBpdGVtIG51bWJlcgogICAgaWYgKCAkUGFyYW17TnVtYmVyfSApIHsKCiAgICAgICAgIyBmaW5kIGV4aXN0aW5nIGNvbmZpZyBpdGVtIG51bWJlcgogICAgICAgIG15ICRFeGlzdHMgPSAkU2VsZi0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAkUGFyYW17TnVtYmVyfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJEV4aXN0cykgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ29uZmlnIGl0ZW0gbnVtYmVyIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICROdW1iZXJNb2R1bGUgPSAkQ2xhc3NQcmVmZXJlbmNlc3tOdW1iZXJNb2R1bGV9ID8gJENsYXNzUHJlZmVyZW5jZXN7TnVtYmVyTW9kdWxlfVswXSA6ICdBdXRvSW5jcmVtZW50JzsKCiAgICAgICAgIyBjcmVhdGUgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgJFBhcmFte051bWJlcn0gPSAkU2VsZi0+Q29uZmlnSXRlbU51bWJlckNyZWF0ZSgKICAgICAgICAgICAgVHlwZSAgICA9PiAiS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOdW1iZXI6OiROdW1iZXJNb2R1bGUiLAogICAgICAgICAgICBDbGFzc0lEID0+ICRQYXJhbXtDbGFzc0lEfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICROYW1lTW9kdWxlID0gJENsYXNzUHJlZmVyZW5jZXN7TmFtZU1vZHVsZX0gPyAkQ2xhc3NQcmVmZXJlbmNlc3tOYW1lTW9kdWxlfVswXSA6ICcnOwogICAgaWYgKCROYW1lTW9kdWxlKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBtb2R1bGUgZXhpc3RzCiAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOYW1lOjokTmFtZU1vZHVsZSIpICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBuYW1lIG1vZHVsZSBmb3IgY2xhc3MgJENsYXNzTGlzdC0+eyAkUGFyYW17Q2xhc3NJRH0gfSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrLCB3aGV0aGVyIHRoZSBmZWF0dXJlIHRvIGNoZWNrIGZvciBhIHVuaXF1ZSBuYW1lIGlzIGVuYWJsZWQKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVW5pcXVlQ0lOYW1lOjpFbmFibGVVbmlxdWVuZXNzQ2hlY2snKSApIHsKCiAgICAgICAgICAgIG15ICROYW1lRHVwbGljYXRlcyA9ICRTZWxmLT5VbmlxdWVOYW1lQ2hlY2soCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJ05FVycsCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc3RvcCBwcm9jZXNzaW5nIGlmIHRoZSBuYW1lIGlzIG5vdCB1bmlxdWUKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE5hbWVEdXBsaWNhdGVzKSApIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGEgc3RyaW5nIG9mIGFsbCBkdXBsaWNhdGUgSURzCiAgICAgICAgICAgICAgICBteSAkRHVwbGljYXRlcyA9IGpvaW4gJywgJywgQHskTmFtZUR1cGxpY2F0ZXN9OwoKICAgICAgICAgICAgICAgICMgd3JpdGUgYW4gZXJyb3IgbG9nIG1lc3NhZ2UgY29udGFpbmluZyBhbGwgdGhlIGR1cGxpY2F0ZSBJRHMKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBuYW1lICRQYXJhbXtOYW1lfSBpcyBhbHJlYWR5IGluIHVzZSAoQ29uZmlnSXRlbUlEczogJER1cGxpY2F0ZXMpISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZiBJSQogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBOYW1lISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICAjIGluc2VydCBuZXcgY29uZmlnIGl0ZW0KIyAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiMgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZmlnaXRlbSAoJwojICAgICAgICAgICAgLiAnY29uZmlnaXRlbV9udW1iZXIsIGN1cl9kZXBsX3N0YXRlX2lkLCBjdXJfaW5jaV9zdGF0ZV9pZCcKIyAgICAgICAgICAgIC4gJywgY2xhc3NfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnknCiMgICAgICAgICAgICAuICcpIFZBTFVFUyAoPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiMgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte051bWJlcn0sIFwkUGFyYW17RGVwbFN0YXRlSUR9LCBcJFBhcmFte0luY2lTdGF0ZUlEfSwgXCRQYXJhbXtDbGFzc0lEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0gXSwKIyAgICApOwogICAgbXkgJEdyb3VwSUQgPSAkUGFyYW17R3JvdXBJRH0gPyAkUGFyYW17R3JvdXBJRH0gOiB1bmRlZjsKCiAgICAjIGluc2VydCBuZXcgY29uZmlnIGl0ZW0KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNvbmZpZ2l0ZW0gKCcKICAgICAgICAgICAgLiAnY29uZmlnaXRlbV9udW1iZXIsIGN1cl9kZXBsX3N0YXRlX2lkLCBjdXJfaW5jaV9zdGF0ZV9pZCcKICAgICAgICAgICAgLiAnLCBjbGFzc19pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgZ3JvdXBfaWQnCiAgICAgICAgICAgIC4gJykgVkFMVUVTICg/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8sID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtOdW1iZXJ9LCBcJFBhcmFte0RlcGxTdGF0ZUlEfSwgXCRQYXJhbXtJbmNpU3RhdGVJRH0sIFwkUGFyYW17Q2xhc3NJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LCBcJEdyb3VwSUQgXSwKICAgICk7CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICAjIGZpbmQgaWQgb2YgbmV3IGl0ZW0KICAgICMgVE9ETzogd2hhdCBhYm91dCBjb25jdXJyZW50IElOU0VSVHMgPz8/CiAgICBteSAoJENvbmZpZ0l0ZW1JRCkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+U2VsZWN0Um93QXJyYXkoCiAgICAgICAgU1FMID0+IDw8J0VORF9TUUwnLApTRUxFQ1QgaWQKICBGUk9NIGNvbmZpZ2l0ZW0KICBXSEVSRSBjb25maWdpdGVtX251bWJlciA9ID8KICAgIEFORCBjbGFzc19pZCA9ID8KICBPUkRFUiBCWSBpZCBERVNDCkVORF9TUUwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtOdW1iZXJ9LCBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICApOwoKICAgICMgdHJpZ2dlciBDb25maWdJdGVtQ3JlYXRlCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJENvbmZpZ0l0ZW1JRCAuICclJScgLiAkUGFyYW17TnVtYmVyfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhZGQgdGhlIGZpcnN0IHZlcnNpb24KICAgIG15ICRWZXJzaW9uSUQgPSAkU2VsZi0+VmVyc2lvbkFkZCgKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnJywKICAgICAgICAlUGFyYW0sCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgTGFzdFZlcnNpb24gID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICdORVcnLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggISRWZXJzaW9uSUQgKSB7CgogICAgICAgICMgZGVsZXRlIGhpc3RvcnkgZW50cmllcwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY29uZmlnaXRlbV9oaXN0b3J5IFdIRVJFIGNvbmZpZ2l0ZW1faWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ29uZmlnSXRlbUlEIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgY29uZmlnIGl0ZW0gaWYgbm8gdmVyc2lvbiBjb3VsZCBiZSBjcmVhdGVkCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJENvbmZpZ0l0ZW1JRCBdLAogICAgICAgICk7CgogICAgICAgICMgd3JpdGUgYW4gZXJyb3IgbG9nIG1lc3NhZ2UgY29udGFpbmluZyBhbGwgdGhlIGR1cGxpY2F0ZSBJRHMKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBjcmVhdGUgdmVyc2lvbiEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJENvbmZpZ0l0ZW1JRDsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1EZWxldGUoKQoKZGVsZXRlIGFuIGV4aXN0aW5nIGNvbmZpZyBpdGVtCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmZpZ0l0ZW1JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbWVtYmVyIGNvbmZpZyBpdGVtIGRhdGEgYmVmb3JlIGRlbGV0ZQogICAgbXkgJENvbmZpZ0l0ZW1EYXRhID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBsaW5rcyB0byB0aGlzIGNvbmZpZyBpdGVtIGJlZm9yZSBkZWxldGluZyB0aGUgdmVyc2lvbnMuCiAgICAjIExpbmtEZWxldGVBbGwoKSBjYWxscyBMaW5rRGVsZXRlKCkgaW50ZXJuYWxseS4gVGhpcyBtZWFucyB0aGF0CiAgICAjIHRoZSBldmVudCBoYW5kbGVycyBhcmUgaG9ub3JlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSB0YWJsZSBjb25maWdpdGVtX2xpbmsKICAgICMgaXMgYWxzbyBwdXJnZWQuCiAgICByZXR1cm4gdW5sZXNzICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtEZWxldGVBbGwoCiAgICAgICAgT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgZHluYW1pYyBsaW5rIHRhYmxlIGVudHJpZXMsIGlmIGFueQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtX2xpbmsgV0hFUkUgc291cmNlX2NvbmZpZ2l0ZW1faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwogICAgJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtX2xpbmsgV0hFUkUgdGFyZ2V0X2NvbmZpZ2l0ZW1faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwoKICAgICMgaWYgdGhlcmUgYXJlIHN0YXRpYyAodmVyc2lvbmVkKSBsaW5rcywgZGVsZXRlIGFsbCBvZiB0aGVtCiAgICBteSAkVmVyc2lvbkxpc3RSZWYgPSAkU2VsZi0+VmVyc2lvbkxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICBmb3IgbXkgJFZlcnNpb25JRCAoQCRWZXJzaW9uTGlzdFJlZikgewogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW1fbGluayBXSEVSRSBzb3VyY2VfY29uZmlnaXRlbV92ZXJzaW9uX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZlcnNpb25JRCBdLAogICAgICAgICk7CiAgICAgICAgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY29uZmlnaXRlbV9saW5rIFdIRVJFIHRhcmdldF9jb25maWdpdGVtX3ZlcnNpb25faWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkVmVyc2lvbklEIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyB2ZXJzaW9ucwogICAgJFNlbGYtPlZlcnNpb25EZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBhdHRhY2htZW50cwogICAgbXkgQEV4aXN0aW5nQXR0YWNobWVudHMgPSAkU2VsZi0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIGF0dGFjaG1lbnRzIG9mIHRoaXMgY29uZmlnIGl0ZW0KICAgIEZJTEVOQU1FOgogICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIGF0dGFjaG1lbnQKICAgICAgICBteSAkRGVsZXRpb25TdWNjZXNzID0gJFNlbGYtPkNvbmZpZ0l0ZW1BdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIEZpbGVuYW1lICAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkRGVsZXRpb25TdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5rbm93biBwcm9ibGVtIHdoZW4gZGVsZXRpbmcgYXR0YWNobWVudCAkRmlsZW5hbWUgb2YgQ29uZmlnSXRlbSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJFBhcmFte0NvbmZpZ0l0ZW1JRH0uIFBsZWFzZSBjaGVjayB0aGUgVmlydHVhbEZTIGJhY2tlbmQgZm9yIHN0YWxlICIKICAgICAgICAgICAgICAgICAgICAuICJmaWxlcyEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQ2xhc3NQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbURhdGEtPntDbGFzc0lEfSwKICAgICk7CiAgICBteSAkTmFtZU1vZHVsZSA9ICRDbGFzc1ByZWZlcmVuY2Vze05hbWVNb2R1bGV9ID8gJENsYXNzUHJlZmVyZW5jZXN7TmFtZU1vZHVsZX1bMF0gOiAnJzsKICAgIGlmICgkTmFtZU1vZHVsZSkgewoKICAgICAgICAjIGNoZWNrIGlmIG5hbWUgbW9kdWxlIGV4aXN0cwogICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOYW1lOjokTmFtZU1vZHVsZSIpICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgYSBiYWNrZW5kIG9iamVjdAogICAgICAgICAgICBteSAkTmFtZU1vZHVsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJE5hbWVNb2R1bGUpOwoKICAgICAgICAgICAgaWYgKCAkTmFtZU1vZHVsZU9iamVjdC0+Y2FuKCdDb25maWdJdGVtTmFtZURlbGV0ZScpICkgewogICAgICAgICAgICAgICAgJE5hbWVNb2R1bGVPYmplY3QtPkNvbmZpZ0l0ZW1OYW1lRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJENvbmZpZ0l0ZW1EYXRhLT57TmFtZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBuYW1lIG1vZHVsZSBmb3IgY2xhc3MgJENvbmZpZ0l0ZW1EYXRhLT57Q2xhc3N9ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBDb25maWdJdGVtRGVsZXRlIGV2ZW50CiAgICAjIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBkZWxldGluZyB0aGUgY29uZmlnIGl0ZW0gZnJvbSB0aGUgZGF0YWJhc2UsCiAgICAjIGJlY2F1c2Ugb2YgYSBmb3JlaWduIGtleSBjb25zdHJhaW50IGluIHRoZSBjb25maWdpdGVtX2hpc3RvcnkgdGFibGUKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIE51bWJlciAgICAgICA9PiAkQ29uZmlnSXRlbURhdGEtPntOdW1iZXJ9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJENvbmZpZ0l0ZW1EYXRhLT57Q2xhc3N9LAogICAgICAgICAgICBDb25maWdJdGVtICAgPT4gJENvbmZpZ0l0ZW1EYXRhLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBjb25maWcgaXRlbQogICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwoKICAgICMgZGVsZXRlIHRoZSBjYWNoZQogICAgZm9yIG15ICRERkRhdGEgKCAwLCAxICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+IGpvaW4oCiAgICAgICAgICAgICAgICAnQ29uZmlnSXRlbUdldCcsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBERkRhdGEgICAgICAgPT4gJERGRGF0YQogICAgICAgICAgICApLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aGVhZDIgQ29uZmlnSXRlbVVwZGF0ZSgpCgp1cGRhdGUgYSBjb25maWcgaXRlbS4gQSBuZXcgdmVyc2lvbiB3aWxsIGJlIGNyZWF0ZWQgb25seSB3aGVuIGEgdmVyc2lvbiB0cmlnZ2VyIGFwcGxpZXMuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICBDb25maWdJdGVtSUQgICA9PiAyNywKICAgICAgICBOdW1iZXIgICAgICAgICA9PiAnMTExJywgICAgIyBJRCBvciBOdW1iZXIgaXMgcmVxdWlyZWQKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdOYW1lJywgICAjIG9wdGlvbmFsCiAgICAgICAgRGVmaW5pdGlvbklEICAgPT4gMTIzLCAgICAgICMgb3B0aW9uYWwKICAgICAgICBEZXBsU3RhdGVJRCAgICA9PiAzLCAgICAgICAgIyBvcHRpb25hbAogICAgICAgIEluY2lTdGF0ZUlEICAgID0+IDIsICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgRGVzY3JpcHRpb24gICAgPT4gJ0FCQ0QnLCAgICMgb3B0aW9uYWwKICAgICAgICBEeW5hbWljRmllbGRfWCA9PiAkVmFsdWUsICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb29rdXAKICAgICRQYXJhbXtDb25maWdJdGVtSUR9IC8vPSAkU2VsZi0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRQYXJhbXtOdW1iZXJ9LAogICAgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzCiAgICBmb3IgbXkgJEtleSAocXcvQ29uZmlnSXRlbUlEIFVzZXJJRC8pIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICIgLiAoICRLZXkgZXEgJ0NvbmZpZ0l0ZW1JRCcgPyAnQ29uZmlnSXRlbUlEIG9yIE51bWJlcicgOiAkS2V5ICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgIyBnYXRoZXIgZHluYW1pYyBmaWVsZCBrZXlzCiAgICBteSBARHluYW1pY0ZpZWxkTmFtZXMgPSBtYXAKICAgICAgICB7bS9eRHluYW1pY0ZpZWxkXyguKykvfQogICAgICAgIHNvcnQga2V5cyAlUGFyYW07CgogICAgIyBnZXQgY3VycmVudCBjb25maWcgaXRlbSwgaW5jbHVkaW5nIGluZm8gZnJvbSB0aGUgbGFzdCB2ZXJzaW9uCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwogICAgbXkgJENsYXNzID0gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9IH07CgogICAgaWYgKCAhJENsYXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2xhc3MgZm91bmQgZm9yIGlkICckQ29uZmlnSXRlbS0+e0NsYXNzSUR9JyAoQ29uZmlnSXRlbSMkQ29uZmlnSXRlbS0+e051bWJlcn0pISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWdub3JlIHRoZSBwYXNzZWQgaW4gbmFtZSB3aGVuIGEgbmFtZSBtb2R1bGUgaXMgYWN0aXZlCiAgICBteSAlQ2xhc3NQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKCiAgICAjIGV4ZWN1dGUgbmFtZSBjaGVjayBvbmx5IGlmIG5hbWUgaGFzIGNoYW5nZWQKICAgIG15ICROYW1lTW9kdWxlID0gJENsYXNzUHJlZmVyZW5jZXN7TmFtZU1vZHVsZX0gPyAkQ2xhc3NQcmVmZXJlbmNlc3tOYW1lTW9kdWxlfVswXSA6ICcnOwogICAgaWYgKCROYW1lTW9kdWxlKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBtb2R1bGUgZXhpc3RzCiAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTmFtZU1vZHVsZSkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIG5hbWUgbW9kdWxlIGZvciBjbGFzcyAkQ2xhc3NMaXN0LT57ICRQYXJhbXtDbGFzc0lEfSB9ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBkZWxldGUgJFBhcmFte05hbWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TmFtZX0gJiYgJFBhcmFte05hbWV9IG5lICRDb25maWdJdGVtLT57TmFtZX0gKSB7CgogICAgICAgICMgY2hlY2ssIHdoZXRoZXIgdGhlIGZlYXR1cmUgdG8gY2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgaXMgZW5hYmxlZAogICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdVbmlxdWVDSU5hbWU6OkVuYWJsZVVuaXF1ZW5lc3NDaGVjaycpICkgewoKICAgICAgICAgICAgbXkgJE5hbWVEdXBsaWNhdGVzID0gJFNlbGYtPlVuaXF1ZU5hbWVDaGVjaygKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzdG9wIHByb2Nlc3NpbmcgaWYgdGhlIG5hbWUgaXMgbm90IHVuaXF1ZQogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTmFtZUR1cGxpY2F0ZXMpICkgewoKICAgICAgICAgICAgICAgICMgYnVpbGQgYSBzdHJpbmcgb2YgYWxsIGR1cGxpY2F0ZSBJRHMKICAgICAgICAgICAgICAgIG15ICREdXBsaWNhdGVzID0gam9pbiAnLCAnLCBAeyROYW1lRHVwbGljYXRlc307CgogICAgICAgICAgICAgICAgIyB3cml0ZSBhbiBlcnJvciBsb2cgbWVzc2FnZSBjb250YWluaW5nIGFsbCB0aGUgZHVwbGljYXRlIElEcwogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIG5hbWUgJFBhcmFte05hbWV9IGlzIGFscmVhZHkgaW4gdXNlIChDb25maWdJdGVtSURzOiAkRHVwbGljYXRlcykhIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICVWZXJzaW9uVHJpZ2dlciA9IG1hcAogICAgICAgIHsgJF8gPT4gMSB9CiAgICAgICAgKCAkQ2xhc3NQcmVmZXJlbmNlc3tWZXJzaW9uVHJpZ2dlcn0gLy8gW10gKS0+QCo7CgogICAgbXkgJUNoYW5nZWQ7ICAgICAgICAgICAgICAjIHRyYWNrIGNoYW5nZWQgdmFsdWVzIGZvciB0aGUgRXZlbnQgaGFuZGxlciwgZS5nLiBmb3Igd3JpdGluZyBoaXN0b3J5CiAgICBteSAkQWRkVmVyc2lvbiAgICA9IDA7ICAgICMgZmxhZyBmb3IgZGVjaWRpbmcgd2hldGhlciBhIG5ldyB2ZXJzaW9uIGlzIGNyZWF0ZWQKICAgIG15ICRVcGRhdGVWZXJzaW9uID0gMDsgICAgIyBmbGFnIGZvciBkZWNpZGluZyB3aGV0aGVyIHRoZSBjdXJyZW50IHZlcnNpb24gbmVlZHMgYW4gdXBkYXRlCgojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQojICAgICMgY2hlY2sgbmFtZSwgZGVwbG95bWVudCBhbmQgaW5jaWRlbnQgc3RhdGUsIGFzIHdlbGwgYXMgRGVzY3JpcHRpb24KIyAgICBBVFRSOgojICAgIGZvciBteSAkQXR0cmlidXRlIChxdy9OYW1lIERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEIERlc2NyaXB0aW9uLykgewojICAgICAgICBuZXh0IEFUVFIgdW5sZXNzIGRlZmluZWQgJFBhcmFteyRBdHRyaWJ1dGV9OwojICAgICAgICBuZXh0IEFUVFIgaWYgJFBhcmFteyRBdHRyaWJ1dGV9IGVxICRDb25maWdJdGVtLT57JEF0dHJpYnV0ZX07CiMKIyAgICAgICAgJENoYW5nZWR7JEF0dHJpYnV0ZX0gPSB7CiMgICAgICAgICAgICBPbGQgPT4gJENvbmZpZ0l0ZW0tPnskQXR0cmlidXRlfSwKIyAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17JEF0dHJpYnV0ZX0sCiMgICAgICAgIH07CiMKIyAgICAgICAgJFVwZGF0ZVZlcnNpb24gPSAxOwogICAgbXkgJFVwZGF0ZUdyb3VwSUQgPSAwOyAgICAjIGZsYWcgZm9yIGRlY2lkaW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgZ3JvdXAgaWQgbmVlZHMgYW4gdXBkYXRlCgogICAgIyBjaGVjayBuYW1lLCBkZXBsb3ltZW50IGFuZCBpbmNpZGVudCBzdGF0ZSwgYXMgd2VsbCBhcyBEZXNjcmlwdGlvbiBhbmQgZ3JvdXAKICAgIEFUVFI6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcvTmFtZSBEZXBsU3RhdGVJRCBJbmNpU3RhdGVJRCBEZXNjcmlwdGlvbiBHcm91cElELykgewogICAgICAgIG5leHQgQVRUUiB1bmxlc3MgZGVmaW5lZCAkUGFyYW17JEF0dHJpYnV0ZX07CiAgICAgICAgbmV4dCBBVFRSIGlmICRQYXJhbXskQXR0cmlidXRlfSBlcSAkQ29uZmlnSXRlbS0+eyRBdHRyaWJ1dGV9OwoKICAgICAgICAkQ2hhbmdlZHskQXR0cmlidXRlfSA9IHsKICAgICAgICAgICAgT2xkID0+ICRDb25maWdJdGVtLT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17JEF0dHJpYnV0ZX0sCiAgICAgICAgfTsKCiAgICAgICAgIyBjaGFuZ2VzIHRvIEdyb3VwSUQgc2hvdWxkIG5vdCB0cmlnZ2VyIFZlcnNpb25BZGQgb3IgVmVyc2lvblVwZGF0ZQogICAgICAgICMgVGh1cyBpdHMgdXBkYXRlIGhhcyB0byBiZSBwZXJmb3JtZWQgbG9jYWxseSBpbiB0aGlzIG1vZHVsZQogICAgICAgIGlmICgkQXR0cmlidXRlIGVxICdHcm91cElEJykgewogICAgICAgICAgICAkVXBkYXRlR3JvdXBJRCA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVXBkYXRlVmVyc2lvbiA9IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRWZXJzaW9uVHJpZ2dlcnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEFkZFZlcnNpb24gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoZSBjb3JuZXIgY2FzZSBpbiB3aGljaCB0aGUgR3JvdXBJRCB3YXMgdXBkYXRlZCB0byBudWxsCiAgICBpZiAoJENvbmZpZ0l0ZW0tPntHcm91cElEfSAmJiAhJFBhcmFte0dyb3VwSUR9KSB7CiAgICAgICAgJFVwZGF0ZUdyb3VwSUQgPSAxOwogICAgICAgICRDaGFuZ2Vke0dyb3VwSUR9ID0gewogICAgICAgICAgICBPbGQgPT4gJENvbmZpZ0l0ZW0tPntHcm91cElEfSwKICAgICAgICAgICAgTmV3ID0+IHVuZGVmLAogICAgICAgIH07CiAgICB9CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICAjIGdldCBsYXRlc3QgZGVmaW5pdGlvbiBmb3IgdGhlIGNsYXNzCiAgICBteSAkRGVmaW5pdGlvbiA9ICRTZWxmLT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSwKICAgICk7CgogICAgbXkgJVNraXBGb3JVcGRhdGVERnM7CgogICAgIyBjaGVjayBmb3IgY2hhbmdlZCBkeW5hbWljIGZpZWxkcyB0byB0cmlnZ2VyIHZlcnNpb25zIGFuZCBmaWx0ZXIgaGlzdG9yeSBlbnRyaWVzCiAgICBpZiAoQER5bmFtaWNGaWVsZE5hbWVzKSB7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgICMgZHluYW1pYyBmaWVsZHMKICAgICAgICBOQU1FOgogICAgICAgIGZvciBteSAkTmFtZSAoQER5bmFtaWNGaWVsZE5hbWVzKSB7CiAgICAgICAgICAgIG5leHQgTkFNRSB1bmxlc3MgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9eyROYW1lfTsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICROYW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUlzRGlmZmVyZW50KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlMSAgICAgICAgICAgICA9PiAkUGFyYW17IkR5bmFtaWNGaWVsZF8kTmFtZSJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlMiAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbS0+eyJEeW5hbWljRmllbGRfJE5hbWUifSwKICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbFNvdXJjZSAgICAgPT4gJFBhcmFte0V4dGVybmFsU291cmNlfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyBkbyBub3QgcGFzcyB1bmNoYW5nZWQgZHluYW1pYyBmaWVsZHMgdG8gVmVyc2lvblVwZGF0ZSgpCiAgICAgICAgICAgICAgICAjIHN0b3JlIHRoZW0gZm9yIFZlcnNpb25BZGQoKSBiZWNhdXNlIG9mIHBvdGVudGlhbCBkaWZmZXJlbmNlIGZyb20gRXh0ZXJuYWxTb3VyY2UKICAgICAgICAgICAgICAgICRTa2lwRm9yVXBkYXRlREZzeyJEeW5hbWljRmllbGRfJE5hbWUifSA9IGRlbGV0ZSAkUGFyYW17IkR5bmFtaWNGaWVsZF8kTmFtZSJ9OwoKICAgICAgICAgICAgICAgIG5leHQgTkFNRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFVwZGF0ZVZlcnNpb24gPSAxOwoKICAgICAgICAgICAgaWYgKCAkVmVyc2lvblRyaWdnZXJ7IkR5bmFtaWNGaWVsZF8kTmFtZSJ9ICkgewogICAgICAgICAgICAgICAgJEFkZFZlcnNpb24gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgaWYgKCRVcGRhdGVHcm91cElEKSB7CgogICAgICAgICMgdXBkYXRlIGN1cnJlbnQgZ3JvdXAgaWQKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIGNvbmZpZ2l0ZW0gU0VUIGdyb3VwX2lkID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDaGFuZ2Vke0dyb3VwSUR9e05ld30sIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgICAgICk7CgogICAgICAgICMgQ2xlYXIgdGhlIGNhY2hlIGZvciBDb25maWdJdGVtR2V0CiAgICAgICAgbXkgJFZlcnNpb25MaXN0ID0gJFNlbGYtPlZlcnNpb25MaXN0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJERGRGF0YSAocXcoMCAxKSkgewogICAgICAgICAgICBmb3IgbXkgJFZlcnNpb25JRCAoJFZlcnNpb25MaXN0LT5AKikgewogICAgICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICA9PiBqb2luKAogICAgICAgICAgICAgICAgICAgICAgICAnOjonLCAnQ29uZmlnSXRlbUdldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25JRCA9PiAkVmVyc2lvbklELAogICAgICAgICAgICAgICAgICAgICAgICBERkRhdGEgICAgPT4gJERGRGF0YQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICBLZXkgID0+IGpvaW4oCiAgICAgICAgICAgICAgICAgICAgJzo6JywgJ0NvbmZpZ0l0ZW1HZXQnLAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBERkRhdGEgICAgICAgPT4gJERGRGF0YQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICBpZiAoJEFkZFZlcnNpb24pIHsKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5WZXJzaW9uQWRkKAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkQ29uZmlnSXRlbS0+e0Rlc2NyaXB0aW9ufSAvLyAnJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlU2tpcEZvclVwZGF0ZURGcywKICAgICAgICAgICAgTGFzdFZlcnNpb24gPT4gJENvbmZpZ0l0ZW0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdW5sZXNzICRTdWNjZXNzOwogICAgfQogICAgZWxzaWYgKCRVcGRhdGVWZXJzaW9uKSB7CiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+VmVyc2lvblVwZGF0ZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBWZXJzaW9uID0+ICRDb25maWdJdGVtLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHVubGVzcyAkU3VjY2VzczsKICAgIH0KCiAgICBteSAlRXZlbnRzID0gKAogICAgICAgIE5hbWUgICAgICAgID0+ICdOYW1lVXBkYXRlJywKICAgICAgICBEZXBsU3RhdGVJRCA9PiAnRGVwbG95bWVudFN0YXRlVXBkYXRlJywKICAgICAgICBJbmNpU3RhdGVJRCA9PiAnSW5jaWRlbnRTdGF0ZVVwZGF0ZScsCiAgICApOwoKICAgIENIQU5HRToKICAgIGZvciBteSAkS2V5ICgga2V5cyAlQ2hhbmdlZCApIHsKICAgICAgICBuZXh0IENIQU5HRSBpZiAhJEV2ZW50c3skS2V5fTsKCiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJEV2ZW50c3skS2V5fSwKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkQ2hhbmdlZHskS2V5fXtOZXd9IC4gJyUlJyAuICRDaGFuZ2VkeyRLZXl9e09sZH0sCiAgICAgICAgICAgICAgICBPbGQgICAgICAgICAgPT4gJENoYW5nZWR7JEtleX17T2xkfSwKICAgICAgICAgICAgICAgIE5ldyAgICAgICAgICA9PiAkQ2hhbmdlZHskS2V5fXtOZXd9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgQ29uZmlnSXRlbVVwZGF0ZSBidXQgb25seSBpZiB0aGVyZSB3ZXJlIHVwZGF0ZXMKICAgIGlmICggJEFkZFZlcnNpb24gfHwgJFVwZGF0ZVZlcnNpb24gfHwgJUNoYW5nZWQgKSB7CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0NvbmZpZ0l0ZW1VcGRhdGUnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSAuICclJScgLiAkQ29uZmlnSXRlbS0+e051bWJlcn0sCiAgICAgICAgICAgICAgICBPbGREZXBsU3RhdGUgPT4gJENoYW5nZWR7RGVwbFN0YXRlSUR9e09sZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29uZmlnSXRlbUF0dGFjaG1lbnRBZGQoKQoKYWRkcyBhbiBhdHRhY2htZW50IHRvIGEgY29uZmlnIGl0ZW0KCiAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEFkZCgKICAgICAgICBDb25maWdJdGVtSUQgICAgPT4gMSwKICAgICAgICBGaWxlbmFtZSAgICAgICAgPT4gJ2ZpbGVuYW1lJywKICAgICAgICBDb250ZW50ICAgICAgICAgPT4gJ2NvbnRlbnQnLAogICAgICAgIENvbnRlbnRUeXBlICAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1BdHRhY2htZW50QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgRmlsZW5hbWUgQ29udGVudCBDb250ZW50VHlwZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgd3JpdGUgdG8gdmlydHVhbCBmcwogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPldyaXRlKAogICAgICAgIEZpbGVuYW1lICAgID0+ICJDb25maWdJdGVtLyRQYXJhbXtDb25maWdJdGVtSUR9LyRQYXJhbXtGaWxlbmFtZX0iLAogICAgICAgIE1vZGUgICAgICAgID0+ICdiaW5hcnknLAogICAgICAgIENvbnRlbnQgICAgID0+IFwkUGFyYW17Q29udGVudH0sCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBDb250ZW50SUQgICAgPT4gJFBhcmFte0NvbnRlbnRJRH0sCiAgICAgICAgICAgIENvbnRlbnRUeXBlICA9PiAkUGFyYW17Q29udGVudFR5cGV9LAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBlcnJvcgogICAgaWYgKCRTdWNjZXNzKSB7CgogICAgICAgICMgdHJpZ2dlciBBdHRhY2htZW50QWRkLUV2ZW50CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0F0dGFjaG1lbnRBZGRQb3N0JywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRQYXJhbXtGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgPT4gJ0F0dGFjaG1lbnRBZGQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2Fubm90IGFkZCBhdHRhY2htZW50IGZvciBjb25maWcgaXRlbSAkUGFyYW17Q29uZmlnSXRlbUlEfSIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29uZmlnSXRlbUF0dGFjaG1lbnREZWxldGUoKQoKRGVsZXRlIHRoZSBnaXZlbiBmaWxlIGZyb20gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbS4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudERlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLCAgICAgICAgICAgICAgICMgdXNlZCBpbiBldmVudCBoYW5kbGluZywgZS5nLiBmb3IgbG9nZ2luZyB0aGUgaGlzdG9yeQogICAgICAgIEZpbGVuYW1lICAgICA9PiAnUHJvamVjdHBsYW4ucGRmJywgIyBpZGVudGlmaWVzIHRoZSBhdHRhY2htZW50ICh0b2dldGhlciB3aXRoIHRoZSBDb25maWdJdGVtSUQpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1BdHRhY2htZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgRmlsZW5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBwcmVmaXgKICAgIG15ICRGaWxlbmFtZSA9ICdDb25maWdJdGVtLycgLiAkUGFyYW17Q29uZmlnSXRlbUlEfSAuICcvJyAuICRQYXJhbXtGaWxlbmFtZX07CgogICAgIyBkZWxldGUgZmlsZQogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPkRlbGV0ZSgKICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGVycm9yCiAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgIyB0cmlnZ2VyIEF0dGFjaG1lbnREZWxldGVQb3N0LUV2ZW50CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0F0dGFjaG1lbnREZWxldGVQb3N0JywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRQYXJhbXtGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgPT4gJ0F0dGFjaG1lbnREZWxldGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2Fubm90IGRlbGV0ZSBhdHRhY2htZW50ICRGaWxlbmFtZSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1oZWFkMiBDb25maWdJdGVtQXR0YWNobWVudEdldCgpCgpUaGlzIG1ldGhvZCByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IG9uZSBzcGVjaWZpYyBhdHRhY2htZW50LgoKICAgIG15ICRBdHRhY2htZW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiA0LAogICAgICAgIEZpbGVuYW1lICAgICA9PiAndGVzdC50eHQnLAogICAgKTsKCnJldHVybnMKCiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBBbGxQcmVmZXJlbmNlcyA9PiAndGVzdCcsCiAgICAgICAgfSwKICAgICAgICBGaWxlbmFtZSAgICA9PiAndGVzdC50eHQnLAogICAgICAgIENvbnRlbnQgICAgID0+ICdjb250ZW50JywKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgRmlsZXNpemUgICAgPT4gMTIzNDg0MDksCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgfQoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1BdHRhY2htZW50R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmZpZ0l0ZW1JRCBGaWxlbmFtZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcHJlZml4CiAgICBteSAkRmlsZW5hbWUgPSAnQ29uZmlnSXRlbS8nIC4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0gLiAnLycgLiAkUGFyYW17RmlsZW5hbWV9OwoKICAgICMgZmluZCBhbGwgYXR0YWNobWVudHMgb2YgdGhpcyBjb25maWcgaXRlbQogICAgbXkgQEF0dGFjaG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycpLT5GaW5kKAogICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHJldHVybiBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGV4aXN0CiAgICBpZiAoICFAQXR0YWNobWVudHMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgKCRGaWxlbmFtZSkhIiwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhIGZvciBhdHRhY2htZW50CiAgICBteSAlQXR0YWNobWVudERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPlJlYWQoCiAgICAgICAgRmlsZW5hbWUgPT4gJEZpbGVuYW1lLAogICAgICAgIE1vZGUgICAgID0+ICdiaW5hcnknLAogICAgKTsKCiAgICBteSAkQXR0YWNobWVudEluZm8gPSB7CiAgICAgICAgJUF0dGFjaG1lbnREYXRhLAogICAgICAgIEZpbGVuYW1lICAgID0+ICRQYXJhbXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHsgJEF0dGFjaG1lbnREYXRhe0NvbnRlbnR9IH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfXtDb250ZW50VHlwZX0sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgIEZpbGVzaXplICAgID0+ICRBdHRhY2htZW50RGF0YXtQcmVmZXJlbmNlc317RmlsZXNpemVSYXd9LAogICAgfTsKCiAgICByZXR1cm4gJEF0dGFjaG1lbnRJbmZvOwp9Cgo9aGVhZDIgQ29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KCkKClJldHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgYXR0YWNobWVudHMgb2YgdGhlIGdpdmVuIGNvbmZpZyBpdGVtLgoKICAgIG15IEBBdHRhY2htZW50cyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7CgpyZXR1cm5zCgogICAgQEF0dGFjaG1lbnRzID0gKAogICAgICAgICdmaWxlbmFtZS50eHQnLAogICAgICAgICdvdGhlcl9maWxlLnBkZicsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1BdHRhY2htZW50TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29uZmlnSXRlbUlEIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZmluZCBhbGwgYXR0YWNobWVudHMgb2YgdGhpcyBjb25maWcgaXRlbQogICAgbXkgQEF0dGFjaG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycpLT5GaW5kKAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIH0sCiAgICApOwoKICAgIGZvciBteSAkRmlsZW5hbWUgKEBBdHRhY2htZW50cykgewoKICAgICAgICAjIHJlbW92ZSBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIGZpbGVuYW1lCiAgICAgICAgJEZpbGVuYW1lID1+IHN7IFxBIENvbmZpZ0l0ZW0gLyBcZCsgLyB9e314bXM7CiAgICB9CgogICAgcmV0dXJuIEBBdHRhY2htZW50czsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1BdHRhY2htZW50RXhpc3RzKCkKCkNoZWNrcyBpZiBhIGZpbGUgd2l0aCBhIGdpdmVuIGZpbGVuYW1lIGV4aXN0cy4KCiAgICBteSAkRXhpc3RzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50RXhpc3RzKAogICAgICAgIEZpbGVuYW1lID0+ICd0ZXN0LnR4dCcsCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtQXR0YWNobWVudEV4aXN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmlsZW5hbWUgQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPkZpbmQoCiAgICAgICAgRmlsZW5hbWUgPT4gJ0NvbmZpZ0l0ZW0vJyAuICRQYXJhbXtDb25maWdJdGVtSUR9IC4gJy8nIC4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb25maWdJdGVtTG9va3VwKCkKClRoaXMgbWV0aG9kIGRvZXMgYSBsb29rdXAgZm9yIGEgY29uZmlnLWl0ZW0uIElmIGEgY29uZmlnLWl0ZW0gaWQgaXMgZ2l2ZW4sCml0IHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY29uZmlnLWl0ZW0uIElmIGEgY29uZmlnLWl0ZW0gbnVtYmVyIGlzIGdpdmVuLAp0aGUgYXBwcm9wcmlhdGUgaWQgaXMgcmV0dXJuZWQuCgogICAgbXkgJE51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjM0LAogICAgKTsKCm9yCgogICAgbXkgJElEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1Mb29rdXAoCiAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAxMDAwMDAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgKCRLZXkpID0gZmlyc3QgeyAkUGFyYW17JF99IH0gcXcoQ29uZmlnSXRlbUlEIENvbmZpZ0l0ZW1OdW1iZXIpOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJEtleSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29uZmlnSXRlbUlEIG9yIENvbmZpZ0l0ZW1OdW1iZXIhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiByZXN1bHQgaXMgY2FjaGVkIHJldHVybiB0aGF0IHJlc3VsdAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9e0NvbmZpZ0l0ZW1Mb29rdXB9eyRLZXl9eyAkUGFyYW17JEtleX0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9e0NvbmZpZ0l0ZW1Mb29rdXB9eyRLZXl9eyAkUGFyYW17JEtleX0gfTsKCiAgICAjIHNldCB0aGUgYXBwcm9wcmlhdGUgU1FMIHN0YXRlbWVudAogICAgbXkgJFNRTCA9ICRLZXkgZXEgJ0NvbmZpZ0l0ZW1OdW1iZXInCiAgICAgICAgPwogICAgICAgICdTRUxFQ1QgaWQgICAgICAgICAgICAgICAgRlJPTSBjb25maWdpdGVtIFdIRVJFIGNvbmZpZ2l0ZW1fbnVtYmVyID0gPycKICAgICAgICA6CiAgICAgICAgJ1NFTEVDVCBjb25maWdpdGVtX251bWJlciBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JzsKCiAgICAjIGZldGNoIHRoZSByZXF1ZXN0ZWQgdmFsdWUKICAgIHJldHVybiB1bmxlc3MgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17JEtleX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkVmFsdWU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRWYWx1ZSA9ICRSb3dbMF07CiAgICB9CgogICAgJFNlbGYtPntDYWNoZX17Q29uZmlnSXRlbUxvb2t1cH17JEtleX17ICRQYXJhbXskS2V5fSB9ID0gJFZhbHVlOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1oZWFkMiBVbmlxdWVOYW1lQ2hlY2soKQoKVGhpcyBtZXRob2QgY2hlY2tzIGFsbCBhbHJlYWR5IGV4aXN0aW5nIGNvbmZpZyBpdGVtcywgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBkb2VzIGFscmVhZHkgZXhpc3QKd2l0aGluIHRoZSBzYW1lIGNvbmZpZyBpdGVtIGNsYXNzIG9yIGFtb25nIGFsbCBjbGFzc2VzLCBkZXBlbmRpbmcgb24gdGhlIFN5c0NvbmZpZyB2YWx1ZSBvZgpVbmlxdWVDSU5hbWU6OlVuaXF1ZW5lc3NDaGVja1Njb3BlIChDbGFzcyBvciBHbG9iYWwpLgoKVGhpcyBtZXRob2QgcmVxdWlyZXMgMyBwYXJhbWV0ZXJzOiBDb25maWdJdGVtSUQsIE5hbWUgYW5kIENsYXNzCiJDb25maWdJdGVtSUQiICBpcyB0aGUgSUQgb2YgdGhlIENvbmZpZ0l0ZW0sIHdoaWNoIGlzIHRvIGJlIGNoZWNrZWQgZm9yIHVuaXF1ZW5lc3MKIk5hbWUiICAgICAgICAgIGlzIHRoZSBjb25maWcgaXRlbSBuYW1lIHRvIGJlIGNoZWNrZWQgZm9yIHVuaXF1ZW5lc3MKIkNsYXNzSUQiICAgICAgIGlzIHRoZSBJRCBvZiB0aGUgY29uZmlnIGl0ZW0ncyBjbGFzcwoKQWxsIHBhcmFtZXRlcnMgYXJlIG1hbmRhdG9yeS4KCiAgICBteSAkRHVwbGljYXRlTmFtZXMgPSAkQ29uZmlnSXRlbU9iamVjdC0+VW5pcXVlTmFtZUNoZWNrKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAnNzMnCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdQQyMwMDUnLAogICAgICAgIENsYXNzSUQgICAgICA9PiAnMzInLAogICAgKTsKClRoZSBnaXZlbiBuYW1lIGlzIG5vdCB1bmlxdWUKCiAgICBteSAkTmFtZUR1cGxpY2F0ZXMgPSBbIDUsIDM1LCA0OCwgXTsgICAgIyBJRHMgb2YgQ29uZmlnSXRlbXMgd2l0aCB0aGUgc2FtZSBuYW1lCgpUaGUgZ2l2ZW4gbmFtZSBpcyB1bmlxdWUKCiAgICBteSAkTmFtZUR1cGxpY2F0ZXMgPSBbXTsKCj1jdXQKCnN1YiBVbmlxdWVOYW1lQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgTmFtZSBDbGFzc0lEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1pc3NpbmcgcGFyYW1ldGVyICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIENvbmZpZ0l0ZW1JRCBwYXJhbSBmb3IgdmFsaWQgZm9ybWF0CiAgICBpZiAoCiAgICAgICAgIUlzSW50ZWdlciggJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKQogICAgICAgICYmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSAmJiAkUGFyYW17Q29uZmlnSXRlbUlEfSBuZSAnTkVXJyApCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIENvbmZpZ0l0ZW1JRCBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciBvciAnTkVXJyIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBOYW1lIHBhcmFtIGZvciB2YWxpZCBmb3JtYXQKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtOYW1lfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIE5hbWUgcGFyYW1ldGVyIG5lZWRzIHRvIGJlIGEgc3RyaW5nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBDbGFzc0lEIHBhcmFtIGZvciB2YWxpZCBmb3JtYXQKICAgIGlmICggIUlzSW50ZWdlciggJFBhcmFte0NsYXNzSUR9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgQ2xhc3NJRCBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIGxpc3QgZm9yIHZhbGlkaXR5CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQ2xhc3NMaXN0KSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuYWJsZSB0byByZXRyaWV2ZSBhIHZhbGlkIGNsYXNzIGxpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgY2xhc3MgbmFtZSBmcm9tIHRoZSBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3MgPSAkQ2xhc3NMaXN0LT57ICRQYXJhbXtDbGFzc0lEfSB9OwoKICAgICMgY2hlY2sgY2xhc3MgZm9yIHZhbGlkaXR5CiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCRDbGFzcykgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmFibGUgdG8gZGV0ZXJtaW5lIGEgY29uZmlnIGl0ZW0gY2xhc3MgdXNpbmcgdGhlIGdpdmVuIENsYXNzSUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGVsc2lmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZXNvbHZlZCBDbGFzc0lEICRQYXJhbXtDbGFzc0lEfSB0byBjbGFzcyAkQ2xhc3MiLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGhlIHVuaXF1ZW5lc3Mgc2NvcGUgZnJvbSBTeXNDb25maWcKICAgIG15ICRTY29wZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVW5pcXVlQ0lOYW1lOjpVbmlxdWVuZXNzQ2hlY2tTY29wZScpOwoKICAgICMgY2hlY2sgc2NvcGUgZm9yIHZhbGlkaXR5CiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCRTY29wZSkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgY29uZmlndXJhdGlvbiBvZiBVbmlxdWVDSU5hbWU6OlVuaXF1ZW5lc3NDaGVja1Njb3BlIGlzIGludmFsaWQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkU2NvcGUgbmUgJ2dsb2JhbCcgJiYgJFNjb3BlIG5lICdjbGFzcycgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmlxdWVDSU5hbWU6OlVuaXF1ZW5lc3NDaGVja1Njb3BlIGlzICRTY29wZSwgYnV0IG11c3QgYmUgZWl0aGVyICIKICAgICAgICAgICAgICAgIC4gIidnbG9iYWwnIG9yICdjbGFzcychIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT57RGVidWd9ID4gMCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzY29wZSBmb3IgY2hlY2tpbmcgdGhlIHVuaXF1ZW5lc3MgaXMgJFNjb3BlIiwKICAgICAgICApOwogICAgfQoKICAgIG15ICVTZWFyY2hDcml0ZXJpYTsKCiAgICAjIGFkZCB0aGUgY29uZmlnIGl0ZW0gY2xhc3MgdG8gdGhlIHNlYXJjaCBjcml0ZXJpYSBpZiB0aGUgdW5pcXVlbmVzcyBzY29wZSBpcyBub3QgZ2xvYmFsCiAgICBpZiAoICRTY29wZSBuZSAnZ2xvYmFsJyApIHsKICAgICAgICAkU2VhcmNoQ3JpdGVyaWF7Q2xhc3NJRHN9ID0gWyAkUGFyYW17Q2xhc3NJRH0gXTsKICAgIH0KCiAgICAkU2VhcmNoQ3JpdGVyaWF7TmFtZX0gPSAkUGFyYW17TmFtZX07CgogICAgIyBzZWFyY2ggZm9yIGEgY29uZmlnIGl0ZW0gbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUKICAgIG15IEBDb25maWdJdGVtSURzID0gJFNlbGYtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgJVNlYXJjaENyaXRlcmlhLAogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknCiAgICApOwoKICAgICMgcmVtb3ZlIHRoZSBwcm92aWRlZCBDb25maWdJdGVtSUQgZnJvbSB0aGUgcmVzdWx0cywgb3RoZXJ3aXNlIHRoZSBkdXBsaWNhdGUgY2hlY2sgd291bGQgZmFpbAogICAgIyBiZWNhdXNlIHRoZSBDb25maWdJdGVtIGl0c2VsZiBpcyBmb3VuZCBhcyBkdXBsaWNhdGUKICAgIG15IEBEdXBsaWNhdGVzID0gZ3JlcCB7ICRfIG5lICRQYXJhbXtDb25maWdJdGVtSUR9IH0gQENvbmZpZ0l0ZW1JRHM7CgogICAgIyBpZiBhIGNvbmZpZyBpdGVtIHdhcyBmb3VuZCwgdGhlIGdpdmVuIG5hbWUgaXMgbm90IHVuaXF1ZQogICAgIyBpZiBubyBjb25maWcgaXRlbSB3YXMgZm91bmQsIHRoZSBnaXZlbiBuYW1lIGlzIHVuaXF1ZQoKICAgICMgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbmZpZyBpdGVtIHNlYXJjaCBmb3IgZHVwbGljYXRlcwogICAgcmV0dXJuIFxARHVwbGljYXRlczsKfQoKPWhlYWQyIEN1ckluY2lTdGF0ZVJlY2FsYygpCgpyZWNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSBhbmQgb2YgY29uZmlnIGl0ZW1zCnRoYXQgYXJlIGxpbmtlZCB0byBpdC4gT25seSBsaW5rcyBiZXR3ZWVuIGNvbmZpZyBpdGVtcyBhcmUgY29uc2lkZXJlZCBoZXJlLiBMaW5rcyB0bwpvciBmcm9tIGNvbmZpZyBpdGVtIHZlcnNpb25zIGFyZSBpZ25vcmVkLgoKVGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgZGVwZW5kcyBvbiB0aGUgaW5jaWRlbnQgc3RhdGVzIHRoYXQgdGhpcyBjb25maWcgaXRlbSBkZXBlbmRzIG9uLgpBIGNoYW5nZSBvZiB0aGUgaW5jaWRlbnQgc3RhdGUgbWlnaHQgaGF2ZSByZXBlcmN1c3Npb25zIG9uIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlCm9mIHRoZSBjb25maWcgaXRlbXMgdGhhdCBkZXBlbmQgb24gdGhpcyBjb25maWcgaXRlbS4KCkl0IGlzIGEgY29tbW9uIHVzZSBjYXNlIHRoYXQgQzxDdXJJbmNpU3RhdGVSZWNhbGMoKT4gaXMgY2FsbGVkIGluIGEgbG9vcCBvdmVyIGEgbGlzdCBvZiBjb25maWcgaXRlbXMuCkV4YW1wbGVzIGFyZSB0aGUgY29uc29sZSBjb21tYW5kIEM8QWRtaW46OklUU006OkluY2lkZW50U3RhdGU6OlJlY2FsY3VsYXRlPiBvciB3aGVuIHRoZSBsaW5raW5nCm9mIHRoZSBjb25maWcgaXRlbXMgaGFzIGNoYW5nZWQuIEZvciBvcHRpbWl6aW5nIHRoYXQgY2FzZSB0aGVyZSBhcmUgdGhlIHBhcmFtZXRlcnMKQzxOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZT4gYW5kIEM8U2Nhbm5lZENvbmZpZ0l0ZW1JRHM+IHdoaWNoIGNhcnJ5IHN0YXRlIGJldHdlZW4KaW52b2NhdGlvbnMgb2YgdGhpcyBtZXRob2QuIFRoZXkgcHJvdmlkZSBjYWNoaW5nIGFuZCBwcmV2ZW50IGluZmluaXRlIGxvb3BzLgoKQ2hhbmdpbmcgdGhlIGluY2lkZW50IHN0YXRlIG9mIGNvbmZpZyBpdGVtcyBoYXMgcmVwZXJjdXNzaW9ucyBvbiBzZXJ2aWNlcy4gVGhlc2UgZWZmZWN0cwphcmUgaGFuZGxlZCBpbiB0aGlzIG1ldGhvZCBhcyB3ZWxsLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkN1ckluY2lTdGF0ZVJlY2FsYygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGUgPT4gJE5ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlLCAgIyBvcHRpb25hbCwgaW5jaWRlbnQgc3RhdGVzIG9mIGFscmVhZHkgY2hlY2tlZCBDSXMKICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyAgICAgICA9PiAkU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsICAgICAgICAjIG9wdGlvbmFsLCBJRHMgYW5kIGluY2lkZW50IHN0YXRlcyBvZiBhbHJlYWR5IGNoZWNrZWQgQ0lzCiAgICApOwoKRm9yIGFzeW5jaHJvbm91cyBleGVjdXRpb24gaXQgaXMgY29udmVuaWVudCB0byBwYXNzIGEgbGlzdCBvZiBjb25maWcgaXRlbXMgdG8gQzxDdXJJbmNpU3RhdGVSZWNhbGMoKT4uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q3VySW5jaVN0YXRlUmVjYWxjKAogICAgICAgIENvbmZpZ0l0ZW1JRHMgICAgICAgICAgICAgID0+IFsgMTIzLCAxMjQsIDEyNSBdLAogICAgKTsKCkluIHRoYXQgY2FzZSB0aGUgbG9vcCBpcyBkaXNjb250aW51ZWQgd2hlbiBhbiBpdGVyYXRpb24gcmVwb3J0ZWQgYSBmYWlsdXJlLgoKPWN1dAoKc3ViIEN1ckluY2lTdGF0ZVJlY2FsYyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlZnVsIGZvciBhc3luYyBleGVjdXRpb24KICAgICMgYWxsIG90aGVyIHBhcmFtZXRlcnMgd2lsbCBiZSBpZ25vcmVkCiAgICBpZiAoICRQYXJhbXtDb25maWdJdGVtSURzfSApIHsKCiAgICAgICAgIyB0aGVzZSBoYXNoZXMgd2lsbCBiZSBmaWxsZWQgaW4gdGhlIGNhbGxzIHRvIEN1ckluY2lTdGF0ZVJlY2FsYwogICAgICAgIG15ICggJU5ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlLCAlU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgKTsKCiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCAkUGFyYW17Q29uZmlnSXRlbUlEc30tPkAqICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5DdXJJbmNpU3RhdGVSZWNhbGMoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGUgPT4gXCVOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZSwKICAgICAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzICAgICAgID0+IFwlU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRTdWNjZXNzOwogICAgICAgIH0KCiAgICAgICAgIyBhbGwgZmluZQogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29uZmlnSXRlbUlEIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCByZWYgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW1ldGVyIENvbmZpZ0l0ZW1JRCBtdXN0IGJlIGEgcGxhaW4gc2NhbGFyIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGluY2lkZW50IGxpbmsgdHlwZXMgYW5kIGRpcmVjdGlvbnMgZnJvbSBjb25maWcuIEUuZy4KICAgICMgeyBEZXBlbmRzT24gPT4gJ0JvdGgnLCBMb2NhdGlvbk9mID0+ICdTb3VyY2UnIH0KICAgIG15ICRJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNOjpDb3JlOjpJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uJyk7CgogICAgIyAkUGFyYW17TmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGV9IGhvbGRzIHRoZSBkZXRlcm1pbmVkIGluY2lkZW50IHN0YXRlcyBvZiB0aGUgY29uc2lkZXJlZCBjb25maWcgaXRlbXMuCiAgICAjIEl0IG1heSBjb250YWluIGNvbnRhaW4gY29udGVudCBmcm9tIHByZXZpb3VzIGNhbGxzIG9mIEN1ckluY2lTdGF0ZVJlY2FsYygpIHNvIHRoYXQgdW5uZWNlc3Nhcnkgd29yawogICAgIyBjYW4gYmUgc2tpcHBlZC4KICAgICMgTmV3IGluY2lkZW50IHN0YXRlcyBhcmUgY2FsY3VsYXRlZCBmcm9tIGFsbCBpbmNpZGVudCBsaW5rIHR5cGVzLgogICAgIyBUaGUgbmV3bHkgZGV0ZXJtaW5lZCBpbmNpZGVudCBzdGF0ZXMgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIsIHNvIHRoYXQgdGhlIGNhbGxlcgogICAgIyBjYW4gcGFzcyBpdCB0byB0aGUgbmV4dCBpdGVyYXRpb24uCiAgICAjIEluY29ycG9yYXRlIGRhdGEgZnJvbSBwcmV2aW91cyBydW4ocykgYW5kIHJlbWVtYmVyIGtub3duIGRhdGEuCiAgICAkUGFyYW17TmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGV9IC8vPSB7fTsKICAgIG15ICRLbm93bk5ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlID0gZGNsb25lKCAkUGFyYW17TmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGV9ICk7CgogICAgIyBSZW1lbWJlciB0aGUgc2Nhbm5lZCBjb25maWcgaXRlbXMKICAgICMgSW5jb3Jwb3JhdGUgZGF0YSBmcm9tIHByZXZpb3VzIHJ1bihzKSBhbmQgcmVtZW1iZXIga25vd24gZGF0YS4KICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30gLy89IHt9OwogICAgbXkgJEtub3duU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPSBkY2xvbmUoICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30gKTsKCiAgICAjIEZpbmQgZGVlcGx5IGNvbm5lY3RlZCBjb25maWcgaXRlbXMgd2l0aCBhbiBpbmNpZGVudCBzdGF0ZS4KICAgICMgVGhlIGRpcmVjdGlvbiBpbiAkSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbiBpcyBpZ25vcmVkIGhlcmUgYmVjYXVzZSBkZXBlbmRlZCBvbiBpdGVtcyBjb3VsZCBjaGFuZ2UKICAgICMgdGhlIGluY2lkZW50IHN0YXRlIG9mIHRoZSBjdXJyZW50IGNvbmZpZyBpdGVtLiBPciBjaGFuZ2VzIGluCiAgICAjIHRoZSBjdXJyZW50IGNvbmZpZyBpdGVtIGNvdWxkIGNoYW5nZSBkb3duc3RyZWFtIGNvbmZpZyBpdGVtcy4KICAgICRTZWxmLT5fRmluZEluY2lDb25maWdJdGVtcygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBJbmNpZGVudExpbmtUeXBlcyAgICA9PiBbIGtleXMgJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24tPiUqIF0sCiAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSwKICAgICk7CgogICAgIyB0byBzdG9yZSB0aGUgcmVsYXRpb24gYmV0d2VlbiBzZXJ2aWNlcyBhbmQgbGlua2VkIENJcwogICAgIyBUaGUgaW5mbyB3aWxsIGJlIHVzZWQgZm9yIHVwZGF0aW5nIHRoZSBzZXJ2aWNlcy4KICAgIG15ICVTZXJ2aWNlQ0lSZWxhdGlvbjsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgbmV3IENJIGluY2lkZW50IHN0YXRlIGZvciBlYWNoIGNvbmZpZ3VyZWQgbGlua3R5cGUKICAgIExJTktUWVBFOgogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAkSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbi0+JSogKSB7CgogICAgICAgICMgZ2V0IHRoZSBkaXJlY3Rpb24KICAgICAgICBteSAkTGlua0RpcmVjdGlvbiA9ICRJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uLT57JExpbmtUeXBlfTsKCiAgICAgICAgIyBpbnZlc3RpZ2F0ZSBhbGwgY29uZmlnIGl0ZW1zIHdpdGggYSB3YXJuaW5nIHN0YXRlCiAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBrZXlzICV7ICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30gfSApIHsKCiAgICAgICAgICAgICMgU2tpcCBjb25maWcgaXRlbXMga25vd24gZnJvbSBwcmV2aW91cyBleGVjdXRpb24ocykuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzU3RyaW5nV2l0aERhdGEoICRLbm93blNjYW5uZWRDb25maWdJdGVtSURzLT57JENvbmZpZ0l0ZW1JRH17VHlwZX0gKQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICRLbm93blNjYW5uZWRDb25maWdJdGVtSURzLT57JENvbmZpZ0l0ZW1JRH17VHlwZX0gZXEgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXskQ29uZmlnSXRlbUlEfXtUeXBlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbnZlc3RpZ2F0ZSBvbmx5IGNvbmZpZyBpdGVtcyB3aXRoIGFuIGluY2lkZW50IHN0YXRlCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIHVubGVzcyAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyRDb25maWdJdGVtSUR9e1R5cGV9IGVxICdpbmNpZGVudCc7CgogICAgICAgICAgICAjIGFubm90YXRlIGxpbmtlZCBjb25maWcgaXRlbXMgd2l0aCBhIHdhcm5pbmcKICAgICAgICAgICAgJFNlbGYtPl9GaW5kV2FybkNvbmZpZ0l0ZW1zKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgIExpbmtUeXBlICAgICAgICAgICAgID0+ICRMaW5rVHlwZSwKICAgICAgICAgICAgICAgIERpcmVjdGlvbiAgICAgICAgICAgID0+ICRMaW5rRGlyZWN0aW9uLAogICAgICAgICAgICAgICAgTnVtYmVyT2ZMaW5rVHlwZXMgICAgPT4gc2NhbGFyIGtleXMgJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24tPiUqLAogICAgICAgICAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIENPTkZJR0lURU1JRDoKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQga2V5cyAleyAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9IH0gKSB7CgogICAgICAgICAgICAjIFNraXAgY29uZmlnIGl0ZW1zIGtub3duIGZyb20gcHJldmlvdXMgZXhlY3V0aW9uKHMpLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBJc1N0cmluZ1dpdGhEYXRhKCAkS25vd25TY2FubmVkQ29uZmlnSXRlbUlEcy0+eyRDb25maWdJdGVtSUR9e1R5cGV9ICkKICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAkS25vd25TY2FubmVkQ29uZmlnSXRlbUlEcy0+eyRDb25maWdJdGVtSUR9e1R5cGV9IGVxICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc317JENvbmZpZ0l0ZW1JRH17VHlwZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXh0cmFjdCBpbmNpZGVudCBzdGF0ZSB0eXBlCiAgICAgICAgICAgIG15ICRJbmNpU3RhdGVUeXBlID0gJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXskQ29uZmlnSXRlbUlEfXtUeXBlfTsKCiAgICAgICAgICAgICMgRmluZCBhbGwgbGlua2VkIHNlcnZpY2VzIG9mIHRoaXMgY29uZmlnIGl0ZW0uCiAgICAgICAgICAgICMgVGhlc2Uga2luZCBvZiBsaW5rcyBhcmUgbm90IGF2YWlsYWJsZSBmcm9tIHRoZSB0YWJsZSBjb25maWdpdGVtX2xpbmsKICAgICAgICAgICAgbXkgJUxpbmtlZFNlcnZpY2VJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rS2V5TGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdDEgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgS2V5MSAgICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBPYmplY3QyICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgRGlyZWN0aW9uID0+ICRMaW5rRGlyZWN0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBTRVJWSUNFSUQ6CiAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVMaW5rZWRTZXJ2aWNlSURzICkgewoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhlIENJcyB0aGF0IGFyZSBsaW5rZWQgd2l0aCB0aGlzIHNlcnZpY2UKICAgICAgICAgICAgICAgICRTZXJ2aWNlQ0lSZWxhdGlvbnskU2VydmljZUlEfSAvLz0gW107CiAgICAgICAgICAgICAgICBwdXNoICRTZXJ2aWNlQ0lSZWxhdGlvbnskU2VydmljZUlEfS0+QCosICRDb25maWdJdGVtSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICRJbmNpU3RhdGVUeXBlIGVxICdpbmNpZGVudCc7CgogICAgICAgICAgICAkUGFyYW17TmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGV9eyRDb25maWdJdGVtSUR9ID0gJEluY2lTdGF0ZVR5cGU7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBsaXN0IG9mIHdhcm5pbmdzCiAgICBteSAkV2FyblN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICd3YXJuaW5nJywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICFkZWZpbmVkICRXYXJuU3RhdGVMaXN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZSBXYXJuaW5nIGNhbm5vdCBiZSBpbnZhbGlkLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlUmV2ZXJzZVdhcm5TdGF0ZUxpc3QgPSByZXZlcnNlICV7JFdhcm5TdGF0ZUxpc3R9OwogICAgbXkgQFNvcnRlZFdhcm5MaXN0ICAgICAgID0gc29ydCBrZXlzICVSZXZlcnNlV2FyblN0YXRlTGlzdDsKICAgIG15ICRXYXJuaW5nU3RhdGVJRCAgICAgICA9ICRSZXZlcnNlV2FyblN0YXRlTGlzdHtXYXJuaW5nfSB8fCAkUmV2ZXJzZVdhcm5TdGF0ZUxpc3R7ICRTb3J0ZWRXYXJuTGlzdFswXSB9OwogICAgbXkgJENhY2hlT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBzZXQgdGhlIG5ldyBjdXJyZW50IGluY2lkZW50IHN0YXRlIGZvciBDSXMKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBrZXlzICRQYXJhbXtOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZX0tPiUqICkgewoKICAgICAgICAjIFNraXAgY29uZmlnIGl0ZW1zIGtub3duIGZyb20gcHJldmlvdXMgZXhlY3V0aW9uKHMpLgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNTdHJpbmdXaXRoRGF0YSggJEtub3duTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGUtPnskQ29uZmlnSXRlbUlEfSApCiAgICAgICAgICAgICYmICRLbm93bk5ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlLT57JENvbmZpZ0l0ZW1JRH0gZXEgJFBhcmFte05ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlfXskQ29uZmlnSXRlbUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG5ldyBpbmNpZGVudCBzdGF0ZSB0eXBlIChjYW4gb25seSBiZSAnb3BlcmF0aW9uYWwnIG9yICd3YXJuaW5nJykKICAgICAgICBteSAkSW5jaVN0YXRlVHlwZSA9ICRQYXJhbXtOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZX17JENvbmZpZ0l0ZW1JRH07CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbgogICAgICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICBteSAkQ3VySW5jaVN0YXRlSUQ7CiAgICAgICAgaWYgKCAkSW5jaVN0YXRlVHlwZSBlcSAnd2FybmluZycgKSB7CgogICAgICAgICAgICAjIGNoZWNrIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIHR5cGUgaXMgaW4gJ2luY2lkZW50JwogICAgICAgICAgICAjIHRoZW4gd2UgZG8gbm90IHdhbnQgdG8gY2hhbmdlIGl0IHRvIHdhcm5pbmcKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJExhc3RWZXJzaW9uLT57SW5jaVN0YXRlVHlwZX0gZXEgJ2luY2lkZW50JzsKCiAgICAgICAgICAgICRDdXJJbmNpU3RhdGVJRCA9ICRXYXJuaW5nU3RhdGVJRDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkSW5jaVN0YXRlVHlwZSBlcSAnb3BlcmF0aW9uYWwnICkgewogICAgICAgICAgICAkQ3VySW5jaVN0YXRlSUQgPSAkTGFzdFZlcnNpb24tPntJbmNpU3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIE5vIHVwZGF0ZSBuZWNlc3NhcnkgaWYgaW5jaWRlbnQgc3RhdGUgaWQgb2YgdmVyc2lvbiBhbmQgY29uZmlnIGl0ZW0gbWF0Y2guCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJExhc3RWZXJzaW9uLT57Q3VySW5jaVN0YXRlSUR9IGVxICRDdXJJbmNpU3RhdGVJRDsKCiAgICAgICAgIyB1cGRhdGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIGNvbmZpZ2l0ZW0gU0VUIGN1cl9pbmNpX3N0YXRlX2lkID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDdXJJbmNpU3RhdGVJRCwgXCRDb25maWdJdGVtSUQgXSwKICAgICAgICApOwoKICAgICAgICAjIFRPRE86IEFsc28gdGhlIFZlcnNpb25JRC1jYWNoZXMgaGF2ZSB0byBiZSBjb25zaWRlcmVkLCB0aGV5IGFsc28gY29udGFpbiBDdXJJbmNpU3RhdGUKICAgICAgICAjIGRlbGV0ZSB0aGUgY2FjaGUKICAgICAgICBmb3IgbXkgJERGRGF0YSAoIDAsIDEgKSB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICBLZXkgID0+IGpvaW4oCiAgICAgICAgICAgICAgICAgICAgJzo6JywgJ0NvbmZpZ0l0ZW1HZXQnLAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgICAgIERGRGF0YSAgICAgICA9PiAkREZEYXRhCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSB0eXBlIGZvciBlYWNoIHNlcnZpY2UgKGluZmx1ZW5jZWQgYnkgbGlua2VkIENJcykKICAgIFNFUlZJQ0VJRDoKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlQ0lSZWxhdGlvbiApIHsKCiAgICAgICAgIyBzZXQgZGVmYXVsdCBpbmNpZGVudCBzdGF0ZSB0eXBlCiAgICAgICAgbXkgJEN1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzID0gJ29wZXJhdGlvbmFsJzsKCiAgICAgICAgIyBnZXQgdGhlIHVuaXF1ZSBjb25maWcgaXRlbSBpZHMgd2hpY2ggYXJlIGRpcmVjdGx5IGxpbmtlZCB0byB0aGlzIHNlcnZpY2UKICAgICAgICBteSAlVW5pcXVlQ29uZmlnSXRlbUlEcyA9IG1hcCB7ICRfID0+IDEgfSAkU2VydmljZUNJUmVsYXRpb257JFNlcnZpY2VJRH0tPkAqOwoKICAgICAgICAjIGludmVzdGlnYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIGVhY2ggY29uZmlnIGl0ZW0KICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IGtleXMgJVVuaXF1ZUNvbmZpZ0l0ZW1JRHMgKSB7CgogICAgICAgICAgICAjIGdldCBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgICAgIG15ICRDb25maWdJdGVtRGF0YSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBDYWNoZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICRDb25maWdJdGVtRGF0YS0+e0N1ckRlcGxTdGF0ZVR5cGV9IG5lICdwcm9kdWN0aXZlJzsKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJENvbmZpZ0l0ZW1EYXRhLT57Q3VySW5jaVN0YXRlVHlwZX0gZXEgJ29wZXJhdGlvbmFsJzsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBtdXN0IGJlIHNldCB0byAnd2FybmluZycKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnd2FybmluZycgKSB7CiAgICAgICAgICAgICAgICAkQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMgPSAnd2FybmluZyc7CgogICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBtdXN0IGJlIHNldCB0byAnaW5jaWRlbnQnCiAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW1EYXRhLT57Q3VySW5jaVN0YXRlVHlwZX0gZXEgJ2luY2lkZW50JyApIHsKICAgICAgICAgICAgICAgICRDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcyA9ICdpbmNpZGVudCc7CgogICAgICAgICAgICAgICAgbGFzdCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIHR5cGUgZnJvbSBDSXMgb2YgdGhlIHNlcnZpY2UKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0N1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcywKICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQoKcmV0dXJucyB0aGUgYXR0cmlidXRlcyBhIGNvbmZpZyBpdGVtIGNhbiBoYXZlIG9uIHRoZSBzeXN0ZW0uCgogICAgbXkgJUF0dHJpYnV0ZXMgPSAkVGlja2V0T2JqZWN0LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gKDB8MSksICAgICAgICAgIyAob3B0aW9uYWwpIGlmIGR5bmFtaWMgZmllbGQgbmFtZXMgYXJlIGluY2x1ZGVkLCBkZWZhdWx0IDAKICAgICAgICBWZXJzaW9uICAgICAgID0+ICgwfDEpLCAgICAgICAgICMgKG9wdGlvbmFsKSBpZiB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIGluY2x1ZGVkLCBkZWZhdWx0IDEKICAgICAgICBFZGl0TWFzayAgICAgID0+ICgwfDEpLCAgICAgICAgICMgKG9wdGlvbmFsKSBpZiBlZGl0IG1hc2sgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBiYWNrZW5kIGF0dHJpYnV0ZXMsIGRlZmF1bHQgMAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte1ZlcnNpb259IC8vPSAxOwoKICAgIG15ICVDb25maWdJdGVtQXR0cmlidXRlczsKCiAgICBpZiAoICRQYXJhbXtFZGl0TWFza30gKSB7CiAgICAgICAgJUNvbmZpZ0l0ZW1BdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBEZXBsU3RhdGVJRCAgID0+IDEsCiAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgPT4gMSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICBWZXJzaW9uU3RyaW5nID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICVDb25maWdJdGVtQXR0cmlidXRlcyA9ICgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgPT4gMSwKICAgICAgICAgICAgTnVtYmVyICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2xhc3NlcyAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgPT4gMSwKICAgICAgICAgICAgQ3VyRGVwbFN0YXRlcyAgPT4gMSwKICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgPT4gMSwKICAgICAgICAgICAgQ3VySW5jaVN0YXRlcyAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGlmIHJlcXVlc3RlZCwgc2V0IHZlcnNpb24gYXR0cmlidXRlcwogICAgICAgIGlmICggJFBhcmFte1ZlcnNpb259ICkgewogICAgICAgICAgICAlQ29uZmlnSXRlbUF0dHJpYnV0ZXMgPSAoCiAgICAgICAgICAgICAgICAlQ29uZmlnSXRlbUF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBWZXJzaW9uU3RyaW5nID0+IDEsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgID0+IDEsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgID0+IDEsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVzICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgZHluYW1pYyBmaWVsZHMgbmVlZCB0byBiZSBhZGRlZAogICAgaWYgKCAkUGFyYW17RHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3QoCiAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBSZXN1bHRUeXBlID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEZpZWxkTmFtZSAoIHZhbHVlcyAkRHluYW1pY0ZpZWxkcy0+JSogKSB7CiAgICAgICAgICAgICRDb25maWdJdGVtQXR0cmlidXRlc3siRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlQ29uZmlnSXRlbUF0dHJpYnV0ZXM7Cn0KCj1oZWFkMSBJTlRFUk5BTCBJTlRFUkZBQ0UKCj1oZWFkMiBfRmluZEluY2lDb25maWdJdGVtcygpCgpmaW5kIGNvbm5lY3RlZCBjb25maWcgaXRlbXMgd2l0aCBhbiBpbmNpZGVudCBzdGF0ZS4KCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+X0ZpbmRJbmNpQ29uZmlnSXRlbXMoCiAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBJbmNpZGVudExpbmtUeXBlcyAgICA9PiBbIGtleXMgJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24tPiUqIF0sCiAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gXCVTY2FubmVkQ29uZmlnSXRlbUlEcywKICAgICk7CgpUaGUgc2Nhbm5lZCBjb25maWcgaXRlbXMgd2lsbCBiZSBlbnRlcmVkIGluIHRoZSBDPFNjYW5uZWRDb25maWdJdGVtSURzPiBoYXNocmVmLiBFYWNoIGNvbmZpZyBpdGVtIHdpbGwgYmUgc2Nhbm5lZCBvbmx5IG9uY2UuClRoZSBhdHRyaWJ1dGUgQzxUeXBlPiB3aWxsIGJlIGVpdGhlciAnb3BlcmF0aW9uYWwnIG9yICdpbmNpZGVudCcuCgpUaGUgc2VhcmNoIGZvciBjb25maWcgaXRlbXMgd2l0aCBpbmNpZGVudHMgcmVjdXJzZXMgaW50byB0aGUgZ3JhcGggb2YgbGlua2VkIGNvbmZpZyBpdGVtcy4gVGhlIGRpcmVjdGx5CmxpbmtlZCBpdGVtcyB3aWxsIGFsd2F5cyBiZSBjaGVja2VkLiBSZWN1cnNpb24gc3RvcHMgb25jZSBhbiBpbmNpZGVudCBoYXMgYmVlbiBmb3VuZC4KClRoaXMgbWV0aG9kIG9ubHkgY29sbGVjdHMgZGF0YSwgbm8gY3VycmVudCBpbmNpZGVudCBzdGF0ZXMgd2lsbCBiZSBhbHRlcmVkLgoKPWN1dAoKc3ViIF9GaW5kSW5jaUNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiB1bmxlc3MgJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgIyBpZ25vcmUgYWxyZWFkeSBzY2FubmVkIGlkcyAoaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uKQogICAgcmV0dXJuIGlmIGRlZmluZWQgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfTsKCiAgICAjIHNldCBhIGRlZmF1bHQgc28gdGhlIENvbmZpZ0l0ZW0gd29uJ3QgYmUgc2Nhbm5lZCBhZ2FpbgogICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfSA9IHt9OwogICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e1R5cGV9ID0gJ29wZXJhdGlvbmFsJzsKCiAgICAjIGFkZCBvd24gY29uZmlnIGl0ZW0gaWQgdG8gbGlzdCBvZiBsaW5rZWQgY29uZmlnIGl0ZW1zCiAgICBteSBAQ29uZmlnSXRlbUlEcyA9ICRQYXJhbXtDb25maWdJdGVtSUR9OwoKICAgICMgZmluZCB0aGUgZGlyZWN0bHkgbGlua2VkIGNvbmZpZyBpdGVtcwogICAgewogICAgICAgICMgRGlyZWN0aW9uIG11c3QgQUxXQVlTIGJlICdCb3RoJyBoZXJlIGFzIHdlIG5lZWQgdG8gaW5jbHVkZQogICAgICAgICMgYWxsIGxpbmtlZCBDSXMgdGhhdCBjb3VsZCBpbmZsdWVuY2UgdGhpcyBvbmUhCiAgICAgICAgbXkgJExpbmtlZENvbmZpZ0l0ZW1zID0gJFNlbGYtPkxpbmtlZENvbmZpZ0l0ZW1zKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFR5cGVzICAgICAgICA9PiAkUGFyYW17SW5jaWRlbnRMaW5rVHlwZXN9LAogICAgICAgICAgICBEaXJlY3Rpb24gICAgPT4gJ0JvdGgnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHJlbWVtYmVyIG9ubHkgdGhlIGxpbmtlZCBjb25maWcgaXRlbSBpZHMsIGlnbm9yZSB0aGUgY29uZmlnIGl0ZW0gdmVyc2lvbnMKICAgICAgICBwdXNoIEBDb25maWdJdGVtSURzLAogICAgICAgICAgICBncmVwIHtkZWZpbmVkfQogICAgICAgICAgICBtYXAgIHsgJF8tPntDb25maWdJdGVtSUR9IH0KICAgICAgICAgICAgJExpbmtlZENvbmZpZ0l0ZW1zLT5AKjsKICAgIH0KCiAgICAjIExvb3Agb3ZlciB0aGUgcmVxdWVzdGVkIGNvbmZpZyBpdGVtIGFuZCB0aGUgZGlyZWN0bHkgbGlua2VkIGNvbmZpZyBpdGVtcwogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IEBDb25maWdJdGVtSURzICkgewoKICAgICAgICAjIGdldCBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgbXkgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENhY2hlICAgICAgICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgV2hlbiBhbiBpbmNpZGVudCB3YXMgZm91bmQsIG1hcmsgdGhlIGNvbmZpZyBpdGVtIGFuZCBzdG9wIHJlY3Vyc2luZwogICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyRDb25maWdJdGVtSUR9e1R5cGV9ID0gJ2luY2lkZW50JzsKCiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEOwogICAgICAgIH0KCiAgICAgICAgIyBubyBpbmNpZGVudCB3YXMgZW5jb3VudGVyZWQsIGNvbnRpbnVlIHdpdGggcmVjdXJzaW9uCiAgICAgICAgIyBfRmluZEluY2lDb25maWdJdGVtcygpIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50ICRQYXJhbXtDb25maWdJdGVtSUR9LgogICAgICAgICMgQnV0IHRoYXQgY2FsbCB3aWxsIGRvIG5vdGhpbmcuCiAgICAgICAgJFNlbGYtPl9GaW5kSW5jaUNvbmZpZ0l0ZW1zKAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBJbmNpZGVudExpbmtUeXBlcyAgICA9PiAkUGFyYW17SW5jaWRlbnRMaW5rVHlwZXN9LAogICAgICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgX0ZpbmRXYXJuQ29uZmlnSXRlbXMoKQoKVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciBjb25maWcgaXRlbSB0aGF0IGFyZSBpbiBhIGluY2lkZW50IG9yIHdhcm5pbmcgc3RhdGUuCkZpbmQgY29ubmVjdGVkIGNvbmZpZyBpdGVtcyBhbmQgYW5ub3RhdGUgdGhlbSB3aXRoIGEgd2FybmluZyBpbiBDPFNjYW5uZWRDb25maWdJdGVtSURzPi4gUHJvcGFnYXRlIHRoZSB3YXJuaW5nLgoKICAgICRDb25maWdJdGVtT2JqZWN0LT5fRmluZFdhcm5Db25maWdJdGVtcygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIExpbmtUeXBlICAgICAgICAgICAgID0+ICRMaW5rVHlwZSwKICAgICAgICBEaXJlY3Rpb24gICAgICAgICAgICA9PiAkTGlua0RpcmVjdGlvbiwKICAgICAgICBOdW1iZXJPZkxpbmtUeXBlcyAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICMganVzdCBmb3IgaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uCiAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gJFNjYW5uZWRDb25maWdJdGVtSURzLAogICAgKTsKCj1jdXQKCnN1YiBfRmluZFdhcm5Db25maWdJdGVtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gdW5sZXNzICRQYXJhbXtDb25maWdJdGVtSUR9OwoKICAgICMgSW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uLgogICAgIyBJZ25vcmUgYWxyZWFkeSBzY2FubmVkIGlkcy4KICAgICMgSXQgaXMgb2sgdGhhdCBhIGNvbmZpZyBpdGVtIGlzIGludmVzdGlnYXRlZCBhcyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBjb25maWd1cmVkIGxpbmsgdHlwZXMgKiBudW1iZXIgb2YgaW5jaWRlbnQgY29uZmlnIGl0ZWVtcwogICAgbXkgJEluY2lkZW50Q291bnQgPSB0cnVlIHsgKCAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyRffXtUeXBlfSB8fCAnJyApIGVxICdpbmNpZGVudCcgfQogICAga2V5cyAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT4lKjsKICAgIGlmICgKICAgICAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9LT57RmluZFdhcm59CiAgICAgICAgJiYKICAgICAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9LT57RmluZFdhcm59ID49ICggJFBhcmFte051bWJlck9mTGlua1R5cGVzfSAqICRJbmNpZGVudENvdW50ICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW5jcmVhc2UgdGhlIHZpc2l0IGNvdW50ZXIKICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc317ICRQYXJhbXtDb25maWdJdGVtSUR9IH0tPntGaW5kV2Fybn0rKzsKCiAgICAjIGZpbmQgY29uZmlnIGl0ZW1zIHRvIHdoaWNoIHRoZSBpbmNpZGVudCBvciB3YXJuaW5nIG11c3QgYmUgcHJvcGFnYXRlZAogICAgbXkgJExpbmtlZENvbmZpZ0l0ZW1zID0gJFNlbGYtPkxpbmtlZENvbmZpZ0l0ZW1zKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBUeXBlcyAgICAgICAgPT4gWyAkUGFyYW17TGlua1R5cGV9IF0sCiAgICAgICAgRGlyZWN0aW9uICAgID0+ICRQYXJhbXtEaXJlY3Rpb259LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKICAgIG15IEBMaW5rZWRDb25maWdJdGVtSURzID0gbWFwIHsgJF8tPntDb25maWdJdGVtSUR9IH0gJExpbmtlZENvbmZpZ0l0ZW1zLT5AKjsKCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQgQExpbmtlZENvbmZpZ0l0ZW1JRHMgKSB7CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uCiAgICAgICAgJFNlbGYtPl9GaW5kV2FybkNvbmZpZ0l0ZW1zKAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBMaW5rVHlwZSAgICAgICAgICAgICA9PiAkUGFyYW17TGlua1R5cGV9LAogICAgICAgICAgICBEaXJlY3Rpb24gICAgICAgICAgICA9PiAkUGFyYW17RGlyZWN0aW9ufSwKICAgICAgICAgICAgTnVtYmVyT2ZMaW5rVHlwZXMgICAgPT4gJFBhcmFte051bWJlck9mTGlua1R5cGVzfSwKICAgICAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAoICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc317JENvbmZpZ0l0ZW1JRH17VHlwZX0gfHwgJycgKSBlcSAnaW5jaWRlbnQnOwoKICAgICAgICAjIHNldCB3YXJuaW5nIHN0YXRlCiAgICAgICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXskQ29uZmlnSXRlbUlEfXtUeXBlfSA9ICd3YXJuaW5nJzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9QcmVwYXJlTGlrZVN0cmluZygpCgppbnRlcm5hbCBmdW5jdGlvbiB0byBwcmVwYXJlIGxpa2Ugc3RyaW5ncwoKICAgICRDb25maWdJdGVtT2JqZWN0LT5fUHJlcGFyZUxpa2VTdHJpbmcoICRTdHJpbmdSZWYgKTsKCj1jdXQKCnN1YiBfUHJlcGFyZUxpa2VTdHJpbmcgewogICAgbXkgKCAkU2VsZiwgJFZhbHVlICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRWYWx1ZTsKICAgIHJldHVybiBpZiByZWYgJFZhbHVlIG5lICdTQ0FMQVInOwoKICAgICMgUXVvdGUKICAgICR7JFZhbHVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdW90ZSggJHskVmFsdWV9LCAnTGlrZScgKTsKCiAgICAjIHJlcGxhY2UgKiB3aXRoICUKICAgICR7JFZhbHVlfSA9fiBzeyBcKisgfXslfXhtc2c7CgogICAgcmV0dXJuOwp9Cgo9aGVhZDEgSVRTTSBDb25maWcgSXRlbSBldmVudHM6CgpDb25maWdJdGVtQ3JlYXRlLCBDb25maWdJdGVtVXBkYXRlLCBWZXJzaW9uQ3JlYXRlLCBWZXJzaW9uVXBkYXRlLCBEZXBsb3ltZW50U3RhdGVVcGRhdGUsIEluY2lkZW50U3RhdGVVcGRhdGUsCkNvbmZpZ0l0ZW1EZWxldGUsIExpbmtBZGQsIExpbmtEZWxldGUsIERlZmluaXRpb25VcGRhdGUsIE5hbWVVcGRhdGUsIERlZmluaXRpb25DcmVhdGUsIFZlcnNpb25EZWxldGUKCj1jdXQKCjE7Cg==</File>
        <File Location="Custom/Kernel/System/ITSMConfigItem/ConfigItemSearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojICRvcmlnaW46IG90b2JvIC0gIC0gS2VybmVsL1N5c3RlbS9JVFNNQ29uZmlnSXRlbS9Db25maWdJdGVtU2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpDb25maWdJdGVtU2VhcmNoOwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKdXNlIHV0Zjg7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoSXNBcnJheVJlZldpdGhEYXRhIElzU3RyaW5nV2l0aERhdGEpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6Q29uZmlnSXRlbVNlYXJjaCAtIHN1YiBtb2R1bGUgb2YgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtIGZvciBjb25maWcgaXRlbSBzZWFyY2gKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGNvbmZpZyBpdGVtIHNlYXJjaCBmdW5jdGlvbnMuIFRoZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB2aWEgdGhlIEM8S2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtPiBvYmplY3QuCgo9aGVhZDIgQ29uZmlnSXRlbVNlYXJjaCgpCgpUbyBmaW5kIGNvbmZpZyBpdGVtcyBpbiB5b3VyIHN5c3RlbS4KCiAgICBteSBAQ29uZmlnSXRlbUlEcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgICMgcmVzdWx0IChvcHRpb25hbCwgZGVmYXVsdCBpcyAnSEFTSCcpCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScgfHwgJ0hBU0gnIHx8ICdDT1VOVCcsCgogICAgICAgICMgbGltaXQgdGhlIG51bWJlciBvZiBmb3VuZCBjb25maWcgaXRlbXMgKG9wdGlvbmFsLCBkZWZhdWx0IGlzIDEwMDAwKQogICAgICAgIExpbWl0ID0+IDEwMCwKCiAgICAgICAgIyBVc2UgQ29uZmlnSXRlbVNlYXJjaCBhcyBhIGNvbmZpZyBpdGVtIGZpbHRlciBvbiBhIHNpbmdsZSBjb25maWcgaXRlbSwKICAgICAgICAjIG9yIGEgcHJlZGVmaW5lZCBjb25maWcgaXRlbSBsaXN0CiAgICAgICAgQ29uZmlnSXRlbUlEICAgICA9PiAxMjM0LAogICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgPT4gWzEyMzQsIDEyMzVdLAoKICAgICAgICAjIGNvbmZpZyBpdGVtIG51bWJlciAob3B0aW9uYWwpIGFzIFNUUklORyBvciBhcyBBUlJBWVJFRgogICAgICAgICMgVGhlIHZhbHVlIHdpbGwgYmUgdHJlYXRlZCBhcyBhIFNRTCBxdWVyeSBleHByZXNzaW9uLgogICAgICAgIE51bWJlciA9PiAnJTEyMzU0NiUnLAogICAgICAgIE51bWJlciA9PiBbJyUxMjM1NDYlJywgJyUxMjM2NjYlJ10sCgogICAgICAgICMgY29uZmlnIGl0ZW0gbmFtZSAob3B0aW9uYWwpIGFzIFNUUklORyBvciBhcyBBUlJBWVJFRgogICAgICAgICMgVGhlIHZhbHVlIHdpbGwgYmUgdHJlYXRlZCBhcyBhIFNRTCBxdWVyeSBleHByZXNzaW9uLgogICAgICAgICMgV2hlbiBDb25kaXRpb25JbmxpbmUgaXMgc2V0IHRoZW4gcmVtYWluaW5nIHdoaXRlc3BhY2Ugd2lsbCBiZSB0cmVhdGVkIGFzIGEgJiYgY29uZGl0aW9uIGFuZAogICAgICAgICMgYW5kIHRoZSBzZXR0aW5ncyBvZiBDb250ZW50U2VhcmNoUHJlZml4IGFuZCBDb250ZW50U2VhcmNoU3VmZml4IHdpbGwgYmUgaG9ub3JlZC4KICAgICAgICBOYW1lID0+ICclU29tZVRleHQlJywKICAgICAgICBOYW1lID0+IFsnJVNvbWVUZXN0MSUnLCAnJVNvbWVUZXN0MiUnXSwKCiAgICAgICAgQ2xhc3NlcyAgICAgICAgID0+IFsnQ29tcHV0ZXInLCAnTmV0d29yayddICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2xhc3NJRHMgICAgICAgID0+IFs5LCA4LCA3LCA2XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIERlcGxTdGF0ZXMgICAgICA9PiBbJ1Byb2R1Y3Rpb24nXSAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIERlcGxTdGF0ZUlEcyAgICA9PiBbMSwgMiwgMywgNF0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBDdXJEZXBsU3RhdGVzICAgPT4gWydQcm9kdWN0aW9uJ10gICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDdXJEZXBsU3RhdGVJRHMgPT4gWzEsIDIsIDMsIDRdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgSW5jaVN0YXRlcyAgICAgID0+IFsnV2FybmluZyddICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW5jaVN0YXRlSURzICAgID0+IFsxLCAyLCAzLCA0XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIEN1ckluY2lTdGF0ZXMgICA9PiBbJ1dhcm5pbmcnXSAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEN1ckluY2lTdGF0ZUlEcyA9PiBbMSwgMiwgMywgNF0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gWzEsIDIsIDNdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gWzMsIDIsIDFdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBEeW5hbWljRmllbGRzCiAgICAgICAgIyAgIEF0IGxlYXN0IG9uZSBvcGVyYXRvciBtdXN0IGJlIHNwZWNpZmllZC4gT3BlcmF0b3JzIHdpbGwgYmUgY29ubmVjdGVkIHdpdGggQU5ELAogICAgICAgICMgICAgICAgdmFsdWVzIGluIGFuIG9wZXJhdG9yIHdpdGggT1IuCiAgICAgICAgIyAgIFlvdSBjYW4gYWxzbyBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gYW4gb3BlcmF0b3I6IFsndmFsdWUxJywgJ3ZhbHVlMiddCiAgICAgICAgRHluYW1pY0ZpZWxkX0ZpZWxkTmFtZVggPT4gewogICAgICAgICAgICBFbXB0eSAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgIyB3aWxsIHJldHVybiBkeW5hbWljIGZpZWxkcyB3aXRob3V0IGEgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2V0IHRvIDAgdG8gc2VhcmNoIGZpZWxkcyB3aXRoIGEgdmFsdWUgcHJlc2VudAogICAgICAgICAgICBFcXVhbHMgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIExpa2UgICAgICAgICAgICAgID0+ICd2YWx1ZSonLCAgICAgICAgICAgICAgICAjICJlcXVhbHMiIG9wZXJhdG9yIHdpdGggd2lsZGNhcmQgc3VwcG9ydAogICAgICAgICAgICBHcmVhdGVyVGhhbiAgICAgICA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIEdyZWF0ZXJUaGFuRXF1YWxzID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgU21hbGxlclRoYW4gICAgICAgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgICAgICBTbWFsbGVyVGhhbkVxdWFscyA9PiAnMjAwMi0wMi0wMiAwMjowMjowMicsCiAgICAgICAgfQoKICAgICAgICAjIGNvbmZpZyBpdGVtcyBjcmVhdGVkIG1vcmUgdGhhbiA2MCBtaW51dGVzIGFnbyAoY29uZmlnIGl0ZW0gb2xkZXIgdGhhbiA2MCBtaW51dGVzKSAgKG9wdGlvbmFsKQogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJNaW51dGVzID0+IDYwLAogICAgICAgICMgY29uZmlnIGl0ZW1zIGNyZWF0ZWQgbGVzcyB0aGFuIDEyMCBtaW51dGVzIGFnbyAoY29uZmlnIGl0ZW0gbmV3ZXIgdGhhbiAxMjAgbWludXRlcykgKG9wdGlvbmFsKQogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJNaW51dGVzID0+IDEyMCwKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjcmVhdGUgdGltZSBhZnRlciAuLi4gKGNvbmZpZyBpdGVtIG5ld2VyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLAogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGJlZm9yZSAuLi4gKGNvbmZpZyBpdGVtIG9sZGVyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLAoKICAgICAgICAjIGNvbmZpZyBpdGVtcyBjaGFuZ2VkIG1vcmUgdGhhbiA2MCBtaW51dGVzIGFnbyAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJNaW51dGVzID0+IDYwLAogICAgICAgICMgY29uZmlnIGl0ZW1zIGNoYW5nZWQgbGVzcyB0aGFuIDEyMCBtaW51dGVzIGFnbyAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJNaW51dGVzID0+IDEyMCwKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYWZ0ZXIgLi4uIChjb25maWcgaXRlbSBjaGFuZ2VkIG5ld2VyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNoYW5nZWQgdGltZSBiZWZvcmUgLi4uIChjb25maWcgaXRlbSBjaGFuZ2VkIG9sZGVyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywKCiAgICAgICAgIyBPcmRlckJ5IChvcHRpb25hbCwgZGVmYXVsdCBpcyAnRG93bicpCiAgICAgICAgT3JkZXJCeSA9PiAnRG93bicsICAjIERvd258VXAKCiAgICAgICAgIyBTb3J0QnkgKG9wdGlvbmFsLCBkZWZhdWx0IGlzICdOdW1iZXInKQogICAgICAgIFNvcnRCeSAgPT4gJ05hbWUnLAoKICAgICAgICAjIE9yZGVyQnkgYW5kIFNvcnRCeSBhcyBBUlJBWSBmb3Igc3ViIHNvcnRpbmcgKG9wdGlvbmFsKQogICAgICAgIE9yZGVyQnkgPT4gWydEb3duJywgJ1VwJ10sCiAgICAgICAgU29ydEJ5ICA9PiBbJ0NvbmZpZ0l0ZW1JRCcsICdOdW1iZXInXSwKCiAgICAgICAgIyB1c2VyIHNlYXJjaAogICAgICAgIFVzZXJJRCAgICAgPT4gMTIzLCAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nIHx8ICdydycsICMgb3B0aW9uYWwsIGRlZmF1bHQgaXMgJ3JvJwoKICAgICAgICAjIENhY2hlVFRMLCBjYWNoZSBzZWFyY2ggcmVzdWx0IGluIHNlY29uZHMgKG9wdGlvbmFsLCB0aGUgZGVmYXVsdCBpcyBmb3VyIG1pbnV0ZXMpCiAgICAgICAgQ2FjaGVUVEwgPT4gNjAgKiAxNSwKCiAgICAgICAgIyBFbi0gb3IgZGlzYWJsZSB1c2FnZSBvZiBRdWVyeUNvbmRpdGlvbjsgY29udHJvbGxpbmcgdGhlIGV2YWx1YXRpb24gb2Ygc29tZSBzcGVjaWFsIGNoYXJhY3RlcnMsIGUuZy4gJysnLCBhcyBzZWFyY2ggb3BlcmF0b3JzCiAgICAgICAgIyBkZWZhdWx0IDEKICAgICAgICBRdWVyeUNvbmRpdGlvbiA9PiAoMXwwKSwKICAgICk7CgpSZXR1cm5zIGZvciBDPFJlc3VsdCA9PiAnQVJSQVknPjoKCiAgICBAQ29uZmlnSXRlbUlEcyA9ICggMSwgMiwgMyApOwoKUmV0dXJucyBmb3IgQzxSZXN1bHQgPT4gJ0hBU0gnPiBvciB3aGVuIG5vIHJlc3VsdCB0eXBlIGlzIHNwZWNpZmllZDoKCiAgICAlQ29uZmlnSXRlbUlEcyA9ICgKICAgICAgICAxID0+ICcyMDEwMTAyNzAwMDAxJywKICAgICAgICAyID0+ICcyMDEwMTAyNzAwMDAyJywKICAgICAgICAzID0+ICcyMDEwMTAyNzAwMDAzJywKICAgICk7CgpSZXR1cm5zIGZvciBDPFJlc3VsdCA9PiAnQ09VTlQnPjoKCiAgICAkTnVtQ29uZmlnSXRlbUlEcyA9IDM7ICMgdGhyZWUgcmVzdWx0cwoKPWN1dAoKIyBUT0RPOiBDaGVjayBhbGwgaW5zdGFuY2VzIHdoZXJlIHRoaXMgaXMgY2FsbGVkLiBDaGFuZ2UgRHluYW1pY0ZpZWxkcywgT3JkZXJCeSAtPiBTb3J0QnksIE9yZGVyQnlEaXJlY3Rpb24gLT4gT3JkZXJCeSwgUmV0dXJuID0+IEFSUkFZIHJldHVybnMgbm90IGEgcmVmCnN1YiBDb25maWdJdGVtU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZhdWx0IHZhbHVlcwogICAgbXkgJFJlc3VsdCAgICAgICAgID0gJFBhcmFte1Jlc3VsdH0gIHx8ICdIQVNIJzsKICAgIG15ICRPcmRlckJ5ICAgICAgICA9ICRQYXJhbXtPcmRlckJ5fSB8fCAnRG93bic7CiAgICBteSAkU29ydEJ5ICAgICAgICAgPSAkUGFyYW17U29ydEJ5fSAgfHwgJ051bWJlcic7CiAgICBteSAkTGltaXQgICAgICAgICAgPSAkUGFyYW17TGltaXR9ICAgfHwgMTAwMDA7CiAgICBteSAkUXVlcnlDb25kaXRpb24gPSAkUGFyYW17UXVlcnlDb25kaXRpb259IC8vIDE7CgogICAgbXkgJVNvcnRPcHRpb25zID0gKAogICAgICAgIENvbmZpZ0l0ZW0gICA9PiAnY2kuY29uZmlnaXRlbV9udW1iZXInLAogICAgICAgIE51bWJlciAgICAgICA9PiAnY2kuY29uZmlnaXRlbV9udW1iZXInLAogICAgICAgIE5hbWUgICAgICAgICA9PiAndi5uYW1lJywKICAgICAgICBEZXBsU3RhdGUgICAgPT4gJ2djX2RlcGwubmFtZScsCiAgICAgICAgSW5jaVN0YXRlICAgID0+ICdnY19pbmNpLm5hbWUnLAogICAgICAgIEN1ckRlcGxTdGF0ZSA9PiAnZ2NfY2RlcGwubmFtZScsCiAgICAgICAgQ3VySW5jaVN0YXRlID0+ICdnY19jaW5jaS5uYW1lJywKICAgICAgICBBZ2UgICAgICAgICAgPT4gJ2NpLmNyZWF0ZV90aW1lJywKICAgICAgICBDcmVhdGVkICAgICAgPT4gJ2NpLmNyZWF0ZV90aW1lJywKICAgICAgICBDaGFuZ2VkICAgICAgPT4gJ2NpLmNoYW5nZV90aW1lJywKICAgICk7CgogICAgIyBjaGVjayB0eXBlcyBvZiBnaXZlbiBhcmd1bWVudHMKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdygKICAgICAgICAgICAgQ29uZmlnSXRlbUlEIENsYXNzSURzIERlcGxTdGF0ZUlEcyBDdXJEZXBsU3RhdGVJRHMgSW5jaVN0YXRlSURzIEN1ckluY2lTdGF0ZUlEcyBDcmVhdGVCeSBDaGFuZ2VCeQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRQYXJhbXskS2V5fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2h5IG5vIHNlYXJjaCBmb3IgJzAnID8/PwogICAgICAgIG5leHQgS0VZIGlmIHJlZiAkUGFyYW17JEtleX0gZXEgJ0FSUkFZJyAmJiBAeyAkUGFyYW17JEtleX0gfTsKCiAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBnaXZlbiBwYXJhbSAnJEtleScgaXMgaW52YWxpZCBvciBhbiBlbXB0eSBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAjIHF1b3RlIGlkIGFycmF5IGVsZW1lbnRzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdygKICAgICAgICAgICAgQ2xhc3NJRHMgRGVwbFN0YXRlSURzIEN1ckRlcGxTdGF0ZUlEcyBJbmNpU3RhdGVJRHMgQ3VySW5jaVN0YXRlSURzIENyZWF0ZUJ5IENoYW5nZUJ5CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICEkUGFyYW17JEtleX07CgogICAgICAgICMgcXVvdGUgZWxlbWVudHMKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JEtleX0gfSApIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkREJPYmplY3QtPlF1b3RlKCAkRWxlbWVudCwgJ0ludGVnZXInICkgKSB7CgogICAgICAgICAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBnaXZlbiBwYXJhbSAnJEVsZW1lbnQnIGluICckS2V5JyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgc29ydC9vcmRlciBieSBvcHRpb25zCiAgICBteSBAU29ydEJ5QXJyYXkgID0gcmVmICRTb3J0QnkgZXEgJ0FSUkFZJyAgPyAkU29ydEJ5LT5AKiAgOiAkU29ydEJ5OwogICAgbXkgQE9yZGVyQnlBcnJheSA9IHJlZiAkT3JkZXJCeSBlcSAnQVJSQVknID8gJE9yZGVyQnktPkAqIDogJE9yZGVyQnk7CgogICAgZm9yIG15ICRDb3VudCAoIDAgLi4gJCNTb3J0QnlBcnJheSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkU29ydE9wdGlvbnN7ICRTb3J0QnlBcnJheVskQ291bnRdIH0KICAgICAgICAgICAgJiYgJFNvcnRCeUFycmF5WyRDb3VudF0gIX4gL15EeW5hbWljRmllbGRfLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCB2YWxpZCBTb3J0QnkgKCcgLiAkU29ydEJ5QXJyYXlbJENvdW50XSAuICcpIScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIFRPRE86IGZhbGwgYmFjayB0byBhIGRlZmF1bHQgb2YgJ1VwJwogICAgICAgIGlmICggJE9yZGVyQnlBcnJheVskQ291bnRdIG5lICdEb3duJyAmJiAkT3JkZXJCeUFycmF5WyRDb3VudF0gbmUgJ1VwJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgdmFsaWQgT3JkZXJCeSAoJyAuICRPcmRlckJ5QXJyYXlbJENvdW50XSAuICcpIScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHNxbAogICAgbXkgJFNRTFNlbGVjdDsKCiAgICAjIFRPRE86IGFkZCB2ZXJzaW9uIHNlYXJjaAogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFNRTFNlbGVjdCA9ICdTRUxFQ1QgQ09VTlQoRElTVElOQ1QoY2kuaWQpKSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMU2VsZWN0ID0gJ1NFTEVDVCBESVNUSU5DVCBjaS5pZCwgY2kuY29uZmlnaXRlbV9udW1iZXInOwogICAgfQoKICAgIG15ICRTUUxGcm9tID0gJyBGUk9NIGNvbmZpZ2l0ZW0gY2knOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCB2ZXJzaW9uIHNlYXJjaCBpbmRleCB0YWJsZSBqb2luCiAgICBteSAkVmVyc2lvblRhYmxlSm9pbmVkOwogICAgaWYgKCAkU2VsZi0+X1ZlcnNpb25TZWFyY2hJbmRleFNRTEpvaW5OZWVkZWQoIFNlYXJjaFBhcmFtcyA9PiBcJVBhcmFtICkgKSB7CiAgICAgICAgJFNRTEZyb20gLj0gJyBJTk5FUiBKT0lOIGNvbmZpZ2l0ZW1fdmVyc2lvbiB2IE9OIGNpLmxhc3RfdmVyc2lvbl9pZCA9IHYuaWQnOwogICAgICAgICRWZXJzaW9uVGFibGVKb2luZWQgPSAxOwogICAgfQoKICAgIG15ICRTUUxFeHQgPSAnIFdIRVJFIDEgPSAxJzsKCiAgICAjIExpbWl0IHRoZSBzZWFyY2ggdG8ganVzdCBvbmUgKG9yIGEgbGlzdCkgQ29uZmlnSXRlbUlECiAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtDb25maWdJdGVtSUR9ICkgfHwgSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApICkgewoKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ2NpLmlkJywKICAgICAgICAgICAgVmFsdWVzICAgID0+IHJlZiAkUGFyYW17Q29uZmlnSXRlbUlEfSBlcSAnQVJSQVknID8gJFBhcmFte0NvbmZpZ0l0ZW1JRH0gOiBbICRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICAgICAgICAgIFF1b3RlVHlwZSA9PiAnSW50ZWdlcicsCiAgICAgICAgICAgIEJpbmRNb2RlICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFNRTEV4dCAuPSAnIEFORCAoICcgLiAkU1FMUXVlcnlJbkNvbmRpdGlvbiAuICcgKSAnOwogICAgfQoKICAgICMgbG9va3VwIGNsYXNzZXMKICAgIGlmICggJFBhcmFte0NsYXNzZXN9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJUNsYXNzTG9va3VwID0gcmV2ZXJzZSAlewogICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgKSAvLyB7fQogICAgICAgIH07CgogICAgICAgIGZvciBteSAkQ2xhc3MgKCBAeyAkUGFyYW17Q2xhc3Nlc30gfSApIHsKCiAgICAgICAgICAgIGlmICggISRDbGFzc0xvb2t1cHskQ2xhc3N9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gSUQgZm9yICRDbGFzcyBmb3VuZCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0NsYXNzSURzfSB9LCAkQ2xhc3NMb29rdXB7JENsYXNzfTsKICAgICAgICB9CiAgICB9CgogICAgIyBwZXJtaXNzaW9ucyBhcmUgaGFuZGxlZCB2aWEgY2xhc3NlcwogICAgaWYgKCAkUGFyYW17VXNlcklEfSAmJiAkUGFyYW17VXNlcklEfSAhPSAxICkgewoKICAgICAgICBteSBAQ2xhc3NJRHMgPSAkUGFyYW17Q2xhc3NJRHN9ID8gJFBhcmFte0NsYXNzSURzfS0+QCogOgogICAgICAgICAgICBrZXlzICV7CiAgICAgICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgICAgICApIC8vIHt9CiAgICAgICAgICAgIH07CgogICAgICAgIG15IEBBbGxvd2VkQ2xhc3NJRHM7CgogICAgICAgIGZvciBteSAkQ2xhc3NJRCAoQENsYXNzSURzKSB7CiAgICAgICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkU2VsZi0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGFyYW17UGVybWlzc2lvbn0gLy8gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSGFzQWNjZXNzKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBbGxvd2VkQ2xhc3NJRHMsICRDbGFzc0lEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWYgIUBBbGxvd2VkQ2xhc3NJRHM7CgogICAgICAgICRQYXJhbXtDbGFzc0lEc30gPSBcQEFsbG93ZWRDbGFzc0lEczsKIyBSb3RoZXIgT1NTLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgIG15ICVBbGxvd2VkR3JvdXBzSGFzaCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtQZXJtaXNzaW9ufSAvLyAncm8nLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgICAgIHJldHVybiBpZiAhJUFsbG93ZWRHcm91cHNIYXNoOwoKICAgICAgICBteSAkSXRlbU1hbmFnZW1lbnRHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW1NYW5hZ2VtZW50R3JvdXAnKTsKCiAgICAgICAgIyBlbmZvcmNlIGdyb3VwIHBlcm1pc3Npb25zIG9ubHkgaWYgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YgdGhlIGNpIG1hbmFnZW1lbnQgZ3JvdXAKICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJEl0ZW1NYW5hZ2VtZW50R3JvdXAgfSB2YWx1ZXMgJUFsbG93ZWRHcm91cHNIYXNoICkgewogICAgICAgICAgICBteSBAQWxsb3dlZEdyb3VwSURzID0ga2V5cyAlQWxsb3dlZEdyb3Vwc0hhc2g7CiAgICAgICAgICAgICRQYXJhbXtHcm91cElEc30gPSBcQEFsbG93ZWRHcm91cElEczsKICAgICAgICB9CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgIH0KCiAgICAjIGNsYXNzIGlkcwogICAgaWYgKCAkUGFyYW17Q2xhc3NJRHN9ICkgewogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnY2kuY2xhc3NfaWQnLAogICAgICAgICAgICBWYWx1ZXMgICAgPT4gJFBhcmFte0NsYXNzSURzfSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggJyAuICRTUUxRdWVyeUluQ29uZGl0aW9uIC4gJyApICc7CiAgICB9CiMgUm90aGVyIE9TUy8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICMgZ3JvdXAgaWRzCiAgICBpZiAoICRQYXJhbXtHcm91cElEc30gKSB7CiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdjaS5ncm91cF9pZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICA9PiAkUGFyYW17R3JvdXBJRHN9LAogICAgICAgICAgICBRdW90ZVR5cGUgPT4gJ0ludGVnZXInLAogICAgICAgICAgICBCaW5kTW9kZSAgPT4gMCwKICAgICAgICApOwogICAgICAgIGlmICgkU1FMUXVlcnlJbkNvbmRpdGlvbikgewogICAgICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggY2kuZ3JvdXBfaWQgSVMgTlVMTCBPUiAnIC4gJFNRTFF1ZXJ5SW5Db25kaXRpb24gLiAnICkgJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgaWYgU1FMUXVlcnlJbkNvbmRpdGlvbiBpcyBlbXB0eQogICAgICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggY2kuZ3JvdXBfaWQgSVMgTlVMTCApICc7CiAgICAgICAgfQogICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgIyBsb29rdXAgZGVwbG95bWVudCBzdGF0ZXMKICAgIGlmICggJFBhcmFte0RlcGxTdGF0ZXN9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJURlcGxTdGF0ZUxvb2t1cCA9IHJldmVyc2UgJXsKICAgICAgICAgICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICAgICApIC8vIHt9CiAgICAgICAgfTsKCiAgICAgICAgZm9yIG15ICREZXBsU3RhdGUgKCBAeyAkUGFyYW17RGVwbFN0YXRlc30gfSApIHsKCiAgICAgICAgICAgIGlmICggISREZXBsU3RhdGVMb29rdXB7JERlcGxTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBJRCBmb3IgJERlcGxTdGF0ZSBmb3VuZCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0RlcGxTdGF0ZUlEc30gfSwgJERlcGxTdGF0ZUxvb2t1cHskRGVwbFN0YXRlfTsKICAgICAgICB9CiAgICB9CgogICAgIyBkZXBsb3ltZW50IHN0YXRlIGlkcwogICAgaWYgKCAkUGFyYW17RGVwbFN0YXRlSURzfSApIHsKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ3YuZGVwbF9zdGF0ZV9pZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICA9PiAkUGFyYW17RGVwbFN0YXRlSURzfSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggJyAuICRTUUxRdWVyeUluQ29uZGl0aW9uIC4gJyApICc7CiAgICB9CgogICAgIyBsb29rdXAgY3VycmVudCBkZXBsb3ltZW50IHN0YXRlcwogICAgaWYgKCAkUGFyYW17Q3VyRGVwbFN0YXRlc30gKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAlQ3VyRGVwbFN0YXRlTG9va3VwID0gcmV2ZXJzZSAlewogICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgICAgICkgLy8ge30KICAgICAgICB9OwoKICAgICAgICBmb3IgbXkgJEN1ckRlcGxTdGF0ZSAoIEB7ICRQYXJhbXtDdXJEZXBsU3RhdGVzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEN1ckRlcGxTdGF0ZUxvb2t1cHskQ3VyRGVwbFN0YXRlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIElEIGZvciAkQ3VyRGVwbFN0YXRlIGZvdW5kISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17Q3VyRGVwbFN0YXRlSURzfSB9LCAkQ3VyRGVwbFN0YXRlTG9va3VweyRDdXJEZXBsU3RhdGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGN1cnJlbnQgZGVwbG95bWVudCBzdGF0ZSBpZHMKICAgIGlmICggJFBhcmFte0N1ckRlcGxTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdjaS5jdXJfZGVwbF9zdGF0ZV9pZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICA9PiAkUGFyYW17Q3VyRGVwbFN0YXRlSURzfSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggJyAuICRTUUxRdWVyeUluQ29uZGl0aW9uIC4gJyApICc7CiAgICB9CgogICAgIyBsb29rdXAgaW5jaWRlbnQgc3RhdGVzCiAgICBpZiAoICRQYXJhbXtJbmNpU3RhdGVzfSApIHsKCiAgICAgICAgIyBnZXQgY2xhc3MgbGlzdAogICAgICAgIG15ICVJbmNpU3RhdGVMb29rdXAgPSByZXZlcnNlICV7CiAgICAgICAgICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgICAgICkgLy8ge30KICAgICAgICB9OwoKICAgICAgICBmb3IgbXkgJEluY2lTdGF0ZSAoIEB7ICRQYXJhbXtJbmNpU3RhdGVzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEluY2lTdGF0ZUxvb2t1cHskSW5jaVN0YXRlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIElEIGZvciAkSW5jaVN0YXRlIGZvdW5kISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17SW5jaVN0YXRlSURzfSB9LCAkSW5jaVN0YXRlTG9va3VweyRJbmNpU3RhdGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGluY2lkZW50IHN0YXRlIGlkcwogICAgaWYgKCAkUGFyYW17SW5jaVN0YXRlSURzfSApIHsKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ3YuaW5jaV9zdGF0ZV9pZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICA9PiAkUGFyYW17SW5jaVN0YXRlSURzfSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggJyAuICRTUUxRdWVyeUluQ29uZGl0aW9uIC4gJyApICc7CiAgICB9CgogICAgIyBsb29rdXAgY3VycmVudCBpbmNpZGVudCBzdGF0ZXMKICAgIGlmICggJFBhcmFte0N1ckluY2lTdGF0ZXN9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJUN1ckluY2lTdGF0ZUxvb2t1cCA9IHJldmVyc2UgJXsKICAgICAgICAgICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICAgICAgKSAvLyB7fQogICAgICAgIH07CgogICAgICAgIGZvciBteSAkQ3VySW5jaVN0YXRlICggQHsgJFBhcmFte0N1ckluY2lTdGF0ZXN9IH0gKSB7CgogICAgICAgICAgICBpZiAoICEkQ3VySW5jaVN0YXRlTG9va3VweyRDdXJJbmNpU3RhdGV9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gSUQgZm9yICRDdXJJbmNpU3RhdGUgZm91bmQhIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtDdXJJbmNpU3RhdGVJRHN9IH0sICRDdXJJbmNpU3RhdGVMb29rdXB7JEN1ckluY2lTdGF0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgaW5jaWRlbnQgc3RhdGUgaWRzCiAgICBpZiAoICRQYXJhbXtDdXJJbmNpU3RhdGVJRHN9ICkgewogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnY2kuY3VyX2luY2lfc3RhdGVfaWQnLAogICAgICAgICAgICBWYWx1ZXMgICAgPT4gJFBhcmFte0N1ckluY2lTdGF0ZUlEc30sCiAgICAgICAgICAgIFF1b3RlVHlwZSA9PiAnSW50ZWdlcicsCiAgICAgICAgICAgIEJpbmRNb2RlICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFNRTEV4dCAuPSAnIEFORCAoICcgLiAkU1FMUXVlcnlJbkNvbmRpdGlvbiAuICcgKSAnOwogICAgfQoKICAgICMgb3RoZXIgY29uZmlnIGl0ZW0gc3R1ZmYKICAgIG15ICVGaWVsZFNRTE1hcCA9ICgKICAgICAgICBOdW1iZXIgICA9PiAnY2kuY29uZmlnaXRlbV9udW1iZXInLAogICAgICAgIE5hbWUgICAgID0+ICd2Lm5hbWUnLAogICAgICAgIENyZWF0ZUJ5ID0+ICdjaS5jcmVhdGVfYnknLAogICAgICAgIENoYW5nZUJ5ID0+ICdjaS5jaGFuZ2VfYnknLAogICAgKTsKCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlRmllbGRTUUxNYXAgKSB7CiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIWRlZmluZWQgJFBhcmFteyRLZXl9OwoKICAgICAgICAjIGlmIGl0J3Mgbm8gcmVmLCBwdXQgaXQgdG8gYXJyYXkgcmVmCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRLZXl9IGVxICcnICkgewogICAgICAgICAgICAkUGFyYW17JEtleX0gPSBbICRQYXJhbXskS2V5fSBdOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jY2VzcyBhcnJheSByZWYKICAgICAgICBteSAkVXNlZCA9IDA7CgogICAgICAgIFZBTFVFOgogICAgICAgIGZvciBteSAkVmFsdWUgKCBAeyAkUGFyYW17JEtleX0gfSApIHsKICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhZGVmaW5lZCAkVmFsdWUgfHwgIWxlbmd0aCAkVmFsdWU7CgogICAgICAgICAgICAkVmFsdWUgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgIyBjaGVjayBzZWFyY2ggYXR0cmlidXRlLCB3ZSBkbyBub3QgbmVlZCB0byBzZWFyY2ggZm9yICoKICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAkVmFsdWUgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICBpZiAoICEkVXNlZCApIHsKICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gJyBBTkQgKCc7CiAgICAgICAgICAgICAgICAkVXNlZCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICcgT1IgJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRRdWVyeUNvbmRpdGlvbikgewoKICAgICAgICAgICAgICAgICMgdXNlIHNlYXJjaCBjb25kaXRpb24gZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICREQk9iamVjdC0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJEZpZWxkU1FMTWFweyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICRGaWVsZFNRTE1hcHskS2V5fSAuICIgPSAnIiAuICREQk9iamVjdC0+UXVvdGUoJFZhbHVlKSAuICInIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRVc2VkKSB7CiAgICAgICAgICAgICRTUUxFeHQgLj0gJyknOwogICAgICAgIH0KICAgIH0KCiAgICAjIFJlbWVtYmVyIGFscmVhZHkgam9pbmVkIHRhYmxlcyBmb3Igc29ydGluZy4KICAgIG15ICVEeW5hbWljRmllbGRKb2luVGFibGVzOwogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyID0gMTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICRQYXJhbU5hbWUgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJFBhcmFtTmFtZSA9fiBtL15EeW5hbWljRmllbGRfKC4rKS87CgogICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJER5bmFtaWNGaWVsZC0+JSogKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+IHFxW05vIHN1Y2ggZHluYW1pYyBmaWVsZCAiJDEiIChvciBpdCBpcyBpbmFjdGl2ZSldLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFNlYXJjaFBhcmFtID0gZGVsZXRlICRQYXJhbXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGQtPntOYW1lfSJ9OwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJFNlYXJjaFBhcmFtOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyByZWYgJFNlYXJjaFBhcmFtIGVxICdIQVNIJzsKCiAgICAgICAgbXkgJE5lZWRKb2luOwogICAgICAgIG15ICRRdWVyeUZvckVtcHR5VmFsdWVzID0gMDsKCiAgICAgICAgZm9yIG15ICRPcGVyYXRvciAoIHNvcnQga2V5cyAkU2VhcmNoUGFyYW0tPiUqICkgewoKICAgICAgICAgICAgbXkgQFNlYXJjaFBhcmFtcyA9ICggcmVmICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gZXEgJ0FSUkFZJyApCiAgICAgICAgICAgICAgICA/IEB7ICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gfQogICAgICAgICAgICAgICAgOiAoICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gKTsKCiAgICAgICAgICAgIG15ICRTUUxFeHRTdWIgPSAnIEFORCAoJzsKICAgICAgICAgICAgbXkgJENvdW50ZXIgICA9IDA7CiAgICAgICAgICAgIFRFWFQ6CiAgICAgICAgICAgIGZvciBteSAkVGV4dCAoQFNlYXJjaFBhcmFtcykgewogICAgICAgICAgICAgICAgbmV4dCBURVhUIHVubGVzcyBkZWZpbmVkICRUZXh0OwogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICRUZXh0IGVxICcnOwoKICAgICAgICAgICAgICAgICRUZXh0ID1+IHMvXCovJS9naTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHNlYXJjaCBhdHRyaWJ1dGUsIHdlIGRvIG5vdCBuZWVkIHRvIHNlYXJjaCBmb3IgKgogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICRUZXh0ID1+IC9eXCV7MSwzfSQvOwoKICAgICAgICAgICAgICAgICMgc2tpcCB2YWxpZGF0aW9uIGZvciBlbXB0eSB2YWx1ZXMKICAgICAgICAgICAgICAgIGlmICggJE9wZXJhdG9yIG5lICdFbXB0eScgKSB7CgogICAgICAgICAgICAgICAgICAgICMgdmFsaWRhdGUgZGF0YSB0eXBlCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBOb1ZhbGlkYXRlUmVnZXggICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9IHx8IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsaWRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHZhbHVlICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkVGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIicgb24gZmllbGQgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGQtPntOYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIichIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRXh0U3ViIC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEVtcHR5ID0+IDEgcmVxdWlyZXMgYSBMRUZUIEpPSU4uCiAgICAgICAgICAgICAgICBpZiAoICRPcGVyYXRvciBlcSAnRW1wdHknICYmICRUZXh0ICkgewogICAgICAgICAgICAgICAgICAgICRTUUxFeHRTdWIgLj0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlNlYXJjaFNRTEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAiZGZ2RW1wdHkkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciAgICAgICAgICAgPT4gJE9wZXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hUZXJtICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkUXVlcnlGb3JFbXB0eVZhbHVlcyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRXh0U3ViIC49ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUFsaWFzICAgICAgICAgPT4gImRmdiREeW5hbWljRmllbGRKb2luQ291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaFRlcm0gICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNRTEV4dFN1YiAuPSAnKSc7CiAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgJFNRTEV4dCAuPSAkU1FMRXh0U3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewoKICAgICAgICAgICAgaWYgKCAhJFZlcnNpb25UYWJsZUpvaW5lZCApIHsKICAgICAgICAgICAgICAgICRTUUxGcm9tIC49ICcgSU5ORVIgSk9JTiBjb25maWdpdGVtX3ZlcnNpb24gdiBPTiBjaS5sYXN0X3ZlcnNpb25faWQgPSB2LmlkJzsKICAgICAgICAgICAgICAgICRWZXJzaW9uVGFibGVKb2luZWQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJFF1ZXJ5Rm9yRW1wdHlWYWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAjIFVzZSBMRUZUIEpPSU4gdG8gYWxsb3cgZm9yIG51bGwgdmFsdWVzLgogICAgICAgICAgICAgICAgJFNRTEZyb20gLj0gIiBMRUZUIEpPSU4gZHluYW1pY19maWVsZF92YWx1ZSBkZnZFbXB0eSREeW5hbWljRmllbGRKb2luQ291bnRlcgogICAgICAgICAgICAgICAgICAgIE9OICh2LmlkID0gZGZ2RW1wdHkkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIub2JqZWN0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnZFbXB0eSREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIgLgogICAgICAgICAgICAgICAgICAgICREQk9iamVjdC0+UXVvdGUoICREeW5hbWljRmllbGQtPntJRH0sICdJbnRlZ2VyJyApIC4gIikgIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTUUxGcm9tIC49ICIgSU5ORVIgSk9JTiBkeW5hbWljX2ZpZWxkX3ZhbHVlIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlcgogICAgICAgICAgICAgICAgICAgIE9OICh2LmlkID0gZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLm9iamVjdF9pZAogICAgICAgICAgICAgICAgICAgICAgICBBTkQgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLmZpZWxkX2lkID0gIiAuCiAgICAgICAgICAgICAgICAgICAgJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKSAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSm9pblRhYmxlc3sgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIjsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRKb2luQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aW1lIG9iamVjdAogICAgIyByZW1lbWJlciBjdXJyZW50IHRpbWUgdG8gcHJldmVudCBzZWFyY2hlcyBmb3IgZnV0dXJlIHRpbWVzdGFtcHMKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtcyBjcmVhdGVkIG9sZGVyL25ld2VyIHRoYW4geCBtaW51dGVzCiAgICBteSAlQ29uZmlnSXRlbVRpbWUgPSAoCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWUgPT4gJ2NpLmNyZWF0ZV90aW1lJywKICAgICk7CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlQ29uZmlnSXRlbVRpbWUgKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtcyBjcmVhdGVkIG9sZGVyIHRoYW4geCBtaW51dGVzCiAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXsgJEtleSAuICdPbGRlck1pbnV0ZXMnIH0gKSB7CgogICAgICAgICAgICAkUGFyYW17ICRLZXkgLiAnT2xkZXJNaW51dGVzJyB9IHx8PSAwOwoKICAgICAgICAgICAgbXkgJFRpbWUgPSAkRGF0ZVRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICRUaW1lLT5TdWJ0cmFjdCggTWludXRlcyA9PiAkUGFyYW17ICRLZXkgLiAnT2xkZXJNaW51dGVzJyB9ICk7CgogICAgICAgICAgICBteSAkVGFyZ2V0VGltZSA9ICRLZXkgZXEgJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lJyA/ICRUaW1lLT5Ub1N0cmluZygpIDogJFRpbWUtPlRvRXBvY2goKTsKCiAgICAgICAgICAgICRTUUxFeHQgLj0gc3ByaW50ZiggIiBBTkQgKCAlcyA8PSAnJXMnICkiLCAkQ29uZmlnSXRlbVRpbWV7JEtleX0sICRUYXJnZXRUaW1lICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb25maWcgaXRlbXMgY3JlYXRlZCBuZXdlciB0aGFuIHggbWludXRlcwogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17ICRLZXkgLiAnTmV3ZXJNaW51dGVzJyB9ICkgewoKICAgICAgICAgICAgJFBhcmFteyAkS2V5IC4gJ05ld2VyTWludXRlcycgfSB8fD0gMDsKCiAgICAgICAgICAgIG15ICRUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgICAgICRUaW1lLT5TdWJ0cmFjdCggTWludXRlcyA9PiAkUGFyYW17ICRLZXkgLiAnTmV3ZXJNaW51dGVzJyB9ICk7CgogICAgICAgICAgICBteSAkVGFyZ2V0VGltZSA9ICRLZXkgZXEgJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lJyA/ICRUaW1lLT5Ub1N0cmluZygpIDogJFRpbWUtPlRvRXBvY2goKTsKCiAgICAgICAgICAgICRTUUxFeHQgLj0gc3ByaW50ZiggIiBBTkQgKCAlcyA+PSAnJXMnICkiLCAkQ29uZmlnSXRlbVRpbWV7JEtleX0sICRUYXJnZXRUaW1lICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtcyBjcmVhdGVkIG9sZGVyL25ld2VyIHRoYW4geHh4eC14eC14eCB4eDp4eCBkYXRlCiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlQ29uZmlnSXRlbVRpbWUgKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtcyBjcmVhdGVkIG9sZGVyIHRoYW4geHh4eC14eC14eCB4eDp4eCBkYXRlCiAgICAgICAgbXkgJENvbXBhcmVPbGRlck5ld2VyRGF0ZTsKICAgICAgICBpZiAoICRQYXJhbXsgJEtleSAuICdPbGRlckRhdGUnIH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIHRpbWUgZm9ybWF0CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRQYXJhbXsgJEtleSAuICdPbGRlckRhdGUnIH0KICAgICAgICAgICAgICAgICF+IC9cZFxkXGRcZC0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCk6KFxkXGR8XGQpLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIHRpbWUgZm9ybWF0ICciIC4gJFBhcmFteyAkS2V5IC4gJ09sZGVyRGF0ZScgfSAuICInISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXsgJEtleSAuICdPbGRlckRhdGUnIH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRUaW1lICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB0aW1lICciCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFBhcmFteyAkS2V5IC4gJ09sZGVyRGF0ZScgfSAuICInISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDb21wYXJlT2xkZXJOZXdlckRhdGUgPSAkVGltZTsKCiAgICAgICAgICAgIG15ICRUYXJnZXRUaW1lID0gJEtleSBlcSAnQ29uZmlnSXRlbUNyZWF0ZVRpbWUnID8gJFRpbWUtPlRvU3RyaW5nKCkgOiAkVGltZS0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgJFNRTEV4dCAuPSBzcHJpbnRmKCAiIEFORCAoICVzIDw9ICclcycgKSIsICRDb25maWdJdGVtVGltZXskS2V5fSwgJFRhcmdldFRpbWUgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtcyBjcmVhdGVkIG5ld2VyIHRoYW4geHh4eC14eC14eCB4eDp4eCBkYXRlCiAgICAgICAgaWYgKCAkUGFyYW17ICRLZXkgLiAnTmV3ZXJEYXRlJyB9ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUGFyYW17ICRLZXkgLiAnTmV3ZXJEYXRlJyB9CiAgICAgICAgICAgICAgICAhfiAvXGRcZFxkXGQtKFxkXGR8XGQpLShcZFxkfFxkKSAoXGRcZHxcZCk6KFxkXGR8XGQpOihcZFxkfFxkKS8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIGZvcm1hdCAnIiAuICRQYXJhbXsgJEtleSAuICdOZXdlckRhdGUnIH0gLiAiJyEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17ICRLZXkgLiAnTmV3ZXJEYXRlJyB9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkVGltZSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIlNlYXJjaCBub3QgZXhlY3V0ZWQgZHVlIHRvIGludmFsaWQgdGltZSAnIgogICAgICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXsgJEtleSAuICdOZXdlckRhdGUnIH0gLiAiJyEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkb24ndCBleGVjdXRlIHF1ZXJpZXMgaWYgbmV3ZXIgZGF0ZSBpcyBhZnRlciBjdXJyZW50IGRhdGUKICAgICAgICAgICAgcmV0dXJuIGlmICRUaW1lID4gJERhdGVUaW1lT2JqZWN0OwoKICAgICAgICAgICAgIyBkb24ndCBleGVjdXRlIHF1ZXJpZXMgaWYgb2xkZXIvbmV3ZXIgZGF0ZSByZXN0cmljdGlvbiBzaG93IG5vdyB2YWxpZCB0aW1lZnJhbWUKICAgICAgICAgICAgcmV0dXJuIGlmICRDb21wYXJlT2xkZXJOZXdlckRhdGUgJiYgJFRpbWUgPiAkQ29tcGFyZU9sZGVyTmV3ZXJEYXRlOwoKICAgICAgICAgICAgbXkgJFRhcmdldFRpbWUgPSAkS2V5IGVxICdDb25maWdJdGVtQ3JlYXRlVGltZScgPyAkVGltZS0+VG9TdHJpbmcoKSA6ICRUaW1lLT5Ub0Vwb2NoKCk7CgogICAgICAgICAgICAkU1FMRXh0IC49IHNwcmludGYoICIgQU5EICggJXMgPj0gJyVzJyApIiwgJENvbmZpZ0l0ZW1UaW1leyRLZXl9LCAkVGFyZ2V0VGltZSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25maWcgaXRlbXMgY2hhbmdlZCBvbGRlciB0aGFuIHggbWludXRlcwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVPbGRlck1pbnV0ZXN9ICkgewoKICAgICAgICAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJNaW51dGVzfSB8fD0gMDsKCiAgICAgICAgbXkgJFRpbWVTdGFtcCA9ICREYXRlVGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAkVGltZVN0YW1wLT5TdWJ0cmFjdCggTWludXRlcyA9PiAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJNaW51dGVzfSApOwoKICAgICAgICAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJEYXRlfSA9ICRUaW1lU3RhbXAtPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGl0ZW1zIGNoYW5nZWQgbmV3ZXIgdGhhbiB4IG1pbnV0ZXMKICAgIGlmICggZGVmaW5lZCAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJNaW51dGVzfSApIHsKCiAgICAgICAgJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU5ld2VyTWludXRlc30gfHw9IDA7CgogICAgICAgIG15ICRUaW1lU3RhbXAgPSAkRGF0ZVRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgJFRpbWVTdGFtcC0+U3VidHJhY3QoIE1pbnV0ZXMgPT4gJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU5ld2VyTWludXRlc30gKTsKCiAgICAgICAgJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZX0gPSAkVGltZVN0YW1wLT5Ub1N0cmluZygpOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtcyBjaGFuZ2VkIG9sZGVyIHRoYW4geHh4eC14eC14eCB4eDp4eCBkYXRlCiAgICBteSAkQ29tcGFyZUxhc3RDaGFuZ2VUaW1lT2xkZXJOZXdlckRhdGU7CiAgICBpZiAoICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVPbGRlckRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIHRpbWUgZm9ybWF0CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJEYXRlfQogICAgICAgICAgICAhfiAvXGRcZFxkXGQtKFxkXGR8XGQpLShcZFxkfFxkKSAoXGRcZHxcZCk6KFxkXGR8XGQpOihcZFxkfFxkKS8KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgdGltZSBmb3JtYXQgJyRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVPbGRlckRhdGV9JyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVPbGRlckRhdGV9LAogICAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRpbWUgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIlNlYXJjaCBub3QgZXhlY3V0ZWQgZHVlIHRvIGludmFsaWQgdGltZSAnIgogICAgICAgICAgICAgICAgICAgIC4gJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU9sZGVyRGF0ZX0gLiAiJyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRDb21wYXJlTGFzdENoYW5nZVRpbWVPbGRlck5ld2VyRGF0ZSA9ICRUaW1lOwoKICAgICAgICAkU1FMRXh0IC49ICIgQU5EIGNpLmNoYW5nZV90aW1lIDw9ICciIC4gJFRpbWUtPlRvU3RyaW5nKCkgLiAiJyI7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGl0ZW1zIGNoYW5nZWQgbmV3ZXIgdGhhbiB4eHh4LXh4LXh4IHh4Onh4IGRhdGUKICAgIGlmICggJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZX0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJEYXRlfQogICAgICAgICAgICAhfiAvXGRcZFxkXGQtKFxkXGR8XGQpLShcZFxkfFxkKSAoXGRcZHxcZCk6KFxkXGR8XGQpOihcZFxkfFxkKS8KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgdGltZSBmb3JtYXQgJyRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVOZXdlckRhdGV9JyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVOZXdlckRhdGV9LAogICAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRpbWUgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIlNlYXJjaCBub3QgZXhlY3V0ZWQgZHVlIHRvIGludmFsaWQgdGltZSAnIgogICAgICAgICAgICAgICAgICAgIC4gJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZX0gLiAiJyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGRvbid0IGV4ZWN1dGUgcXVlcmllcyBpZiBuZXdlciBkYXRlIGlzIGFmdGVyIGN1cnJlbnQgZGF0ZQogICAgICAgIHJldHVybiBpZiAkVGltZSA+ICREYXRlVGltZU9iamVjdDsKCiAgICAgICAgIyBkb24ndCBleGVjdXRlIHF1ZXJpZXMgaWYgb2xkZXIvbmV3ZXIgZGF0ZSByZXN0cmljdGlvbiBzaG93IG5vdyB2YWxpZCB0aW1lZnJhbWUKICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgJENvbXBhcmVMYXN0Q2hhbmdlVGltZU9sZGVyTmV3ZXJEYXRlICYmICRUaW1lID4gJENvbXBhcmVMYXN0Q2hhbmdlVGltZU9sZGVyTmV3ZXJEYXRlOwoKICAgICAgICAkU1FMRXh0IC49ICIgQU5EIGNpLmNoYW5nZV90aW1lID49ICciIC4gJFRpbWUtPlRvU3RyaW5nKCkgLiAiJyI7CiAgICB9CgogICAgIyBkYXRhYmFzZSBxdWVyeSBmb3Igc29ydC9vcmRlciBieSBvcHRpb24KICAgIGlmICggJFJlc3VsdCBuZSAnQ09VTlQnICkgewogICAgICAgICRTUUxFeHQgLj0gJyBPUkRFUiBCWSc7CgogICAgICAgIG15ICVKb2luZWRUYWJsZXM7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDAgLi4gJCNTb3J0QnlBcnJheSApIHsKICAgICAgICAgICAgaWYgKCAkQ291bnQgPiAwICkgewogICAgICAgICAgICAgICAgJFNRTEV4dCAuPSAnLCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc29ydCBieSBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIGlmICggJFNvcnRCeUFycmF5WyRDb3VudF0gPX4gL15EeW5hbWljRmllbGRfKC4qKS8gKSB7CiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICQxOwogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZCAgICAgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJER5bmFtaWNGaWVsZCApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgdmFsaWQgU29ydEJ5ICgnIC4gJFNvcnRCeUFycmF5WyRDb3VudF0gLiAnKSEnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIElmIHRoZSB0YWJsZSB3YXMgYWxyZWFkeSBqb2luZWQgZm9yIHNlYXJjaGluZywgd2UgcmV1c2UgaXQuCiAgICAgICAgICAgICAgICBpZiAoICEkRHluYW1pY0ZpZWxkSm9pblRhYmxlc3skRHluYW1pY0ZpZWxkTmFtZX0gKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRWZXJzaW9uVGFibGVKb2luZWQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTUUxGcm9tIC49ICcgSU5ORVIgSk9JTiBjb25maWdpdGVtX3ZlcnNpb24gdiBPTiBjaS5sYXN0X3ZlcnNpb25faWQgPSB2LmlkJzsKICAgICAgICAgICAgICAgICAgICAgICAgJFZlcnNpb25UYWJsZUpvaW5lZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU1FMRnJvbQogICAgICAgICAgICAgICAgICAgICAgICAuPSAiIExFRlQgT1VURVIgSk9JTiBkeW5hbWljX2ZpZWxkX3ZhbHVlIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlcgogICAgICAgICAgICAgICAgICAgICAgICBPTiAodi5pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIuZmllbGRfaWQgPSAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKSAiOwoKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSm9pblRhYmxlc3sgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIjsKCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJFNRTE9yZGVyRmllbGQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoU1FMT3JkZXJGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBUYWJsZUFsaWFzICAgICAgICAgPT4gJER5bmFtaWNGaWVsZEpvaW5UYWJsZXN7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU1FMU2VsZWN0IC49ICIsICRTUUxPcmRlckZpZWxkICI7CiAgICAgICAgICAgICAgICAkU1FMRXh0ICAgIC49ICIgJFNRTE9yZGVyRmllbGQgIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGpvaW4gdGhlIGdlbmVyYWwgY2F0YWxvZyBmb3Igc29ydGluZwogICAgICAgICAgICAgICAgaWYgKCAkU29ydEJ5QXJyYXlbJENvdW50XSBlcSAnRGVwbFN0YXRlJyAmJiAhJEpvaW5lZFRhYmxlc3tEZXBsU3RhdGV9KysgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTEZyb20gLj0gJyBJTk5FUiBKT0lOIGdlbmVyYWxfY2F0YWxvZyBnY19kZXBsIE9OICh2LmRlcGxfc3RhdGVfaWQgPSBnY19kZXBsLmlkKSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRTb3J0QnlBcnJheVskQ291bnRdIGVxICdJbmNpU3RhdGUnICYmICEkSm9pbmVkVGFibGVze0luY2lTdGF0ZX0rKyApIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRnJvbSAuPSAnIElOTkVSIEpPSU4gZ2VuZXJhbF9jYXRhbG9nIGdjX2luY2kgT04gKHYuaW5jaV9zdGF0ZV9pZCA9IGdjX2luY2kuaWQpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNvcnRCeUFycmF5WyRDb3VudF0gZXEgJ0N1ckRlcGxTdGF0ZScgJiYgISRKb2luZWRUYWJsZXN7Q3VyRGVwbFN0YXRlfSsrICkgewogICAgICAgICAgICAgICAgICAgICRTUUxGcm9tIC49ICcgSU5ORVIgSk9JTiBnZW5lcmFsX2NhdGFsb2cgZ2NfY2RlcGwgT04gKGNpLmN1cl9kZXBsX3N0YXRlX2lkID0gZ2NfY2RlcGwuaWQpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNvcnRCeUFycmF5WyRDb3VudF0gZXEgJ0N1ckluY2lTdGF0ZScgJiYgISRKb2luZWRUYWJsZXN7Q3VySW5jaVN0YXRlfSsrICkgewogICAgICAgICAgICAgICAgICAgICRTUUxGcm9tIC49ICcgSU5ORVIgSk9JTiBnZW5lcmFsX2NhdGFsb2cgZ2NfY2luY2kgT04gKGNpLmN1cl9pbmNpX3N0YXRlX2lkID0gZ2NfY2luY2kuaWQpJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFJlZ3VsYXIgc29ydC4KICAgICAgICAgICAgICAgICRTUUxTZWxlY3QgLj0gJywgJyAuICRTb3J0T3B0aW9uc3sgJFNvcnRCeUFycmF5WyRDb3VudF0gfTsKICAgICAgICAgICAgICAgICRTUUxFeHQgICAgLj0gJyAnIC4gJFNvcnRPcHRpb25zeyAkU29ydEJ5QXJyYXlbJENvdW50XSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRPcmRlckJ5QXJyYXlbJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgJFNRTEV4dCAuPSAnIEFTQyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICcgREVTQyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlT2JqZWN0OwoKICAgIGlmICggJFBhcmFte0NhY2hlVFRMfSApIHsKICAgICAgICAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICBteSAkQ2FjaGVEYXRhID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICAgICBLZXkgID0+ICRTUUxTZWxlY3QgLiAkU1FMRnJvbSAuICRTUUxFeHQgLiAkUmVzdWx0IC4gJExpbWl0LAogICAgICAgICk7CgogICAgICAgIGlmICggZGVmaW5lZCAkQ2FjaGVEYXRhICkgewogICAgICAgICAgICBpZiAoIHJlZiAkQ2FjaGVEYXRhIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAleyRDYWNoZURhdGF9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiBAeyRDYWNoZURhdGF9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRDYWNoZURhdGEgZXEgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGF0YWJhc2UgcXVlcnkKICAgIG15ICVDb25maWdJdGVtczsKICAgIG15IEBDb25maWdJdGVtSURzOwogICAgbXkgJENvdW50OwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUxTZWxlY3QgLiAkU1FMRnJvbSAuICRTUUxFeHQsCiAgICAgICAgTGltaXQgPT4gJExpbWl0CiAgICApOwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDb3VudCA9ICRSb3dbMF07CiAgICAgICAgJENvbmZpZ0l0ZW1zeyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1JRHMsICRSb3dbMF07CiAgICB9CgogICAgIyByZXR1cm4gQ09VTlQKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgIGlmICgkQ2FjaGVPYmplY3QpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMU2VsZWN0IC4gJFNRTEZyb20gLiAkU1FMRXh0IC4gJFJlc3VsdCAuICRMaW1pdCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRQYXJhbXtDYWNoZVRUTH0gfHwgNjAgKiA0LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJENvdW50OwogICAgfQoKICAgICMgcmV0dXJuIEhBU0gKICAgIGVsc2lmICggJFJlc3VsdCBlcSAnSEFTSCcgKSB7CiAgICAgICAgaWYgKCRDYWNoZU9iamVjdCkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxTZWxlY3QgLiAkU1FMRnJvbSAuICRTUUxFeHQgLiAkUmVzdWx0IC4gJExpbWl0LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gXCVDb25maWdJdGVtcywKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRQYXJhbXtDYWNoZVRUTH0gfHwgNjAgKiA0LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJUNvbmZpZ0l0ZW1zOwogICAgfQoKICAgICMgcmV0dXJuIEFSUkFZCiAgICBlbHNlIHsKICAgICAgICBpZiAoJENhY2hlT2JqZWN0KSB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTFNlbGVjdCAuICRTUUxGcm9tIC4gJFNRTEV4dCAuICRSZXN1bHQgLiAkTGltaXQsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkUGFyYW17Q2FjaGVUVEx9IHx8IDYwICogNCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBDb25maWdJdGVtSURzOwogICAgfQp9CgpzdWIgX1ZlcnNpb25TZWFyY2hJbmRleFNRTEpvaW5OZWVkZWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcvTmFtZSBEZXBsU3RhdGVzIEluY2lTdGF0ZXMgRGVwbFN0YXRlSURzIEluY2lTdGF0ZUlEcy8pIHsKICAgICAgICByZXR1cm4gMSBpZiAkUGFyYW17U2VhcmNoUGFyYW1zfXskQXR0cmlidXRlfTsKICAgIH0KCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJFBhcmFte1NlYXJjaFBhcmFtc30tPiUqICkgewogICAgICAgIHJldHVybiAxIGlmICRLZXkgPX4gL15EeW5hbWljRmllbGRfLzsKICAgIH0KCiAgICByZXR1cm47Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/ITSMConfigItem/Event/DoHistory.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtL0V2ZW50L0RvSGlzdG9yeS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkRvSGlzdG9yeTsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgbmFtZXNwYWNlOjphdXRvY2xlYW47CnVzZSB1dGY4OwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5IC0gRXZlbnQgaGFuZGxlciB0aGF0IHJlY29yZHMgdGhlIGhpc3RvcnkKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CgogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkRG9IaXN0b3J5T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICByZXR1cm4gYmxlc3Mge30sICRUeXBlOwp9Cgo9aGVhZDIgUnVuKCkKClRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGV2ZW50LgoKICAgICREb0hpc3RvcnlPYmplY3QtPlJ1bigKICAgICAgICBFdmVudCA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJ25ldyB2YWx1ZTogMScsCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIEV2ZW50IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvciBkeW5hbWljIGZpZWxkcyBmaXJzdCwgbW9zdCBldmVudHMgd2lsbCBiZSB0aGlzLAogICAgIyBSZWFkYWJsZVZhbHVlIGFuZCBSZWFkYWJsZU9sZFZhbHVlIGFyZSBleHBlY3RlZCB0byBiZSBzdHJpbmdzCiAgICBpZiAoICRQYXJhbXtFdmVudH0gPX4gbS9eQ29uZmlnSXRlbUR5bmFtaWNGaWVsZFVwZGF0ZV8vICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0hpc3RvcnlBZGQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17RGF0YX17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdWYWx1ZVVwZGF0ZScsCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAiJFBhcmFte0RhdGF9e0ZpZWxkTmFtZX0lJSRQYXJhbXtEYXRhfXtSZWFkYWJsZU9sZFZhbHVlfSUlJFBhcmFte0RhdGF9e1JlYWRhYmxlVmFsdWV9IiwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkdWUgdG8gY29uc2lzdGVuY3kgd2l0aCB0aWNrZXQgaGlzdG9yeSwgd2UgbmVlZCBIaXN0b3J5VHlwZQogICAgJFBhcmFte0hpc3RvcnlUeXBlfSA9ICRQYXJhbXtFdmVudH07CgogICAgIyBkaXNwYXRjaCB0YWJsZSBmb3IgYWxsIGV2ZW50cwogICAgbXkgJURpc3BhdGNoZXIgPSAoCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZSAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgQ29uZmlnSXRlbVVwZGF0ZSAgICAgID0+IFwmX1JldHVybiwKICAgICAgICBDb25maWdJdGVtRGVsZXRlICAgICAgPT4gXCZfQ29uZmlnSXRlbURlbGV0ZSwKICAgICAgICBMaW5rQWRkICAgICAgICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBMaW5rRGVsZXRlICAgICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBOYW1lVXBkYXRlICAgICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBJbmNpZGVudFN0YXRlVXBkYXRlICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBEZXBsb3ltZW50U3RhdGVVcGRhdGUgPT4gXCZfSGlzdG9yeUFkZCwKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICBHcm91cFVwZGF0ZSAgICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgIERlZmluaXRpb25VcGRhdGUgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIFZlcnNpb25DcmVhdGUgICAgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIFZlcnNpb25VcGRhdGUgICAgICAgICA9PiBcJl9SZXR1cm4sCiAgICAgICAgRGVmaW5pdGlvbkNyZWF0ZSAgICAgID0+IFwmX1JldHVybiwKICAgICAgICBWZXJzaW9uRGVsZXRlICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBBdHRhY2htZW50QWRkUG9zdCAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBBdHRhY2htZW50RGVsZXRlUG9zdCAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICk7CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgaWYgKCAhZXhpc3RzICREaXNwYXRjaGVyeyAkUGFyYW17RXZlbnR9IH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdub24gZXhpc3RlbnQgaGlzdG9yeSB0eXBlOiAnIC4gJFBhcmFte0V2ZW50fSwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIGNhbGxiYWNrCiAgICBteSAkU3ViID0gJERpc3BhdGNoZXJ7ICRQYXJhbXtFdmVudH0gfTsKICAgICRTZWxmLT4kU3ViKAogICAgICAgICVQYXJhbSwKICAgICAgICAleyAkUGFyYW17RGF0YX0gfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMSBJTlRFUk5BTCBJTlRFUkZBQ0UKCj1oZWFkMiBfUmV0dXJuKCkKCmRvIG5vdGhpbmcKCj1jdXQKCnN1YiBfUmV0dXJuIHsgcmV0dXJuIDEgfQoKPWhlYWQyIF9Db25maWdJdGVtRGVsZXRlKCkKCmhpc3RvcnkncyBldmVudCBoYW5kbGVyIGZvciBDb25maWdJdGVtRGVsZXRlCgo9Y3V0CgpzdWIgX0NvbmZpZ0l0ZW1EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBoaXN0b3J5CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+SGlzdG9yeURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0hpc3RvcnlBZGQoKQoKaGlzdG9yeSdzIGRlZmF1bHQgZXZlbnQgaGFuZGxlci4KCj1jdXQKCnN1YiBfSGlzdG9yeUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIGhpc3RvcnkgZW50cnkKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+SGlzdG9yeUFkZCgKICAgICAgICAlUGFyYW0sCiAgICApOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/ITSMConfigItem/Permission.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtL1Blcm1pc3Npb24ucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTGlzdDo6VXRpbCBxdyhhbnkgbm9uZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uIC0gbW9kdWxlIGZvciBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIFBlcm1pc3Npb24gZnVuY3Rpb25zCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBQZXJtaXNzaW9uIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgUGVybWlzc2lvbigpCgpyZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb25zIG9yIG5vdAoKICAgIG15ICRBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFNjb3BlICAgID0+ICdDbGFzcycsICMgQ2xhc3MgfHwgSXRlbQogICAgICAgIENsYXNzSUQgID0+IDEyMywgICAgICMgaWYgU2NvcGUgaXMgJ0NsYXNzJwogICAgICAgIEl0ZW1JRCAgID0+IDEyMywgICAgICMgaWYgU2NvcGUgaXMgJ0l0ZW0nCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgKTsKCm9yIHdpdGhvdXQgbG9nZ2luZywgZm9yIGV4YW1wbGUgZm9yIHRvIGNoZWNrIGlmIGEgbGluay9hY3Rpb24gc2hvdWxkIGJlIHNob3duCgogICAgbXkgJEFjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgU2NvcGUgICAgPT4gJ0NsYXNzJywgIyBDbGFzcyB8fCBJdGVtCiAgICAgICAgQ2xhc3NJRCAgPT4gMTIzLCAgICAgIyBpZiBTY29wZSBpcyAnQ2xhc3MnCiAgICAgICAgSXRlbUlEICAgPT4gMTIzLCAgICAgIyBpZiBTY29wZSBpcyAnSXRlbScKICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBTY29wZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIEl0ZW1JRCBvciBDbGFzc0lEIGRlcGVuZGVudAogICAgIyBvbiB0aGUgU2NvcGUKICAgIGlmICgKICAgICAgICAoICRQYXJhbXtTY29wZX0gZXEgJ0NsYXNzJyAmJiAhJFBhcmFte0NsYXNzSUR9ICkKICAgICAgICB8fAogICAgICAgICggJFBhcmFte1Njb3BlfSBlcSAnSXRlbScgJiYgISRQYXJhbXtJdGVtSUR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIENsYXNzSUQgaWYgU2NvcGUgaXMgJ0NsYXNzJyBvciBJdGVtSUQgaWYgU2NvcGUgaXMgJ0l0ZW0nISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgaWYgKCAkUGFyYW17U2NvcGV9IGVxICdJdGVtJyApIHsKICAgICAgICBteSAkR3JvdXBBdXRoID0gJFNlbGYtPl9JdGVtR3JvdXBDaGVjaygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHVubGVzcyAkR3JvdXBBdXRoOwogICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgIyBSdW4gYWxsIElUU01Db25maWdJdGVtIFBlcm1pc3Npb24gbW9kdWxlcy4KICAgICMKICAgICMgVGhlIGlkZWEgaXMgdGhlIHRoZSBwZXJtaXNzaW9uIG1vZHVsZXMgYXJlIG9yZGVyZWQgYW5kIGNhbiBiZSBkaXZpZGVkIGludG8gdHdvIHBoYXNlcy4KICAgICMgSW4gdGhlIGZpcnN0IHBoYXNlICdSZXF1aXJlZCcgaXMgb24gYW5kICdHcmFudGVkJyBpcyBvZmYuIFRoaXMgYXNzdXJlcyB0aGF0IGFsbCByZXF1aXJlZAogICAgIyBwcmVjb25kaXRpb25zIGFyZSBtZXQuIEluIHRoZSBzZWNvbmQgcGhhc2UgJ1JlcXVpcmVkJyBpcyBvZmYgYW5kICdHcmFudGVkJyBpcyBvbi4gSXQgc3VmZmljZXMKICAgICMgd2hlbiBvbmx5IG9uIHNlY29uZCBwaGFzZSBtb2R1bGUgZ3JhbnRzIGFjY2Vzcy4KICAgICMKICAgICMgT3RoZXIgY29tYmluYXRpb25zIGFyZSBwb3NzaWJsZSBidXQgbWlnaHQgYnJpbmcgc3VycHJpc2luZyByZXN1bHRzLgogICAgaWYgKAogICAgICAgIHJlZiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoICdJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6JyAuICRQYXJhbXtTY29wZX0gKSBlcSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJU1vZHVsZXMgPSAlewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoICdJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6JyAuICRQYXJhbXtTY29wZX0gKQogICAgICAgIH07CiAgICAgICAgTU9EVUxFOgogICAgICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICVNb2R1bGVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IE1PRFVMRSB1bmxlc3MgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICAjIGNyZWF0ZSBvYmplY3QKICAgICAgICAgICAgbXkgJE1vZHVsZU9iamVjdCA9ICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfS0+bmV3OwoKICAgICAgICAgICAgIyBleGVjdXRlIFJ1bigpCiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRNb2R1bGVPYmplY3QtPlJ1biglUGFyYW0pOwoKICAgICAgICAgICAgIyBjaGVjayBncmFudGVkIG9wdGlvbiAoc2hvdWxkIEkgc2F5IG9rKQogICAgICAgICAgICBpZiAoICRBY2Nlc3NPayAmJiAkTW9kdWxlc3skTW9kdWxlfS0+e0dyYW50ZWR9ICkgewoKICAgICAgICAgICAgICAgICMgYWNjZXNzIG9rCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWZ1c2UgYWNjZXNzICBiZWNhdXNlIGFjY2VzcyBpcyBmYWxzZSBidXQgaXQncyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgJiYgJE1vZHVsZXN7JE1vZHVsZX0tPntSZXF1aXJlZH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17TG9nTm99ICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBlcm1pc3Npb24gZGVuaWVkIGJlY2F1c2UgbW9kdWxlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIigkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0pIGlzIHJlcXVpcmVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIihVc2VySUQ6ICRQYXJhbXtVc2VySUR9ICckUGFyYW17VHlwZX0nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIm9uICRQYXJhbXtTY29wZX06ICIgLiAkUGFyYW17ICRQYXJhbXtTY29wZX0gLiAnSUQnIH0gLiAiKSEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZWZ1c2UgYWNjZXNzCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkb24ndCBncmFudCBhY2Nlc3MKICAgIGlmICggISRQYXJhbXtMb2dOb30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUGVybWlzc2lvbiBkZW5pZWQgKFVzZXJJRDogJFBhcmFte1VzZXJJRH0gJyRQYXJhbXtUeXBlfScgIgogICAgICAgICAgICAgICAgLiAib24gJFBhcmFte1Njb3BlfTogIiAuICRQYXJhbXsgJFBhcmFte1Njb3BlfSAuICdJRCcgfSAuICIpISIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBDdXN0b21lclBlcm1pc3Npb24oKQoKcmV0dXJucyB3aGV0aGVyIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9ucyBvciBub3QKCiAgICBteSAkQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICAgICAgTG9nTm8gICAgICAgID0+IDEsICAgICMgb3B0aW9uYWwsIGRvIG5vdCBsb2csIGRlZmF1bHQ6IDAKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJQZXJtaXNzaW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21lckdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKICAgIG15ICVHcm91cExvb2t1cDsKCiAgICBteSAlQ29uZGl0aW9ucyA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXI6OkNvbmZpZ0l0ZW06OlBlcm1pc3Npb25Db25kaXRpb25zJykgLy8ge30gfTsKICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKSApIHsKICAgICAgICAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CgogICAgICAgICMgaWYgZ3JvdXBfaWQgaXMgZGVmaW5lZCwgdGhlbiBpdCBtdXN0IGJlbG9uZyB0byBvbmUgb2YgdGhlIGN1c3RvbWVyIHVzZXIncyBhdXRob3JpemVkIGdyb3VwcwogICAgICAgIHJldHVybiBpZiAkQ29uZmlnSXRlbS0+e0dyb3VwSUR9ICYmIG5vbmUgeyAkXyBlcSAkQ29uZmlnSXRlbS0+e0dyb3VwSUR9IH0gdmFsdWVzICVHcm91cExvb2t1cDsKICAgIH0KIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKICAgIENPTkRJVElPTjoKICAgIGZvciBteSAkQ29uZGl0aW9uU2V0ICggdmFsdWVzICVDb25kaXRpb25zICkgewogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0dyb3Vwc30gJiYgJENvbmRpdGlvblNldC0+e0dyb3Vwc30tPkAqICkgewogICAgICAgICAgICBpZiAoICElR3JvdXBMb29rdXAgKSB7CiAgICAgICAgICAgICAgICAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiBub25lIHsgJEdyb3VwTG9va3VweyRffSB9ICRDb25kaXRpb25TZXQtPntHcm91cHN9LT5AKjsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0NsYXNzZXN9ICkgewogICAgICAgICAgICBteSBAQ2xhc3NlcyA9IHJlZiAkQ29uZGl0aW9uU2V0LT57Q2xhc3Nlc30gPyAkQ29uZGl0aW9uU2V0LT57Q2xhc3Nlc30tPkAqIDogKCAkQ29uZGl0aW9uU2V0LT57Q2xhc3Nlc30gKTsKCiAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmIEBDbGFzc2VzICYmICFncmVwIHsgJF8gZXEgJENvbmZpZ0l0ZW0tPntDbGFzc30gfSBAQ2xhc3NlczsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0RlcGxveW1lbnRTdGF0ZXN9ICkgewogICAgICAgICAgICBteSBARGVwbFN0YXRlcyA9IHJlZiAkQ29uZGl0aW9uU2V0LT57RGVwbG95bWVudFN0YXRlc30gPyAkQ29uZGl0aW9uU2V0LT57RGVwbG95bWVudFN0YXRlc30tPkAqIDogKCAkQ29uZGl0aW9uU2V0LT57RGVwbG95bWVudFN0YXRlc30gKTsKCiAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmIEBEZXBsU3RhdGVzICYmICFncmVwIHsgJF8gZXEgJENvbmZpZ0l0ZW0tPntEZXBsU3RhdGV9IH0gQERlcGxTdGF0ZXM7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDb25kaXRpb25TZXQtPntEeW5hbWljRmllbGRWYWx1ZXN9ICkgewogICAgICAgICAgICBmb3IgbXkgJEZpZWxkTmFtZSAoIGtleXMgJENvbmRpdGlvblNldC0+e0R5bmFtaWNGaWVsZFZhbHVlc30tPiUqICkgewogICAgICAgICAgICAgICAgbXkgJENvbmRpdGlvblZhbHVlID0gJENvbmRpdGlvblNldC0+e0R5bmFtaWNGaWVsZFZhbHVlc317JEZpZWxkTmFtZX0gLy8gJyc7CgogICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ29uZmlnSXRlbS0+eyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmICRDb25kaXRpb25WYWx1ZSBuZSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggIXJlZiAkQ29uZmlnSXRlbS0+eyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmICRDb25kaXRpb25WYWx1ZSBuZSAkQ29uZmlnSXRlbS0+eyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkQ29uZGl0aW9uVmFsdWUgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05ESVRJT04gaWYgJENvbmZpZ0l0ZW0tPnsiRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifS0+QCo7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiBub25lIHsgJF8gZXEgJENvbmRpdGlvblZhbHVlIH0gJENvbmZpZ0l0ZW0tPnsiRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifS0+QCo7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0N1c3RvbWVyVXNlckR5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmICEkQ29uZmlnSXRlbS0+eyAnRHluYW1pY0ZpZWxkXycgLiAkQ29uZGl0aW9uU2V0LT57Q3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgQEN1c3RvbWVyVXNlcnMgPSByZWYgJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJENvbmRpdGlvblNldC0+e0N1c3RvbWVyVXNlckR5bmFtaWNGaWVsZH0gfQogICAgICAgICAgICAgICAgPyAkQ29uZmlnSXRlbS0+eyAnRHluYW1pY0ZpZWxkXycgLiAkQ29uZGl0aW9uU2V0LT57Q3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkfSB9LT5AKgogICAgICAgICAgICAgICAgOiAoICRDb25maWdJdGVtLT57ICdEeW5hbWljRmllbGRfJyAuICRDb25kaXRpb25TZXQtPntDdXN0b21lclVzZXJEeW5hbWljRmllbGR9IH0gKTsKCiAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmIG5vbmUgeyAkXyBlcSAkUGFyYW17VXNlcklEfSB9IEBDdXN0b21lclVzZXJzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZGl0aW9uU2V0LT57Q3VzdG9tZXJDb21wYW55RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBDT05ESVRJT04gaWYgISRDb25maWdJdGVtLT57ICdEeW5hbWljRmllbGRfJyAuICRDb25kaXRpb25TZXQtPntDdXN0b21lckNvbXBhbnlEeW5hbWljRmllbGR9IH07CgogICAgICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW5pZXMgPSByZWYgJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJENvbmRpdGlvblNldC0+e0N1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZH0gfQogICAgICAgICAgICAgICAgPyAkQ29uZmlnSXRlbS0+eyAnRHluYW1pY0ZpZWxkXycgLiAkQ29uZGl0aW9uU2V0LT57Q3VzdG9tZXJDb21wYW55RHluYW1pY0ZpZWxkfSB9LT5AKgogICAgICAgICAgICAgICAgOiAoICRDb25maWdJdGVtLT57ICdEeW5hbWljRmllbGRfJyAuICRDb25kaXRpb25TZXQtPntDdXN0b21lckNvbXBhbnlEeW5hbWljRmllbGR9IH0gKTsKCiAgICAgICAgICAgIG15ICVBY2Nlc3NpYmxlQ3VzdG9tZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKS0+R3JvdXBDb250ZXh0Q3VzdG9tZXJzKAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiBub25lIHsgJEFjY2Vzc2libGVDdXN0b21lcnN7JF99IH0gQEN1c3RvbWVyQ29tcGFuaWVzOwogICAgICAgIH0KCiAgICAgICAgIyBncmFudCBhY2Nlc3MKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZiAoICEkUGFyYW17TG9nTm99ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBlcm1pc3Npb24gZGVuaWVkIChDdXN0b21lclVzZXJJRDogJFBhcmFte1VzZXJJRH0gIgogICAgICAgICAgICAgICAgLiAib24gQ29uZmlnSXRlbTogIiAuICRQYXJhbXtDb25maWdJdGVtSUR9IC4gIikhIiwKICAgICAgICApOwogICAgfQoKICAgICMgZG9uJ3QgZ3JhbnQgYWNjZXNzCiAgICByZXR1cm47Cn0KCiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CnN1YiBfSXRlbUdyb3VwQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgaXRlbSBkYXRhCiAgICBteSAkQ29uZmlnSXRlbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpLT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICk7CgogICAgIyB0aGUgaXRlbSBwZXJtaXNzaW9uIGdyb3VwIGlzIG9wdGlvbmFsLCBzbyBncmFudCBhY2Nlc3MgaWYgaXQgZXhpc3RzIGJ1dCBpcyBub3Qgc2V0CiAgICBteSAkSXRlbVBlcm1pc3Npb24gPSAkQ29uZmlnSXRlbS0+e0dyb3VwSUR9OwogICAgcmV0dXJuIDEgdW5sZXNzICRJdGVtUGVybWlzc2lvbjsKCiAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgbXkgJEl0ZW1NYW5hZ2VtZW50R3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtTWFuYWdlbWVudEdyb3VwJyk7CgogICAgIyBsb29raW5nIGZvciBncm91cCBpZCwgZ3JhbnQgYWNjZXNzIGlmIHVzZXIgaXMgaW4gZ3JvdXAgb3IgaXMgYSBtZW1iZXIgb2YgdGhlIGNpIG1hbmFnZW1lbnQgZ3JvdXAKICAgIGZvciBteSAkR3JvdXBJRCAoIGtleXMgJUdyb3VwcyApIHsKICAgICAgICByZXR1cm4gMSBpZiAkR3JvdXBzeyRHcm91cElEfSBlcSAkSXRlbU1hbmFnZW1lbnRHcm91cCB8fCAkR3JvdXBJRCBlcSAkSXRlbVBlcm1pc3Npb247CiAgICB9CgogICAgIyByZWZ1c2UgYWNjZXNzIHBlciBkZWZhdWx0CiAgICByZXR1cm47Cn0KIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKMTsK</File>
        <File Location="Kernel/Config/Files/XML/ITSMConfigItemMultitenancy.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDaGFuZ2VzIj4KCiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ29uZmlnSXRlbU1hbmFnZW1lbnRHcm91cCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2VtZW50IGdyb3VwIHRoYXQgZXhlbXB0cyBmcm9tIGFueSBjb25maWcgaXRlbSBsZXZlbCBncm91cCByZXN0cmljdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpHZW5lcmFsQ2F0YWxvZzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIj5hZG1pbjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI0NvbmZpZ2l0ZW1Hcm91cCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2RlIGZvciBjb25maWcgaXRlbSBsZXZlbCBncm91cCByZXN0cmljdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpHZW5lcmFsQ2F0YWxvZzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzOjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZyBJdGVtIEdyb3VwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSI+MjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiIFRyYW5zbGF0YWJsZT0iMSI+U2V0IG1vZGUgZm9yIGNvbmZpZyBpdGVtIGxldmVsIGdyb3VwIHJlc3RyaWN0aW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+RGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db25maWdJdGVtR3JvdXA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5PcHRpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hbmRhdG9yeSIgVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4gICAgICAgICAgICAgICAgCiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPiAgICAKCiAgICA8IS0tIE92ZXJyaWRlIHRoZXNlIG9yaWdpbmFsIElUU01Db25maWdJdGVtIHNldHRpbmdzIHRvIGluc2VydCB0aGUgR3JvdXBVcGRhdGUgZXZlbnQgLS0+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RXZlbnRNb2R1bGVQb3N0IyMjMTAwLUhpc3RvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNQ29uZmlnSXRlbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkRvSGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDb25maWdJdGVtQ3JlYXRlfFZlcnNpb25DcmVhdGV8RGVwbG95bWVudFN0YXRlVXBkYXRlfEluY2lkZW50U3RhdGVVcGRhdGV8Q29uZmlnSXRlbURlbGV0ZXxMaW5rQWRkfExpbmtEZWxldGV8RGVmaW5pdGlvblVwZGF0ZXxOYW1lVXBkYXRlfFZlcnNpb25EZWxldGV8QXR0YWNobWVudEFkZFBvc3R8QXR0YWNobWVudERlbGV0ZVBvc3R8Q29uZmlnSXRlbUR5bmFtaWNGaWVsZHxHcm91cFVwZGF0ZXxDb25maWdJdGVtVXBkYXRlfFZlcnNpb25VcGRhdGUpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJFdmVudHMjIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIGFsbCBQYWNrYWdlIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbmZpZ0l0ZW1DcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db25maWdJdGVtVXBkYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VmVyc2lvbkNyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkRlcGxveW1lbnRTdGF0ZVVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkluY2lkZW50U3RhdGVVcGRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db25maWdJdGVtRGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TmFtZVVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkF0dGFjaG1lbnRBZGRQb3N0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QXR0YWNobWVudERlbGV0ZVBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5WZXJzaW9uRGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VmVyc2lvblVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkdyb3VwVXBkYXRlPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU3RvcmVGaWVsZHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RmllbGRzIHN0b3JlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGluZGV4IHdoaWNoIGFyZSB1c2VkIGZvciBvdGhlciB0aGluZ3MgYmVzaWRlcyBmdWxsdGV4dCBzZWFyY2hlcy4gRm9yIHRoZSBjb21wbGV0ZSBmdW5jdGlvbmFsaXR5IGFsbCBmaWVsZHMgYXJlIG1hbmRhdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVsYXN0aWNzZWFyY2g6OlNldHRpbmdzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJhc2ljIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvbmZpZ0l0ZW1JRDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q2xhc3NJRDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q2xhc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPk51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+R3JvdXBJRDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="scripts/test/ConfigItemMultiTenancy.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI1IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCnVzZSBUZXN0Mjo6VjA7CgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6UmVnaXN0ZXJPTTsgICAgIyBTZXQgdXAgJEtlcm5lbDo6T00KCnVzZSBEYXRhOjpEdW1wZXI7Cgp1c2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkRhc2hib2FyZDo6VGlja2V0UHJvZmlsZVNlYXJjaDsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCm15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKbXkgKCAkVXNlckxvZ2luLCAkVXNlcklEICkgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgpOwpvaygKICAgICRVc2VySUQsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgY3JlYXRlZCIsCik7CgojIGNyZWF0ZSByZXF1aXJlZCBvYmplY3RzCm15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwpteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKIyBmZXRjaCB0aGUgaWRzIG9mIHRoZSBpbnRlbmRlZCBjbGFzcywgZGVwbG95bWVudCBzdGF0ZSBhbmQgaW5jaWRlbnQgc3RhdGUKbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAopOwpteSAlUmV2ZXJzZUNsYXNzTGlzdCA9IHJldmVyc2UgJXskQ2xhc3NMaXN0fTsKbXkgJENsYXNzSUQgPSAkUmV2ZXJzZUNsYXNzTGlzdHsnQ291bnRyeSd9OwoKbXkgJERlcGxTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCik7Cm15ICVSZXZlcnNlRGVwbFN0YXRlTGlzdCA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07Cm15ICREZXBsU3RhdGVJRCA9ICRSZXZlcnNlRGVwbFN0YXRlTGlzdHsnUHJvZHVjdGlvbid9OwoKbXkgJEluY2lTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAopOwpteSAlUmV2ZXJzZUluY2lTdGF0ZUxpc3QgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwpteSAkSW5jaVN0YXRlSUQgPSAkUmV2ZXJzZUluY2lTdGF0ZUxpc3R7J09wZXJhdGlvbmFsJ307CgpteSAlR3JvdXBMaXN0ID0gJEdyb3VwT2JqZWN0LT5Hcm91cExpc3QoKTsKbXkgJVJldmVyc2VHcm91cExpc3QgPSByZXZlcnNlICVHcm91cExpc3Q7CgpteSAkRmlyc3RHcm91cElEID0gJFJldmVyc2VHcm91cExpc3R7J2FkbWluJ307Cm15ICRTZWNvbmRHcm91cElEID0gJFJldmVyc2VHcm91cExpc3R7J3N0YXRzJ307CgojIGluc2VydCBmaXZlIENJcwojIHRoZSBmaXJzdCB0d28gQ0lzIGJlbG9uZyBhcmUgZnJvbSB0aGUgJ2FkbWluJyBncm91cAojIHRoZSBmb2xsb3dpbmcgdHdvIENJcyBiZWxvbmcgdG8gdGhlICdzdGF0cycgZ3JvdXAKIyB0aGUgbGFzdCBvbmUgaGFzIG5vIGdyb3VwIChncm91cF9pZCBpcyBudWxsKQpteSAkQ291bnQgPSAxOwpteSBAQ29uZmlnSXRlbUlETGlzdDsKZm9yIG15ICRPcmQgKHF3KGZpcnN0IHNlY29uZCB0aGlyZCBmb3VydGggZmlmdGgpKQp7CiAgICBteSAkR3JvdXBJRDsKICAgIGlmICgkQ291bnQgPCAzKSB7CiAgICAgICAgJEdyb3VwSUQgPSAkRmlyc3RHcm91cElEOwogICAgfQogICAgZWxzaWYgKCRDb3VudCA8IDUpIHsKICAgICAgICAkR3JvdXBJRCA9ICRTZWNvbmRHcm91cElEOwogICAgfQogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgIENsYXNzSUQgICAgICAgID0+ICRDbGFzc0lELAogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJDb25maWcgSXRlbSAjJENvdW50IiwKICAgICAgICBEZXBsU3RhdGVJRCAgICA9PiAkRGVwbFN0YXRlSUQsCiAgICAgICAgSW5jaVN0YXRlSUQgICAgPT4gJEluY2lTdGF0ZUlELAogICAgICAgIEdyb3VwSUQgICAgICAgID0+ICRHcm91cElELAogICAgICAgIERlc2NyaXB0aW9uICAgID0+ICRPcmQsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICk7CiAgICBwdXNoIEBDb25maWdJdGVtSURMaXN0LCAkQ29uZmlnSXRlbUlEOwogICAgJENvdW50Kys7CgogICAgb2soCiAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAiQWRkZWQgJE9yZCBjb25maWcgaXRlbSIsCiAgICApOwp9CgojIHNlYXJjaCBDSXMgdGhhdCBiZWxvbmcgdG8gdGhlICdhZG1pbicgZ3JvdXAgYW5kIGNoZWNrIHRoZSBxdWVyeSByZXN1bHQKbXkgQENvbmZpZ0l0ZW1SZXN1bHRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgUmVzdWx0ICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgT3JkZXJCeSAgICAgID0+ICdVcCcsCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IFxAQ29uZmlnSXRlbUlETGlzdCwKICAgICAgICBHcm91cElEcyAgICAgPT4gWyRGaXJzdEdyb3VwSURdLAogICAgKTsKCm9rKAogICAgc2NhbGFyIEBDb25maWdJdGVtUmVzdWx0TGlzdCA9PSAzIAogICAgICAgICAgICAmJiAkQ29uZmlnSXRlbVJlc3VsdExpc3RbMF0gPT0gJENvbmZpZ0l0ZW1JRExpc3RbMF0KICAgICAgICAgICAgJiYgJENvbmZpZ0l0ZW1SZXN1bHRMaXN0WzFdID09ICRDb25maWdJdGVtSURMaXN0WzFdCiAgICAgICAgICAgICYmICRDb25maWdJdGVtUmVzdWx0TGlzdFsyXSA9PSAkQ29uZmlnSXRlbUlETGlzdFs0XSwKICAgICJTZWFyY2ggZm9yIGNvbmZpZyBpdGVtcyBvZiBncm91cCAkRmlyc3RHcm91cElEIgopOwoKIyBtb3ZlIHRoZSB0aGlyZCBDSSBmcm9tIHRoZSAnc3RhdHMnIHRvIHRoZSAnYWRtaW4nIGdyb3VwCm15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICBDb25maWdJdGVtSUQgICA9PiAkQ29uZmlnSXRlbUlETGlzdFsyXSwKICAgIEdyb3VwSUQgICAgICAgID0+ICRGaXJzdEdyb3VwSUQsCiAgICBVc2VySUQgICAgICAgICA9PiAxLAopOwoKb2soCiAgICAkU3VjY2VzcywKICAgICJDaGFuZ2VkIHRoaXJkIGNvbmZpZyBpdGVtIiwKKTsKCiMgcmVwZWF0IHRoZSBzZWFyY2ggYW5kIGNoZWNrIHRoZSB1cGRhdGVkIHJlc3VsdHMKQENvbmZpZ0l0ZW1SZXN1bHRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgUmVzdWx0ICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgT3JkZXJCeSAgICAgID0+ICdVcCcsCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IFxAQ29uZmlnSXRlbUlETGlzdCwKICAgICAgICBHcm91cElEcyAgICAgPT4gWyRGaXJzdEdyb3VwSURdLAogICAgKTsKCm9rKAogICAgc2NhbGFyIEBDb25maWdJdGVtUmVzdWx0TGlzdCA9PSA0IAogICAgICAgICAgICAmJiAkQ29uZmlnSXRlbVJlc3VsdExpc3RbMF0gPT0gJENvbmZpZ0l0ZW1JRExpc3RbMF0KICAgICAgICAgICAgJiYgJENvbmZpZ0l0ZW1SZXN1bHRMaXN0WzFdID09ICRDb25maWdJdGVtSURMaXN0WzFdCiAgICAgICAgICAgICYmICRDb25maWdJdGVtUmVzdWx0TGlzdFsyXSA9PSAkQ29uZmlnSXRlbUlETGlzdFsyXQogICAgICAgICAgICAmJiAkQ29uZmlnSXRlbVJlc3VsdExpc3RbM10gPT0gJENvbmZpZ0l0ZW1JRExpc3RbNF0sCiAgICAiU2VhcmNoIGZvciBjb25maWcgaXRlbXMgb2YgZ3JvdXAgJyRHcm91cExpc3R7JEZpcnN0R3JvdXBJRH0nIGFmdGVyIHVwZGF0ZSIKKTsKCiMgZGVsZXRlIHRoZSBmaXJzdCB0aHJlZSBDSVMgd2hpY2ggYmVsb25nIGFsbCB0byB0aGUgJ2FkbWluJyBncm91cApteSAkSW5kZXggPSAwOwpmb3IgbXkgJE9yZCAocXcoZmlyc3Qgc2Vjb25kIHRoaXJkKSkKewogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgID0+ICRDb25maWdJdGVtSURMaXN0WyRJbmRleCsrXSwKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBvaygKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiRGVsZXRlZCAkT3JkIGNvbmZpZyBpdGVtIiwKICAgICk7Cn0KCiMgcmVwZWF0IHRoZSBzZWFyY2ggYW5kIGNoZWNrIHRoZSByZXN1bHRzIGFmdGVyIGRlbGV0aW9uCkBDb25maWdJdGVtUmVzdWx0TGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgICAgIE9yZGVyQnkgICAgICA9PiAnVXAnLAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiBcQENvbmZpZ0l0ZW1JRExpc3QsCiAgICAgICAgR3JvdXBJRHMgICAgID0+IFskRmlyc3RHcm91cElEXSwKICAgICk7CgpvaygKICAgIHNjYWxhciBAQ29uZmlnSXRlbVJlc3VsdExpc3QgPT0gMQogICAgICAgICAgICAmJiAkQ29uZmlnSXRlbVJlc3VsdExpc3RbMF0gPT0gJENvbmZpZ0l0ZW1JRExpc3RbNF0sCiAgICAiU2VhcmNoIGZvciBjb25maWcgaXRlbXMgb2YgZ3JvdXAgJyRHcm91cExpc3R7JEZpcnN0R3JvdXBJRH0nIGFmdGVyIGRlbGV0ZSIKKTsKCmRvbmVfdGVzdGluZzsK</File>
        <File Location="doc/en/ITSMConfigItemMultitenancy.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="configitem">
            <ColumnAdd Name="group_id" Type="INTEGER"></ColumnAdd>
            <ForeignKeyCreate ForeignTable="groups_table">
                <Reference Foreign="id" Local="group_id">
                </Reference>
            </ForeignKeyCreate>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="configitem">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>