<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>DiscreteSystemAddresses</Name>
    <Version>11.1.2</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-07-22 17:14:41" Version="11.1.2">Update to 11.1 beta2.</ChangeLog>
    <ChangeLog Date="2026-06-22 08:28:44" Version="11.1.1">Update to OTOBO 11.1.</ChangeLog>
    <Description Lang="en">This extension facilitates communication between system addresses within OTOBO (e.g. in cc), by linking tickets in different queues to each other and using address pools to ensure a new article is added to all relevant tickets within the system (e.g. one in the IT Queue and one in HR).</Description>
    <Description Lang="de">Diese Erweiterung erleichtert die Kommunikation zwischen Systemadressen innerhalb von OTOBO (z. B. in cc), indem sie Tickets in verschiedenen Queues miteinander verknüpft und Adress-Bereiche verwendet, um sicherzustellen, dass ein neuer Artikel zu allen relevanten Tickets innerhalb des Systems hinzugefügt wird (z. B. eines in der IT-Queue und eine in der Personalabteilung).</Description>
    <Framework>11.1.x</Framework>
    <IntroInstall Lang="en" Title="Install Information" Type="pre">
        &lt;br/&gt;
        &lt;strong&gt;WELCOME&lt;/strong&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        You are about to install the OTOBO package DiscreteSystemAddresses.&lt;br/&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        ((enjoy))&lt;br/&gt;
        &lt;br/&gt;
    </IntroInstall>
    <IntroInstall Lang="de" Title="Installation Information" Type="pre">
        &lt;br/&gt;
        &lt;strong&gt;WILLKOMMEN&lt;/strong&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        Sie sind im Begriff das OTOBO-Paket DiscreteSystemAddresses zu installieren.&lt;br/&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        ((enjoy))&lt;br/&gt;
        &lt;br/&gt;
    </IntroInstall>
    <BuildCommitID>0d5e244106b9d3e3d414f29c9ad4ccdc11a307a5</BuildCommitID>
    <BuildDate>2026-07-22 17:14:45</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Kernel/Autoload/TicketSubjectCleanInterdivisional.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7ICAgICMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsgICAgIyMgbm8gY3JpdGljIChNb2R1bGVzOjpSZXF1aXJlRmlsZW5hbWVNYXRjaGVzUGFja2FnZSkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCik7CgojIGRpc2FibGUgcmVkZWZpbmUgd2FybmluZ3MgaW4gdGhpcyBzY29wZQp7CiAgICBubyB3YXJuaW5ncyAncmVkZWZpbmUnOyAgICAjIyBubyBjcml0aWMgcXcoVGVzdGluZ0FuZERlYnVnZ2luZzo6UHJvaGliaXROb1dhcm5pbmdzKQoKICAgICMgYmFja3VwIG9yaWdpbmFsIHJvdXRpbmVzCiAgICBteSAkVGlja2V0U3ViamVjdENsZWFuID0gXCZLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpUaWNrZXRTdWJqZWN0Q2xlYW47CgogICAgIyBSZW1vdmUgaW50ZXJkaXZpc2lvbmFsIHRpY2tldCBudW1iZXJzCiAgICAqS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6VGlja2V0U3ViamVjdENsZWFuID0gc3ViIHsKICAgICAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICAgICAjIHN0YW5kYXJkIGNsZWFuZWQgc3ViamVjdAogICAgICAgIG15ICRTdWJqZWN0ID0gJnskVGlja2V0U3ViamVjdENsZWFufShAXyk7CgogICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkU3ViamVjdDsKCiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJFRpY2tldEhvb2sgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKTsKICAgICAgICBteSAkVGlja2V0SG9va0RpdmlkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKTsKCiAgICAgICAgcmV0dXJuICRTdWJqZWN0IGlmICRTdWJqZWN0ICF+IC8kVGlja2V0SG9vay87CiAgICAgICAgcmV0dXJuICRTdWJqZWN0IGlmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTdWJqZWN0Q2xlYW5BbGxOdW1iZXJzJyk7CgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRTZWxmLT5UaWNrZXRJRExvb2t1cCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRQYXJhbXtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsaW5rZWQgdGlja2V0cwogICAgICAgIG15ICVMaW5rZWRUaWNrZXRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0tleUxpc3RXaXRoRGF0YSgKICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgS2V5MSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIE9iamVjdDIgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVHlwZSAgICA9PiAnSW50ZXJkaXZpc2lvbmFsJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU3ViamVjdCBpZiAhJUxpbmtlZFRpY2tldHM7CgogICAgICAgIGZvciBteSAkVGlja2V0ICggdmFsdWVzICVMaW5rZWRUaWNrZXRzICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHBvc3NpYmxlIHRpY2tldCBob29rIGZvcm1hdHMgd2l0aCBbXQogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xbXHMqXFEkVGlja2V0SG9vazogJFRpY2tldC0+e1RpY2tldE51bWJlcn1cRVxzKlxdXHMqLy9nOwogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xbXHMqXFEkVGlja2V0SG9vazokVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqXF1ccyovL2c7CiAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXFtccypcUSRUaWNrZXRIb29rJFRpY2tldEhvb2tEaXZpZGVyJFRpY2tldC0+e1RpY2tldE51bWJlcn1cRVxzKlxdXHMqLy9nOwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHBvc3NpYmxlIHRpY2tldCBob29rIGZvcm1hdHMgd2l0aG91dCBbXQogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xRJFRpY2tldEhvb2s6ICRUaWNrZXQtPntUaWNrZXROdW1iZXJ9XEVccyovL2c7CiAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXFEkVGlja2V0SG9vazokVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqLy9nOwogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xRJFRpY2tldEhvb2skVGlja2V0SG9va0RpdmlkZXIkVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqLy9nOwogICAgICAgIH0KCiAgICAgICAgIyB0cmltIHdoaXRlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kCiAgICAgICAgJFN1YmplY3QgPX4gcy8oXlxzK3xccyskKS8vOwoKICAgICAgICByZXR1cm4gJFN1YmplY3Q7CiAgICB9Owp9CgoxOwo=</File>
        <File Location="Kernel/Config/Files/XML/AddressPool.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sOjpFbWFpbEhlYWRlcnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW1haWwgaGVhZGVycyB1c2VkIGZvciBhZGRyZXNzLXBvb2wgYXNzaWdubWVudC4gU2Vjb25kYXJ5IGhlYWRlcnMgYXJlIG5vdCBldmFsdWF0ZWQgaWYgcG9vbHMgY291bGQgYmUgYXNzaWduZWQgdmlhIHRoZSBwcmltYXJ5IGhlYWRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3RlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmltYXJ5Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlJlc2VudC1UbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RW52ZWxvcGUtVG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5DYzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZWNvbmRhcnkiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RGVsaXZlcmVkLVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5YLU9yaWdpbmFsLVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDAyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDA1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDA4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwOSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDExIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDE0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDE3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxOCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDIwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wyMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMjIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDIzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wyNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMjUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNJbnRlcmRpdmlzaW9uYWwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnSW50ZXJkaXZpc2lvbmFsJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb3VyY2VOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkludGVyZGl2aXNpb25hbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5JbnRlcmRpdmlzaW9uYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMjIwMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaW5rcyAyIHRpY2tldHMgd2l0aCBhICJJbnRlcmRpdmlzaW9uYWwiIHR5cGUgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkludGVyZGl2aXNpb25hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUjIyMwMDAtU2tpcFZpYU1lc3NhZ2VJRCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gY2hlY2sgaWYgYW4gYXJ0aWNsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgaWQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHN5c3RlbS4gKEUuZy4gaWYgdGhlIG1haWwgd2FzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQgdGhyb3VnaCBhIGRpZmZlcmVudCBlbWFpbCBpbmJveC4pIE11bHRpcGxlIHBhcnNpbmcgY2FuIGJlIGFsbG93ZWQuIFBvb2xzIHdoaWNoIGFscmVhZHkgY29udGFpbiBhbiBhcnRpY2xlIHdpdGggdGhlIHJlc3BlY3RpdmUgbWVzc2FnZSBpZCB3aWxsIHN0aWxsIGJlIGlnbm9yZWQuIE9wdGlvbnMgYXJlICJBbHdheXMiLCAiQm91bmNlZEVtYWlsIiAobXVsdGlwbGUgcGFyc2luZyB3aWxsIG9ubHkgYmUgZG9uZSBmb3IgRW1haWxzIHdpdGggIlJlc2VudC1UbyItaGVhZGVyLCBlLmcuIFBvb2xBIGJvdW5jZWQgYSBtYWlsIHRvIFBvb2xCKSBhbmQgIk1haWxBY2NvdW50UXVldWUiIChpZiBkaXNwYXRjaGluZyB2aWEgcXVldWUgaXMgZW5hYmxlZCBmb3IgYSBtYWlsIGFjY291bnQsIGFuIGVtYWlsIGNhbiBiZSBtb3ZlZCB0byB0aGUgcmVzcGVjdGl2ZSBpbmJveCwgdG8gYmUgZXZhbHVhdGVkIGFnYWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U2tpcFZpYU1lc3NhZ2VJRDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWxsb3dNdWx0aVBhcnNlIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBbHdheXMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFpbEFjY291bnRRdWV1ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCb3VuY2VkRW1haWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkF1dG9sb2FkUGVybFBhY2thZ2VzIyMjMTAwMC1UaWNrZXRTdWJqZWN0Q2xlYW5JbnRlcmRpdmlzaW9uYWxUaWNrZXROdW1iZXJzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlbW92ZSB0aWNrZXQgbnVtYmVycyBvZiBhbGwgaW50ZXJkaXZpc2lvbmFsbHkgbGlua2VkIHRpY2tldHMgd2hlbiBzdWJqZWN0IGlzIGNsZWFuZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRvbG9hZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIj5LZXJuZWw6OkF1dG9sb2FkOjpUaWNrZXRTdWJqZWN0Q2xlYW5JbnRlcmRpdmlzaW9uYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cg==</File>
        <File Location="Kernel/Language/de_DiscreteSystemAddresses.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0Rpc2NyZXRlU3lzdGVtQWRkcmVzc2VzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWFpbCBoZWFkZXJzIHVzZWQgZm9yIGFkZHJlc3MtcG9vbCBhc3NpZ25tZW50LiBTZWNvbmRhcnkgaGVhZGVycyBhcmUgbm90IGV2YWx1YXRlZCBpZiBwb29scyBjb3VsZCBiZSBhc3NpZ25lZCB2aWEgdGhlIHByaW1hcnkgaGVhZGVycy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRlcmRpdmlzaW9uYWwnfSA9ICdCZXJlaWNoc8O8YmVyZ3JlaWZlbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgMiB0aWNrZXRzIHdpdGggYSAiSW50ZXJkaXZpc2lvbmFsIiB0eXBlIGxpbmsuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayBpZiBhbiBhcnRpY2xlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBpZCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3lzdGVtLiAoRS5nLiBpZiB0aGUgbWFpbCB3YXMgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZCB0aHJvdWdoIGEgZGlmZmVyZW50IGVtYWlsIGluYm94LikgTXVsdGlwbGUgcGFyc2luZyBjYW4gYmUgYWxsb3dlZC4gUG9vbHMgd2hpY2ggYWxyZWFkeSBjb250YWluIGFuIGFydGljbGUgd2l0aCB0aGUgcmVzcGVjdGl2ZSBtZXNzYWdlIGlkIHdpbGwgc3RpbGwgYmUgaWdub3JlZC4gT3B0aW9ucyBhcmUgIkFsd2F5cyIsICJCb3VuY2VkRW1haWwiIChtdWx0aXBsZSBwYXJzaW5nIHdpbGwgb25seSBiZSBkb25lIGZvciBFbWFpbHMgd2l0aCAiUmVzZW50LVRvIi1oZWFkZXIsIGUuZy4gUG9vbEEgYm91bmNlZCBhIG1haWwgdG8gUG9vbEIpIGFuZCAiTWFpbEFjY291bnRRdWV1ZSIgKGlmIGRpc3BhdGNoaW5nIHZpYSBxdWV1ZSBpcyBlbmFibGVkIGZvciBhIG1haWwgYWNjb3VudCwgYW4gZW1haWwgY2FuIGJlIG1vdmVkIHRvIHRoZSByZXNwZWN0aXZlIGluYm94LCB0byBiZSBldmFsdWF0ZWQgYWdhaW4pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbW92ZSB0aWNrZXQgbnVtYmVycyBvZiBhbGwgaW50ZXJkaXZpc2lvbmFsbHkgbGlua2VkIHRpY2tldHMgd2hlbiBzdWJqZWN0IGlzIGNsZWFuZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSBcJ0ludGVyZGl2aXNpb25hbFwnLiBJZiB0aGUgc291cmNlIG5hbWUgYW5kIHRoZSB0YXJnZXQgbmFtZSBjb250YWluIHRoZSBzYW1lIHZhbHVlLCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBub24tZGlyZWN0aW9uYWwgb25lLiBJZiB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIGRpcmVjdGlvbmFsIGxpbmsuJ30gPQogICAgICAgICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICk7Cgp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/PostMaster.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkN2RhYTczZWUzZjQzZjE2NTdjZDY4M2I2YTE3NDBiY2MyMmQ3OGQ4IC0gS2VybmVsL1N5c3RlbS9Qb3N0TWFzdGVyLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyICAgICAgICAgICAoKTsKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3Nlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkRlc3RRdWV1ZSAoKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpOZXdUaWNrZXQgKCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6Rm9sbG93VXAgICgpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OlJlamVjdCAgICAoKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrICAgICAgICAgcXcoSXNIYXNoUmVmV2l0aERhdGEpOwoKb3VyICVPYmplY3RNYW5hZ2VyRmxhZ3MgPSAoCiAgICBOb25TaW5nbGV0b24gPT4gMSwKKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyIC0gcG9zdG1hc3RlciBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIHBvc3RtYXN0ZXIgZnVuY3Rpb25zLiBFLiBnLiB0byBwcm9jZXNzIGVtYWlscy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRQb3N0TWFzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIEVtYWlsICAgICAgICA9PiBcQEFycmF5T2ZFbWFpbENvbnRlbnQsCiAgICAgICAgICAgIFRydXN0ZWQgICAgICA9PiAxLCAjIDF8MCBpZ25vcmUgWC1PVE9CTyBoZWFkZXIgaWYgZmFsc2UKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgICRTZWxmLT57RW1haWx9ICAgICAgICAgICAgICAgICAgPSAkUGFyYW17RW1haWx9ICAgICAgICAgICAgICAgICAgfHwgZGllICJHb3Qgbm8gRW1haWwhIjsKICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0gPSAkUGFyYW17Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0gfHwgZGllICJHb3Qgbm8gQ29tbXVuaWNhdGlvbkxvZ09iamVjdCEiOwoKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH0gPSAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9OwojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57UGFyc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgIEVtYWlsID0+ICRQYXJhbXtFbWFpbH0sCiAgICApOwogICAgJFNlbGYtPntEZXN0UXVldWVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkRlc3RRdWV1ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntOZXdUaWNrZXRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6Ok5ld1RpY2tldC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntGb2xsb3dVcE9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZvbGxvd1VwLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1JlamVjdE9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6UmVqZWN0LT5uZXcoICV7JFNlbGZ9ICk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpEZXN0UXVldWUtPm5ldyggJXskU2VsZn0gKTsKIyAgICAkU2VsZi0+e05ld1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6TmV3VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7CiMgICAgJFNlbGYtPntGb2xsb3dVcE9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZvbGxvd1VwLT5uZXcoICV7JFNlbGZ9ICk7CiMgICAgJFNlbGYtPntSZWplY3RPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OlJlamVjdC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPl9DcmVhdGVNYWlsT2JqZWN0cygKICAgICAgICBEYXRhID0+ICRTZWxmLAogICAgKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICMgY2hlY2sgbmVlZGVkIGNvbmZpZyBvcHRpb25zCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIGZvciBteSAkT3B0aW9uIChxdyhQb3N0bWFzdGVyVXNlcklEIFBvc3RtYXN0ZXJYLUhlYWRlcikpIHsKICAgICAgICAkU2VsZi0+eyRPcHRpb259ID0gJENvbmZpZ09iamVjdC0+R2V0KCRPcHRpb24pCiAgICAgICAgICAgIHx8IGRpZSAiRm91bmQgbm8gJyRPcHRpb24nIG9wdGlvbiBpbiBjb25maWd1cmF0aW9uISI7CiAgICB9CgogICAgIyBzaG91bGQgSSB1c2UgWC1PVE9CTyBoZWFkZXJzPwogICAgJFNlbGYtPntUcnVzdGVkfSA9ICRQYXJhbXtUcnVzdGVkfSAvLyAxOwoKICAgIGlmICggJFNlbGYtPntUcnVzdGVkfSApIHsKCiAgICAgICAgIyBnZXQgZHluYW1pYyBmaWVsZCBvYmplY3RzCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAgICAgIyBhZGQgRHluYW1pYyBGaWVsZCBoZWFkZXJzCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZHMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0KAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGEgbG9va3VwIHRhYmxlCiAgICAgICAgbXkgJUhlYWRlckxvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyAkU2VsZi0+eydQb3N0bWFzdGVyWC1IZWFkZXInfSB9OwoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHZhbHVlcyAlJER5bmFtaWNGaWVsZHMgKSB7CiAgICAgICAgICAgIGZvciBteSAkSGVhZGVyICgKICAgICAgICAgICAgICAgICdYLU9UT0JPLUR5bmFtaWNGaWVsZC0nIC4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICdYLU9UT0JPLUZvbGxvd1VwLUR5bmFtaWNGaWVsZC0nIC4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgb25seSBhZGQgdGhlIGhlYWRlciBpZiBpcyBub3QgYWxyZWRheSBpbiB0aGUgY29uZmlnCiAgICAgICAgICAgICAgICBpZiAoICEkSGVhZGVyTG9va3VweyRIZWFkZXJ9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFNlbGYtPnsnUG9zdG1hc3RlclgtSGVhZGVyJ30gfSwgJEhlYWRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKdG8gZXhlY3V0ZSB0aGUgcnVuIHByb2Nlc3MKCiAgICBteSAoJFJldENvZGUsICRUaWNrZXRJRCkgPSAkUG9zdE1hc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFF1ZXVlICAgPT4gJ0p1bmsnLCAgIyBvcHRpb25hbCwgc3BlY2lmeSB0YXJnZXQgcXVldWUgZm9yIG5ldyB0aWNrZXRzCiAgICAgICAgUXVldWVJRCA9PiAxLCAgICAgICAjIG9wdGlvbmFsLCBzcGVjaWZ5IHRhcmdldCBxdWV1ZSBmb3IgbmV3IHRpY2tldHMKICAgICk7CgpBbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgYW4gZXJyb3IuCgpUaGUgZmlyc3QgcmV0dXJuZWQgdmFsdWUgaW5kaWNhdGVzIHdoYXQgaGFzIGJlZW4gZG9uZS4KCiAgICAwID0gZXJyb3IgKGFsc28gdW5kZWZpbmVkKQogICAgMSA9IG5ldyB0aWNrZXQgY3JlYXRlZAogICAgMiA9IGZvbGxvdyB1cCAvIG9wZW4vcmVvcGVuCiAgICAzID0gZm9sbG93IHVwIC8gY2xvc2UgLT4gbmV3IHRpY2tldAogICAgNCA9IGZvbGxvdyB1cCAvIGNsb3NlIC0+IHJlamVjdAogICAgNSA9IGlnbm9yZWQgKGJlY2F1c2Ugb2YgWC1PVE9CTy1JZ25vcmUgaGVhZGVyKQoKV2hlbiB0aGVyZSBpcyBhIG5ldyBvciBmb2xsb3d1cCB0aWNrZXQgdGhlbiB0aGlzIHRpY2tldCBpZCBpcyByZXR1cm5lZCBhcyB0aGUgc2Vjb25kIHZhbHVlLgoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBSZXR1cm47CgogICAgIyBDb25maWdPYmplY3Qgc2VjdGlvbiAvIGdldCBwYXJhbXMKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKIyAgIG15ICRHZXRQYXJhbSA9ICRTZWxmLT5HZXRFbWFpbFBhcmFtcygpOwojCiMgICAgIyBjaGVjayBpZiBmb2xsb3cgdXAKIyAgICBteSAoICRUbiwgJFRpY2tldElEICkgPSAkU2VsZi0+Q2hlY2tGb2xsb3dVcCggR2V0UGFyYW0gPT4gJEdldFBhcmFtICk7CgogICAgbXkgJEdldFBhcmFtID0gJFBhcmFte0VtYWlsUGFyYW1zfSB8fCAkU2VsZi0+R2V0RW1haWxQYXJhbXMoKTsKCiAgICBteSAoICRUbiwgJFRpY2tldElEICk7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKCiAgICAjIGdldCBjb25maWcgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgbXkgJExpbmtPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwoKICAgIG15IEBUaWNrZXRJRHNUb0xpbms7CiAgICBpZiAoICEkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICggJFRuLCAkVGlja2V0SUQgKSA9ICRTZWxmLT5DaGVja0ZvbGxvd1VwKCBHZXRQYXJhbSA9PiAkR2V0UGFyYW0gKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICAgICAjIFJ1biB0aGUgUHJlRmlsdGVyTW9kdWxlcy4KICAgICAgICAjIFRoZXNlIGZpbHRlciBtb2R1bGVzIG1heSBtb2RpZnkgdGhlIGVtYWlsIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtLCBpbmNsdWRpbmcKICAgICAgICAjIHRoZSBib2R5IGFuZCB0aGUgYXR0YWNobWVudHMuCiAgICAgICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlRmlsdGVyTW9kdWxlJykgfTsKCiAgICAgICAgICAgICMgZ2V0IG1haW4gb2JqZWN0cwogICAgICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IHBhc3NpbmcgUGFyc2VyT2JqZWN0IHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZmlsdGVyIG9iamVjdAogICAgICAgICAgICAgICAgIyBhbGxvd3MgdGhlIGZpbHRlciB0byBtb2RpZnkgdGhlIG1lc3NhZ2UgaXRzZWxmLiBUaGlzIGlzIHVzZWQgaW4gU01JTUUgZGVjcnlwdGlvbi4KICAgICAgICAgICAgICAgIG15ICRGaWx0ZXJPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJEZpbHRlck9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAibmV3KCkgb2YgUHJlRmlsdGVyTW9kdWxlICRKb2JzeyRKb2J9LT57TW9kdWxlfSBub3Qgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEpPQjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIG1vZGlmeSBwYXJhbXMKICAgICAgICAgICAgICAgIG15ICRSdW4gPSAkRmlsdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gID0+ICRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBKb2JDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgPT4gJFBhcmFte1F1ZXVlSUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFJ1biApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiRXhlY3V0ZSBSdW4oKSBvZiBQcmVGaWx0ZXJNb2R1bGUgJEpvYnN7JEpvYn0tPntNb2R1bGV9IG5vdCBzdWNjZXNzZnVsbHkhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3VsZCBJIGlnbm9yZSB0aGUgaW5jb21pbmcgbWFpbD8KICAgICAgICBpZiAoICRHZXRQYXJhbS0+eydYLU9UT0JPLUlnbm9yZSd9ICYmICRHZXRQYXJhbS0+eydYLU9UT0JPLUlnbm9yZSd9ID1+IC8oeWVzfHRydWUpL2kgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnSW5mbycsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+CiAgICAgICAgICAgICAgICAgICAgIklnbm9yZWQgRW1haWwgKEZyb206ICRHZXRQYXJhbS0+eydGcm9tJ30sIE1lc3NhZ2UtSUQ6ICRHZXRQYXJhbS0+eydNZXNzYWdlLUlEJ30pICIKICAgICAgICAgICAgICAgICAgICAuICJiZWNhdXNlIHRoZSBYLU9UT0JPLUlnbm9yZSBpcyBzZXQgKFgtT1RPQk8tSWdub3JlOiAkR2V0UGFyYW0tPnsnWC1PVE9CTy1JZ25vcmUnfSkuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAoNSk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyB0aWNrZXQgc2VjdGlvbgogICAgICAgICMKCiAgICAgICAgIyBjaGVjayBpZiBmb2xsb3cgdXAgKGFnYWluLCB3aXRoIG5ldyBHZXRQYXJhbSkKICAgICAgICAoICRUbiwgJFRpY2tldElEICkgPSAkU2VsZi0+Q2hlY2tGb2xsb3dVcCggR2V0UGFyYW0gPT4gJEdldFBhcmFtICk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICAgICAjIGJ1aWxkIG1haWwgYWRkcmVzcyBsaXN0CiAgICAgICAgbXkgQEFkZHJlc3NlZFBvb2xzID0gJFNlbGYtPntBZGRyZXNzUG9vbE9iamVjdH0tPkZpbHRlclBvb2xzKAogICAgICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggQEFkZHJlc3NlZFBvb2xzICkgewogICAgICAgICAgICAjIGdldCB0aGUgUG9vbCBmb3IgUXVldWVJRCBmcm9tIE1haWxBY2NvdW50LCBpbiBjYXNlIG9mIGRpc3BhdGNoaW5nIHZpYSBRdWV1ZQogICAgICAgICAgICBteSAkTWFpbEFjY291bnRQb29sOwogICAgICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17UXVldWV9ICkgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ICAgICAgfHw9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgUXVldWUgICA9PiAkUGFyYW17UXVldWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVNYWlsQWNjb3VudEFkZHJlc3MgPSAkUXVldWVPYmplY3QtPkdldFN5c3RlbUFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE1haWxBY2NvdW50UG9vbCAgICAgICA9ICRTZWxmLT57QWRkcmVzc1Bvb2xPYmplY3R9LT5Qb29sTG9va3VwKAogICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJE1haWxBY2NvdW50QWRkcmVzc3tFbWFpbH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBQb29sLCBpZiBub3QgYWRkcmVzc2VkCiAgICAgICAgICAgICAgICBpZiAoICRNYWlsQWNjb3VudFBvb2wgJiYgKCAhZ3JlcCB7ICRfIGVxICRNYWlsQWNjb3VudFBvb2wgfSBAQWRkcmVzc2VkUG9vbHMgKSApIHsKICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0IEBBZGRyZXNzZWRQb29scywgJE1haWxBY2NvdW50UG9vbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB3ZSBhcmUgcmVwcm9jZXNzaW5nIGFuIGVtYWlsIGZpbHRlciBvdXQgcG9vbHMgd2hpY2ggYWxyZWFkeSBoYXZlIGFuIGFydGljbGUgd2l0aCB0aGlzIG1lc3NhZ2UgaWQKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9ICkgewogICAgICAgICAgICAgICAgQEFkZHJlc3NlZFBvb2xzID0gZ3JlcCB7ICEkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9eyRffSB9IEBBZGRyZXNzZWRQb29sczsKCiAgICAgICAgICAgICAgICBpZiAoICFAQWRkcmVzc2VkUG9vbHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnSW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yZWQgRW1haWwgKEZyb206ICRHZXRQYXJhbS0+eydGcm9tJ30sIE1lc3NhZ2UtSUQ6ICRHZXRQYXJhbS0+eydNZXNzYWdlLUlEJ30pICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gImJlY2F1c2UgYWxsIGFkZHJlc3NlZCBwb29scyBhbHJlYWR5IGhvbGQgYW4gYXJ0aWNsZSBmb3IgaXQuIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciBmb2xsb3ctdXBzCiAgICAgICAgICAgIGlmICggJFRpY2tldElEICkgewogICAgICAgICAgICAgICAgbXkgJFBvb2wgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+UG9vbExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFBvb2wgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJFBvb2wgfSBAQWRkcmVzc2VkUG9vbHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBZGRyZXNzUG9vbH0gPSAkUG9vbDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgaWYgYSBmb2xsb3cgdXAgaW4gYSBub3QgYWRkcmVzc2VkIHBvb2wgZXhpc3RzLCBsb29rIGZvciBsaW5rZWQgdGlja2V0cyBhbHNvIGluIHRoZSBwYXJlbnQgcnVuCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiBwb29scyBhcmUgYWRkcmVzc2VkLCBub24gcG9vbCB0aWNrZXRzIGFyZSBpZ25vcmVkCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVG4gICAgICAgPSB1bmRlZjsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQgPSB1bmRlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0FkZHJlc3NQb29sfSAvLz0gc2hpZnQgQEFkZHJlc3NlZFBvb2xzOwoKICAgICAgICAgICAgQUREUkVTUzoKICAgICAgICAgICAgZm9yIG15ICRQb29sICggQEFkZHJlc3NlZFBvb2xzICkgewogICAgICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICRQb29sIGVxICRQYXJhbXtBZGRyZXNzUG9vbH07CgogICAgICAgICAgICAgICAgbXkgJUVtYWlsUGFyYW1zICA9ICV7JEdldFBhcmFtfTsKICAgICAgICAgICAgICAgIG15ICRSZWN1VGlja2V0SUQgPSAkU2VsZi0+UmVjdXJzaXZlUG9zdE1hc3RlclJ1bigKICAgICAgICAgICAgICAgICAgICBFbWFpbFBhcmFtcyAgICAgID0+IFwlRW1haWxQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgQWRkcmVzc1Bvb2wgICAgICA9PiAkUG9vbCwKICAgICAgICAgICAgICAgICAgICBGb2xsb3dVcFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICggJE1haWxBY2NvdW50UG9vbCAmJiAkTWFpbEFjY291bnRQb29sIGVxICRQb29sICkgPyAkUGFyYW17UXVldWVJRH0gOiB1bmRlZiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzVG9MaW5rLCAkUmVjdVRpY2tldElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRha2UgcXVldWUgYnkgbWFpbCBhY2NvdW50IG9ubHkgaW50byBjb25zaWRlcmF0aW9uIGZvciBpdHMgcmVzcGVjdGl2ZSBwb29sCiAgICAgICAgICAgIGlmICggISRNYWlsQWNjb3VudFBvb2wgfHwgJE1haWxBY2NvdW50UG9vbCBuZSAkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtRdWV1ZX07CiAgICAgICAgICAgICAgICBkZWxldGUgJFBhcmFte1F1ZXVlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBjb21tdW5pY2F0aW9uIGxvZyB0byBvcmlnaW4KICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH07CiAgICAgICAgICAgICRTZWxmLT5fQ3JlYXRlTWFpbE9iamVjdHMoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRTZWxmLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSApIHsKICAgICAgICAoICRUbiwgJFRpY2tldElEICkgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+RmluZExpbmtlZFRpY2tldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFBhcmFte0ZvbGxvd1VwVGlja2V0SUR9LAogICAgICAgICAgICBBZGRyZXNzUG9vbCA9PiAkUGFyYW17QWRkcmVzc1Bvb2x9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1Bvc3RtYXN0ZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICRHZXRQYXJhbS0+e0FkZHJlc3NQb29sfSA9ICRQYXJhbXtBZGRyZXNzUG9vbH07CgogICAgICAgIFhRVUVVRUhFQURFUjoKICAgICAgICBmb3IgbXkgJFhRdWV1ZUhlYWRlciAocXcoWC1PVE9CTy1RdWV1ZSBYLU9UT0JPLUZvbGxvd1VwLVF1ZXVlKSkgewoKICAgICAgICAgICAgbmV4dCBYUVVFVUVIRUFERVIgaWYgISRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9OwoKICAgICAgICAgICAgbXkgJFF1ZXVlRXhpc3QgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+UXVldWVDaGVjaygKICAgICAgICAgICAgICAgIFF1ZXVlICAgICAgID0+ICRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9LAogICAgICAgICAgICAgICAgQWRkcmVzc1Bvb2wgPT4gJEdldFBhcmFtLT57QWRkcmVzc1Bvb2x9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFF1ZXVlRXhpc3QgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUoICRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgogICAgIyBydW4gYWxsIFByZUNyZWF0ZUZpbHRlck1vZHVsZXMKICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlQ3JlYXRlRmlsdGVyTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlQ3JlYXRlRmlsdGVyTW9kdWxlJykgfTsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgIG15ICRGaWx0ZXJPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEZpbHRlck9iamVjdCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIm5ldygpIG9mIFByZUNyZWF0ZUZpbHRlck1vZHVsZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgSk9COwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vZGlmeSBwYXJhbXMKICAgICAgICAgICAgbXkgJFJ1biA9ICRGaWx0ZXJPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgIEdldFBhcmFtICA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBKb2JDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSdW4gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJFeGVjdXRlIFJ1bigpIG9mIFByZUNyZWF0ZUZpbHRlck1vZHVsZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0J3MgYSBmb2xsb3cgdXAgLi4uCiAgICBpZiAoICRUbiAmJiAkVGlja2V0SUQgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcXVldWUgb2JqZWN0CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgY2hlY2sgaWYgaXQgaXMgcG9zc2libGUgdG8gZG8gdGhlIGZvbGxvdyB1cAogICAgICAgICMgZ2V0IGZvbGxvdyB1cCBvcHRpb24gKHBvc3NpYmxlIG9yIG5vdCkKICAgICAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBPcHRpb24oCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsb2NrIG9wdGlvbiAoc2hvdWxkIGJlIHRoZSB0aWNrZXQgbG9ja2VkIC0gaWYgY2xvc2VkIC0gYWZ0ZXIgdGhlIGZvbGxvdyB1cCkKICAgICAgICBteSAkTG9jayA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBMb2NrT3B0aW9uKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3RhdGUgZGV0YWlscwogICAgICAgIG15ICVTdGF0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJFRpY2tldHtTdGF0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gdHJlYXQgYSBib3VuY2UgZS1tYWlsIGFsd2F5cyBhcyBhIG5vcm1hbCBmb2xsb3ctdXAgKHRvIHJlb3BlbiB0aGUgdGlja2V0IGlmIG5lZWRlZCkuCiAgICAgICAgbXkgJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCA9IDA7CiAgICAgICAgaWYgKCAkR2V0UGFyYW0tPnsnWC1PVE9CTy1Cb3VuY2UnfSApIHsKICAgICAgICAgICAgJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCA9ICRDb25maWdPYmplY3QtPkdldCgnUG9zdG1hc3RlckJvdW5jZUVtYWlsQXNGb2xsb3dVcCcpOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgdGlja2V0CiAgICAgICAgaWYgKCAhJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCAmJiAkRm9sbG93VXBQb3NzaWJsZSA9fiAvbmV3IHRpY2tldC9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL14ocmVtb3ZlZHxjbG9zZSkvaSApCiAgICAgICAgewoKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdJbmZvJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkZvbGxvdyB1cCBmb3IgWyRUbl0gYnV0IGZvbGxvdyB1cCBub3QgcG9zc2libGUgKCRUaWNrZXR7U3RhdGV9KS4gQ3JlYXRlIG5ldyB0aWNrZXQuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VuZCBtYWlsICYmIGNyZWF0ZSBuZXcgYXJ0aWNsZQogICAgICAgICAgICAjIGdldCBxdWV1ZSBpZiBvZiBGcm9tOiBhbmQgVG86CiAgICAgICAgICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fS0+R2V0UXVldWVJRCgKICAgICAgICAgICAgICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB0cnVzdGVkIHJldHVybnMgYSBuZXcgcXVldWUgaWQKICAgICAgICAgICAgbXkgJFRRdWV1ZUlEID0gJFNlbGYtPntEZXN0UXVldWVPYmplY3R9LT5HZXRUcnVzdGVkUXVldWVJRCgKICAgICAgICAgICAgICAgIFBhcmFtcyA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkVFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRUUXVldWVJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDbGVhbiBvdXQgdGhlIG9sZCBUaWNrZXROdW1iZXIgZnJvbSB0aGUgc3ViamVjdCAoc2VlIGJ1ZyM5MTA4KS4KICAgICAgICAgICAgIyBUaGlzIGF2b2lkcyBmYWxzZSB0aWNrZXQgbnVtYmVyIGRldGVjdGlvbiBvbiBjdXN0b21lciByZXBsaWVzLgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFtLT57U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUbiwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFtLT57U3ViamVjdH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVGlja2V0SUQgPSAkU2VsZi0+e05ld1RpY2tldE9iamVjdH0tPlJ1bigKICAgICAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgICAgID0+ICJCZWNhdXNlIHRoZSBvbGQgdGlja2V0IFskVG5dIGlzICckU3RhdGV7TmFtZX0nIiwKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gcmVwbHkvbmV3IHRpY2tldCcsCiAgICAgICAgICAgICAgICBMaW5rVG9UaWNrZXRJRCAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJFRpY2tldElEOwoKICAgICAgICAgICAgQFJldHVybiA9ICggMywgJFRpY2tldElEICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlamVjdCBmb2xsb3cgdXAKICAgICAgICBlbHNpZiAoICEkQm91bmNlRW1haWxBc0ZvbGxvd1VwICYmICRGb2xsb3dVcFBvc3NpYmxlID1+IC9yZWplY3QvaSAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eKHJlbW92ZWR8Y2xvc2UpL2kgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0luZm8nLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiRm9sbG93IHVwIGZvciBbJFRuXSBidXQgZm9sbG93IHVwIG5vdCBwb3NzaWJsZS4gRm9sbG93IHVwIHJlamVjdGVkLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlbmQgcmVqZWN0IG1haWwgYW5kIGFkZCBhcnRpY2xlIHRvIHRpY2tldAogICAgICAgICAgICBteSAkUnVuID0gJFNlbGYtPntSZWplY3RPYmplY3R9LT5SdW4oCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgTG9jayAgICAgICAgICAgICA9PiAkTG9jaywKICAgICAgICAgICAgICAgIFRuICAgICAgICAgICAgICAgPT4gJFRuLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICA9PiAnRm9sbG93IHVwIHJlamVjdGVkLicsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlamVjdCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRSdW47CgogICAgICAgICAgICBAUmV0dXJuID0gKCA0LCAkVGlja2V0SUQgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5vcm1hbCBmb2xsb3cgdXAKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15ICRSdW4gPSAkU2VsZi0+e0ZvbGxvd1VwT2JqZWN0fS0+UnVuKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBJbm1haWxVc2VySUQgICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICAgICAgPT4gJExvY2ssCiAgICAgICAgICAgICAgICBUbiAgICAgICAgICAgICAgID0+ICRUbiwKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gZm9sbG93IHVwJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJFJ1bjsKCiAgICAgICAgICAgIEBSZXR1cm4gPSAoIDIsICRUaWNrZXRJRCApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgdGlja2V0CiAgICBlbHNlIHsKCiAgICAgICAgaWYgKCAkUGFyYW17UXVldWV9ICYmICEkUGFyYW17UXVldWVJRH0gKSB7CgogICAgICAgICAgICAjIHF1ZXVlIGxvb2t1cCBpZiBxdWV1ZSBuYW1lIGlzIGdpdmVuCiAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRQYXJhbXtRdWV1ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBxdWV1ZSBmcm9tIEZyb206IG9yIFRvOgogICAgICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ID0gJFNlbGYtPntEZXN0UXVldWVPYmplY3R9LT5HZXRRdWV1ZUlEKCBQYXJhbXMgPT4gJEdldFBhcmFtICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRydXN0ZWQgcmV0dXJucyBhIG5ldyBxdWV1ZSBpZAogICAgICAgIG15ICRUUXVldWVJRCA9ICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fS0+R2V0VHJ1c3RlZFF1ZXVlSUQoCiAgICAgICAgICAgIFBhcmFtcyA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFRRdWV1ZUlEKSB7CiAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRUUXVldWVJRDsKICAgICAgICB9CiAgICAgICAgJFRpY2tldElEID0gJFNlbGYtPntOZXdUaWNrZXRPYmplY3R9LT5SdW4oCiAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgICAgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlcGx5JywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gdW5sZXNzICRUaWNrZXRJRDsKCiAgICAgICAgQFJldHVybiA9ICggMSwgJFRpY2tldElEICk7CiAgICB9CgogICAgIyBydW4gYWxsIFBvc3RGaWx0ZXJNb2R1bGVzIChtb2RpZnkgZW1haWwgcGFyYW1zKQogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdQb3N0TWFzdGVyOjpQb3N0RmlsdGVyTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UG9zdEZpbHRlck1vZHVsZScpIH07CgogICAgICAgICMgZ2V0IG1haW4gb2JqZWN0cwogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgSk9COgogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgcmV0dXJuIHVubGVzcyAkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICBteSAkRmlsdGVyT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRGaWx0ZXJPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJuZXcoKSBvZiBQb3N0RmlsdGVyTW9kdWxlICRKb2JzeyRKb2J9LT57TW9kdWxlfSBub3Qgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgSk9COwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vZGlmeSBwYXJhbXMKICAgICAgICAgICAgbXkgJFJ1biA9ICRGaWx0ZXJPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgSm9iQ29uZmlnID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgUmV0dXJuICAgID0+ICRSZXR1cm5bMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSdW4gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJFeGVjdXRlIFJ1bigpIG9mIFBvc3RGaWx0ZXJNb2R1bGUgJEpvYnN7JEpvYn0tPntNb2R1bGV9IG5vdCBzdWNjZXNzZnVsbHkhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgIyBjcmVhdGUgbGluayBvZiB0eXBlICdJbnRlcmRpdmlzaW9uYWwnIHRvIHRpY2tldHMKICAgIGlmICggJFBhcmFte0FkZHJlc3NQb29sfQogICAgICAgICYmICggQFRpY2tldElEc1RvTGluayB8fCAkUGFyYW17Rm9sbG93VXBUaWNrZXRJRH0gfHwgJEdldFBhcmFtLT57SWdub3JlQWRkcmVzc1Bvb2xzfSApICkgewoKICAgICAgICAjIGFkZCBhbGwgdGlja2V0IGlkcyB0byB0aGUgcmV0dXJuIC0gbWFpbmx5IHVzZWQgZm9yIHVuaXQgdGVzdHMKICAgICAgICBwdXNoIEBSZXR1cm4sIEBUaWNrZXRJRHNUb0xpbms7CgogICAgICAgICMgYWRkIHRoZSB0aWNrZXQgSUQgb2YgdGhlIGZpcnN0IHRpY2tldAogICAgICAgIHB1c2ggQFRpY2tldElEc1RvTGluaywgJFJldHVyblsxXTsKCiAgICAgICAgIyBhZGQgdGhlIG9yaWdpbmFsIGZvbGxvdyB1cCBJRCwgaWYgaXQgd2FzIGluIGEgcG9vbCBub3QgYWRkcmVzc2VkCiAgICAgICAgaWYgKCAkUGFyYW17Rm9sbG93VXBUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgIHB1c2ggQFRpY2tldElEc1RvTGluaywgJFBhcmFte0ZvbGxvd1VwVGlja2V0SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGlzIGlzIGFuIGVtYWlsIHBhcnNlZCBhbiBhZGRpdGlvbmFsIHRpbWUsIGxpbmsgYWxsIHByZXZpb3VzbHkgY3JlYXRlZCB0aWNrZXRzCiAgICAgICAgaWYgKCAkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9ICkgewogICAgICAgICAgICBwdXNoIEBUaWNrZXRJRHNUb0xpbmssICggdmFsdWVzICRHZXRQYXJhbS0+e0lnbm9yZUFkZHJlc3NQb29sc30tPiUqICk7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhbGwgdGlja2V0cyBhbHJlYWR5IGxpbmtlZAogICAgICAgIG15ICVMaW5rZWRUaWNrZXRzID0gJExpbmtPYmplY3QtPkxpbmtLZXlMaXN0KAogICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICBLZXkxICAgID0+ICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSB8fCAkVGlja2V0SUQsCiAgICAgICAgICAgIE9iamVjdDIgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVHlwZSAgICA9PiAnSW50ZXJkaXZpc2lvbmFsJywKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1Bvc3RtYXN0ZXJVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFRpY2tldElEc1RvTGluaywga2V5cyAlTGlua2VkVGlja2V0czsKCiAgICAgICAgJFNlbGYtPntBZGRyZXNzUG9vbE9iamVjdH0tPkludGVyZGl2aXNpb25hbFRpY2tldExpbmtBZGQoCiAgICAgICAgICAgIFRpY2tldElEcyA9PiBcQFRpY2tldElEc1RvTGluaywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgIHJldHVybiBAUmV0dXJuOwp9Cgo9aGVhZDIgQ2hlY2tGb2xsb3dVcCgpCgp0byBkZXRlY3QgdGhlIHRpY2tldCBudW1iZXIgaW4gcHJvY2Vzc2luZyBlbWFpbAoKICAgIG15ICgkVGlja2V0TnVtYmVyLCAkVGlja2V0SUQpID0gJFBvc3RNYXN0ZXJPYmplY3QtPkNoZWNrRm9sbG93VXAoCiAgICAgICAgU3ViamVjdCA9PiAnUmU6IFtUaWNrZXQ6IzEyMzQ1Nl0gU29tZSBTdWJqZWN0JywKICAgICk7Cgo9Y3V0CgpzdWIgQ2hlY2tGb2xsb3dVcCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgTG9hZCBDaGVja0ZvbGxvd1VwIE1vZHVsZXMKICAgIG15ICRKb2JzID0gJENvbmZpZ09iamVjdC0+R2V0KCdQb3N0TWFzdGVyOjpDaGVja0ZvbGxvd1VwTW9kdWxlJyk7CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkSm9icykgKSB7CiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgICAgIEpPQjoKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlJEpvYnMgKSB7CiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkSm9icy0+eyRKb2J9OwoKICAgICAgICAgICAgcmV0dXJuIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnMtPnskSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgIG15ICRDaGVja09iamVjdCA9ICRKb2JzLT57JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRDaGVja09iamVjdCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIm5ldygpIG9mIENoZWNrRm9sbG93VXAgJEpvYnMtPnskSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgSk9COwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRUaWNrZXRJRCA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkVGlja2V0SUQpIHsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICglVGlja2V0KSB7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgZm9sbG93IHVwIHRpY2tldCB3aXRoIFRpY2tldE51bWJlciAnJFRpY2tldHtUaWNrZXROdW1iZXJ9JyBhbmQgVGlja2V0SUQgJyRUaWNrZXRJRCcuIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAkVGlja2V0e1RpY2tldE51bWJlcn0sICRUaWNrZXRJRCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEdldEVtYWlsUGFyYW1zKCkKCnRvIGdldCBhbGwgY29uZmlndXJlZCBQb3N0bWFzdGVyWC1IZWFkZXIgZW1haWwgaGVhZGVycwoKICAgIG15ICVIZWFkZXIgPSAkUG9zdE1hc3Rlck9iamVjdC0+R2V0RW1haWxQYXJhbXMoKTsKCj1jdXQKCnN1YiBHZXRFbWFpbFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVHZXRQYXJhbTsKCiAgICAjIHBhcnNlIHNlY3Rpb24KICAgIEhFQURFUjoKICAgIGZvciBteSAkUGFyYW0gKCBAeyAkU2VsZi0+eydQb3N0bWFzdGVyWC1IZWFkZXInfSB9ICkgewoKICAgICAgICAjIGRvIG5vdCBzY2FuIHgtb3RvYm8gaGVhZGVycyBpZiBtYWlsYm94IGlzIG5vdCBtYXJrZWQgYXMgdHJ1c3RlZAogICAgICAgIG5leHQgSEVBREVSIGlmICggISRTZWxmLT57VHJ1c3RlZH0gJiYgJFBhcmFtID1+IC9eeC1vdG9iby9pICk7CgogICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRQYXJhbSggV0hBVCA9PiAkUGFyYW0gKTsKCiAgICAgICAgbmV4dCBIRUFERVIgaWYgISRHZXRQYXJhbXskUGFyYW19OwoKICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiJFBhcmFtOiAiIC4gJEdldFBhcmFteyRQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBjb21wYXQuIGhlYWRlcnMKICAgIGlmICggJEdldFBhcmFteydNZXNzYWdlLUlkJ30gKSB7CiAgICAgICAgJEdldFBhcmFteydNZXNzYWdlLUlEJ30gPSAkR2V0UGFyYW17J01lc3NhZ2UtSWQnfTsKICAgIH0KICAgIGlmICggJEdldFBhcmFteydSZXBseS1Ubyd9ICkgewogICAgICAgICRHZXRQYXJhbXsnUmVwbHlUbyd9ID0gJEdldFBhcmFteydSZXBseS1Ubyd9OwogICAgfQogICAgaWYgKAogICAgICAgICRHZXRQYXJhbXsnTWFpbGluZy1MaXN0J30KICAgICAgICB8fCAkR2V0UGFyYW17J1ByZWNlZGVuY2UnfQogICAgICAgIHx8ICRHZXRQYXJhbXsnWC1Mb29wJ30KICAgICAgICB8fCAkR2V0UGFyYW17J1gtTm8tTG9vcCd9CiAgICAgICAgfHwgJEdldFBhcmFteydYLU9UT0JPLUxvb3AnfQogICAgICAgIHx8ICgKICAgICAgICAgICAgJEdldFBhcmFteydBdXRvLVN1Ym1pdHRlZCd9CiAgICAgICAgICAgICYmIHN1YnN0ciggJEdldFBhcmFteydBdXRvLVN1Ym1pdHRlZCd9LCAwLCA1ICkgZXEgJ2F1dG8tJwogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteydYLU9UT0JPLUxvb3AnfSA9ICd5ZXMnOwogICAgfQogICAgaWYgKCAhJEdldFBhcmFteydYLVNlbmRlcid9ICkgewoKICAgICAgICAjIGdldCBzZW5kZXIgZW1haWwKICAgICAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwogICAgICAgIG15IEBFbWFpbEFkZHJlc3NlcyAgICAgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKAogICAgICAgICAgICBMaW5lID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkRW1haWwgKEBFbWFpbEFkZHJlc3NlcykgewogICAgICAgICAgICAkR2V0UGFyYW17J1gtU2VuZGVyJ30gPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIHNldCBzZW5kZXIgdHlwZSBpZiBub3QgZ2l2ZW4KICAgIGZvciBteSAkS2V5IChxdyhYLU9UT0JPLVNlbmRlclR5cGUgWC1PVE9CTy1Gb2xsb3dVcC1TZW5kZXJUeXBlKSkgewoKICAgICAgICBpZiAoICEkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICdjdXN0b21lcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIFgtT1RPQk8tU2VuZGVyVHlwZSBleGlzdHMsIGlmIG5vdCwgc2V0IGN1c3RvbWVyCiAgICAgICAgaWYgKCAhJEFydGljbGVPYmplY3QtPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKCBTZW5kZXJUeXBlID0+ICRHZXRQYXJhbXskS2V5fSApICkgewogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkNhbid0IGZpbmQgc2VuZGVyIHR5cGUgJyRHZXRQYXJhbXskS2V5fScgaW4gZGIsIHRha2UgJ2N1c3RvbWVyJyIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICdjdXN0b21lcic7CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IGFydGljbGUgY3VzdG9tZXIgdmlzaWJpbGl0eSBpZiBub3QgZ2l2ZW4uCiAgICBmb3IgbXkgJEtleSAocXcoWC1PVE9CTy1Jc1Zpc2libGVGb3JDdXN0b21lciBYLU9UT0JPLUZvbGxvd1VwLUlzVmlzaWJsZUZvckN1c3RvbWVyKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBib2R5LgogICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRNZXNzYWdlQm9keSgpOwoKICAgICMgR2V0IGNvbnRlbnQgdHlwZSwgZGlzcG9zaXRpb24gYW5kIGNoYXJzZXQuCiAgICAkR2V0UGFyYW17J0NvbnRlbnQtVHlwZSd9ICAgICAgICA9ICRTZWxmLT57UGFyc2VyT2JqZWN0fS0+R2V0UmV0dXJuQ29udGVudFR5cGUoKTsKICAgICRHZXRQYXJhbXsnQ29udGVudC1EaXNwb3NpdGlvbid9ID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRDb250ZW50RGlzcG9zaXRpb24oKTsKICAgICRHZXRQYXJhbXtDaGFyc2V0fSAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRSZXR1cm5DaGFyc2V0KCk7CgogICAgIyBHZXQgYXR0YWNobWVudHMuCiAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldEF0dGFjaG1lbnRzKCk7CiAgICAkR2V0UGFyYW17QXR0YWNobWVudH0gPSBcQEF0dGFjaG1lbnRzOwoKICAgIHJldHVybiBcJUdldFBhcmFtOwp9CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKPWhlYWQyIFJlY3Vyc2l2ZVBvc3RNYXN0ZXJSdW4oKQoKUmVjdXJzaXZlIHBvc3RtYXN0ZXIgcnVuIGZvciBhZGRyZXNzIHBvb2wKCiAgICBteSAkVGlja2V0SUQgPSAkUG9zdE1hc3Rlck9iamVjdC0+UmVjdXJzaXZlUG9zdE1hc3RlclJ1bigKICAgICAgICBFbWFpbFBhcmFtcyAgICAgID0+IFwlRW1haWxQYXJhbXMsICAjIChvcHRpb25hbCkKICAgICAgICBBZGRyZXNzUG9vbCAgICAgID0+ICdQb29sMScsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBGb2xsb3dVcFRpY2tldElEID0+IDQsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICk7CgpSZXR1cm46CgogICAgVGlja2V0SUQgPSA1Cgo9Y3V0CgpzdWIgUmVjdXJzaXZlUG9zdE1hc3RlclJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRJRDsKCiAgICAjIGdldCBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY3JlYXRlIG5ldyBjb21tdW5pY2F0aW9uIGxvZyBmb3IgZXZlcnkgYXJ0aWNsZQogICAgbXkgJENvbW11bmljYXRpb25Mb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6Q29tbXVuaWNhdGlvbkxvZycsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgVHJhbnNwb3J0ICAgPT4gJ0VtYWlsJywKICAgICAgICAgICAgRGlyZWN0aW9uICAgPT4gJ0luY29taW5nJywKICAgICAgICAgICAgQWNjb3VudFR5cGUgPT4gJ1NURElOJywKICAgICAgICB9LAogICAgKTsKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdGFydCggT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScgKTsKCiAgICAjIGNyZWF0ZSBjb25uZWN0aW9uIGRldGFpbHMgbGluawogICAgbXkgJE9yaWdpbkNvbm5lY3Rpb25JRCAgICA9ICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPntDdXJyZW50fS0+e0Nvbm5lY3Rpb259OwogICAgbXkgJE9yaWdpbkNvbW11bmljYXRpb25JRCA9ICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPntDb21tdW5pY2F0aW9uSUR9OwogICAgaWYgKCAkT3JpZ2luQ29ubmVjdGlvbklEICYmICRPcmlnaW5Db21tdW5pY2F0aW9uSUQgKSB7CgogICAgICAgIG15ICREZXRhaWxzTGluayA9ICRDb25maWdPYmplY3QtPntIdHRwVHlwZX0gLiAiOi8vIiAuICRDb25maWdPYmplY3QtPntGUUROfSAuCiAgICAgICAgICAgICIvb3RvYm8vaW5kZXgucGw/QWN0aW9uPUFkbWluQ29tbXVuaWNhdGlvbkxvZztTdWJhY3Rpb249Wm9vbTtDb21tdW5pY2F0aW9uSUQ9JE9yaWdpbkNvbW11bmljYXRpb25JRDtPYmplY3RMb2dJRD0kT3JpZ2luQ29ubmVjdGlvbklEIjsKCiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sOjpPcmlnaW5hbE1haWwnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJGb3IgbW9yZSBkZXRhaWxzIHNlZTogJERldGFpbHNMaW5rIiwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IG5ldyBjb21tdW5pY2F0aW9uIGxvZwogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0OwoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzIGFnYWluCiAgICAkU2VsZi0+X0NyZWF0ZU1haWxPYmplY3RzKAogICAgICAgIERhdGEgPT4gJFNlbGYsCiAgICApOwoKICAgICMgc2V0IHN0YXR1cyBtZXNzYWdlCiAgICBteSAkTWVzc2FnZVN0YXR1cyA9ICdTdWNjZXNzZnVsJzsKCiAgICAjIHJ1biBwb3N0IG1hc3RlcgogICAgbXkgQFN1Y2Nlc3MgPSBldmFsIHsKICAgICAgICAkU2VsZi0+UnVuKAogICAgICAgICAgICBFbWFpbFBhcmFtcyAgICAgID0+ICRQYXJhbXtFbWFpbFBhcmFtc30sCiAgICAgICAgICAgIEFkZHJlc3NQb29sICAgICAgPT4gJFBhcmFte0FkZHJlc3NQb29sfSwKICAgICAgICAgICAgRm9sbG93VXBUaWNrZXRJRCA9PiAkUGFyYW17Rm9sbG93VXBUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgIH07CiAgICBpZiAoICEkU3VjY2Vzc1swXSApIHsKICAgICAgICAkTWVzc2FnZVN0YXR1cyA9ICdGYWlsZWQnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFRpY2tldElEID0gJFN1Y2Nlc3NbMV07CiAgICB9CgogICAgIyBzdG9wIG9iamVjdCAvIGNvbW11bmljYXRpb24gbG9nCiAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nU3RvcCgKICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICBTdGF0dXMgICAgICAgID0+ICRNZXNzYWdlU3RhdHVzLAogICAgKTsKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5Db21tdW5pY2F0aW9uU3RvcCggU3RhdHVzID0+ICdTdWNjZXNzZnVsJyApOwoKICAgIHJldHVybiAkVGlja2V0SUQ7Cn0KCj1oZWFkMiBfQ3JlYXRlTWFpbE9iamVjdHMoKQoKQ3JlYXRlIG5ldyBtYWlsIG9iamVjdHMgKERlc3RRdWV1ZSwgTmV3VGlja2V0LCBGb2xsb3dVcCwgUmVqZWN0LCBBZGRyZXNzUG9vbCkKCiAgICAkUG9zdE1hc3Rlck9iamVjdC0+X0NyZWF0ZU1haWxPYmplY3RzKAogICAgICAgIERhdGEgPT4gJFNlbGYsCiAgICApOwoKPWN1dAoKc3ViIF9DcmVhdGVNYWlsT2JqZWN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RGF0YX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIERhdGEhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBtYWlsIG9iamVjdHMKICAgICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkRlc3RRdWV1ZS0+bmV3KCAkUGFyYW17RGF0YX0tPiUqICk7CiAgICAkU2VsZi0+e05ld1RpY2tldE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpOZXdUaWNrZXQtPm5ldyggJFBhcmFte0RhdGF9LT4lKiApOwogICAgJFNlbGYtPntGb2xsb3dVcE9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6Rm9sbG93VXAtPm5ldyggJFBhcmFte0RhdGF9LT4lKiApOwogICAgJFNlbGYtPntSZWplY3RPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6UmVqZWN0LT5uZXcoICRQYXJhbXtEYXRhfS0+JSogKTsKICAgICRTZWxmLT57QWRkcmVzc1Bvb2xPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sLT5uZXcoICRQYXJhbXtEYXRhfS0+JSogKTsKCiAgICByZXR1cm4gMTsKfQoKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKMTsK</File>
        <File Location="Custom/Kernel/System/SystemAddress.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAyY2QyY2VjNjhmMTNlN2M3MmFlZWZiMDY5ZWEwNmQzOWU0ZTI0ZjE5IC0gS2VybmVsL1N5c3RlbS9TeXN0ZW1BZGRyZXNzLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3M7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGUKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJywKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIC0gYWxsIHN5c3RlbSBhZGRyZXNzIGZ1bmN0aW9ucwoKPWhlYWQxIERFU0NSSVBUSU9OCgpHbG9iYWwgbW9kdWxlIHRvIGFkZC9lZGl0L3VwZGF0ZSBzeXN0ZW0gYWRkcmVzc2VzLiBUaGVyZSBpcyBhIHN5c3RlbSBhZGRyZXNzIGZvciBlYWNoIHF1ZXVlLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIG15ICRTeXN0ZW1BZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCRUeXBlKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ1N5c3RlbUFkZHJlc3MnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc0FkZCgpCgphZGQgc3lzdGVtIGFkZHJlc3Mgd2l0aCBhdHRyaWJ1dGVzCgogICAgbXkgJElEID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NBZGQoCiAgICAgICAgTmFtZSAgICAgPT4gJ2luZm9AZXhhbXBsZS5jb20nLAogICAgICAgIFJlYWxuYW1lID0+ICdIb3RsaW5lJywKICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgIFF1ZXVlSUQgID0+IDEyMywKICAgICAgICBDb21tZW50ICA9PiAnc29tZSBjb21tZW50JywKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFN5c3RlbUFkZHJlc3NBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5hbWUgVmFsaWRJRCBSZWFsbmFtZSBRdWV1ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIE9ubHkgdGhlIHBsYWluIGFkZHJlc3MgaXMgcmVsZXZhbnQKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CiAgICBteSAkQWRkcmVzcyAgICAgICAgICAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggRW1haWwgPT4gJFBhcmFte05hbWV9ICk7CiAgICBpZiAoICEkQWRkcmVzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIickUGFyYW17TmFtZX0nIGlzIG5vdCBhbiBlbWFpbCBhZGRyZXNzIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBhIHN5c3RlbSBhZGRyZXNzIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoICRTZWxmLT5OYW1lRXhpc3RzQ2hlY2soIE5hbWUgPT4gJEFkZHJlc3MgKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgc3lzdGVtIGFkZHJlc3Mgd2l0aCB0aGUgbmFtZSAnJEFkZHJlc3MnIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBpbnNlcnQgbmV3IHN5c3RlbSBhZGRyZXNzCiAgICByZXR1cm4gdW5sZXNzICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzeXN0ZW1fYWRkcmVzcyAodmFsdWUwLCB2YWx1ZTEsIHZhbGlkX2lkLCBjb21tZW50cywgcXVldWVfaWQsICcKICAgICAgICAgICAgLiAnIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpJwogICAgICAgICAgICAuICcgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRBZGRyZXNzLCAgICAgICAgXCRQYXJhbXtSZWFsbmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17UXVldWVJRH0sIFwkUGFyYW17VXNlcklEfSwgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgc3lzdGVtIGFkZHJlc3MgaWQKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgdmFsdWUwID0gPyBBTkQgdmFsdWUxID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJEFkZHJlc3MsIFwkUGFyYW17UmVhbG5hbWV9LCBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJElEID0gJFJvd1swXTsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICRJRDsKfQoKPWhlYWQyIFN5c3RlbUFkZHJlc3NHZXQoKQoKZ2V0IHN5c3RlbSBhZGRyZXNzIHdpdGggYXR0cmlidXRlcwoKICAgIG15ICVTeXN0ZW1BZGRyZXNzID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgSUQgPT4gMSwKICAgICk7CgpyZXR1cm5zOgoKICAgICVTeXN0ZW1BZGRyZXNzID0gKAogICAgICAgIElEICAgICAgICAgPT4gMSwKICAgICAgICBOYW1lICAgICAgID0+ICdpbmZvQGV4YW1wbGUuY29tJwogICAgICAgIFJlYWxuYW1lICAgPT4gJ0hvdGxpbmUnLAogICAgICAgIFF1ZXVlSUQgICAgPT4gMTIzLAogICAgICAgIENvbW1lbnQgICAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIENyZWF0ZVRpbWUgPT4gJzIwMTAtMTEtMjkgMTE6MDQ6MDQnLAogICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMTAtMTItMDcgMTI6MzM6NTYnLAogICAgKQoKPWN1dAoKc3ViIFN5c3RlbUFkZHJlc3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgSUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQ2FjaGVLZXkgPSAnU3lzdGVtQWRkcmVzc0dldDo6JyAuICRQYXJhbXtJRH07CgogICAgbXkgJENhY2hlZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIHJldHVybiAleyRDYWNoZWR9IGlmIHJlZiAkQ2FjaGVkIGVxICdIQVNIJzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHN5c3RlbSBhZGRyZXNzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCB2YWx1ZTAsIHZhbHVlMSwgY29tbWVudHMsIHZhbGlkX2lkLCBxdWV1ZV9pZCwgY2hhbmdlX3RpbWUsIGNyZWF0ZV90aW1lICcKICAgICAgICAgICAgLiAnIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgSUQgICAgICAgICA9PiAkUGFyYW17SUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICREYXRhWzBdLAogICAgICAgICAgICBSZWFsbmFtZSAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICREYXRhWzJdLAogICAgICAgICAgICBWYWxpZElEICAgID0+ICREYXRhWzNdLAogICAgICAgICAgICBRdWV1ZUlEICAgID0+ICREYXRhWzRdLAogICAgICAgICAgICBDaGFuZ2VUaW1lID0+ICREYXRhWzVdLAogICAgICAgICAgICBDcmVhdGVUaW1lID0+ICREYXRhWzZdLAogICAgICAgICk7CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICk7CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc1VwZGF0ZSgpCgp1cGRhdGUgc3lzdGVtIGFkZHJlc3Mgd2l0aCBhdHRyaWJ1dGVzCgogICAgJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NVcGRhdGUoCiAgICAgICAgSUQgICAgICAgPT4gMSwKICAgICAgICBOYW1lICAgICA9PiAnaW5mb0BleGFtcGxlLmNvbScsICAgIyBhY3R1YWxseSB0aGUgZW1haWwKICAgICAgICBSZWFsbmFtZSA9PiAnSG90bGluZScsCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBRdWV1ZUlEICA9PiAxMjMsCiAgICAgICAgQ29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBDaGVjayBuZWVkZWQgc3R1ZmYuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgTmFtZSBWYWxpZElEIFJlYWxuYW1lIFF1ZXVlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgT25seSB0aGUgcGxhaW4gYWRkcmVzcyBpcyByZWxldmFudAogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgIG15ICRBZGRyZXNzICAgICAgICAgICAgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBFbWFpbCA9PiAkUGFyYW17TmFtZX0gKTsKICAgIGlmICggISRBZGRyZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJyRQYXJhbXtOYW1lfScgaXMgbm90IGFuIGVtYWlsIGFkZHJlc3MiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENoZWNrIHdoZXRoZXIgYW5vdGhlciBzeXN0ZW0gYWRkcmVzcyB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4KICAgIGlmICgKICAgICAgICAkU2VsZi0+TmFtZUV4aXN0c0NoZWNrKAogICAgICAgICAgICBJRCAgID0+ICRQYXJhbXtJRH0sCiAgICAgICAgICAgIE5hbWUgPT4gJEFkZHJlc3MsCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgc3lzdGVtIGFkZHJlc3Mgd2l0aCB0aGUgbmFtZSAnJEFkZHJlc3MnIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQ2hlY2sgd2hldGhlciB0aGUgc3lzdGVtIGFkZHJlc3MgaXMgdXNlZCBpbiBhbnkgcXVldWUgb3IgYXV0byByZXNwb25zZQogICAgaWYgKCAkU2VsZi0+U3lzdGVtQWRkcmVzc0lzVXNlZCggU3lzdGVtQWRkcmVzc0lEID0+ICRQYXJhbXtJRH0gKSAmJiAkUGFyYW17VmFsaWRJRH0gPiAxICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgIlRoaXMgc3lzdGVtIGFkZHJlc3MgJyRBZGRyZXNzJyBjYW5ub3QgYmUgc2V0IHRvIGludmFsaWQsIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBvbmUgb3IgbW9yZSBxdWV1ZShzKSBvciBhdXRvIHJlc3BvbnNlKHMpLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBVcGRhdGUgc3lzdGVtIGFkZHJlc3MuCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBzeXN0ZW1fYWRkcmVzcyBTRVQgdmFsdWUwID0gPywgdmFsdWUxID0gPywgY29tbWVudHMgPSA/LCB2YWxpZF9pZCA9ID8sICcKICAgICAgICAgICAgLiAnIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8sIHF1ZXVlX2lkID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJEFkZHJlc3MsICAgICAgIFwkUGFyYW17UmVhbG5hbWV9LCBcJFBhcmFte0NvbW1lbnR9LCBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17UXVldWVJRH0sICBcJFBhcmFte0lEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBTeXN0ZW1BZGRyZXNzTGlzdCgpCgpnZXQgYSBsaXN0IG9mIHN5c3RlbSBhZGRyZXNzZXMKCiAgICBteSAlTGlzdCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzTGlzdCgKICAgICAgICBWYWxpZCA9PiAwLCAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gMQogICAgKTsKCnJldHVybnM6CgogICAgJUxpc3QgPSAoCiAgICAgICAgJzEnID0+ICdzYWxlc0BleGFtcGxlLmNvbScsCiAgICAgICAgJzInID0+ICdwdXJjaGFzaW5nQGV4YW1wbGUuY29tJywKICAgICAgICAnMycgPT4gJ3NlcnZpY2VAZXhhbXBsZS5jb20nLAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoICEkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRDYWNoZUtleSA9ICdTeXN0ZW1BZGRyZXNzTGlzdDo6JyAuICRWYWxpZDsKCiAgICBteSAkQ2FjaGVkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgcmV0dXJuICV7JENhY2hlZH0gaWYgcmVmICRDYWNoZWQgZXEgJ0hBU0gnOwoKICAgIG15ICRWYWxpZFNRTCA9ICcnOwogICAgaWYgKCRWYWxpZCkgewogICAgICAgIG15ICRWYWxpZElEcyA9IGpvaW4gJywnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKICAgICAgICAkVmFsaWRTUUwgPSAiIFdIRVJFIHZhbGlkX2lkIElOICgkVmFsaWRJRHMpIjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHN5c3RlbSBhZGRyZXNzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICBTRUxFQ1QgaWQsIHZhbHVlMAogICAgICAgICAgICBGUk9NIHN5c3RlbV9hZGRyZXNzCiAgICAgICAgICAgICRWYWxpZFNRTCIsCiAgICApOwoKICAgIG15ICVMaXN0OwoKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTGlzdHsgJERhdGFbMF0gfSA9ICREYXRhWzFdOwogICAgfQoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJUxpc3QsCiAgICApOwoKICAgIHJldHVybiAlTGlzdDsKfQoKPWhlYWQyIFN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygpCgpDaGVja3MgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgYSBsb2NhbCAoc3lzdGVtKSBhZGRyZXNzLiBSZXR1cm5zIHRydWUKZm9yIGxvY2FsIGFkZHJlc3Nlcy4KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICAgaWYgKCAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKCBBZGRyZXNzID0+ICdpbmZvQGV4YW1wbGUuY29tJyApICkgewogICAgbXkgJElzTG9jYWwgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgIEFkZHJlc3MgID0+ICdpbmZvQGV4YW1wbGUuY29tJywKICAgICAgICBRdWV1ZUlEICA9PiA0LCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBUaWNrZXRJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICk7CgogICAgaWYgKCAkSXNMb2NhbCApIHsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICMgaXMgbG9jYWwKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgaXMgbm90IGxvY2FsCiAgICB9CgpBbHRlcm5hdGl2ZWx5IGFuIGluc3RhbmNlIG9mIEVtYWlsOjpBZGRyZXNzOjpYUyBtYXkgYmUgcGFzc2VkLiBJbiB0aGF0IGNhc2Ugb25seSB0aGUgYmFyZSBhZGRyZXNzIGlzIGNoZWNrZWQuCgogICAgbXkgJEFkZHJlc3NPYmplY3QgPSBFbWFpbDo6QWRkcmVzczo6WFMtPm5ldygKICAgICAgICAnQXVndXN0IEF1c3Byb2JpZXJlcicsCiAgICAgICAgJ2d1c3RsQHRlc3Rhbnl0aGluZy5vcmcnCiAgICApOwoKICAgIG15ICRJc0xvY2FsID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICBBZGRyZXNzT2JqZWN0ID0+ICRBZGRyZXNzT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0FkZHJlc3N9ICYmICFkZWZpbmVkICRQYXJhbXtBZGRyZXNzT2JqZWN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIEFkZHJlc3Mgb3IgQWRkcmVzc09iamVjdCEnCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCAkUGFyYW17QWRkcmVzc30gJiYgZGVmaW5lZCAkUGFyYW17QWRkcmVzc09iamVjdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIG9ubHkgb25lIG9mIEFkZHJlc3Mgb3IgQWRkcmVzc09iamVjdCEnCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgVHJhZGl0aW9uYWxseSB0aGlzIGNoZWNrIGlzIG9ubHkgbG9va2luZyBhIHRoZSBiYXJlIGFkZHJlc3MuCiAgICBteSAkQWRkcmVzcyA9ICRQYXJhbXtBZGRyZXNzfSAvLyAkUGFyYW17QWRkcmVzc09iamVjdH0tPmFkZHJlc3M7CgogICAgIyBOb3RlIHRoYXQgYSBkZWZpbmVkIGFkZHJlc3Mgb2JqZWN0IGNhbiBzdGlsbCBnaXZlIGFuIGVtcHR5IGFkZHJlc3MuCiAgICAjIEluIHRoaXMgY2FzZSB3ZSBkb24ndCBjbGFpbSB0aGF0IGl0IGlzIGEgbG9jYWwgYWRkcmVzcy4KICAgIHJldHVybiB1bmxlc3MgJEFkZHJlc3M7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgIyBnZXQgb2JqZWN0cwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQWRkcmVzc1Bvb2xPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKTsKCiAgICAjIGdldCBhZGRyZXNzIHBvb2wKICAgIG15ICRBZGRyZXNzUG9vbCA9ICRBZGRyZXNzUG9vbE9iamVjdC0+UG9vbExvb2t1cCgKICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGFkZHJlc3MgZXhpc3QgaW4gc2FtZSBhZGRyZXNzIHBvb2wgb2YgdGlja2V0CiAgICBpZiAoCiAgICAgICAgJEFkZHJlc3NQb29sCiAgICAgICAgJiYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkUXVldWVJRCA9ICRQYXJhbXtRdWV1ZUlEfTsKICAgICAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVJRCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFF1ZXVlRXhpc3QgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPlF1ZXVlQ2hlY2soCiAgICAgICAgICAgIFF1ZXVlICAgICAgID0+ICRRdWV1ZSwKICAgICAgICAgICAgQWRkcmVzc1Bvb2wgPT4gJEFkZHJlc3NQb29sLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkUXVldWVFeGlzdDsKICAgIH0KIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICMgUmV0dXJuIHRoZSBmb3VuZCBxdWV1ZSBpZCwgZGVzcGl0ZSB0aGUgbWV0aG9kIG5hbWUgd2hpY2ggaGludHMgYXQgYSBib29sZWFuIHJlc3VsdAogICAgcmV0dXJuICRTZWxmLT5TeXN0ZW1BZGRyZXNzUXVldWVJRCgKICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzLAogICAgKTsKfQoKPWhlYWQyIFN5c3RlbUFkZHJlc3NRdWV1ZUlEKCkKCmZpbmQgZGlzcGF0Y2hpbmcgcXVldWUgaWQgb2YgZW1haWwgYWRkcmVzcwoKICAgIG15ICRRdWV1ZUlEID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NRdWV1ZUlEKCBBZGRyZXNzID0+ICdpbmZvQGV4YW1wbGUuY29tJyApOwoKPWN1dAoKc3ViIFN5c3RlbUFkZHJlc3NRdWV1ZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBZGRyZXNzKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIHNwYWNlcwogICAgJFBhcmFte0FkZHJlc3N9ID1+IHMvXHMrLy9nOwoKICAgIG15ICRDYWNoZUtleSA9ICdTeXN0ZW1BZGRyZXNzUXVldWVJRDo6JyAuICRQYXJhbXtBZGRyZXNzfTsKICAgIG15ICRDYWNoZWQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIHJldHVybiAkeyRDYWNoZWR9IGlmIHJlZiAkQ2FjaGVkIGVxICdTQ0FMQVInOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAkREJPYmplY3QtPkdldERhdGFiYXNlRnVuY3Rpb24oJ0Nhc2VTZW5zaXRpdmUnKSApIHsKCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIHF1ZXVlX2lkIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgIgogICAgICAgICAgICAgICAgLiAidmFsaWRfaWQgSU4gKCAke1woam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSl9ICkgIgogICAgICAgICAgICAgICAgLiAiQU5EIExPV0VSKHZhbHVlMCkgPSBMT1dFUig/KSIsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtBZGRyZXNzfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgcXVldWVfaWQgRlJPTSBzeXN0ZW1fYWRkcmVzcyBXSEVSRSAiCiAgICAgICAgICAgICAgICAuICJ2YWxpZF9pZCBJTiAoICR7XChqb2luICcsICcsICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpKX0gKSAiCiAgICAgICAgICAgICAgICAuICJBTkQgdmFsdWUwID0gPyIsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtBZGRyZXNzfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkUXVldWVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRRdWV1ZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCRRdWV1ZUlELAogICAgKTsKCiAgICByZXR1cm4gJFF1ZXVlSUQ7Cn0KCj1oZWFkMiBTeXN0ZW1BZGRyZXNzUXVldWVMaXN0KCkKCmdldCBhIGxpc3Qgb2YgdGhlIHF1ZXVlcyBhbmQgdGhlaXIgc3lzdGVtIGFkZHJlc3NlcyBJRHMKCiAgICBteSAlTGlzdCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzUXVldWVMaXN0KAogICAgICAgIFZhbGlkID0+IDAsICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byAxCiAgICApOwoKcmV0dXJuczoKCiAgICAlTGlzdCA9ICgKICAgICAgICAnNScgPT4gMywKICAgICAgICAnNycgPT4gMSwKICAgICAgICAnOScgPT4gMiwKICAgICk7Cgo9Y3V0CgpzdWIgU3lzdGVtQWRkcmVzc1F1ZXVlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgIG15ICRWYWxpZCA9ICRQYXJhbXtWYWxpZH0gLy8gMTsKCiAgICAjIGNyZWF0ZSB0aGUgdmFsaWQgbGlzdAogICAgbXkgJFZhbGlkSURzID0gam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAjIGJ1aWxkIFNRTAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgcXVldWVfaWQsIGlkIEZST00gc3lzdGVtX2FkZHJlc3MnOwoKICAgICMgYWRkIFdIRVJFIHN0YXRlbWVudCBpbiBjYXNlIFZhbGlkIHBhcmFtIGlzIHNldCB0byAnMScsIGZvciB2YWxpZCBzeXN0ZW0gYWRkcmVzcwogICAgaWYgKCRWYWxpZCkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB2YWxpZF9pZCBJTiAoJyAuICRWYWxpZElEcyAuICcpJzsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGRhdGEgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICRTUUwsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVN5c3RlbUFkZHJlc3NRdWV1ZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU3lzdGVtQWRkcmVzc1F1ZXVlTGlzdHsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gJVN5c3RlbUFkZHJlc3NRdWV1ZUxpc3Q7Cgp9Cgo9aGVhZDIgTmFtZUV4aXN0c0NoZWNrKCkKCnJldHVybiAxIGlmIGFub3RoZXIgc3lzdGVtIGFkZHJlc3Mgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMKCiAgICAkRXhpc3QgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+TmFtZUV4aXN0c0NoZWNrKAogICAgICAgIE5hbWUgPT4gJ1NvbWUgQWRkcmVzcycsCiAgICAgICAgSUQgPT4gMSwgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBOYW1lRXhpc3RzQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGlkIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgdmFsdWUwID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkRmxhZzsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggISRQYXJhbXtJRH0gfHwgJFBhcmFte0lEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkRmxhZyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkRmxhZykgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc0lzVXNlZCgpCgpSZXR1cm4gMSBpZiBzeXN0ZW0gYWRkcmVzcyBpcyB1c2VkIGluIGFueSBxdWV1ZSBvciBhdXRvIHJlc3BvbnNlLgoKICAgICRTeXRlbUFkZHJlc3NJc1VzZWQgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0lzVXNlZCgKICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU3lzdGVtQWRkcmVzc0lzVXNlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQ2hlY2sgbmVlZGVkIHBhcmFtLgogICAgaWYgKCAhJFBhcmFte1N5c3RlbUFkZHJlc3NJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFN5c3RlbUFkZHJlc3NJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBHZXQgZGF0YWJhc2Ugb2JqZWN0LgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1Qgc2EuaWQgRlJPTSBzeXN0ZW1fYWRkcmVzcyBzYQogICAgICAgICAgICBMRUZUIEpPSU4gcXVldWUgcSBPTiBxLnN5c3RlbV9hZGRyZXNzX2lkID0gc2EuaWQKICAgICAgICAgICAgTEVGVCBKT0lOIGF1dG9fcmVzcG9uc2UgYXIgT04gYXIuc3lzdGVtX2FkZHJlc3NfaWQgPSBzYS5pZAogICAgICAgICAgICBXSEVSRSBxLnN5c3RlbV9hZGRyZXNzX2lkID0gPyBPUiBhci5zeXN0ZW1fYWRkcmVzc19pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTeXN0ZW1BZGRyZXNzSUR9LCBcJFBhcmFte1N5c3RlbUFkZHJlc3NJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIEZldGNoIHRoZSByZXN1bHQuCiAgICBteSAkU3lzdGVtQWRkcmVzc0lzVXNlZDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTeXN0ZW1BZGRyZXNzSXNVc2VkID0gJFJvd1swXSA/IDEgOiAwOwogICAgfQoKICAgIHJldHVybiAkU3lzdGVtQWRkcmVzc0lzVXNlZDsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/PostMaster/DestQueue.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkN2RhYTczZWUzZjQzZjE2NTdjZDY4M2I2YTE3NDBiY2MyMmQ3OGQ4IC0gS2VybmVsL1N5c3RlbS9Qb3N0TWFzdGVyL0Rlc3RRdWV1ZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpEZXN0UXVldWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJywKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgIyBHZXQgY29tbXVuaWNhdGlvbiBsb2cgb2JqZWN0LgogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRQYXJhbXtDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBDb21tdW5pY2F0aW9uTG9nT2JqZWN0ISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0UXVldWVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGVtYWlsIGhlYWRlcnMKICAgIG15ICVHZXRQYXJhbSA9ICV7ICRQYXJhbXtQYXJhbXN9IH07CgogICAgIyBjaGVjayBwb3NzaWJsZSB0bywgY2MgYW5kIHJlc2VudC10byBlbWFpbGFkZHJlc3NlcwogICAgbXkgJFJlY2lwaWVudCA9ICcnOwogICAgUkVDSVBJRU5UOgogICAgZm9yIG15ICRLZXkgKHF3KFJlc2VudC1UbyBFbnZlbG9wZS1UbyBUbyBDYyBEZWxpdmVyZWQtVG8gWC1PcmlnaW5hbC1UbykpIHsKCiAgICAgICAgbmV4dCBSRUNJUElFTlQgaWYgISRHZXRQYXJhbXskS2V5fTsKCiAgICAgICAgaWYgKCRSZWNpcGllbnQpIHsKICAgICAgICAgICAgJFJlY2lwaWVudCAuPSAnLCAnOwogICAgICAgIH0KCiAgICAgICAgJFJlY2lwaWVudCAuPSAkR2V0UGFyYW17JEtleX07CiAgICB9CgogICAgIyBnZXQgc3lzdGVtIGFkZHJlc3Mgb2JqZWN0CiAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgbXkgJEFkZHJlc3NQb29sT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJyk7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKCiAgICAjIGNoZWNrIGFkZHJlc3NlcwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgIG15IEBFbWFpbEFkZHJlc3NlcyAgICAgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRSZWNpcGllbnQgKTsKICAgIEVNQUlMOgogICAgZm9yIG15ICRFbWFpbCAoQEVtYWlsQWRkcmVzc2VzKSB7CgogICAgICAgIG5leHQgRU1BSUwgdW5sZXNzICRFbWFpbDsKCiAgICAgICAgbXkgJEFkZHJlc3MgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwoKICAgICAgICBuZXh0IEVNQUlMIHVubGVzcyAkQWRkcmVzczsKCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgIyBjaGVjayBpZiBlbWFpbCBleGlzdCBpbiBhZGRyZXNzIHBvb2wKICAgICAgICBpZiAoICRHZXRQYXJhbXtBZGRyZXNzUG9vbH0gKSB7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmCiAgICAgICAgICAgICAgICAoICRBZGRyZXNzUG9vbE9iamVjdC0+UG9vbExvb2t1cCggQWRkcmVzcyA9PiAkQWRkcmVzcyApIC8vICcnICkgbmUgJEdldFBhcmFte0FkZHJlc3NQb29sfTsKICAgICAgICB9CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKCiAgICAgICAgIyBsb29rdXAgcXVldWUgaWQgaWYgcmVjaXBpZW5kIGFkZHJlc3MKICAgICAgICBteSAkUXVldWVJRCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzUXVldWVJRCgKICAgICAgICAgICAgQWRkcmVzcyA9PiAkQWRkcmVzcywKICAgICAgICApOwoKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+IHJlZigkU2VsZiksCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJNYXRjaCBlbWFpbDogJEVtYWlsIHRvIFF1ZXVlSUQgJFF1ZXVlSUQgKE1lc3NhZ2VJRDokR2V0UGFyYW17J01lc3NhZ2UtSUQnfSkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkUXVldWVJRDsKICAgICAgICB9CgogICAgICAgICMgQWRkcmVzcy9FbWFpbCBub3QgbWF0Y2hlZCB3aXRoIGFueSB0aGF0IGlzIGNvbmZpZ3VyZWQgaW4gdGhlIHN5c3RlbQogICAgICAgICMgICBvciBhbnkgZXJyb3Igb2NjdXJyZWQgd2hpbGUgY2hlY2tpbmcgaXQuCgogICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiByZWYoJFNlbGYpLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJObyBtYXRjaCBmb3IgZW1haWw6ICRFbWFpbCAoTWVzc2FnZUlEOiRHZXRQYXJhbXsnTWVzc2FnZS1JRCd9KSEiLAogICAgICAgICk7CiAgICB9CgogICAgIyBJZiB3ZSBnZXQgaGVyZSBtZWFucyB0aGF0IG5vbmUgb2YgdGhlIGFkZHJlc3NlcyBpbiB0aGUgbWVzc2FnZSBpcyBkZWZpbmVkIGFzIGEgc3lzdGVtIGFkZHJlc3MKICAgICMgICBvciBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjaGVja2luZyBpdC4KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICAgbXkgJFF1ZXVlICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3RtYXN0ZXJEZWZhdWx0UXVldWUnKTsKICAgIG15ICRRdWV1ZTsKCiAgICBpZiAoICRHZXRQYXJhbXtBZGRyZXNzUG9vbH0gKSB7CiAgICAgICAgJFF1ZXVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCcpLT57ICRHZXRQYXJhbXtBZGRyZXNzUG9vbH0gfXsnRGVmYXVsdFF1ZXVlJ307CiAgICB9CgogICAgJFF1ZXVlIC8vPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3RtYXN0ZXJEZWZhdWx0UXVldWUnKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKAogICAgICAgIFF1ZXVlID0+ICRRdWV1ZSwKICAgICk7CgogICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+IHJlZigkU2VsZiksCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIk1lc3NhZ2VJRDokR2V0UGFyYW17J01lc3NhZ2UtSUQnfSB0byAnUG9zdG1hc3RlckRlZmF1bHRRdWV1ZScgKCBRdWV1ZUlEOiR7UXVldWVJRH0gKS4iLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkUXVldWVJRDsKICAgIH0KCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgIEtleSAgICAgICAgICAgPT4gcmVmKCRTZWxmKSwKICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJDb3VsZG4ndCBnZXQgUXVldWVJRCBmb3IgJ1Bvc3RtYXN0ZXJEZWZhdWx0UXVldWUnICgke1F1ZXVlfSkgISIsCiAgICApOwoKICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgS2V5ICAgICAgICAgICA9PiByZWYoJFNlbGYpLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gIk1lc3NhZ2VJRDokR2V0UGFyYW17J01lc3NhZ2UtSUQnfSB0byBRdWV1ZUlEOjEhIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBHZXRUcnVzdGVkUXVldWVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGVtYWlsIGhlYWRlcnMKICAgIG15ICVHZXRQYXJhbSA9ICV7ICRQYXJhbXtQYXJhbXN9IH07CgogICAgcmV0dXJuIGlmICEkR2V0UGFyYW17J1gtT1RPQk8tUXVldWUnfTsKCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpEZXN0UXVldWUnLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gIkV4aXN0aW5nIFgtT1RPQk8tUXVldWUgaGVhZGVyOiAkR2V0UGFyYW17J1gtT1RPQk8tUXVldWUnfSAoTWVzc2FnZUlEOiRHZXRQYXJhbXsnTWVzc2FnZS1JRCd9KSEiLAogICAgKTsKCiAgICAjIGdldCBkZXN0IHF1ZXVlCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKAogICAgICAgIFF1ZXVlID0+ICRHZXRQYXJhbXsnWC1PVE9CTy1RdWV1ZSd9LAogICAgKTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/Ticket/Article/Backend/Email.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhZGE4NWRhZmQ1OTdhZDk4NjU4OGZkMzU2NTIzY2VkZGE0ZDM5ZDI3IC0gS2VybmVsL1N5c3RlbS9UaWNrZXQvQXJ0aWNsZS9CYWNrZW5kL0VtYWlsLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6RW1haWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50ICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlOjpCYWNrZW5kOjpNSU1FQmFzZSc7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKdXNlIEVtYWlsOjpBZGRyZXNzOjpYUyAoKTsKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWwnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6TG9vcFByb3RlY3Rpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWlsUXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGU6OkJhY2tlbmQ6OkVtYWlsIC0gYmFja2VuZCBjbGFzcyBmb3IgZW1haWwgYmFzZWQgYXJ0aWNsZXMKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBlbWFpbCBiYXNlZCBhcnRpY2xlcyBpbiB0aGUgZGF0YWJhc2UuCgpJbmhlcml0cyBmcm9tIEw8S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6TUlNRUJhc2U+LCBwbGVhc2UgaGF2ZSBhIGxvb2sgdGhlcmUgZm9yIGl0cyBiYXNlIEFQSSwKYW5kIGJlbG93IGZvciB0aGUgYWRkaXRpb25hbCBmdW5jdGlvbnMgdGhpcyBiYWNrZW5kIHByb3ZpZGVzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1jdXQKCnN1YiBDaGFubmVsTmFtZUdldCB7CiAgICByZXR1cm4gJ0VtYWlsJzsKfQoKPWhlYWQyIEFydGljbGVHZXRCeU1lc3NhZ2VJRCgpCgpSZXR1cm4gYXJ0aWNsZSBkYXRhIGJ5IHN1cHBsaWVkIG1lc3NhZ2UgSUQuCgogICAgbXkgJUFydGljbGUgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXRCeU1lc3NhZ2VJRCgKICAgICAgICBNZXNzYWdlSUQgICAgID0+ICc8MTMyMzEyMzEuMTIzMTIzMS4zMjEzMTIzMUBleGFtcGxlLmNvbT4nLCAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUbyBpbmNsdWRlIHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlcyBmb3IgdGhpcyBhcnRpY2xlIG9uIHRoZSByZXR1cm4gc3RydWN0dXJlLgogICAgICAgIFJlYWxOYW1lcyAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVG8gaW5jbHVkZSB0aGUgRnJvbS9Uby9DYy9CY2MgZmllbGRzIHdpdGggcmVhbCBuYW1lcy4KICAgICk7Cgo9Y3V0CgpzdWIgQXJ0aWNsZUdldEJ5TWVzc2FnZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2VJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1lc3NhZ2VJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRNRDUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5NRDVzdW0oIFN0cmluZyA9PiAkUGFyYW17TWVzc2FnZUlEfSApOwoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgR2V0IHRpY2tldCBhbmQgYXJ0aWNsZSBJRCBmcm9tIG1ldGEgYXJ0aWNsZSB0YWJsZS4KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKIyAgICAgICBTUUwgPT4gJwojICAgICAgICAgICBTRUxFQ1Qgc2EuaWQsIHNhLnRpY2tldF9pZCBGUk9NIGFydGljbGUgc2EKIyAgICAgICAgICAgTEVGVCBKT0lOIGFydGljbGVfZGF0YV9taW1lIHNhZG0gT04gc2EuaWQgPSBzYWRtLmFydGljbGVfaWQKIyAgICAgICAgICAgV0hFUkUgc2FkbS5hX21lc3NhZ2VfaWRfbWQ1ID0gPwojICAgICAgICcsCiMgICAgICAgQmluZCAgPT4gWyBcJE1ENSBdLAojICAgICAgIExpbWl0ID0+IDEwLAojICAgKTsKIwojICAgIG15ICRDb3VudCA9IDA7CiMgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiMgICAgICAgICRQYXJhbXtBcnRpY2xlSUR9ID0gJFJvd1swXTsKIyAgICAgICAgJFBhcmFte1RpY2tldElEfSAgPSAkUm93WzFdOwojICAgICAgICAkQ291bnQrKzsKIyAgICB9CiMKIyAgICAjIE5vIHJlZmVyZW5jZSBmb3VuZC4KIyAgICByZXR1cm4gaWYgJENvdW50ID09IDA7CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1Qgc2EuaWQsIHNhLnRpY2tldF9pZCBGUk9NIGFydGljbGUgc2EKICAgICAgICAgICAgTEVGVCBKT0lOIGFydGljbGVfZGF0YV9taW1lIHNhZG0gT04gc2EuaWQgPSBzYWRtLmFydGljbGVfaWQKICAgICAgICAgICAgV0hFUkUgc2FkbS5hX21lc3NhZ2VfaWRfbWQ1ID0gPwogICAgICAgICAgICBPUkRFUiBCWSBzYS5pZCBERVNDCiAgICAgICAgJywKICAgICAgICBCaW5kICA9PiBbIFwkTUQ1IF0sCiAgICApOwoKICAgIG15IEBUaWNrZXRJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUGFyYW17QXJ0aWNsZUlEfSAvLz0gJFJvd1swXTsKICAgICAgICAkUGFyYW17VGlja2V0SUR9ICAvLz0gJFJvd1sxXTsKICAgICAgICBwdXNoIEBUaWNrZXRJRHMsICRSb3dbMV07CiAgICB9CgogICAgIyBObyByZWZlcmVuY2UgZm91bmQuCiAgICByZXR1cm4gaWYgIUBUaWNrZXRJRHM7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tldElEfSB8fCAhJFBhcmFte0FydGljbGVJRH07CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgIyBNb3JlIHRoYW4gb25lIHJlZmVyZW5jZSBmb3VuZCEgVGhhdCBzaG91bGQgbm90IGhhcHBlbiwgc2luY2UgJ2EgbWVzc2FnZV9pZCcgc2hvdWxkIGJlIHVuaXF1ZSEKIyAgIGlmICggJENvdW50ID4gMSApIHsKIyAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKIyAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiMgICAgICAgICAgIE1lc3NhZ2UgID0+CiMgICAgICAgICAgICAgICAiVGhlIE1lc3NhZ2VJRCAnJFBhcmFte01lc3NhZ2VJRH0nIGlzIGluIHlvdXIgZGF0YWJhc2UgbW9yZSB0aGFuIG9uZSB0aW1lISBUaGF0IHNob3VsZCBub3QgaGFwcGVuLCBzaW5jZSAnYSBtZXNzYWdlX2lkJyBzaG91bGQgYmUgdW5pcXVlISIsCiMgICAgICAgKTsKIyAgICAgICByZXR1cm47CiMgICB9CiMKIyAgICByZXR1cm4gJFNlbGYtPkFydGljbGVHZXQoCiMgICAgICAgICVQYXJhbSwKIyAgICApOwogICAgbXkgJUFydGljbGUgPSAkU2VsZi0+QXJ0aWNsZUdldCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIGlmICggc2NhbGFyIEBUaWNrZXRJRHMgPiAxICkgewogICAgICAgICRBcnRpY2xle0FtYmlndW91c1RpY2tldElEc30gPSBcQFRpY2tldElEczsKICAgIH0KCiAgICByZXR1cm4gJUFydGljbGU7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKfQoKPWhlYWQyIEFydGljbGVTZW5kKCkKClNlbmQgYXJ0aWNsZSB2aWEgZW1haWwgYW5kIGNyZWF0ZSBhcnRpY2xlIHdpdGggYXR0YWNobWVudHMuCgogICAgbXkgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVNlbmQoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgYWdlbnR8c3lzdGVtfGN1c3RvbWVyCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBJcyBhcnRpY2xlIHZpc2libGUgZm9yIGN1c3RvbWVyPwogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKCiAgICAgICAgRnJvbSAgICAgICAgPT4gJ1NvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgVG8gICAgICAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAjIHJlcXVpcmVkIGlmIGJvdGggQ2MgYW5kIEJjYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBDYyAgICAgICAgICA9PiAnU29tZSBDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgcmVxdWlyZWQgaWYgYm90aCBUbyBhbmQgQmNjIGFyZSBub3QgcHJlc2VudAogICAgICAgIEJjYyAgICAgICAgID0+ICdTb21lIEN1c3RvbWVyIEMgPGN1c3RvbWVyLWNAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgIyByZXF1aXJlZCBpZiBib3RoIFRvIGFuZCBDYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBSZXBseVRvICAgICA9PiAnU29tZSBDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBpcyBwb3NzaWJsZSB0byB1c2UgJ1JlcGx5LVRvJyBpbnN0ZWFkCiAgICAgICAgU3ViamVjdCAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgQm9keSAgICAgICAgPT4gJ3RoZSBtZXNzYWdlIHRleHQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgSW5SZXBseVRvICAgPT4gJzxhc2Rhc2Rhc2QuMTJAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCBidXQgdXNlZnVsCiAgICAgICAgUmVmZXJlbmNlcyAgPT4gJzxhc2Rhc2Rhc2QuMUBleGFtcGxlLmNvbT4gPGFzZGFzZGFzZC4xMkBleGFtcGxlLmNvbT4nLCAjIG5vdCByZXF1aXJlZCBidXQgdXNlZnVsCiAgICAgICAgQ2hhcnNldCAgICAgPT4gJ2lzby04ODU5LTE1JwogICAgICAgIE1pbWVUeXBlICAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBMb29wICAgICAgICA9PiAwLCAjIDF8MCB1c2VkIGZvciBidWxrIGVtYWlscwogICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdsYWxhLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRDb250ZW50LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2xhbGExLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBFbWFpbFNlY3VyaXR5ID0+IHsKICAgICAgICAgICAgQmFja2VuZCAgICAgPT4gJ1BHUCcsICAgICAgICAgICAgICAgICAgICAgICAjIFBHUCBvciBTTUlNRQogICAgICAgICAgICBNZXRob2QgICAgICA9PiAnRGV0YWNoZWQnLCAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwgRGV0YWNoZWQgb3IgSW5saW5lIChkZWZhdWx0cyB0byBEZXRhY2hlZCkKICAgICAgICAgICAgU2lnbktleSAgICAgPT4gJzgxODc3RjVFJywgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsCiAgICAgICAgICAgIEVuY3J5cHRLZXlzID0+IFsgJzgxODc3RjVFJywgJzNiNjMwYzgwJyBdLCAgIyBPcHRpb25hbAogICAgICAgIH0KICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAnT3duZXJVcGRhdGUnLCAgIyBNb3ZlfEFkZE5vdGV8UHJpb3JpdHlVcGRhdGV8V2ViUmVxdWVzdEN1c3RvbWVyfC4uLgogICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICdTb21lIGZyZWUgdGV4dCEnLAogICAgICAgIE5vQWdlbnROb3RpZnkgID0+IDAsICAgICAgICAgICAgIyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzZW5kIGFnZW50IG5vdGlmaWNhdGlvbnMKICAgICk7CgoKICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKCAgICAgICAgICAgICAgICAoQmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgYWdlbnR8c3lzdGVtfGN1c3RvbWVyCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBJcyBhcnRpY2xlIHZpc2libGUgZm9yIGN1c3RvbWVyPwogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKCiAgICAgICAgRnJvbSAgICAgICAgPT4gJ1NvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgVG8gICAgICAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAjIHJlcXVpcmVkIGlmIGJvdGggQ2MgYW5kIEJjYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBDYyAgICAgICAgICA9PiAnU29tZSBDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgcmVxdWlyZWQgaWYgYm90aCBUbyBhbmQgQmNjIGFyZSBub3QgcHJlc2VudAogICAgICAgIEJjYyAgICAgICAgID0+ICdTb21lIEN1c3RvbWVyIEMgPGN1c3RvbWVyLWNAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgIyByZXF1aXJlZCBpZiBib3RoIFRvIGFuZCBDYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBSZXBseVRvICAgICA9PiAnU29tZSBDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBpcyBwb3NzaWJsZSB0byB1c2UgJ1JlcGx5LVRvJyBpbnN0ZWFkCiAgICAgICAgU3ViamVjdCAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgQm9keSAgICAgICAgPT4gJ3RoZSBtZXNzYWdlIHRleHQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgSW5SZXBseVRvICAgPT4gJzxhc2Rhc2Rhc2QuMTJAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCBidXQgdXNlZnVsCiAgICAgICAgUmVmZXJlbmNlcyAgPT4gJzxhc2Rhc2Rhc2QuMUBleGFtcGxlLmNvbT4gPGFzZGFzZGFzZC4xMkBleGFtcGxlLmNvbT4nLCAjIG5vdCByZXF1aXJlZCBidXQgdXNlZnVsCiAgICAgICAgQ2hhcnNldCAgICAgPT4gJ2lzby04ODU5LTE1JwogICAgICAgIE1pbWVUeXBlICAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBMb29wICAgICAgICA9PiAwLCAjIDF8MCB1c2VkIGZvciBidWxrIGVtYWlscwogICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdsYWxhLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRDb250ZW50LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2xhbGExLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBTaWduID0+IHsKICAgICAgICAgICAgVHlwZSAgICA9PiAnUEdQJywKICAgICAgICAgICAgU3ViVHlwZSA9PiAnSW5saW5lfERldGFjaGVkJywKICAgICAgICAgICAgS2V5ICAgICA9PiAnODE4NzdGNUUnLAogICAgICAgICAgICBUeXBlICAgID0+ICdTTUlNRScsCiAgICAgICAgICAgIEtleSAgICAgPT4gJzNiNjMwYzgwJywKICAgICAgICB9LAogICAgICAgIENyeXB0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICA9PiAnUEdQJywKICAgICAgICAgICAgU3ViVHlwZSA9PiAnSW5saW5lfERldGFjaGVkJywKICAgICAgICAgICAgS2V5ICAgICA9PiAnODE4NzdGNUUnLAogICAgICAgICAgICBUeXBlICAgID0+ICdTTUlNRScsCiAgICAgICAgICAgIEtleSAgICAgPT4gJzNiNjMwYzgwJywKICAgICAgICB9LAogICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICdPd25lclVwZGF0ZScsICAjIE1vdmV8QWRkTm90ZXxQcmlvcml0eVVwZGF0ZXxXZWJSZXF1ZXN0Q3VzdG9tZXJ8Li4uCiAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJ1NvbWUgZnJlZSB0ZXh0IScsCiAgICAgICAgTm9BZ2VudE5vdGlmeSAgPT4gMCwgICAgICAgICAgICAjIGlmIHlvdSBkb24ndCB3YW50IHRvIHNlbmQgYWdlbnQgbm90aWZpY2F0aW9ucwogICAgKTsKCkV2ZW50czoKICAgIEFydGljbGVTZW5kCgo9Y3V0CgpzdWIgQXJ0aWNsZVNlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVG9PcmlnICAgICAgPSAkUGFyYW17VG99ICAgICAgICAgIHx8ICcnOwogICAgbXkgJExvb3AgICAgICAgID0gJFBhcmFte0xvb3B9ICAgICAgICB8fCAwOwogICAgbXkgJEhpc3RvcnlUeXBlID0gJFBhcmFte0hpc3RvcnlUeXBlfSB8fCAnU2VuZEFuc3dlcic7CgogICAgbXkgJEFydGljbGVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgIyBMb29rdXAgaWYgbm8gSUQgaXMgcGFzc2VkLgogICAgaWYgKCAkUGFyYW17U2VuZGVyVHlwZX0gJiYgISRQYXJhbXtTZW5kZXJUeXBlSUR9ICkgewogICAgICAgICRQYXJhbXtTZW5kZXJUeXBlSUR9ID0gJEFydGljbGVPYmplY3QtPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKCBTZW5kZXJUeXBlID0+ICRQYXJhbXtTZW5kZXJUeXBlfSApOwogICAgfQoKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRCBVc2VySUQgU2VuZGVyVHlwZUlEIEZyb20gQm9keSBDaGFyc2V0IE1pbWVUeXBlKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgSXNWaXNpYmxlRm9yQ3VzdG9tZXIhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIE1hcCBSZXBseVRvIGludG8gUmVwbHktVG8gaWYgcHJlc2VudC4KICAgIGlmICggJFBhcmFte1JlcGx5VG99ICkgewogICAgICAgICRQYXJhbXsnUmVwbHktVG8nfSA9ICRQYXJhbXtSZXBseVRvfTsKICAgIH0KCiAgICAjIENsZWFuIHVwIGJvZHkgc3RyaW5nLgogICAgJFBhcmFte0JvZHl9ID1+IHMvKFxyXG58XG5ccikvXG4vZzsKICAgICRQYXJhbXtCb2R5fSA9fiBzL1xyL1xuL2c7CgogICAgIyBpbml0aWFsaXplIHBhcmFtZXRlciBmb3IgYXR0YWNobWVudHMsIHNvIHRoYXQgdGhlIGNvbnRlbnQgcHVzaGVkIGludG8gdGhhdCByZWYgZnJvbQogICAgIyBFbWJlZGRlZEltYWdlc0V4dHJhY3Qgd2lsbCBzdGF5IGF2YWlsYWJsZQogICAgaWYgKCAhJFBhcmFte0F0dGFjaG1lbnR9ICkgewogICAgICAgICRQYXJhbXtBdHRhY2htZW50fSA9IFtdOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGJhc2U2NCBpbWFnZXMgaW4gYm9keSBhbmQgcHJvY2VzcyB0aGVtCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkVtYmVkZGVkSW1hZ2VzRXh0cmFjdCgKICAgICAgICBEb2N1bWVudFJlZiAgICA9PiBcJFBhcmFte0JvZHl9LAogICAgICAgIEF0dGFjaG1lbnRzUmVmID0+ICRQYXJhbXtBdHRhY2htZW50fSwKICAgICk7CgogICAgIyBjcmVhdGUgYXJ0aWNsZQogICAgbXkgJFRpbWUgICAgICA9ICREYXRlVGltZU9iamVjdC0+VG9FcG9jaCgpOwogICAgbXkgJFJhbmRvbSAgICA9IHJhbmQgOTk5OTk5OwogICAgbXkgJEZRRE4gICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRlFETicpOwogICAgbXkgJE1lc3NhZ2VJRCA9ICI8JFRpbWUuJFJhbmRvbVxAJEZRRE4+IjsKICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAlUGFyYW0sCiAgICAgICAgTWVzc2FnZUlEID0+ICRNZXNzYWdlSUQsCiAgICApOwogICAgcmV0dXJuIGlmICEkQXJ0aWNsZUlEOwoKICAgICMgU2VuZCB0aGUgbWFpbAogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpLT5TZW5kKAogICAgICAgICVQYXJhbSwKICAgICAgICBBcnRpY2xlSUQgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAnTWVzc2FnZS1JRCcgPT4gJE1lc3NhZ2VJRCwKICAgICk7CgogICAgIyByZXR1cm4gaWYgbWFpbCB3YXNuJ3Qgc2VudAogICAgaWYgKCAhJFJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3NzaWJsZSB0byBzZW5kIG1lc3NhZ2UgdG86ICRQYXJhbXsnVG8nfSAuIiwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHdyaXRlIGFydGljbGUgdG8gZmlsZSBzeXN0ZW0KICAgIG15ICRQbGFpbiA9ICRTZWxmLT5BcnRpY2xlV3JpdGVQbGFpbigKICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICBFbWFpbCAgICAgPT4gc3ByaW50ZiggIiVzXG4lcyIsICRSZXN1bHQtPntEYXRhfS0+e0hlYWRlcn0sICRSZXN1bHQtPntEYXRhfS0+e0JvZHl9ICksCiAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJFBsYWluOwoKICAgICMgbG9nCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZigKICAgICAgICAgICAgcXtRdWV1ZWQgZW1haWwgdG8gJyVzJyBmcm9tICclcycuIEhpc3RvcnlUeXBlID0+ICVzLCBTdWJqZWN0ID0+ICVzO30sCiAgICAgICAgICAgICRQYXJhbXtUb30sCiAgICAgICAgICAgICRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgJEhpc3RvcnlUeXBlLAogICAgICAgICAgICAkUGFyYW17U3ViamVjdH0sCiAgICAgICAgKSwKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZVNlbmQnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEFydGljbGVJRDsKfQoKPWhlYWQyIEFydGljbGVCb3VuY2UoKQoKQm91bmNlIGFuIGFydGljbGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVCb3VuY2UoCiAgICAgICAgRnJvbSAgICAgID0+ICdzb21lQGV4YW1wbGUuY29tJywKICAgICAgICBUbyAgICAgICAgPT4gJ3dlYm1hc3RlckBleGFtcGxlLmNvbScsCiAgICAgICAgVGlja2V0SUQgID0+IDEyMywKICAgICAgICBBcnRpY2xlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxMjMsCiAgICApOwoKRXZlbnRzOgogICAgQXJ0aWNsZUJvdW5jZQoKPWN1dAoKc3ViIEFydGljbGVCb3VuY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEl0ZW0gKHF3KFRpY2tldElEIEFydGljbGVJRCBGcm9tIFRvIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEl0ZW19ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkSXRlbSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICMgY3JlYXRlIG1lc3NhZ2UgaWQKICAgIG15ICRUaW1lICAgICAgICAgPSAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKTsKICAgIG15ICRSYW5kb20gICAgICAgPSByYW5kIDk5OTk5OTsKICAgIG15ICRGUUROICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZRRE4nKTsKICAgIG15ICROZXdNZXNzYWdlSUQgPSAiPCRUaW1lLiRSYW5kb20uMFxAJEZRRE4+IjsKICAgIG15ICRFbWFpbCAgICAgICAgPSAkU2VsZi0+QXJ0aWNsZVBsYWluKCBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0gKTsKCiAgICAjIGNoZWNrIGlmIHBsYWluIGVtYWlsIGV4aXN0cwogICAgaWYgKCAhJEVtYWlsICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBwbGFpbiBhcnRpY2xlIGZvciBBcnRpY2xlSUQgKCRQYXJhbXtBcnRpY2xlSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcGlwZSBhbGwgaW50byBzZW5kbWFpbAogICAgbXkgJEJvdW5jZVNlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKS0+Qm91bmNlKAogICAgICAgICdNZXNzYWdlLUlEJyA9PiAkTmV3TWVzc2FnZUlELAogICAgICAgIEZyb20gICAgICAgICA9PiAkUGFyYW17RnJvbX0sCiAgICAgICAgVG8gICAgICAgICAgID0+ICRQYXJhbXtUb30sCiAgICAgICAgRW1haWwgICAgICAgID0+ICRFbWFpbCwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQm91bmNlU2VudC0+e1N1Y2Nlc3N9OwoKICAgICMgd3JpdGUgaGlzdG9yeQogICAgbXkgJEhpc3RvcnlUeXBlID0gJFBhcmFte0hpc3RvcnlUeXBlfSB8fCAnQm91bmNlJzsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+SGlzdG9yeUFkZCgKICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgICAgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgSGlzdG9yeVR5cGUgID0+ICRIaXN0b3J5VHlwZSwKICAgICAgICBOYW1lICAgICAgICAgPT4gIlwlXCUkUGFyYW17VG99IiwKICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FydGljbGVCb3VuY2UnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBTZW5kQXV0b1Jlc3BvbnNlKCkKClNlbmQgYW4gYXV0byByZXNwb25zZSB0byBhIGN1c3RvbWVyIHZpYSBlbWFpbC4KCiAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5TZW5kQXV0b1Jlc3BvbnNlKAogICAgICAgIFRpY2tldElEICAgICAgICAgPT4gMTIzLAogICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgIE9yaWdIZWFkZXIgICAgICAgPT4gewogICAgICAgICAgICBGcm9tICAgID0+ICdzb21lQGV4YW1wbGUuY29tJywKICAgICAgICAgICAgU3ViamVjdCA9PiAnRm9yIHRoZSBtZXNzYWdlIScsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCkV2ZW50czoKICAgIEFydGljbGVBdXRvUmVzcG9uc2UKCj1jdXQKCnN1YiBTZW5kQXV0b1Jlc3BvbnNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkSXRlbSAocXcoVGlja2V0SUQgVXNlcklEIE9yaWdIZWFkZXIgQXV0b1Jlc3BvbnNlVHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEl0ZW19ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkSXRlbSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIG5vdGlmaWNhdGlvbiBpcyBhY3RpdmUKICAgIHJldHVybiAxIGlmICRTZWxmLT57U2VuZE5vTm90aWZpY2F0aW9ufTsKCiAgICAjIGdldCBvcmlnIGVtYWlsIGhlYWRlcgogICAgbXkgJU9yaWdIZWFkZXIgPSAleyAkUGFyYW17T3JpZ0hlYWRlcn0gfTsKCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IHRpY2tldAogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLCAgICAgICAgICAgICAgICAgICMgbm90IG5lZWRlZCBoZXJlLCBUZW1wbGF0ZUdlbmVyYXRvciB3aWxsIGZldGNoIHRoZSB0aWNrZXQgb24gaXRzIG93bgogICAgKTsKCiAgICAjIGdldCBhdXRvIGRlZmF1bHQgcmVzcG9uc2VzCiAgICBteSAlQXV0b1Jlc3BvbnNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPkF1dG9SZXNwb25zZSgKICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSA9PiAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0sCiAgICAgICAgT3JpZ0hlYWRlciAgICAgICA9PiAkUGFyYW17T3JpZ0hlYWRlcn0sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgbm8gdmFsaWQgYXV0byByZXNwb25zZSBleGlzdHMKICAgIHJldHVybiB1bmxlc3MgJEF1dG9SZXNwb25zZXtUZXh0fTsKICAgIHJldHVybiB1bmxlc3MgJEF1dG9SZXNwb25zZXtTZW5kZXJSZWFsbmFtZX07ICAgICMgdGhlIHVucXVvdGVkIHBocmFzZSBvZiB0aGUgc3lzdGVtIGFkZHJlc3MKICAgIHJldHVybiB1bmxlc3MgJEF1dG9SZXNwb25zZXtTZW5kZXJBZGRyZXNzfTsKCiAgICAjIHNlbmQgaWYgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBzZW50IChub3QgZm9yIGNsb3NlZCB0aWNrZXRzKSE/CiAgICBteSAlU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoIElEID0+ICRUaWNrZXR7U3RhdGVJRH0gKTsKICAgIGlmICgKICAgICAgICAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0gZXEgJ2F1dG8gcmVwbHknCiAgICAgICAgJiYgKCAkU3RhdGV7VHlwZU5hbWV9IGVxICdjbG9zZWQnIHx8ICRTdGF0ZXtUeXBlTmFtZX0gZXEgJ3JlbW92ZWQnICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgYWRkIGhpc3Rvcnkgcm93CiAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJ01pc2MnLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAiU2VudCBubyBhdXRvIHJlc3BvbnNlIG9yIGFnZW50IG5vdGlmaWNhdGlvbiBiZWNhdXNlIHRpY2tldCBpcyAiCiAgICAgICAgICAgICAgICAuICJzdGF0ZS10eXBlICckU3RhdGV7VHlwZU5hbWV9JyEiLAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4KICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2cgdGhhdCBubyBhdXRvIHJlc3BvbnNlIHdhcyBzZW50IQogICAgaWYgKCAkT3JpZ0hlYWRlcnsnWC1PVE9CTy1Mb29wJ30gJiYgJE9yaWdIZWFkZXJ7J1gtT1RPQk8tTG9vcCd9ICF+IC9eKGZhbHNlfG5vKSQvaSApIHsKCiAgICAgICAgIyBhZGQgaGlzdG9yeSByb3cKICAgICAgICAkVGlja2V0T2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJTZW50IG5vIGF1dG8tcmVzcG9uc2UgYmVjYXVzZSB0aGUgc2VuZGVyIGRvZXNuJ3Qgd2FudCAiCiAgICAgICAgICAgICAgICAuICJhbiBhdXRvLXJlc3BvbnNlIChlLiBnLiBsb29wIG9yIHByZWNlZGVuY2UgaGVhZGVyKSIsCiAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZW50IG5vICckUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0nIGZvciBUaWNrZXQgWyIKICAgICAgICAgICAgICAgIC4gIiRUaWNrZXR7VGlja2V0TnVtYmVyfV0gKCRPcmlnSGVhZGVye0Zyb219KSBiZWNhdXNlIHRoZSAiCiAgICAgICAgICAgICAgICAuICJzZW5kZXIgZG9lc24ndCB3YW50IGFuIGF1dG8tcmVzcG9uc2UgKGUuIGcuIGxvb3Agb3IgcHJlY2VkZW5jZSBoZWFkZXIpIgogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHJlcGx5IHRvIGZvciBhdXRvIHJlc3BvbnNlIHJlY2lwaWVudAogICAgaWYgKCAkT3JpZ0hlYWRlcntSZXBseVRvfSApIHsKICAgICAgICAkT3JpZ0hlYWRlcntGcm9tfSA9ICRPcmlnSGVhZGVye1JlcGx5VG99OwogICAgfQoKICAgICMgZ2V0IGxvb3AgcHJvdGVjdGlvbiBvYmplY3QKICAgIG15ICRMb29wUHJvdGVjdGlvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpMb29wUHJvdGVjdGlvbicpOwoKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgbXkgQEF1dG9SZXBseUFkZHJlc3NlczsKICAgIG15IEBBZGRyZXNzT2JqZWN0cyA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJE9yaWdIZWFkZXJ7RnJvbX0gKTsKICAgIEFERFJFU1M6CiAgICBmb3IgbXkgJEFkZHJlc3NPYmplY3QgKEBBZGRyZXNzT2JqZWN0cykgewogICAgICAgIG15ICRFbWFpbCAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkQWRkcmVzc09iamVjdCApOwogICAgICAgIG15ICRBZGRyZXNzID0gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KCBBZGRyZXNzT2JqZWN0ID0+ICRBZGRyZXNzT2JqZWN0ICk7CiAgICAgICAgaWYgKCAhJEVtYWlsICkgewoKICAgICAgICAgICAgIyBhZGQgaXQgdG8gdGlja2V0IGhpc3RvcnkKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiU2VudCBubyBhdXRvIHJlc3BvbnNlIHRvICckQWRkcmVzcycgLSBubyB2YWxpZCBlbWFpbCBhZGRyZXNzLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGxvZwogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlbnQgbm8gYXV0byByZXNwb25zZSB0byAnJEFkZHJlc3MnIGJlY2F1c2Ugb2YgaW52YWxpZCBhZGRyZXNzLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFERFJFU1M7CgogICAgICAgIH0KICAgICAgICBpZiAoICEkTG9vcFByb3RlY3Rpb25PYmplY3QtPkNoZWNrKCBUbyA9PiAkRW1haWwgKSApIHsKCiAgICAgICAgICAgICMgYWRkIGhpc3Rvcnkgcm93CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTG9vcFByb3RlY3Rpb24nLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICJcJVwlJEVtYWlsIiwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9nCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VudCBubyAnJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9JyBmb3IgVGlja2V0IFsiCiAgICAgICAgICAgICAgICAgICAgLiAiJFRpY2tldHtUaWNrZXROdW1iZXJ9XSAoJEVtYWlsKSBiZWNhdXNlIG9mIGxvb3AgcHJvdGVjdGlvbi4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFERFJFU1M7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBpbmNyZWFzZSBsb29wIGNvdW50CiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJExvb3BQcm90ZWN0aW9uT2JqZWN0LT5TZW5kRW1haWwoIFRvID0+ICRFbWFpbCApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBzZW5kZXIgaXMgZS4gZy4gTUFJTEVSLURBRU1PTiBvciBQb3N0bWFzdGVyCiAgICAgICAgbXkgJE5vQXV0b1JlZ0V4cCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2VuZE5vQXV0b1Jlc3BvbnNlUmVnRXhwJyk7CiAgICAgICAgaWYgKCAkRW1haWwgPX4gLyROb0F1dG9SZWdFeHAvaSApIHsKCiAgICAgICAgICAgICMgYWRkIGl0IHRvIHRpY2tldCBoaXN0b3J5CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gIlNlbnQgbm8gYXV0byByZXNwb25zZSB0byAnJEVtYWlsJywgU2VuZE5vQXV0b1Jlc3BvbnNlUmVnRXhwIG1hdGNoZWQuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9nCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlbnQgbm8gYXV0byByZXNwb25zZSB0byAnJEVtYWlsJyBiZWNhdXNlIGNvbmZpZyIKICAgICAgICAgICAgICAgICAgICAuICIgb3B0aW9uIFNlbmROb0F1dG9SZXNwb25zZVJlZ0V4cCAoLyROb0F1dG9SZWdFeHAvaSkgbWF0Y2hlZC4iLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IEFERFJFU1M7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBBdXRvUmVwbHlBZGRyZXNzZXMsICRBZGRyZXNzOwogICAgfQoKICAgIG15ICRBdXRvUmVwbHlBZGRyZXNzZXMgPSBqb2luKCAnLCAnLCBAQXV0b1JlcGx5QWRkcmVzc2VzICk7CiAgICBteSAkQ2M7CgogICAgIyBhbHNvIHNlbmQgQ0MgdG8gY3VzdG9tZXIgdXNlciBpZiBjdXN0b21lciB1c2VyIGlkIGlzIHVzZWQgYW5kIGFkZHJlc3NlcyBkbyBub3QgbWF0Y2gKICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CgogICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH0KICAgICAgICAgICAgJiYgJE9yaWdIZWFkZXJ7RnJvbX0gIX4gL1xRJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9XEUvaQogICAgICAgICAgICAmJiAkUGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRDYyA9ICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgaGlzdG9yeSB0eXBlCiAgICBteSAkSGlzdG9yeVR5cGU7CiAgICBpZiAoICRQYXJhbXtBdXRvUmVzcG9uc2VUeXBlfSA9fiAvXmF1dG8gZm9sbG93IHVwJC9pICkgewogICAgICAgICRIaXN0b3J5VHlwZSA9ICdTZW5kQXV0b0ZvbGxvd1VwJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9ID1+IC9eYXV0byByZXBseSQvaSApIHsKICAgICAgICAkSGlzdG9yeVR5cGUgPSAnU2VuZEF1dG9SZXBseSc7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBdXRvUmVzcG9uc2VUeXBlfSA9fiAvXmF1dG8gcmVwbHlcL25ldyB0aWNrZXQkL2kgKSB7CiAgICAgICAgJEhpc3RvcnlUeXBlID0gJ1NlbmRBdXRvUmVwbHknOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0gPX4gL15hdXRvIHJlamVjdCQvaSApIHsKICAgICAgICAkSGlzdG9yeVR5cGUgPSAnU2VuZEF1dG9SZWplY3QnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEhpc3RvcnlUeXBlID0gJ01pc2MnOwogICAgfQoKICAgIGlmICggIUBBdXRvUmVwbHlBZGRyZXNzZXMgJiYgISRDYyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gYXV0byByZXNwb25zZSBhZGRyZXNzZXMgZm9yIFRpY2tldCBbJFRpY2tldHtUaWNrZXROdW1iZXJ9XSIKICAgICAgICAgICAgICAgIC4gIiAoVGlja2V0SUQ9JFBhcmFte1RpY2tldElEfSkuIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgRm9ybWF0IHNlbmRlciByZWFsbmFtZSBhbmQgYWRkcmVzcyBjb21wbGlhbnQgdG8gUkZDIDUzMjIuIFRoaXMgaXMgcmVsZXZhbnQgd2hlbiB0aGUgcmVhbCBuYW1lIGNvbnRhaW4gY29tbWFzCiAgICAjIG9yIG90aGVyIHNwZWNpYWwgc3ltYm9scy4KICAgIG15ICRGcm9tID0gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KAogICAgICAgIFJlYWxOYW1lID0+ICRBdXRvUmVzcG9uc2V7U2VuZGVyUmVhbG5hbWV9LAogICAgICAgIEFkZHJlc3MgID0+ICRBdXRvUmVzcG9uc2V7U2VuZGVyQWRkcmVzc30sCiAgICApOwoKICAgICMgc2VuZCBlbWFpbAogICAgbXkgJEFydGljbGVJRCA9ICRTZWxmLT5BcnRpY2xlU2VuZCgKICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdzeXN0ZW0nLAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJEhpc3RvcnlUeXBlLAogICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICJcJVwlJEF1dG9SZXBseUFkZHJlc3NlcyIsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEF1dG9SZXBseUFkZHJlc3NlcywKICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkQ2MsCiAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJ3V0Zi04JywKICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICA9PiAkQXV0b1Jlc3BvbnNle0NvbnRlbnRUeXBlfSwKICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkQXV0b1Jlc3BvbnNle1N1YmplY3R9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRBdXRvUmVzcG9uc2V7VGV4dH0sCiAgICAgICAgSW5SZXBseVRvICAgICAgICAgICAgPT4gJE9yaWdIZWFkZXJ7J01lc3NhZ2UtSUQnfSwKICAgICAgICBMb29wICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGxvZwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICJTZW50IGF1dG8gcmVzcG9uc2UgKCRIaXN0b3J5VHlwZSkgZm9yIFRpY2tldCBbJFRpY2tldHtUaWNrZXROdW1iZXJ9XSIKICAgICAgICAgICAgLiAiIChUaWNrZXRJRD0kUGFyYW17VGlja2V0SUR9LCBBcnRpY2xlSUQ9JEFydGljbGVJRCkgdG8gJyRBdXRvUmVwbHlBZGRyZXNzZXMnLiIKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZUF1dG9SZXNwb25zZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFydGljbGVUcmFuc21pc3Npb25TdGF0dXMoKQoKR2V0IHRoZSB0cmFuc21pc3Npb24gc3RhdHVzIGZvciBvbmUgYXJ0aWNsZS4KCiAgICBteSAkVHJhbnNtaXNzaW9uU3RhdHVzID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlVHJhbnNtaXNzaW9uU3RhdHVzKAogICAgICAgIEFydGljbGVJRCA9PiAxMjMsICAgIyByZXF1aXJlZAogICAgKTsKClRoaXMgcmV0dXJucyBzb21ldGhpbmcgbGlrZToKCiAgICAkVHJhbnNtaXNzaW9uU3RhdHVzID0gewogICAgICAgIEFydGljbGVJRCAgPT4gMTIzLAogICAgICAgIE1lc3NhZ2VJRCAgPT4gNDU2LAogICAgICAgIE1lc3NhZ2UgICAgPT4gJ0Rlc2NyaXB0aXZlIG1lc3NhZ2Ugb2YgbGFzdCBjb21tdW5pY2F0aW9uJywgICMgb25seSBpbiBjYXNlIG9mIGZhaWxlZCBzdGF0dXMKICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDE3LTAxLTAxIDEyOjM0OjU2JywKICAgICAgICBTdGF0dXMgICAgID0+IFtQcm9jZXNzaW5nfEZhaWxlZF0sCiAgICAgICAgQXR0ZW1wdHMgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGluIGNhc2Ugb2YgcHJvY2Vzc2luZyBzdGF0dXMKICAgICAgICBEdWVUaW1lICAgID0+ICcyMDE3LTAxLTAyIDEyOjM0OjU2JywgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgaW4gY2FzZSBvZiBwcm9jZXNzaW5nIHN0YXR1cwogICAgfQoKPWN1dAoKc3ViIEFydGljbGVUcmFuc21pc3Npb25TdGF0dXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQXJ0aWNsZUlEJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPkFydGljbGVHZXRUcmFuc21pc3Npb25FcnJvciggJVBhcmFtLCApOwogICAgcmV0dXJuICRSZXN1bHQgaWYgJFJlc3VsdCAmJiAleyRSZXN1bHR9OwoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGFydGljbGVfaWQsIGNyZWF0ZV90aW1lLCBhdHRlbXB0cywgZHVlX3RpbWUgRlJPTSBtYWlsX3F1ZXVlIFdIRVJFIGFydGljbGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtBcnRpY2xlSUR9IF0sCiAgICApOwoKICAgIGlmICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIEFydGljbGVJRCAgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAkUm93WzFdLAogICAgICAgICAgICBBdHRlbXB0cyAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIER1ZVRpbWUgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgU3RhdHVzICAgICA9PiAnUHJvY2Vzc2luZycsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBBcnRpY2xlQ3JlYXRlVHJhbnNtaXNzaW9uRXJyb3IoKQoKQ3JlYXRlcyBhIFRyYW5zbWlzc2lvbiBFcnJvciBlbnRyeSBmb3Igb25lIGFydGljbGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGVUcmFuc21pc3Npb25FcnJvcigKICAgICAgICBBcnRpY2xlSUQgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAjIFJlcXVpcmVkCiAgICAgICAgTWVzc2FnZUlEID0+IDQ1NiwgICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbAogICAgICAgIE1lc3NhZ2UgICA9PiAnJywgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgQXJ0aWNsZUNyZWF0ZVRyYW5zbWlzc2lvbkVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkRmllbGQgKHF3e0FydGljbGVJRH0pIHsKICAgICAgICBpZiAoICEkUGFyYW17JEZpZWxkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJHtGaWVsZH0hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTUUwgPSAnSU5TRVJUIElOVE8gYXJ0aWNsZV9kYXRhX21pbWVfc2VuZF9lcnJvcignOwoKICAgIG15IEBGaWVsZHM7CiAgICBteSBAQmluZDsKCiAgICBteSAlTWFwREIgPSAoCiAgICAgICAgQXJ0aWNsZUlEID0+ICdhcnRpY2xlX2lkJywKICAgICAgICBNZXNzYWdlSUQgPT4gJ21lc3NhZ2VfaWQnLAogICAgICAgIE1lc3NhZ2UgICA9PiAnbG9nX21lc3NhZ2UnLAogICAgKTsKCiAgICBteSBAUGxhY2VIb2xkZXI7CgogICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlTWFwREIgKSB7CiAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17JEZpZWxkfSApICkgewogICAgICAgICAgICBwdXNoIEBGaWVsZHMsICAgICAgJE1hcERCeyRGaWVsZH07CiAgICAgICAgICAgIHB1c2ggQFBsYWNlSG9sZGVyLCAnPyc7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsICAgICAgICBcJFBhcmFteyRGaWVsZH07CiAgICAgICAgfQogICAgfQogICAgcHVzaCBARmllbGRzLCAnY3JlYXRlX3RpbWUnOwoKICAgICRTUUwgLj0gam9pbiggJywgJywgQEZpZWxkcyApCiAgICAgICAgLiAnKSB2YWx1ZXMoJzsKCiAgICAkU1FMIC49IGpvaW4gJywgJywgQFBsYWNlSG9sZGVyOwoKICAgICRTUUwgLj0gJywgY3VycmVudF90aW1lc3RhbXApJzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJFRpY2tldElEICAgICAgPSAkQXJ0aWNsZU9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgKTsKCiAgICAjIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcnRpY2xlVHJhbnNtaXNzaW9uRXJyb3JDcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9IHx8IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQXJ0aWNsZUdldFRyYW5zbWlzc2lvbkVycm9yKCkKCkdldCB0aGUgVHJhbnNtaXNzaW9uIEVycm9yIGVudHJ5IGZvciBhIGdpdmVuIGFydGljbGUuCgogICAgbXkgJVRyYW5zbWlzc2lvbkVycm9yID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0VHJhbnNtaXNzaW9uRXJyb3IoCiAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywgICAjIFJlcXVpcmVkCiAgICApOwoKICAgIFJldHVybnM6CiAgICB7CiAgICAgICAgQXJ0aWNsZUlEICA9PiAxMjMsCiAgICAgICAgTWVzc2FnZUlEICA9PiA0NTYsCiAgICAgICAgTWVzc2FnZSAgICA9PiAnRGVzY3JpcHRpdmUgbWVzc2FnZSBvZiBsYXN0IGNvbW11bmljYXRpb24nLAogICAgICAgIENyZWF0ZVRpbWUgPT4gJzIwMTctMDEtMDEgMDE6MDI6MDMnLAogICAgICAgIFN0YXR1cyAgICAgPT4gJ0ZhaWxlZCcsCiAgICB9CiAgICBvciB1bmRlZiBpbiBjYXNlIG9mIGZhaWx1cmUgdG8gcmV0cml2ZSBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZS4KCj1jdXQKCnN1YiBBcnRpY2xlR2V0VHJhbnNtaXNzaW9uRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0FydGljbGVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEFydGljbGVJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmVwYXJlL2ZpbHRlciBBcnRpY2xlSUQKICAgICRQYXJhbXtBcnRpY2xlSUR9ID0gcXVvdGVtZXRhKCAkUGFyYW17QXJ0aWNsZUlEfSApOwogICAgJFBhcmFte0FydGljbGVJRH0gPX4gcy9cMC8vZzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgY2FuJ3Qgb3BlbiBhcnRpY2xlLCB0cnkgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGFydGljbGVfaWQsIG1lc3NhZ2VfaWQsIGxvZ19tZXNzYWdlLCBjcmVhdGVfdGltZSBGUk9NIGFydGljbGVfZGF0YV9taW1lX3NlbmRfZXJyb3IgV0hFUkUgYXJ0aWNsZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0FydGljbGVJRH0gXSwKICAgICk7CgogICAgbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpOwogICAgaWYgKEBSb3cpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnQXJ0aWNsZUlEJyAgPT4gJFJvd1swXSwKICAgICAgICAgICAgJ01lc3NhZ2VJRCcgID0+ICRSb3dbMV0sCiAgICAgICAgICAgICdNZXNzYWdlJyAgICA9PiAkUm93WzJdLAogICAgICAgICAgICAnQ3JlYXRlVGltZScgPT4gJFJvd1szXSwKICAgICAgICAgICAgJ1N0YXR1cycgICAgID0+ICdGYWlsZWQnLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQXJ0aWNsZVVwZGF0ZVRyYW5zbWlzc2lvbkVycm9yKCkKClVwZGF0ZXMgdGhlIFRyYW5zbWlzc2lvbiBFcnJvci4KCiAgICBteSAkUmVzdWx0ID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlVXBkYXRlVHJhbnNtaXNzaW9uRXJyb3IoCiAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlcXVpcmVkCiAgICAgICAgTWVzc2FnZUlEID0+IDQ1NiwgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsCiAgICAgICAgTWVzc2FnZSAgID0+ICdTaG9ydCBkZXNjcmlwdGl2ZSBtZXNzYWdlJywgICAjIE9wdGlvbmFsCiAgICApOwoKUmV0dXJucyAxIG9uIFN1Y2Nlc3MsIHVuZGVmIG9uIGZhaWx1cmUuCgo9Y3V0CgpzdWIgQXJ0aWNsZVVwZGF0ZVRyYW5zbWlzc2lvbkVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBBcnRpY2xlSUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBGaWVsZHNUb1VwZGF0ZTsKICAgIG15IEBCaW5kOwoKICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte01lc3NhZ2VJRH0gKSApIHsKICAgICAgICBwdXNoIEBGaWVsZHNUb1VwZGF0ZSwgJ21lc3NhZ2VfaWQgPSA/JzsKICAgICAgICBwdXNoIEBCaW5kLCAgICAgICAgICAgXCRQYXJhbXtNZXNzYWdlSUR9OwogICAgfQoKICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte01lc3NhZ2V9ICkgKSB7CiAgICAgICAgcHVzaCBARmllbGRzVG9VcGRhdGUsICdsb2dfbWVzc2FnZSA9ID8nOwogICAgICAgIHB1c2ggQEJpbmQsICAgICAgICAgICBcJFBhcmFte01lc3NhZ2V9OwogICAgfQoKICAgIHJldHVybiBpZiAhc2NhbGFyIEBCaW5kOwoKICAgIG15ICRTUUwgPSAnVVBEQVRFIGFydGljbGVfZGF0YV9taW1lX3NlbmRfZXJyb3IgU0VUICcKICAgICAgICAuIGpvaW4oICcsICcsIEBGaWVsZHNUb1VwZGF0ZSApCiAgICAgICAgLiAnIFdIRVJFIGFydGljbGVfaWQgPSA/JzsKCiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0FydGljbGVJRH07CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHVwZGF0ZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15ICRUaWNrZXRJRCAgICAgID0gJEFydGljbGVPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZVRyYW5zbWlzc2lvbkVycm9yVXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSB8fCAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Kernel/System/PostMaster/AddressPool.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyhJc0hhc2hSZWZXaXRoRGF0YSBJc0FycmF5UmVmV2l0aERhdGEpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIEdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QuCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJFBhcmFte0NvbW11bmljYXRpb25Mb2dPYmplY3R9IHx8ICcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEZpbHRlclBvb2xzKCkKClJldHVybiBwb29scyBhZGRyZXNzZWQgaW4gdGhlIGFkZHJlc3MgbGlzdCBvZiBUbywgQ2MgLi4uCgogICAgbXkgQEFkZHJlc3NlZFBvb2xzID0gJEFkZHJlc3NQb29sT2JqZWN0LT5GaWx0ZXJQb29scygKICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBGaWx0ZXJQb29scyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1BhcmFtc30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgUGFyYW1zIGFzIGhhc2ggcmVmISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgIyBnZXQgaGVhZGVycwogICAgbXkgJUdldFBhcmFtICAgICAgICA9ICRQYXJhbXtQYXJhbXN9LT4lKjsKICAgIG15ICRFbWFpbEhlYWRlciAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3RNYXN0ZXI6OkFkZHJlc3NQb29sOjpFbWFpbEhlYWRlcnMnKTsKICAgIG15IEBQcmltYXJ5SGVhZGVyICAgPSBAeyAkRW1haWxIZWFkZXItPntQcmltYXJ5fSAgIHx8IFtdIH07CiAgICBteSBAU2Vjb25kYXJ5SGVhZGVyID0gQHsgJEVtYWlsSGVhZGVyLT57U2Vjb25kYXJ5fSB8fCBbXSB9OwoKICAgICMgY2hlY2sgcG9zc2libGUgYWRkcmVzcyBoZWFkZXJzCiAgICBteSAlUG9vbHNTZWVuOwogICAgbXkgQFBvb2xzOwogICAgSEVBREVSOgogICAgZm9yIG15ICRIZWFkZXIgKEBQcmltYXJ5SGVhZGVyKSB7CgogICAgICAgIG5leHQgSEVBREVSIGlmICEkR2V0UGFyYW17JEhlYWRlcn07CgogICAgICAgIG15IEBFbWFpbHMgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskSGVhZGVyfSApOwogICAgICAgIEVNQUlMOgogICAgICAgIGZvciBteSAkRW1haWwgKEBFbWFpbHMpIHsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgISRFbWFpbDsKCiAgICAgICAgICAgIG15ICRBZGRyZXNzID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKTsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgISRBZGRyZXNzOwoKICAgICAgICAgICAgbXkgJEFkZHJlc3NQb29sID0gJFNlbGYtPlBvb2xMb29rdXAoCiAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmICEkQWRkcmVzc1Bvb2w7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmICRQb29sc1NlZW57JEFkZHJlc3NQb29sfSsrOwoKICAgICAgICAgICAgcHVzaCBAUG9vbHMsICRBZGRyZXNzUG9vbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBQb29scyBpZiBAUG9vbHM7CgogICAgIyBpZiBubyBwb29scyBhcmUgYWRkcmVzc2VkIGluIHRoZSBhYm92ZSBzZXQgb2YgaGVhZGVycywgYWxzbyBsb29rIGZvciBzZWNvbmRhcnkgb25lcwogICAgSEVBREVSOgogICAgZm9yIG15ICRIZWFkZXIgKEBTZWNvbmRhcnlIZWFkZXIpIHsKCiAgICAgICAgbmV4dCBIRUFERVIgaWYgISRHZXRQYXJhbXskSGVhZGVyfTsKCiAgICAgICAgbXkgQEVtYWlscyA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEdldFBhcmFteyRIZWFkZXJ9ICk7CiAgICAgICAgRU1BSUw6CiAgICAgICAgZm9yIG15ICRFbWFpbCAoQEVtYWlscykgewoKICAgICAgICAgICAgbmV4dCBFTUFJTCBpZiAhJEVtYWlsOwoKICAgICAgICAgICAgbXkgJEFkZHJlc3MgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwoKICAgICAgICAgICAgbmV4dCBFTUFJTCBpZiAhJEFkZHJlc3M7CgogICAgICAgICAgICBteSAkQWRkcmVzc1Bvb2wgPSAkU2VsZi0+UG9vbExvb2t1cCgKICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJEFkZHJlc3MKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgISRBZGRyZXNzUG9vbDsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgJFBvb2xzU2VlbnskQWRkcmVzc1Bvb2x9Kys7CgogICAgICAgICAgICBwdXNoIEBQb29scywgJEFkZHJlc3NQb29sOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFBvb2xzOwp9Cgo9aGVhZDIgQWRkcmVzc0xpc3QoKQoKPWZvciBzdG9wd29yZHMgYWRkcmVzc3Bvb2xzCkdldCBhbGwgYWRkcmVzc2VzIGRlZmluZWQgaW4gYWRkcmVzc3Bvb2xzCgogICAgbXkgJUFkZHJlc3NUb1Bvb2wgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPkFkZHJlc3NMaXN0KCk7CgpSZXR1cm46CgogICAgJUFkZHJlc3NUb1Bvb2wgPSAoCiAgICAgICAgICAgICAgJ3Rlc3QxQGV4YW1wbGUuY29tJyA9PiAnUG9vbDEnLAogICAgICAgICAgICAgICd0ZXN0MkBleGFtcGxlLmNvbScgPT4gJ1Bvb2wyJywKICAgICAgICAgICAgICAndGVzdDNAZXhhbXBsZS5jb20nID0+ICdQb29sMycsCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICkKCj1jdXQKCnN1YiBBZGRyZXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0FkZHJlc3NUb1Bvb2x9LT4lKiBpZiAkU2VsZi0+e0FkZHJlc3NUb1Bvb2x9OwoKICAgICRTZWxmLT57QWRkcmVzc1RvUG9vbH0gPSB7fTsKICAgIG15ICRQb29sQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKTsKCiAgICBpZiAoICEkUG9vbENvbmZpZ3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBwb29scyBkZWZpbmVkIGluIFBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sLiIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICgpOwogICAgfQoKICAgIFBPT0w6CiAgICBmb3IgbXkgJFBvb2wgKCBrZXlzICRQb29sQ29uZmlncy0+JSogKSB7CiAgICAgICAgbmV4dCBQT09MIGlmICEkUG9vbENvbmZpZ3MtPnskUG9vbH17RW1haWxzfTsKCiAgICAgICAgZm9yIG15ICRBZGRyZXNzICggJFBvb2xDb25maWdzLT57JFBvb2x9e0VtYWlsc30tPkAqICkgewogICAgICAgICAgICAkU2VsZi0+e0FkZHJlc3NUb1Bvb2x9eyBsYygkQWRkcmVzcykgfSA9ICRQb29sOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntBZGRyZXNzVG9Qb29sfS0+JSo7Cn0KCj1oZWFkMiBQb29sTG9va3VwKCkKCkdldCBhZGRyZXNzIHBvb2wgYnkgYWRkcmVzcyBvciB0aWNrZXQgaWQKCiAgICBteSAkUG9vbE5hbWUgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPlBvb2xMb29rdXAoCiAgICAgICAgQWRkcmVzcyAgPT4gJ3Rlc3QxQGV4YW1wbGUuY29tJywKICAgICk7CgogICAgbXkgJFBvb2xOYW1lID0gJEFkZHJlc3NQb29sT2JqZWN0LT5Qb29sTG9va3VwKAogICAgICAgIFRpY2tldElEID0+IDQsCiAgICApOwoKUmV0dXJuOgoKICAgICRQb29sTmFtZSA9ICJQb29sMSIKCj1jdXQKCnN1YiBQb29sTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtBZGRyZXNzfSAmJiAhJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQWRkcmVzcyBvciBUaWNrZXRJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGFkZHJlc3MgcG9vbCBuYW1lIGxpc3QKICAgIG15ICVBZGRyZXNzVG9Qb29sID0gJFNlbGYtPkFkZHJlc3NMaXN0KCk7CgogICAgcmV0dXJuICRBZGRyZXNzVG9Qb29seyBsYyggJFBhcmFte0FkZHJlc3N9ICkgfSBpZiAkUGFyYW17QWRkcmVzc307CgogICAgIyBnZXQgb2JqZWN0cwogICAgbXkgJFF1ZXVlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCB0aWNrZXQgcXVldWUgaWQKICAgIG15ICRRdWV1ZUlEID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVJRCgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgKTsKCiAgICAjIHNldCBhZGRyZXNzIHBvb2wgbmFtZQogICAgbXkgJVF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoCiAgICAgICAgSUQgPT4gJFF1ZXVlSUQsCiAgICApOwoKICAgIHJldHVybiBpZiAhJFF1ZXVlRGF0YXtFbWFpbH07CgogICAgcmV0dXJuICRBZGRyZXNzVG9Qb29seyBsYyggJFF1ZXVlRGF0YXtFbWFpbH0gKSB9Owp9Cgo9aGVhZDIgUXVldWVDaGVjaygpCgpDaGVjayBpZiBxdWV1ZSBleGlzdHMgaW4gYWRkcmVzcyBwb29sCgogICAgbXkgJFF1ZXVlRXhpc3QgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPlF1ZXVlQ2hlY2soCiAgICAgICAgUXVldWUgICAgICAgPT4gJ0p1bmsnLAogICAgICAgIEFkZHJlc3NQb29sID0+ICdQb29sMScsCiAgICApOwoKUmV0dXJuOgoKICAgICRRdWV1ZUV4aXN0ID0gMQoKICAgIE9yCgogICAgJFF1ZXVlRXhpc3QgPSAwCgo9Y3V0CgpzdWIgUXVldWVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUXVldWUgQWRkcmVzc1Bvb2wpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcXVldWUKICAgIG15ICVRdWV1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUdldCgKICAgICAgICBOYW1lID0+ICRQYXJhbXtRdWV1ZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJVF1ZXVlOwoKICAgIG15ICRQb29sID0gJFNlbGYtPlBvb2xMb29rdXAoCiAgICAgICAgQWRkcmVzcyA9PiAkUXVldWV7RW1haWx9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRQb29sOwogICAgcmV0dXJuIGlmICRQb29sIG5lICRQYXJhbXtBZGRyZXNzUG9vbH07CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGaW5kTGlua2VkVGlja2V0KCkKCkZpbmQgbGlua2VkIHRpY2tldCB3aXRoICdJbnRlcmRpdmlzaW9uYWwnIHR5cGUgaW4gYWRkcmVzcyBwb29sCgogICAgbXkgKCAkTFRUaWNrZXROdW1iZXIsICRMVFRpY2tldElEICkgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPkZpbmRMaW5rZWRUaWNrZXQoCiAgICAgICAgVGlja2V0SUQgICAgPT4gNCwKICAgICAgICBBZGRyZXNzUG9vbCA9PiAnUG9vbDEnLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuOgoKICAgICggJExUVGlja2V0TnVtYmVyLCAkTFRUaWNrZXRJRCApID0gKCIyMDIzMDEyMzM4MDAwMDc0IiwgNSkKCj1jdXQKCnN1YiBGaW5kTGlua2VkVGlja2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRCBBZGRyZXNzUG9vbCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb2JqZWN0CiAgICBteSAkTGlua09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CgogICAgIyBnZXQgbGlua2VkIHRpY2tldHMKICAgIG15ICVMaW5rZWRUaWNrZXRzID0gJExpbmtPYmplY3QtPkxpbmtLZXlMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICBLZXkxICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgT2JqZWN0MiA9PiAnVGlja2V0JywKICAgICAgICBTdGF0ZSAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICA9PiAnSW50ZXJkaXZpc2lvbmFsJywKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBmb3IgbXkgJExpbmtlZFRpY2tldCAoIGtleXMgJUxpbmtlZFRpY2tldHMgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBudW1iZXIgLyB0aWNrZXQgaWQKICAgICAgICBteSAkTFRUaWNrZXRJRCAgICAgPSAkTGlua2VkVGlja2V0c3skTGlua2VkVGlja2V0fXtUaWNrZXRJRH07CiAgICAgICAgbXkgJExUVGlja2V0TnVtYmVyID0gJExpbmtlZFRpY2tldHN7JExpbmtlZFRpY2tldH17VGlja2V0TnVtYmVyfTsKCiAgICAgICAgbXkgJExUUG9vbCA9ICRTZWxmLT5Qb29sTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkTFRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICBpZiAoICRMVFBvb2wgJiYgJExUUG9vbCBlcSAkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICAgICByZXR1cm4gKCAkTFRUaWNrZXROdW1iZXIsICRMVFRpY2tldElEICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEludGVyZGl2aXNpb25hbFRpY2tldExpbmtBZGQoKQoKQWRkIGxpbmsgZm9yIGFkZHJlc3MgcG9vbCB0aWNrZXRzIHdpdGggbmV3ICdJbnRlcmRpdmlzaW9uYWwnIHR5cGUKCiAgICAkQWRkcmVzc1Bvb2xPYmplY3QtPkludGVyZGl2aXNpb25hbFRpY2tldExpbmtBZGQoCiAgICAgICAgVGlja2V0SURzID0+IFsxLCA1LCA4XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSW50ZXJkaXZpc2lvbmFsVGlja2V0TGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SURzIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXRJRHN9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFRpY2tldElEcyBhcyBhcnJheSByZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBAVGlja2V0SURzOwogICAgbXkgJVNlZW47CiAgICBJRDoKICAgIGZvciBteSAkSUQgKCAkUGFyYW17VGlja2V0SURzfS0+QCogKSB7CiAgICAgICAgbmV4dCBJRCBpZiAkU2VlbnskSUR9Kys7CgogICAgICAgIHB1c2ggQFRpY2tldElEcywgJElEOwogICAgfQoKICAgIGlmICggc2NhbGFyKEBUaWNrZXRJRHMpIDwgMiApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgYXQgbGVhc3QgMiB0aWNrZXQgaWRzISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2JqZWN0CiAgICBteSAkTGlua09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CgogICAgIyBsaW5rIHRpY2tldHMKICAgIGZvciBteSAkU291cmNlICggMCAuLiAkI1RpY2tldElEcyApIHsKCiAgICAgICAgZm9yIG15ICRUYXJnZXQgKCAkU291cmNlICsgMSAuLiAkI1RpY2tldElEcyApIHsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJExpbmtPYmplY3QtPkxpbmtBZGQoCiAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFRpY2tldElEc1skU291cmNlXSwKICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGlja2V0SURzWyRUYXJnZXRdLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdJbnRlcmRpdmlzaW9uYWwnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKMTsK</File>
        <File Location="Kernel/System/PostMaster/Filter/SkipViaMessageID.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlNraXBWaWFNZXNzYWdlSUQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBHZXQgY29tbXVuaWNhdGlvbiBsb2cgb2JqZWN0LgogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRQYXJhbXtDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBDb21tdW5pY2F0aW9uTG9nT2JqZWN0ISI7CgogICAgIyBHZXQgQXJ0aWNsZSBiYWNrZW5kIG9iamVjdC4KICAgICRTZWxmLT57QXJ0aWNsZUJhY2tlbmRPYmplY3R9ID0KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnRW1haWwnICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9BZGRDb21tdW5pY2F0aW9uTG9nKCBNZXNzYWdlID0+ICdTZWFyY2hpbmcgZm9yIGhlYWRlciBNZXNzYWdlLUlELicgKTsKCiAgICBteSAkTWVzc2FnZUlEID0gJFBhcmFte0dldFBhcmFtfS0+eydNZXNzYWdlLUlEJ307CgogICAgcmV0dXJuIDEgaWYgISRNZXNzYWdlSUQ7CgogICAgJFNlbGYtPl9BZGRDb21tdW5pY2F0aW9uTG9nKAogICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgJ1NlYXJjaGluZyBmb3IgYXJ0aWNsZSB3aXRoIG1lc3NhZ2UgaWQgIiVzIi4nLAogICAgICAgICAgICAkTWVzc2FnZUlELAogICAgICAgICksCiAgICApOwoKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntBcnRpY2xlQmFja2VuZE9iamVjdH0tPkFydGljbGVHZXRCeU1lc3NhZ2VJRCgKICAgICAgICBNZXNzYWdlSUQgPT4gJE1lc3NhZ2VJRCwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgISVBcnRpY2xlOwoKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgaWYgKCAhJEFydGljbGV7QW1iaWd1b3VzVGlja2V0SURzfSApIHsKICAgICAgICBteSAoJFNlbmRlckVtYWlsKSA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEFydGljbGV7RnJvbX0gKTsKCiAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJFNlbmRlckVtYWlsLAogICAgICAgICk7CgogICAgICAgICMgaWYgd2UgYXJlIHJlYWRpbmcgYSBtZXNzYWdlIHNlbnQgdmlhIG91ciBPVE9CTyBpdHNlbGYgZm9yIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgaWYgKCRJc0xvY2FsKSB7CiAgICAgICAgICAgICRTZWxmLT5fQWRkQ29tbXVuaWNhdGlvbkxvZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAnRW1haWwgd2l0aCBtZXNzYWdlIGlkICIlcyIgd2FzIHNlbnQgYXMgbmV3IGFydGljbGUgZnJvbSBhIGxvY2FsIGFkZHJlc3MuJywKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZUlELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17Sm9iQ29uZmlnfSB8fCAhJFBhcmFte0pvYkNvbmZpZ317QWxsb3dNdWx0aVBhcnNlfSApIHsKICAgICAgICAkU2VsZi0+X0FkZENvbW11bmljYXRpb25Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICdBcnRpY2xlIHdpdGggbWVzc2FnZSBpZCAiJXMiIGFscmVhZHkgZXhpc3RzLCBzZXR0aW5nIFgtT1RPQk8tSWdub3JlLicsCiAgICAgICAgICAgICAgICAkTWVzc2FnZUlELAogICAgICAgICAgICApLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXsnWC1PVE9CTy1JZ25vcmUnfSA9ICd5ZXMnOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkTXVsdGlQYXJzZSA9ICRQYXJhbXtKb2JDb25maWd9e0FsbG93TXVsdGlQYXJzZX17QWx3YXlzfSA/IDEgOiAwOwoKICAgIGlmICggISRNdWx0aVBhcnNlICYmICRQYXJhbXtKb2JDb25maWd9e0FsbG93TXVsdGlQYXJzZX17TWFpbEFjY291bnRRdWV1ZX0gJiYgJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRTZWxmLT5fQWRkQ29tbXVuaWNhdGlvbkxvZygKICAgICAgICAgICAgTWVzc2FnZSA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgJ0FydGljbGUgd2l0aCBtZXNzYWdlIGlkICIlcyIgYWxyZWFkeSBleGlzdHMsIHBhcnNlIGFnYWluIGFzIGV4cGxpY2l0IFF1ZXVlSUQgaXMgcHJvdmlkZWQuJywKICAgICAgICAgICAgICAgICRNZXNzYWdlSUQsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKCiAgICAgICAgJE11bHRpUGFyc2UgPSAxOwogICAgfQoKICAgIGlmICggISRNdWx0aVBhcnNlICYmICRQYXJhbXtKb2JDb25maWd9e0FsbG93TXVsdGlQYXJzZX17Qm91bmNlZEVtYWlsfSAmJiAkUGFyYW17R2V0UGFyYW19eydSZXNlbnQtVG8nfSApIHsKICAgICAgICAkU2VsZi0+X0FkZENvbW11bmljYXRpb25Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICdBcnRpY2xlIHdpdGggbWVzc2FnZSBpZCAiJXMiIGFscmVhZHkgZXhpc3RzLCBwYXJzZSBhZ2FpbiBhcyBlbWFpbCB3YXMgYm91bmNlZC4nLAogICAgICAgICAgICAgICAgJE1lc3NhZ2VJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICAkTXVsdGlQYXJzZSA9IDE7CiAgICB9CgogICAgaWYgKCAhJE11bHRpUGFyc2UgKSB7CiAgICAgICAgJFNlbGYtPl9BZGRDb21tdW5pY2F0aW9uTG9nKAogICAgICAgICAgICBNZXNzYWdlID0+IHNwcmludGYoCiAgICAgICAgICAgICAgICAnQXJ0aWNsZSB3aXRoIG1lc3NhZ2UgaWQgIiVzIiBhbHJlYWR5IGV4aXN0cywgc2V0dGluZyBYLU9UT0JPLUlnbm9yZS4nLAogICAgICAgICAgICAgICAgJE1lc3NhZ2VJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tSWdub3JlJ30gPSAneWVzJzsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJEFkZHJlc3NQb29sT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJyk7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKCAkQXJ0aWNsZXtBbWJpZ3VvdXNUaWNrZXRJRHN9LT5AKiApIHsKICAgICAgICBteSAkUG9vbCA9ICRBZGRyZXNzUG9vbE9iamVjdC0+UG9vbExvb2t1cCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIG5leHQgVElDS0VUSUQgaWYgISRQb29sOwoKICAgICAgICAkUGFyYW17R2V0UGFyYW19e0lnbm9yZUFkZHJlc3NQb29sc317JFBvb2x9ID0gJFRpY2tldElEOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FkZENvbW11bmljYXRpb25Mb2cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAkUGFyYW17UHJpb3JpdHl9IHx8ICdEZWJ1ZycsCiAgICAgICAgS2V5ICAgICAgICAgICA9PiByZWYoJFNlbGYpLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gJFBhcmFte01lc3NhZ2V9LAogICAgKTsKCiAgICByZXR1cm47Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketBounce.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA5YTRmYTA4Y2RkODE1Nzk4YjI5YjY4NDg1NDdlY2Y1OTAwZDFkNjRhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRCb3VuY2UucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0Qm91bmNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGdldCBhcnRpY2xlIElECiAgICAkU2VsZi0+e0FydGljbGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApIHx8ICcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXJ0aWNsZUlEIFRpY2tldElEIFF1ZXVlSUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGlzIG5lZWRlZCEnLCAkTmVlZGVkICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJVRpY2tldCAgICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDb25maWcgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJUFjbEFjdGlvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICgkQUNMKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxvY2sgc3RhdGUgJiYgd3JpdGUgKGxvY2spIHBlcm1pc3Npb25zCiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CgogICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRMb2NrKSB7CgogICAgICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJldmlvdXNPd25lcn0gPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTaG93IGxvY2sgc3RhdGUuCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSB0aWNrZXQgb3duZXIgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgc2NyZWVuCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHBsYWluIGFydGljbGUgZXhpc3RzCiAgICAgICAgaWYgKCAhJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlUGxhaW4oIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0gKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1BsYWluIGFydGljbGUgbm90IGZvdW5kIGZvciBhcnRpY2xlICVzIScsCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntBcnRpY2xlSUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhCiAgICAgICAgbXkgJUFydGljbGUgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBpZiBhcnRpY2xlIGlzIGZyb20gdGhlIHNhbWUgVGlja2V0SUQgYXMgd2UgY2hlY2tlZCBwZXJtaXNzaW9ucyBmb3IuCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtUaWNrZXRJRH0gbmUgJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdBcnRpY2xlIGRvZXMgbm90IGJlbG9uZyB0byB0aWNrZXQgJXMhJywKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSB0byAoUmVwbHlUbyEpIC4uLgogICAgICAgIGlmICggJEFydGljbGV7UmVwbHlUb30gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1RvfSA9ICRBcnRpY2xle1JlcGx5VG99OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGV7VG99ID0gJEFydGljbGV7RnJvbX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBnZW5lcmF0b3Igb2JqZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyA9PiB7ICV7JFNlbGZ9IH0KICAgICAgICApOwogICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAjIHByZXBhcmUgc2FsdXRhdGlvbgogICAgICAgICRQYXJhbXtTYWx1dGF0aW9ufSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2FsdXRhdGlvbigKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICAgICAgJFBhcmFte1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgYm91bmNlIHRleHQKICAgICAgICAkUGFyYW17Qm91bmNlVGV4dH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJvdW5jZVRleHQnKSB8fCAnJzsKCiAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyBwcmVwYXJlIGJvdW5jZSB0YWdzCiAgICAgICAgICAgICRQYXJhbXtCb3VuY2VUZXh0fSA9fiBzLzxPVE9CT19USUNLRVQ+LyZsdDtPVE9CT19USUNLRVQmZ3Q7L2c7CiAgICAgICAgICAgICRQYXJhbXtCb3VuY2VUZXh0fSA9fiBzLzxPVE9CT19CT1VOQ0VfVE8+LyZsdDtPVE9CT19CT1VOQ0VfVE8mZ3Q7L2c7CgogICAgICAgICAgICAkUGFyYW17Qm91bmNlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17Qm91bmNlVGV4dH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEluZm9ybWF0aW9uRm9ybWF0CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJFBhcmFte0luZm9ybWF0aW9uRm9ybWF0fSA9ICIkUGFyYW17U2FsdXRhdGlvbn08YnIvPgo8YnIvPgokUGFyYW17Qm91bmNlVGV4dH08YnIvPgo8YnIvPgokUGFyYW17U2lnbmF0dXJlfSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17SW5mb3JtYXRpb25Gb3JtYXR9ID0gIiRQYXJhbXtTYWx1dGF0aW9ufQoKJFBhcmFte0JvdW5jZVRleHR9CgokUGFyYW17U2lnbmF0dXJlfSI7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgc2VuZGVyIG9mIGJvdW5jZSBlbWFpbAogICAgICAgIG15ICVBZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFN5c3RlbUFkZHJlc3MoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0Zyb219ID0gJEFkZHJlc3N7Rm9ybWF0dGVkQWRkcmVzc307CgogICAgICAgICMgZ2V0IG5leHQgc3RhdGVzCiAgICAgICAgbXkgJU5leHRTdGF0ZXMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgIGlmICggISRDb25maWctPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkTmV4dFN0YXRlc3snJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJU5leHRTdGF0ZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0JvdW5jZVN0YXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBleHBsYW5hdG9yeSBtZXNzYWdlIGFib3V0IGFzdGVyaXNrCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEJvdW5jZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYm91bmNlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoQm91bmNlVG8gVG8gU3ViamVjdCBCb2R5IEluZm9ybVNlbmRlciBCb3VuY2VTdGF0ZUlEKSkgewogICAgICAgICAgICAkUGFyYW17JFBhcmFtZXRlcn0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBNYWtlIHN1cmUgc2VuZGVyIGlzIGNvcnJlY3Qgb25lLgogICAgICAgICRQYXJhbXtGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIGNoZWNrIGZvcndhcmQgZW1haWwgYWRkcmVzcwogICAgICAgIGlmICggISRQYXJhbXtCb3VuY2VUb30gKSB7CiAgICAgICAgICAgICRFcnJvcnsnQm91bmNlVG9JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQm91bmNlVG9DdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZycgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICAgICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJFBhcmFte0JvdW5jZVRvfSApICkgewoKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKIyAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsLAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRJc0xvY2FsKSB7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdCb3VuY2VUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgICAgICAgICAgJEVycm9yeydCb3VuY2VUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBlbHNpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgbXkgJEJvdW5jZVRvRXJyb3JNc2cgPQogICAgICAgICAgICAgICAgICAgICdCb3VuY2VUbycKICAgICAgICAgICAgICAgICAgICAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAkQm91bmNlVG9FcnJvck1zZyApOwogICAgICAgICAgICAgICAgJEVycm9yeydCb3VuY2VUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte0luZm9ybVNlbmRlcn0gKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXtUb30gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcyhlcykKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRQYXJhbXtUb30gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVG9FcnJvck1zZyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJFRvRXJyb3JNc2cgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkUGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1N1YmplY3RJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICNjaGVjayBmb3IgZXJyb3IKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdldCBuZXh0IHN0YXRlcwogICAgICAgICAgICBteSAlTmV4dFN0YXRlcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAgICAgaWYgKCAhJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkTmV4dFN0YXRlc3snJ30gPSAnLSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVOZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0JvdW5jZVN0YXRlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0JvdW5jZVN0YXRlSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcHJlcGFyZSBib3VuY2UgdGFncyBpZiBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgcHJlcGFyZSBib3VuY2UgdGFncwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvJmx0O09UT0JPX1RJQ0tFVCZndDsvJmFtcDtsdDtPVE9CT19USUNLRVQmYW1wO2d0Oy9naTsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzLyZsdDtPVE9CT19CT1VOQ0VfVE8mZ3Q7LyZhbXA7bHQ7T1RPQk9fQk9VTkNFX1RPJmFtcDtndDsvZ2k7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtJbmZvcm1hdGlvbkZvcm1hdH0gICA9ICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgJFBhcmFte0luZm9ybVNlbmRlckNoZWNrZWR9ID0gJFBhcmFte0luZm9ybVNlbmRlcn0gPyAnY2hlY2tlZCAnIDogJyc7CgogICAgICAgICAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEJvdW5jZScsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRCb3VuY2UgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVCb3VuY2UoCiAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVG8gICAgICAgICAgPT4gJFBhcmFte0JvdW5jZVRvfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgPT4gJFBhcmFte0Zyb219LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAnQm91bmNlJywKICAgICAgICApOwoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICBpZiAoICEkQm91bmNlICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IGJvdW5jZSBlbWFpbCEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBjdXN0b21lciBpbmZvPwogICAgICAgIGlmICggJFBhcmFte0luZm9ybVNlbmRlcn0gKSB7CgogICAgICAgICAgICAjIHNldCBtaW1lIHR5cGUKICAgICAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlcGxhY2UgcGxhY2Vob2xkZXJzCiAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzLygmbHQ7fDwpT1RPQk9fVElDS0VUKCZndDt8PikvJFRpY2tldHtUaWNrZXROdW1iZXJ9L2c7CiAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzLygmbHQ7fDwpT1RPQk9fQk9VTkNFX1RPKCZndDt8PikvJFBhcmFte0JvdW5jZVRvfS9nOwoKICAgICAgICAgICAgIyBzZW5kCiAgICAgICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdCb3VuY2UnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gIkJvdW5jZWQgaW5mbyB0byAnJFBhcmFte1RvfScuIiwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgICAgIEVtYWlsICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFbWFpbH0sCiAgICAgICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VG99LAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2VuZCBlbWFpbCEnKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGEgY2hvc2VuIGJvdW5jZSBzdGF0ZSBpZAogICAgICAgIGlmICggJFBhcmFte0JvdW5jZVN0YXRlSUR9ICkgewoKICAgICAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRQYXJhbXtCb3VuY2VTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgID0+ICRQYXJhbXtCb3VuY2VTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3VsZCBpIHNldCBhbiB1bmxvY2s/CiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaQogICAgICAgICAgICAgICAgJiYgISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVkaXJlY3RBZnRlckNsb3NlRGlzYWJsZWQnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgICAgICBVUkwgPT4gKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCcgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JFNlbGYtPntBcnRpY2xlSUR9IiwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdXcm9uZyBTdWJhY3Rpb24hJyksCiAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgKTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentTicketCompose.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiNGNlMTgzMjcxZTE1MjY2MTQyMTkxMjY5MzNmMjA0YzAxOTZhYjM0IC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRDb21wb3NlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldENvbXBvc2U7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBUcnkgdG8gbG9hZCBkcmFmdCBpZiByZXF1ZXN0ZWQuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0Zvcm1EcmFmdH0KICAgICAgICAmJiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRJRCcgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSA9ICRQYXJhbU9iamVjdC0+TG9hZEZvcm1EcmFmdCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApLAogICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgZnJvbnRlbmQgc3BlY2lmaWMgY29uZmlnCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICBteSAkRGVmaW5pdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6Ok1hc2snKS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBNYXNrID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICkgfHwge307CgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ICAgPSB7fTsKICAgICRTZWxmLT57TWFza0RlZmluaXRpb259ID0gJERlZmluaXRpb24tPntNYXNrfTsKCiAgICAjIGFsaWduIHN5c2NvbmZpZyBhbmQgdGlja2V0IG1hc2sgZGF0YSBJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7ICREeW5hbWljRmllbGRMaXN0IC8vIFtdIH0gKSB7CiAgICAgICAgaWYgKCBleGlzdHMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgIG15ICRQYXJhbWV0ZXJzID0gZGVsZXRlICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9IC8vIHt9OwoKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGQtPnskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2ggJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0tPkAqLCB7CiAgICAgICAgICAgICAgICBERiAgICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICRDb25maWctPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyID8gMSA6IDAsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoICRDb25maWctPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+e01hbmRhdG9yeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZDsKICAgIH0KCiAgICAjIGFsaWduIHN5c2NvbmZpZyBhbmQgdGlja2V0IG1hc2sgZGF0YSBJSQogICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lICgga2V5cyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9LT4lKiApIHsKICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH17JER5bmFtaWNGaWVsZE5hbWV9ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICk7CgogICAgICAgIG15ICRQYXJhbWV0ZXJzID0gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXskRHluYW1pY0ZpZWxkTmFtZX0gLy8ge307CgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX17JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+UHJlcGFyZUZvcm1JRCgKICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgIExheW91dE9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyksCiAgICApOwoKICAgICMgbWV0aG9kcyB3aGljaCBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgc3RhbmRhcmQgZmllbGRzCiAgICAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gPSBbCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0TmV4dFN0YXRlcwogICAgICAgIH0sCiAgICBdOwoKICAgICMgZGVwZW5kZW5jaWVzIG9mIHN0YW5kYXJkIGZpZWxkcyB3aGljaCBhcmUgbm90IGRlZmluZWQgdmlhIEFDTHMKICAgICRTZWxmLT57SW50ZXJuYWxEZXBlbmRhbmN5fSA9IHsKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwogICAgbXkgJEFydGljbGVPYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJE1haW5PYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gVGlja2V0SUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJENvbmZpZy0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJUFjbEFjdGlvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICgkQUNMKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgZm9yIGZhaWxlZCBkcmFmdCBsb2FkaW5nIHJlcXVlc3QuCiAgICBpZiAoCiAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xvYWRGb3JtRHJhZnQnICkKICAgICAgICAmJiAhJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTG9hZGluZyBkcmFmdCBmYWlsZWQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIG15ICRUaWNrZXRCYWNrVHlwZSA9ICdUaWNrZXRCYWNrJzsKICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKCiAgICAgICAgICAgIG15ICRMb2NrID0gJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNldCBuZXcgb3duZXIgaWYgdGlja2V0IG93bmVyIGlzIGRpZmZlcmVudCB0aGVuIGxvZ2dlZCB1c2VyLgogICAgICAgICAgICBpZiAoICRMb2NrICYmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSApIHsKCiAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHByZXZpb3VzIG93bmVyLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVzdG9yZSB0aWNrZXQgb3duZXIgb24gdW5kbyBhY3Rpb24uCiAgICAgICAgICAgICAgICAkVGlja2V0e1ByZXZpb3VzT3duZXJ9ID0gJFRpY2tldHtPd25lcklEfTsKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2hvdyBsb2NrIHN0YXRlLgogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFRpY2tldEJhY2tUeXBlIC49ICdVbmRvJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSB0aWNrZXQgb3duZXIgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0VtYWlsJyApOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICAgICAgVG8gQ2MgQmNjIFN1YmplY3QgQm9keSBJblJlcGx5VG8gUmVmZXJlbmNlcyBSZXNwb25zZUlEIFJlcGx5QXJ0aWNsZUlEIFN0YXRlSUQgQXJ0aWNsZUlECiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudCBJc1Zpc2libGVGb3JDdXN0b21lciBUaW1lVW5pdHMgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgRm9ybUlEIFJlcGx5QWxsCiAgICAgICAgICAgIEZvcm1EcmFmdElEIFRpdGxlCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KCiAgICAjIE1ha2Ugc3VyZSBzZW5kZXIgaXMgY29ycmVjdCBvbmUuIFNlZSBidWcjMTQ4NzIgKCBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTE0ODcyICkuCiAgICAkR2V0UGFyYW17RnJvbX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKS0+U2VuZGVyKAogICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBoYXNoIGZvciBjaGVjayBkdXBsaWNhdGVkIGVudHJpZXMKICAgIG15ICVBZGRyZXNzZXNMaXN0OwoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyOwogICAgbXkgJEN1c3RvbWVyc051bWJlclRvID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlclRvQ3VzdG9tZXInICkgfHwgMDsKICAgIG15ICRTZWxlY3RlZCAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclNlbGVjdGVkJyApICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyVG8pIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlclRvICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50OwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRTZWxlY3RlZCBlcSAkQ291bnQgPyAnY2hlY2tlZCAnIDogJycgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZSBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyUXVldWUgICAgPT4gJEN1c3RvbWVyUXVldWUsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJDYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJDYyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudENjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKCiAgICAgICAgICAgIG5leHQgQ09VTlQgdW5sZXNzICRDdXN0b21lckVsZW1lbnRDYzsKCiAgICAgICAgICAgIG15ICRDdXN0b21lcktleUNjICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lcktleV8nIC4gJENvdW50ICkgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWVDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q2N9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSA9ICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQ2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckNjICAgID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRDdXN0b21lckVsZW1lbnRDYyApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSAmJiAkQ3VzdG9tZXJFcnJvckNjIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXhDYyAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlckNjKys7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQ2MgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4Q2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWVDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlQ2MgPSAkQ291bnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJDYywgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyUXVldWUgICAgPT4gJEN1c3RvbWVyUXVldWVDYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQmNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJCY2MgKSB7CiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgJENvdW50ID4gMV8wMDA7ICAgICMgYmFpbCBvdXQgd2hlbiB0aGUgbnVtYmVyIG9mIGN1c3RvbWVycyBpcyBhYm5vcm1hbGx5IGhpZ2gKCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKCiAgICAgICAgICAgIG5leHQgQ09VTlQgdW5sZXNzICRDdXN0b21lckVsZW1lbnRCY2M7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlCY2MgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lcktleV8nIC4gJENvdW50ICkgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWVCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJRdWV1ZV8nIC4gJENvdW50ICkgfHwgJyc7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtCY2N9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRCY2M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSA9ICRDdXN0b21lckVsZW1lbnRCY2M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQmNjICAgID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRDdXN0b21lckVsZW1lbnRCY2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gJiYgJEN1c3RvbWVyRXJyb3JCY2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQmNjID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eEJjYyAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yQmNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lclF1ZXVlQmNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWVCY2MgPSAkQ291bnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJCY2MsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0JjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQmNjLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIHsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRJdGVtICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkRHluYW1pY0ZpZWxkSXRlbTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIGRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZEl0ZW0gfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwogICAgICAgIH0KICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIH0KCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAjIHNlbmQgZW1haWwKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZW5kRW1haWwnIHx8ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgaWYgKCAhJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHZhbGlkIHN0YXRlIGlkCiAgICAgICAgaWYgKCAhJEdldFBhcmFte1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17U3RhdGVJRH0gPSAkVGlja2V0e1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte1N0YXRlSUR9ICk7CgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgICAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBMSU5FIHVubGVzcyAkR2V0UGFyYW17JExpbmV9OwoKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEdldFBhcmFteyRMaW5lfSApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRMaW5lIC4gJ0Vycm9yVHlwZScgfSA9ICRMaW5lIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdJbnZhbGlkJyB9ICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgQWRkcmVzc09iamVjdCA9PiAkRW1haWwsCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkSXNMb2NhbCkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFcnJvcntUb0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRXJyb3J7Q2NJc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEVycm9ye0JjY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIEdldCBhbmQgdmFsaWRhdGUgZHJhZnQgYWN0aW9uLgogICAgICAgIG15ICRGb3JtRHJhZnRBY3Rpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybURyYWZ0QWN0aW9uJyApOwogICAgICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiAmJiAhJENvbmZpZy0+e0Zvcm1EcmFmdH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdGb3JtRHJhZnQgZnVuY3Rpb25hbGl0eSBkaXNhYmxlZCEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVGb3JtRHJhZnRSZXNwb25zZTsKCiAgICAgICAgIyBDaGVjayBkcmFmdCBuYW1lLgogICAgICAgIGlmICgKICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbgogICAgICAgICAgICAmJgogICAgICAgICAgICAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgfHwgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRUaXRsZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRUaXRsZScgKTsKCiAgICAgICAgICAgICMgQSBkcmFmdCBuYW1lIGlzIHJlcXVpcmVkLgogICAgICAgICAgICBpZiAoICEkVGl0bGUgKSB7CgogICAgICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgiRHJhZnQgbmFtZSBpcyByZXF1aXJlZCEiKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hvc2VuIGRyYWZ0IG5hbWUgbXVzdCBiZSB1bmlxdWUuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJEZvcm1EcmFmdExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdExpc3RHZXQoCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIERSQUZUOgogICAgICAgICAgICAgICAgZm9yIG15ICRGb3JtRHJhZnQgKCBAeyRGb3JtRHJhZnRMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBObyBleGlzdGluZyBkcmFmdCB3aXRoIHNhbWUgbmFtZS4KICAgICAgICAgICAgICAgICAgICBuZXh0IERSQUZUIGlmICRUaXRsZSBuZSAkRm9ybURyYWZ0LT57VGl0bGV9OwoKICAgICAgICAgICAgICAgICAgICAjIFNhbWUgbmFtZSBmb3IgdXBkYXRlIG9uIGV4aXN0aW5nIGRyYWZ0LgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRm9ybURyYWZ0QWN0aW9uIGVxICdVcGRhdGUnCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gZXEgJEZvcm1EcmFmdC0+e0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IERSQUZUOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBBbm90aGVyIGRyYWZ0IHdpdGggdGhlIGNob3NlbiBuYW1lIGFscmVhZHkgZXhpc3RzLgogICAgICAgICAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSggIkZvcm1EcmFmdCBuYW1lICVzIGlzIGFscmVhZHkgaW4gdXNlISIsICRUaXRsZSApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBEUkFGVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBQZXJmb3JtIGRyYWZ0IGFjdGlvbiBpbnN0ZWFkIG9mIHNhdmluZyBmb3JtIGRhdGEgaW4gdGlja2V0L2FydGljbGUuCiAgICAgICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uICYmICElRm9ybURyYWZ0UmVzcG9uc2UgKSB7CgogICAgICAgICAgICAjIFJlc2V0IEZvcm1EcmFmdElEIHRvIHByZXZlbnQgdXBkYXRpbmcgZXhpc3RpbmcgZHJhZnQuCiAgICAgICAgICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkgewoKICAgICAgICAgICAgICAgICMgbWVkZGxpbmcgd2l0aCB0aGUgaW5uYXJkcyBvZiBLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0CiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPlNldEFycmF5KAogICAgICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnRm9ybURyYWZ0SUQnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlcyA9PiBbJyddCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRm9ybURyYWZ0QWN0aW9uT2s7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcKICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRQYXJhbU9iamVjdC0+U2F2ZUZvcm1EcmFmdCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnRGVsZXRlJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbk9rID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkRm9ybURyYWZ0QWN0aW9uT2spIHsKICAgICAgICAgICAgICAgICRGb3JtRHJhZnRSZXNwb25zZXtTdWNjZXNzfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdDb3VsZCBub3QgcGVyZm9ybSByZXF1ZXN0ZWQgZHJhZnQgYWN0aW9uIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFJldHVybiBKU09OIHdoZW4gdGhlcmUgYWxyZWFkeSBpcyBhIHJlc3BvbnNlCiAgICAgICAgaWYgKCVGb3JtRHJhZnRSZXNwb25zZSkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+SlNPTlJlcGx5KAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUZvcm1EcmFmdFJlc3BvbnNlCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgZGF0ZQogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAjIGNvbnZlcnQgcGVuZGluZyBkYXRlIHRvIGEgZGF0ZXRpbWUgb2JqZWN0CiAgICAgICAgICAgIG15ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSBlcG9jaAogICAgICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggISRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgfHwgJFBlbmRpbmdEYXRlVGltZU9iamVjdCA8ICRDdXJTeXN0ZW1EYXRlVGltZU9iamVjdCApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcntEYXRlSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGF0IGxlYXN0IG9uZSByZWNpcGllbnQgaGFzIGJlZW4gY2hvc2VuCiAgICAgICAgaWYgKCAhJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBMSU5FIGlmICEkR2V0UGFyYW17JExpbmV9OwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkR2V0UGFyYW17JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEVycm9ye1N1YmplY3RJbnZhbGlkfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAkRXJyb3J7Qm9keUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRpbWUgdW5pdHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9ye1RpbWVVbml0c0ludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAgICAgbXkgJFRuID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUbiwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSB8fCAnJywKICAgICAgICApOwoKICAgICAgICBteSAlQXJ0aWNsZVBhcmFtOwoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9ICk7CgogICAgICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0b3JlTmV3ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgb3B0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgIyBhbmQgYWRkIHRoZW0gYmFjayB0byB0aGUgc2VsZWN0aW9uIHNvIHRoYXQgdGhlIHN1Ym1pdAogICAgICAgICAgICAgICAgIyB3aWxsIGNvbnRhaW4gb3B0aW9ucyB0aGF0IHdlcmUgaGlkZGVuIGZyb20gdGhlIGFnZW50CiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRPcHRpb25zVG9SZW1vdmVBSkFYJykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQFJlbW92ZWRPcHRpb25zID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwogICAgICAgICAgICAgICAgICAgIGlmIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRNdWx0aXBsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdmVkT3B0aW9uIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRHZXRQYXJhbXskS2V5fSB9LCAkUmVtb3ZlZE9wdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9IHNoaWZ0IEBSZW1vdmVkT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sICVBcnRpY2xlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgICAgICVFcnJvciA9ICgKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNraXAgdmFsaWRhdGlvbiBvZiBoaWRkZW4gZmllbGRzCiAgICAgICAgbXkgJVZpc2liaWxpdHk7CgogICAgICAgICMgdHJhbnNmb3JtIGR5bmFtaWMgZmllbGQgZGF0YSBpbnRvIERGTmFtZSA9PiBERk5hbWUgcGFpcgogICAgICAgIG15ICVEeW5hbWljRmllbGRBY2wgPSBtYXAgeyAkXyA9PiAkXyB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKCiAgICAgICAgIyBjYWxsIHRpY2tldCBBQ0xzIGZvciBEeW5hbWljRmllbGRzIHRvIGNoZWNrIGZpZWxkIHZpc2liaWxpdHkKICAgICAgICBteSAkQUNMUmVzdWx0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdGb3JtJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVEeW5hbWljRmllbGRBY2wsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCRBQ0xSZXN1bHQpIHsKICAgICAgICAgICAgJVZpc2liaWxpdHkgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiAwIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQWNsRGF0YSApIHsKICAgICAgICAgICAgICAgICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRmllbGQgfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gMSB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICB9CgogICAgICAgICMgcmVtZW1iZXIgZHluYW1pYyBmaWVsZCB2YWxpZGF0aW9uIHJlc3VsdHMgaWYgZXJyb25lb3VzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCgogICAgICAgICAgICAgICAgICAgICMgVE9ETyBhbHNvIHBhc3Mgb2JqZWN0IGhlcmU/CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICAjIGRvIG5vdCB2YWxpZGF0ZSBvbiBpbnZpc2libGUgZmllbGRzCiAgICAgICAgICAgIGlmICggJFZpc2liaWxpdHl7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewoKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAoKICAgICAgICAgICAgICAgICAgICAjIE1hbmRhdG9yeSBpcyBhZGRlZCB0byB0aGUgY29uZmlncyBieSAkU2VsZi0+bmV3CiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICREeW5hbWljRmllbGRDb25maWctPntNYW5kYXRvcnl9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBQcm9wYWdhdGUgdmFsaWRhdGlvbiBlcnJvciB0byB0aGUgRXJyb3IgdmFyaWFibGUgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGZyb250ZW5kLgogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IHNhdmUgZm9ybSBpZiBhIGRyYWZ0IHdhcyBsb2FkZWQuCiAgICAgICAgaWYgKCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCBMb2FkZWRGb3JtRHJhZnQgPT4gMSApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFdoZW4gYSBkcmFmdCBpcyBsb2FkZWQsIGluZm9ybSBhIHVzZXIgdGhhdCBhcnRpY2xlIHN1YmplY3Qgd2lsbCBiZSBlbXB0eQogICAgICAgICAgICAjIGlmIGNvbnRhaW5zIG9ubHkgdGhlIHRpY2tldCBob29rIChpZiBub3RoaW5nIGlzIG1vZGlmaWVkKS4KICAgICAgICAgICAgaWYgKCAkRXJyb3J7TG9hZGVkRm9ybURyYWZ0fSApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQXJ0aWNsZSBzdWJqZWN0IHdpbGwgYmUgZW1wdHkgaWYgdGhlIHN1YmplY3QgY29udGFpbnMgb25seSB0aGUgdGlja2V0IGhvb2shJwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkR2V0UGFyYW17U3RhbmRhcmRSZXNwb25zZX0gPSAkR2V0UGFyYW17Qm9keX07CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSZXNwb25zZUZvcm1hdCAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFte0JvZHl9ICksCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldEJhY2tUeXBlICAgICAgPT4gJFRpY2tldEJhY2tUeXBlLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIERGUG9zc2libGVWYWx1ZXMgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIERGRXJyb3JzICAgICAgICAgPT4gXCVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkICAgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgICAgIFZpc2liaWxpdHkgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHJlcGxhY2UgPE9UT0JPX1RJQ0tFVF9TVEFURT4gd2l0aCBuZXh0IHRpY2tldCBzdGF0ZSBuYW1lCiAgICAgICAgaWYgKCAkU3RhdGVEYXRhe05hbWV9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy88T1RPQk9fVElDS0VUX1NUQVRFPi8kU3RhdGVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyZsdDtPVE9CT19USUNLRVRfU1RBVEUmZ3Q7LyRTdGF0ZURhdGF7TmFtZX0vZzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVjaXBpZW50cwogICAgICAgIG15ICRSZWNpcGllbnRzID0gJyc7CiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKCiAgICAgICAgICAgIG5leHQgTElORSBpZiAhJEdldFBhcmFteyRMaW5lfTsKCiAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgJFJlY2lwaWVudHMgLj0gJywgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAkR2V0UGFyYW17JExpbmV9OwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyByZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgIGlmICggJENvbnRlbnRJRCAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBJRiB0aGUgaW1hZ2UgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYm9keSBzZXQgaXQgYXMgaW5saW5lLgogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ID1+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259ID0gJ2lubGluZSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIElnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keS4KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGlubGluZSBpbWFnZXMgYW5kIG5vcm1hbCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudERhdGEgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIHZlcmlmeSBIVE1MIGRvY3VtZW50CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPSAkQ29uZmlnLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJEZWZhdWx0fTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnR9ICkgewogICAgICAgICAgICAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPSAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID8gMSA6IDA7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBhdHRyaWJ1dGVzIGxpa2Ugc2VuZGVyIGFkZHJlc3MuCiAgICAgICAgIyBJdCBpcyBub3Qgb2J2aW91cyB3aGV0aGVyICREYXRhe0Zyb219IGNhbiBkaWZmZXIgZnJvbSAkR2V0UGFyYW17RnJvbX0uCiAgICAgICAgbXkgJURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKS0+QXR0cmlidXRlcygKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIERhdGEgICAgID0+IHt9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZW5kIGVtYWlsCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVNlbmQoCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRJc1Zpc2libGVGb3JDdXN0b21lciwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdTZW5kQW5zd2VyJywKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gIlwlXCUkUmVjaXBpZW50cyIsCiAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICREYXRhe0Zyb219LAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgSW5SZXBseVRvICAgICAgICAgICAgPT4gJEdldFBhcmFte0luUmVwbHlUb30sCiAgICAgICAgICAgIFJlZmVyZW5jZXMgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZWZlcmVuY2VzfSwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIHNldCB0aGUgb2JqZWN0IElEIChUaWNrZXRJRCBvciBBcnRpY2xlSUQpIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgICAgICBteSAkT2JqZWN0SUQgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnCiAgICAgICAgICAgICAgICA/ICRTZWxmLT57QXJ0aWNsZUlEfSB8fCAkQXJ0aWNsZUlECiAgICAgICAgICAgICAgICA6ICRTZWxmLT57VGlja2V0SUR9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlIHdoaWNoIHdhcyB0YWtlbiBmcm9tIHdlYiByZXF1ZXN0CiAgICAgICAgICAgICMgVE9ETzogZm9yIFJlZmVyZW5jZSBhbmQgTGVucywgdGhlIG9yZGVyIGlzIHJlbGV2YW50CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIFN0YXRlSUQgICA9PiAkR2V0UGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG91bGQgSSBzZXQgYW4gdW5sb2NrPwogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBZZWFyICAgICA9PiAkR2V0UGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCAgICA9PiAkR2V0UGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJEdldFBhcmFte0RheX0sCiAgICAgICAgICAgICAgICBIb3VyICAgICA9PiAkR2V0UGFyYW17SG91cn0sCiAgICAgICAgICAgICAgICBNaW51dGUgICA9PiAkR2V0UGFyYW17TWludXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbG9nIHVzZSByZXNwb25zZSBpZCBhbmQgcmVwbHkgYXJ0aWNsZSBpZCAodXNlZnVsIGZvciByZXNwb25zZSBkaWFnbm9zdGljcykKICAgICAgICAkVGlja2V0T2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gIlJlc3BvbnNlVGVtcGxhdGUgKCRHZXRQYXJhbXtSZXNwb25zZUlEfS8kR2V0UGFyYW17UmVwbHlBcnRpY2xlSUR9LyRBcnRpY2xlSUQpIiwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIGFsbCBmb3JtIGRhdGEKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgSWYgZm9ybSB3YXMgY2FsbGVkIGJhc2VkIG9uIGEgZHJhZnQsCiAgICAgICAgIyAgIGRlbGV0ZSBkcmFmdCBzaW5jZSBpdHMgY29udGVudCBoYXMgbm93IGJlZW4gdXNlZC4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0KICAgICAgICAgICAgJiYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0RGVsZXRlKAogICAgICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgICAgIE9iamVjdElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgZGVsZXRlIGRyYWZ0IScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaQogICAgICAgICAgICAmJiAhJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpSZWRpcmVjdEFmdGVyQ2xvc2VEaXNhYmxlZCcpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgVVJMID0+ICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9IHx8ICdBY3Rpb249QWdlbnREYXNoYm9hcmQnICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRTZWxmLT57VGlja2V0SUR9O0FydGljbGVJRD0kQXJ0aWNsZUlEIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICAjIHVzZSB0aGUgRmllbGRJRHMsIHdoaWNoIGFyZSBmb3VuZCBpbiBBZ2VudFRpY2tldFBob25lL0VtYWlsLCBhbmQgQ3VzdG9tZXJUaWNrZXRNZXNzYWdlCiAgICAgICAgbXkgJVVuaWZvcm1pdHkgPSAoCiAgICAgICAgICAgIE5ld1N0YXRlSUQgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICApOwoKICAgICAgICBteSBARXh0ZW5kZWREYXRhOwoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIG5leHQgSk9CIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkTXVsdGlwbGU7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIGdldCBBSkFYIHBhcmFtIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldFBhcmFtQUpBWCcpICkgewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IG9wdGlvbnMgdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIHZpc2libGUKICAgICAgICAgICAgICAgICMgdG8gdGhlIGFnZW50LiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAT3B0aW9uc1RvUmVtb3ZlID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskT3B0aW9uVG9SZW1vdmV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgaWYgKCRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFeHRlbmRlZERhdGEsIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+ICRNdWx0aXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDE1MCwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBEeW5hbWljIEZpZWxkcyBQb3NzaWJsZSBWYWx1ZXMgdmlhIEFKQVgKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CiAgICAgICAgaWYgKCAkRWxlbWVudENoYW5nZWQgZXEgJ1N0YXRlSUQnICkgewogICAgICAgICAgICAkRWxlbWVudENoYW5nZWQgPSAnTmV4dFN0YXRlSUQnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkQXV0b3NlbGVjdCA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBdXRvc2VsZWN0JykgfHwgdW5kZWY7CiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzICAgICAgICA9ICRFbGVtZW50Q2hhbmdlZCA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gJUNoYW5nZWRFbGVtZW50czsKCiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwogICAgICAgIG15ICVTdGRGaWVsZFZhbHVlczsKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgICAgIFZpc2liaWxpdHkgPT4ge30sCiAgICAgICAgICAgIEZpZWxkcyAgICAgPT4ge30sCiAgICAgICAgICAgIFNldHMgICAgICAgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHN0YW5kYXJkIGZpZWxkIGlucHV0CiAgICAgICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gKSB7CgogICAgICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICAgICAjIHdoaWNoIHN0YW5kYXJkIGZpZWxkcyB0byBjaGVjayAtIEZpZWxkSUQgPT4gR2V0UGFyYW1WYWx1ZSAobmVjZXNzYXJ5IGZvciBEZXN0KQogICAgICAgICAgICAgICAgbXkgJUNoZWNrID0gKAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISVOZXdDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICAgICAgaWYgKCVDaGFuZ2VkRWxlbWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZXMgYW5kIHZpc2liaWxpdHkgb2YgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgICAgICVDdXJGaWVsZFN0YXRlcyA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+R2V0RmllbGRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0T2JqZWN0ICAgICAgICAgICAgICA9PiAkVGlja2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJFNlbGYtPntEeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPT4gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkU2VsZWN0ZWQgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlSUQgPT4gJEdldFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjb21iaW5lIEZpZWxkU3RhdGVzCiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tTZXRzfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7U2V0c30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7U2V0c30gfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIyBzdG9yZSBuZXcgdmFsdWVzCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGR5bmFtaWMgZmllbGRzIGNoYW5nZWQsIGNoZWNrIHN0YW5kYXJkIGZpZWxkcyBhZ2FpbgogICAgICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMDsKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle0ZpZWxkc30gPSAxOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCB0aGUgQUpBWCByZXR1cm4gZm9yIHRoZSBkeW5hbWljIGZpZWxkcwogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkQUpBWFJldHVybigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlncyA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgRHluRmllbGRTdGF0ZXMgICAgICA9PiBcJUR5bkZpZWxkU3RhdGVzLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgQUpBWCByZXR1cm4gZm9yIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSBAU3RkRmllbGRBSkFYOwogICAgICAgIG15ICVBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAlRGl2ZXJzaXR5ID0gcmV2ZXJzZSAlVW5pZm9ybWl0eTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVTdGRGaWVsZFZhbHVlcyApIHsKICAgICAgICAgICAgcHVzaCBAU3RkRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICREaXZlcnNpdHl7JEZpZWxkfSB8fCAkRmllbGQsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3skRmllbGR9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17JEZpZWxkfSwKICAgICAgICAgICAgICAgICV7ICRBdHRyaWJ1dGVzeyRGaWVsZH0gfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICAgICAgQFN0ZEZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgICMgY2FuJ3QgdXNlIEpTT05SZXBseSBoZXJlLCBhcyB3ZSBhbHJlYWR5IGhhdmUgSlNPTgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN0ZCBhdHRhY2htZW50IG9iamVjdAogICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgIyBoYW5kbGUgcmVzcG9uc2UgdGVtcGxhdGUgYXR0YWNobWVudHMgYW5kIHN0YXRlCiAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVzcG9uc2VJRH0gKSB7CgogICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIGVtYWlsCiAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1Jlc3BvbnNlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudEdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcmVzcG9uc2UgcHJlc2VsZWN0ZWQgc3RhdGUKICAgICAgICAgICAgbXkgJVJlc3BvbnNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKS0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtSZXNwb25zZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte1N0YXRlSUR9IHx8PSAkUmVzcG9uc2V7UHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUgb3Igc2VsZWN0ZWQgYXJ0aWNsZQogICAgICAgIG15IEBBcnRpY2xlTGlzdDsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKCiAgICAgICAgICAgIEBBcnRpY2xlTGlzdCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICBAQXJ0aWNsZUxpc3QgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICBPbmx5TGFzdCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJURhdGE7CgogICAgICAgIEFSVElDTEVNRVRBREFUQToKICAgICAgICBmb3IgbXkgJEFydGljbGVNZXRhRGF0YSAoQEFydGljbGVMaXN0KSB7CgogICAgICAgICAgICBuZXh0IEFSVElDTEVNRVRBREFUQSBpZiAhJEFydGljbGVNZXRhRGF0YTsKICAgICAgICAgICAgbmV4dCBBUlRJQ0xFTUVUQURBVEEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcnRpY2xlTWV0YURhdGEpOwoKICAgICAgICAgICAgbXkgJEN1cnJlbnRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXskQXJ0aWNsZU1ldGFEYXRhfSApOwoKICAgICAgICAgICAgJURhdGEgPSAkQ3VycmVudEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlTWV0YURhdGEtPntBcnRpY2xlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJERhdGF7Q29tbXVuaWNhdGlvbkNoYW5uZWxOYW1lfSA9ICRDdXJyZW50QXJ0aWNsZUJhY2tlbmRPYmplY3QtPkNoYW5uZWxOYW1lR2V0KCk7CgogICAgICAgICAgICBsYXN0IEFSVElDTEVNRVRBREFUQTsKICAgICAgICB9CgogICAgICAgICMgTWVyZ2UgdGlja2V0IGRhdGEgd2l0aCBhcnRpY2xlIGRhdGEsIHNlZSBidWcjMTM5OTUgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM5OTUpLgogICAgICAgICVEYXRhID0gKCAlVGlja2V0LCAlRGF0YSApOwoKICAgICAgICAjIElmIGFydGljbGUgaXMgbm90IGEgTUlNRUJhc2UgYXJ0aWNsZSwgZ2V0IGN1c3RvbWVyIHJlY2lwaWVudHMgZnJvbSB0aGUgYmFja2VuZC4KICAgICAgICBpZiAoICEkRGF0YXtUb30gJiYgISREYXRhe0Zyb219ICkgewogICAgICAgICAgICBteSBAQ3VzdG9tZXJVc2VySURzID0gJExheW91dE9iamVjdC0+QXJ0aWNsZUN1c3RvbWVyUmVjaXBpZW50c0dldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkRGF0YXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgICAgICAgICBteSBAQ3VzdG9tZXJSZWNpcGllbnRzOwoKICAgICAgICAgICAgQ1VTVE9NRVJfVVNFUl9JRDoKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJJRCAoQEN1c3RvbWVyVXNlcklEcykgewogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IENVU1RPTUVSX1VTRVJfSUQgaWYgISVDdXN0b21lcjsKCiAgICAgICAgICAgICAgICBwdXNoIEBDdXN0b21lclJlY2lwaWVudHMsICJcIiRDdXN0b21lcntVc2VyRmlyc3RuYW1lfSAkQ3VzdG9tZXJ7VXNlckxhc3RuYW1lfVwiIDwkQ3VzdG9tZXJ7VXNlckVtYWlsfT4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRGF0YXtUb30gPSBqb2luKCAnLCcsIEBDdXN0b21lclJlY2lwaWVudHMgKSAvLyAnJzsKCiAgICAgICAgICAgICMgSW5jbHVkZSBzZW5kZXIgbmFtZSBpbiAnRnJvbScgZmllbGQgZm9yIGNvcnJlY3QgcXVvdGluZy4KICAgICAgICAgICAgbXkgJUFydGljbGVGaWVsZHMgPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlRmllbGRzKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICREYXRhe0Zyb219ID0gJEFydGljbGVGaWVsZHN7U2VuZGVyfS0+e1ZhbHVlfSAvLyAnJzsKICAgICAgICB9CgogICAgICAgICMgc2V0IE9yaWdGcm9tIGZvciBjb3JyZWN0IGVtYWlsIHF1b3RpbmcgKHh4eHggd3JvdGUpCiAgICAgICAgJERhdGF7T3JpZ0Zyb219ID0gJERhdGF7RnJvbX07CgogICAgICAgICMgY2hlY2sgYXJ0aWNsZSB0eXBlIGFuZCByZXBsYWNlIFRvIHdpdGggRnJvbSAoaW4gY2FzZSkKICAgICAgICBpZiAoICREYXRhe1NlbmRlclR5cGV9ICF+IC9jdXN0b21lci8gKSB7CgogICAgICAgICAgICAjIHJlcGxhY2UgRnJvbS9UbywgVG8vRnJvbSBiZWNhdXNlIHNlbmRlciBpcyBhZ2VudAogICAgICAgICAgICBteSAkVG8gPSAkRGF0YXtUb307CiAgICAgICAgICAgICREYXRhe1RvfSAgID0gJERhdGF7RnJvbX07CiAgICAgICAgICAgICREYXRhe0Zyb219ID0gJFRvOwoKICAgICAgICAgICAgJERhdGF7UmVwbHlUb30gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgT3JpZ0Zyb21OYW1lICh0byBvbmx5IHVzZSB0aGUgcmVhbG5hbWUpCiAgICAgICAgJERhdGF7T3JpZ0Zyb21OYW1lfSA9ICREYXRhe09yaWdGcm9tfTsKICAgICAgICAkRGF0YXtPcmlnRnJvbU5hbWV9ID1+IHMvPC4qPnxcKC4qXCl8XCJ8O3wsLy9nOwogICAgICAgICREYXRhe09yaWdGcm9tTmFtZX0gPX4gcy8oICQpfCggICQpLy9nOwoKICAgICAgICAjIEZhbGxiYWNrIHRvIE9yaWdGcm9tIGlmIHJlYWxuYW1lIHBhcnQgaXMgZW1wdHkuCiAgICAgICAgaWYgKCAhJERhdGF7T3JpZ0Zyb21OYW1lfSApIHsKICAgICAgICAgICAgJERhdGF7T3JpZ0Zyb21OYW1lfSA9ICREYXRhe09yaWdGcm9tfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEKICAgICAgICBteSAlQ3VzdG9tZXI7CiAgICAgICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJUN1c3RvbWVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJ0aWNsZSB0byBxdW90ZQogICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+QXJ0aWNsZVF1b3RlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBVcGxvYWRDYWNoZU9iamVjdCA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNhZmV0eUNoZWNrUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtCb2R5fSwKCiAgICAgICAgICAgICMgU3RyaXAgb3V0IGV4dGVybmFsIGNvbnRlbnQgaWYgQmxvY2tMb2FkaW5nUmVtb3RlQ29udGVudCBpcyBlbmFibGVkLgogICAgICAgICAgICBOb0V4dFNyY0xvYWQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCbG9ja0xvYWRpbmdSZW1vdGVDb250ZW50JyksCgogICAgICAgICAgICAjIERpc2FsbG93IHBvdGVudGlhbGx5IHVuc2FmZSBjb250ZW50LgogICAgICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICAgICAgTm9PYmplY3QgICAgID0+IDEsCiAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICBOb1NWRyAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm9KYXZhU2NyaXB0ID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtCb2R5fSA9ICRTYWZldHlDaGVja1Jlc3VsdHtTdHJpbmd9OwoKICAgICAgICAjIHJlc3RyaWN0IG51bWJlciBvZiBib2R5IGxpbmVzIGlmIGNvbmZpZ3VyZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICREYXRhe0JvZHl9CiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VRdW90ZU1heExpbmVzJykKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJE1heExpbmVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpSZXNwb25zZVF1b3RlTWF4TGluZXMnKTsKCiAgICAgICAgICAgICMgc3BsaXQgYm9keSAtIG9uZSBlbGVtZW50IHBlciBsaW5lCiAgICAgICAgICAgIG15IEBCb2R5ID0gc3BsaXQgL1xuLywgJERhdGF7Qm9keX07CgogICAgICAgICAgICAjIG9ubHkgbW9kaWZ5IGlmIGJvZHkgaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZAogICAgICAgICAgICBpZiAoIHNjYWxhciBAQm9keSA+ICRNYXhMaW5lcyApIHsKCiAgICAgICAgICAgICAgICAjIHNwbGljZSB0byBtYXguIGFsbG93ZWQgbGluZXMgYW5kIHJlYXNzZW1ibGUKICAgICAgICAgICAgICAgIEBCb2R5ICAgICAgID0gQEJvZHlbIDAgLi4gKCAkTWF4TGluZXMgLSAxICkgXTsKICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gam9pbiAiXG4iLCBAQm9keTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSBib2R5LCBzdWJqZWN0LCBSZXBseVRvCiAgICAgICAgICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICAgICAgICAgIGlmICggJERhdGF7Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9fiBzL1x0LyAvZzsKICAgICAgICAgICAgICAgIG15ICRRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpRdW90ZScpIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRRdW90ZSkgewoKICAgICAgICAgICAgICAgICAgICAjIHF1b3RlIHRleHQKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICI8YmxvY2txdW90ZSB0eXBlPVwiY2l0ZVwiPiREYXRhe0JvZHl9PC9ibG9ja3F1b3RlPlxuIjsKCiAgICAgICAgICAgICAgICAgICAgIyBjbGVhbnVwIG5vbi1jb21wYXRpYmxlIHRhZ3MKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICI8YnIvPiIgLiAkRGF0YXtCb2R5fTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RhdGUnKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiAkRGF0YXtDcmVhdGVUaW1lfTxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yIChxdyhTdWJqZWN0IFJlcGx5VG8gUmVwbHktVG8gQ2MgVG8gRnJvbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskX30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkXykgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICREYXRheyRffTxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkRnJvbSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RnJvbX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2VGcm9tID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNZXNzYWdlIGZyb20nKTsKICAgICAgICAgICAgICAgICAgICBteSAkRW5kTWVzc2FnZSAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0VuZCBtZXNzYWdlJyk7CgogICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIjxici8+LS0tLSAkTWVzc2FnZUZyb20gJEZyb20gLS0tPGJyLz48YnIvPiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSAuPSAiPGJyLz4tLS0tICRFbmRNZXNzYWdlIC0tLTxici8+IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSBib2R5LCBzdWJqZWN0LCBSZXBseVRvCiAgICAgICAgICAgICMgcmUtd3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgICAgICBpZiAoICREYXRhe0JvZHl9ICkgewogICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPX4gcy9cdC8gL2c7CiAgICAgICAgICAgICAgICBteSAkUXVvdGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJyk7CiAgICAgICAgICAgICAgICBpZiAoJFF1b3RlKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPX4gcy9cbi9cbiRRdW90ZSAvZzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbiRRdW90ZSAiIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRhe0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICREYXRhe0NyZWF0ZVRpbWV9XG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmb3IgKHF3KFN1YmplY3QgUmVwbHlUbyBSZXBseS1UbyBDYyBUbyBGcm9tKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogJERhdGF7JF99XG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlRnJvbSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWVzc2FnZSBmcm9tJyk7CiAgICAgICAgICAgICAgICAgICAgbXkgJEVuZE1lc3NhZ2UgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdFbmQgbWVzc2FnZScpOwoKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbi0tLS0gJE1lc3NhZ2VGcm9tICREYXRhe0Zyb219IC0tLVxuXG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gLj0gIlxuLS0tLSAkRW5kTWVzc2FnZSAtLS1cbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHN5c3RlbSBhZGRyZXNzIG9iamVjdAogICAgICAgIG15ICRTeXN0ZW1BZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKCiAgICAgICAgIyBhZGQgbm90IGxvY2FsIFRvIGFkZHJlc3NlcyB0byBDYwogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRhe1RvfSApICkgewogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRTeXN0ZW1BZGRyZXNzLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCwKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJElzTG9jYWwgKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRhe0NjfSApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtDY30gLj0gJywgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRhe0NjfSAuPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5Gb3JtYXQoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgUmVwbHlUbwogICAgICAgIGlmICggJERhdGF7UmVwbHlUb30gKSB7CiAgICAgICAgICAgICREYXRhe1RvfSA9ICREYXRhe1JlcGx5VG99OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7VG99ID0gJERhdGF7RnJvbX07CgogICAgICAgICAgICAjIHRyeSB0byByZW1vdmUgc29tZSB3cm9uZyB0ZXh0IHRvIGZyb20gbGluZSAoYnkgd2F5IG9mIC4uLikKICAgICAgICAgICAgIyBhZGRlZCBieSBzb21lIHN0cmFuZ2UgbWFpbCBwcm9ncmFtcyBvbiBib3VuY2UKICAgICAgICAgICAgJERhdGF7VG99ID1+IHMvKC4rP1w8Lis/XEAuKz9cPilccytcKGJ5XHMrd2F5XHMrb2ZccysuKz9cKS8kMS9pZzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRvIGVtYWlsIChqdXN0ICJzb21lQGV4YW1wbGUuY29tIikKICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkRGF0YXtUb30gKSApIHsKICAgICAgICAgICAgJERhdGF7VG9FbWFpbH0gPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwogICAgICAgIH0KCiAgICAgICAgIyBvbmx5IHJlcGx5IHRvIHNlbmRlcgogICAgICAgIGlmICggISRHZXRQYXJhbXtSZXBseUFsbH0gKSB7CiAgICAgICAgICAgICREYXRhe0NjfSAgPSAnJzsKICAgICAgICAgICAgJERhdGF7QmNjfSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyB1c2UgY3VzdG9tZXIgZGF0YWJhc2UgZW1haWwKICAgICAgICAjIGRvIG5vdCBhZGQgY3VzdG9tZXIgZW1haWwgdG8gY2MsIGlmIGFydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXIKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q29tcG9zZUFkZEN1c3RvbWVyQWRkcmVzcycpCiAgICAgICAgICAgICYmICREYXRhe0lzVmlzaWJsZUZvckN1c3RvbWVyfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGNoZWNrIGlmIGN1c3RvbWVyIGlzIGluIHJlY2lwaWVudCBsaXN0CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVye1VzZXJFbWFpbH0gJiYgJERhdGF7VG9FbWFpbH0gIX4gL15cUSRDdXN0b21lcntVc2VyRW1haWx9XEUkL2kgKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtTZW5kZXJUeXBlfSBlcSAnYWdlbnQnICYmICEkRGF0YXtJc1Zpc2libGVGb3JDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtUb30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVye1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtUb30gPSAkQ3VzdG9tZXJ7VXNlckVtYWlsfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIFRvIHdpdGggY3VzdG9tZXJzIGRhdGFiYXNlIGFkZHJlc3MKICAgICAgICAgICAgICAgIGVsc2lmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDb21wb3NlUmVwbGFjZVNlbmRlckFkZHJlc3MnKSApIHsKCiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkZHJlc3MgJXMgcmVwbGFjZWQgd2l0aCByZWdpc3RlcmVkIGN1c3RvbWVyIGFkZHJlc3MuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1RvRW1haWx9LAogICAgICAgICAgICAgICAgICAgICAgICApLAoKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICREYXRhe1RvfSA9ICRDdXN0b21lcntVc2VyRW1haWx9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYWRkIGN1c3RvbWVycyBkYXRhYmFzZSBhZGRyZXNzIHRvIENjCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiBUcmFuc2xhdGFibGUoIkN1c3RvbWVyIHVzZXIgYXV0b21hdGljYWxseSBhZGRlZCBpbiBDYy4iKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7Q2N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtDY30gLj0gJywgJyAuICRDdXN0b21lcntVc2VyRW1haWx9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Q2N9ID0gJEN1c3RvbWVye1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGZpbmQgZHVwbGljYXRlIGFkZHJlc3NlcwogICAgICAgIG15ICVSZWNpcGllbnQ7CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JFR5cGV9ICkgewogICAgICAgICAgICAgICAgbXkgJE5ld0xpbmUgPSAnJzsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRheyRUeXBlfSApICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBZGRyZXNzID0gbGMgJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBvbmx5IHVzZSBlbWFpbCBhZGRyZXNzZXMgd2l0aCBAIGluc2lkZQogICAgICAgICAgICAgICAgICAgIGlmICggJEFkZHJlc3MgJiYgJEFkZHJlc3MgPX4gL0AvICYmICEkUmVjaXBpZW50eyRBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJlY2lwaWVudHskQWRkcmVzc30gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRTeXN0ZW1BZGRyZXNzLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJElzTG9jYWwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE5ld0xpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3TGluZSAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0xpbmUgLj0gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJERhdGF7JFR5cGV9ID0gJE5ld0xpbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRlbXBsYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICMgdXNlIGtleSBTdGRSZXNwb25zZSB0byBwYXNzIHRoZSBkYXRhIHRvIHRoZSB0ZW1wbGF0ZSBmb3IgbGVnYWN5IHJlYXNvbnMsCiAgICAgICAgIyAgIGJlY2F1c2UgZXhpc3Rpbmcgc3lzdGVtcyBtYXkgaGF2ZSBpdCBpbiB0aGVpciBjb25maWd1cmF0aW9uIGFzIHRoYXQgd2FzCiAgICAgICAgIyAgIHRoZSBrZXkgdXNlZCBiZWZvcmUgdGhlIGludGVybmFsIHN3aXRjaCB0byBTdGFuZGFyZFJlc3BvbnNlIEFuZCBTdGFuZGFyZFRlbXBsYXRlCgogICAgICAgICREYXRhe1N0ZFJlc3BvbnNlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1Jlc3BvbnNlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2FsdXRhdGlvbgogICAgICAgICREYXRhe1NhbHV0YXRpb259ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TYWx1dGF0aW9uKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2lnbmF0dXJlCiAgICAgICAgJERhdGF7U2lnbmF0dXJlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyAkVGVtcGxhdGVHZW5lcmF0b3ItPkF0dHJpYnV0ZXMoKSBkb2VzIG5vdCBvdmVyd3JpdGUgJURhdGEsIGJ1dCBpdCBhZGRzIG1vcmUga2V5cwogICAgICAgICVEYXRhID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5BdHRyaWJ1dGVzKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVzcG9uc2VGb3JtYXQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlRm9ybWF0Jyk7CgogICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgbXkgJURhdGFIVE1MID0gJURhdGE7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgaWYgKCRSZXNwb25zZUZvcm1hdCkgewogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZXNwb25zZUZvcm1hdCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZXN0b3JlIGRhdGEgZm9ybWF0dGluZyBmb3IgT3V0cHV0IHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQgPX4gcy8mcXVvdDsvIi9naTsKCiAgICAgICAgICAgICAgICAjIGh0bWwgcXVvdGUgdG8gaGF2ZSBpdCBjb3JyZWN0IGluIGVkaXQgYXJlYQogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRSZXNwb25zZUZvcm1hdCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZXN0b3JlIGRhdGEgZm9ybWF0dGluZyBmb3IgT3V0cHV0IHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQgPX4gcy8mcXVvdDsvIi9naTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBxdW90ZSBhbGwgbm9uIGh0bWwgY29udGVudCB0byBoYXZlIGl0IGNvcnJlY3QgaW4gZWRpdCBhcmVhCiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJURhdGFIVE1MICkgewogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISREYXRhSFRNTHskS2V5fTsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1NhbHV0YXRpb24nOwogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQm9keSc7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdTdGRSZXNwb25zZSc7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdTaWduYXR1cmUnOwogICAgICAgICAgICAgICAgJERhdGFIVE1MeyRLZXl9ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhSFRNTHskS2V5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV3IHJlc3BvbnNlIGZvcm1hdCBiYXNlZCBvbiB0ZW1wbGF0ZQogICAgICAgICREYXRhe1Jlc3BvbnNlRm9ybWF0fSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFJlc3BvbnNlRm9ybWF0LAogICAgICAgICAgICBEYXRhICAgICA9PiB7ICVQYXJhbSwgJURhdGFIVE1MIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISREYXRheyRMaW5lfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJERhdGF7JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAiSW52YWxpZCIgfSA9ICIgU2VydmVyRXJyb3IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJERhdGF7RnJvbX0gKSB7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRhe0Zyb219ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRnJvbUludmFsaWQifSAuPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdmFsdWVzIGZvciBUaWNrZXQgZmllbGRzIGFuZCB1c2UgZGVmYXVsdCB2YWx1ZSBmb3IgQXJ0aWNsZSBmaWVsZHMsIGlmIGdpdmVuLgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIFRoaXMgb3ZlcndyaXRlcyB0aGUgdmFsdWVzIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIHdlYiByZXF1ZXN0LgogICAgICAgICAgICAjIE5vdGUgdGhhdCB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IHZhbHVlcyBmcm9tIHRoZSB3ZWIgcmVxdWVzdCwKICAgICAgICAgICAgIyBiZWNhdXNlIHN1Ym1pdHMsIHN1Y2Nlc3NmdWwgYW5kIHVuc3VjY2Vzc2Z1bCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5IGFib3ZlLgogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKCiAgICAgICAgICAgICAgICAjIFZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgZnJvbSBUaWNrZXQuCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRBdXRvc2VsZWN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkF1dG9zZWxlY3QnKSB8fCB1bmRlZjsKCiAgICAgICAgIyBnYXRoZXIgZmllbGRzIHdoaWNoIGFyZSBzdXBwb3NlZCB0byBiZSBoaWRkZW4gd2hlbiBhdXRvLXNlbGVjdGVkCiAgICAgICAgbXkgJEhpZGVBdXRvc2VsZWN0ZWRKU09OOwogICAgICAgIGlmICgkQXV0b3NlbGVjdCkgewogICAgICAgICAgICBteSBASGlkZUF1dG9zZWxlY3RlZCA9IGdyZXAgeyAhcmVmKCAkQXV0b3NlbGVjdC0+eyRffSApICYmICRBdXRvc2VsZWN0LT57JF99ID09IDIgfSBrZXlzICV7JEF1dG9zZWxlY3R9OwogICAgICAgICAgICBpZiAoICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEhpZGVBdXRvc2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgbWFwIHsgIkR5bmFtaWNGaWVsZF8iIC4gJF8gfQogICAgICAgICAgICAgICAgICAgICggZ3JlcCB7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfXskX30gPT0gMiB9IGtleXMgJXsgJEF1dG9zZWxlY3QtPntEeW5hbWljRmllbGR9IH0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEBIaWRlQXV0b3NlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICBteSAkSlNPTk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CiAgICAgICAgICAgICAgICAkSGlkZUF1dG9zZWxlY3RlZEpTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICAgICAgU2V0cyAgICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgICAgICMgaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGZvciBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBpZiAoICRDb25maWctPntTdGF0ZURlZmF1bHR9ICkgewoKICAgICAgICAgICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkR2V0UGFyYW17U3RhdGVJRH0gLy89IHsgcmV2ZXJzZSAkTmV4dFN0YXRlcy0+JSogfS0+eyAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9ICkgewoKICAgICAgICAgICAgJEdldFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSAvLz0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICAgICAgfQoKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSApIHsKCiAgICAgICAgICAgICAgICBteSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwoKICAgICAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlSUQgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRBQ0xQcmVzZWxlY3Rpb24gJiYgISRJbml0aWFsUnVuICkgewogICAgICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRGaWVsZElEIG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyRGaWVsZElEfSAmJiAkQ2hhbmdlZEVsZW1lbnRzeyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggc29ydCBrZXlzICVDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbi0+e1J1bGVzfXtUaWNrZXR9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEVsZW1lbnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEVsZW1lbnQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJENoZWNreyRGaWVsZElEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgICAgICAgICAgTUVUSE9EOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgTUVUSE9EIHVubGVzcyAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH07CgogICAgICAgICAgICAgICAgICAgICMgdXNlICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSBmb3IgRGVzdD0+UXVldWVJRAogICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZWN0ZWQgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IGluY2x1ZGVkIGZvciBtb3JlIHNpbWlsYXJpdHkgdG8gQWdlbnRUaWNrZXRQaG9uZSBldGMuOwogICAgICAgICAgICAgICAgICAgIGlmICggJEZpZWxkLT57RmllbGRJRH0gZXEgJ0Rlc3QnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH0gPSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH07CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gJiYgISRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXsgJEdldFBhcmFte1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICAgICAgICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJU5ld0NoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gJU5ld0NoYW5nZWRFbGVtZW50czsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCwKICAgICAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRMb29wUHJvdGVjdGlvbi0tIDwgMSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJhbiBpbnRvIHVucmVzb2x2YWJsZSBsb29wISIsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoICVDaGFuZ2VkRWxlbWVudHMgfHwgJEluaXRpYWxSdW4gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAlQ3VyRmllbGRTdGF0ZXMgPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkdldEZpZWxkU3RhdGVzKAogICAgICAgICAgICAgICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIENoYW5nZWRFbGVtZW50cyAgICAgICAgICAgPT4gXCVDaGFuZ2VkRWxlbWVudHMsICAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VyfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiAkR2V0UGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQXV0b3NlbGVjdCAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICAgICAgICAgIEFDTFByZXNlbGVjdGlvbiA9PiAkQUNMUHJlc2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIExvb3BQcm90ZWN0aW9uICA9PiBcJExvb3BQcm90ZWN0aW9uLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNvbWJpbmUgRmllbGRTdGF0ZXMKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1NldHN9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tTZXRzfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tTZXRzfSB9LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgZHluYW1pYyBmaWVsZHMgY2hhbmdlZCwgY2hlY2sgc3RhbmRhcmQgZmllbGRzIGFnYWluCiAgICAgICAgICAgIGlmICggJUN1ckZpZWxkU3RhdGVzICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSApICkgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAwOwogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9IG1hcCB7ICRfID0+IDEgfSBrZXlzICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7RmllbGRzfSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRJbml0aWFsUnVuID0gMDsKICAgICAgICB9CgogICAgICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcyA9IG1hcCB7CiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRfID0+IGRlZmluZWQgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99CiAgICAgICAgICAgICAgICA/ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRffXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgIDogdW5kZWYKICAgICAgICB9ICgga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICk7CgogICAgICAgICMgYnVpbGQgcmVmZXJlbmNlcyBpZiBleGlzdAogICAgICAgIG15ICRSZWZlcmVuY2VzID0gKCAkRGF0YXtNZXNzYWdlSUR9IHx8ICcnICkgLiAoICREYXRhe1JlZmVyZW5jZXN9IHx8ICcnICk7CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIHVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFRpY2tldHtRdWV1ZUlEfTsKCiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30gKTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgJE5ld1BhcmFtcyA9ICRPYmplY3QtPlJ1biggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICBpZiAoJE5ld1BhcmFtcykgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkTmV3UGFyYW1zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgICAgICVFcnJvciA9ICgKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHZpZXcKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIEF0dGFjaG1lbnRzICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgUmVzcG9uc2VJRCAgICAgICAgICA9PiAkR2V0UGFyYW17UmVzcG9uc2VJRH0sCiAgICAgICAgICAgIFJlcGx5QXJ0aWNsZUlEICAgICAgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICBJblJlcGx5VG8gICAgICAgID0+ICREYXRhe01lc3NhZ2VJRH0sCiAgICAgICAgICAgIFJlZmVyZW5jZXMgICAgICAgPT4gIiRSZWZlcmVuY2VzIiwKICAgICAgICAgICAgVGlja2V0QmFja1R5cGUgICA9PiAkVGlja2V0QmFja1R5cGUsCiAgICAgICAgICAgIERGUG9zc2libGVWYWx1ZXMgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgRHluYW1pY0ZpZWxkICAgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgTmV4dFN0YXRlICAgICAgICA9PiAkR2V0UGFyYW17U3RhdGVJRH0gPyAkU3RkRmllbGRWYWx1ZXN7TmV4dFN0YXRlSUR9eyAkR2V0UGFyYW17U3RhdGVJRH0gfSA6ICcnLAogICAgICAgICAgICBIaWRlQXV0b3NlbGVjdGVkID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5leHQgc3RhdGVzCiAgICBteSAlTmV4dFN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgIGlmICggJFBhcmFte0hpZGVBdXRvc2VsZWN0ZWR9ICkgewoKICAgICAgICAjIGFkZCBBdXRvc2VsZWN0IEpTCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNPbkRvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgIENvZGUgPT4gIkNvcmUuRm9ybS5Jbml0SGlkZUF1dG9zZWxlY3RlZCh7IEZpZWxkSURzOiAkUGFyYW17SGlkZUF1dG9zZWxlY3RlZH0gfSk7IiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAlU3RhdGU7CiAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntTdGF0ZUlEfSApIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17R2V0UGFyYW19LT57U3RhdGVJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRWYWx1ZX0gLy89ICRDb25maWctPntTdGF0ZURlZmF1bHR9OwogICAgfQogICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAlU3RhdGUsCiAgICAgICAgJVBhcmFtLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICk7CgogICAgbXkgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnR9ICkgewogICAgICAgICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRQYXJhbXtHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lcn0gPyAxIDogMDsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJc1Zpc2libGVGb3JDdXN0b21lcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRJc1Zpc2libGVGb3JDdXN0b21lciwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskRXJyb3J9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskRXJyb3J9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB1c2VkIGNhbGVuZGFyCiAgICBteSAkQ2FsZW5kYXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldENhbGVuZGFyR2V0KAogICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgIFNMQUlEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICk7CgogICAgbXkgJFF1aWNrRGF0ZUJ1dHRvbnMgPSAkQ29uZmlnLT57UXVpY2tEYXRlQnV0dG9uc30gLy8gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEZWZhdWx0UXVpY2tEYXRlQnV0dG9ucycpOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgID0+IDAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgPT4gNSwKICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgIENhbGVuZGFyICAgICAgICAgICAgID0+ICRDYWxlbmRhciwKICAgICAgICBRdWlja0RhdGVCdXR0b25zICAgICA9PiAkUXVpY2tEYXRlQnV0dG9ucywKICAgICk7CgogICAgIyBNdWx0aXBsZS1BdXRvY29tcGxldGUKICAgICRQYXJhbXtUb30gPSAoIHNjYWxhciBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSA/ICcnIDogJFBhcmFte1RvfSApOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUb30gJiYgJFBhcmFte1RvfSBuZSAnJyApIHsKICAgICAgICAkUGFyYW17VG9JbnZhbGlkfSA9ICcnOwogICAgfQoKICAgICRQYXJhbXtDY30gPSAoIHNjYWxhciBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSB9ID8gJycgOiAkUGFyYW17Q2N9ICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0NjfSAmJiAkUGFyYW17Q2N9IG5lICcnICkgewogICAgICAgICRQYXJhbXtDY0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgIyBDYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjLAogICAgICAgIH0sCiAgICApOwoKICAgICMgQmNjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckJjYyApIHsKICAgICAgICAkUGFyYW17QmNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckJjYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgVG8KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlciwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtUb0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgIyBzZXQgcHJlc2VsZWN0ZWQgdmFsdWVzIGZvciBDYyBmaWVsZAogICAgaWYgKCAkUGFyYW17Q2N9ICYmICRQYXJhbXtDY30gbmUgJycgJiYgISRDdXN0b21lckNvdW50ZXJDYyApIHsKCiAgICAgICAgIyBzcGxpdCBDYyB2YWx1ZXMKICAgICAgICBteSBARW1haWxBZGRyZXNzZXNDYzsKICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkUGFyYW17Q2N9ICkgKSB7CgogICAgICAgICAgICBteSAlQ3VzdG9tZXJTZWFyY2ggPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ3VzdG9tZXJTZWFyY2ggaGFzaCBjb3VsZCBoYXZlIG9uZSBpdGVtIGZyb20gZWFjaCBiYWNrZW5kLCBzbyBpbnNlcnQganVzdCB0aGUgZmlyc3Qgb25lLgogICAgICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoKSB7CiAgICAgICAgICAgICAgICBDVVNUT01FUlVTRVJJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVyU2VhcmNoICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzQ2MsIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICAgID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRDdXN0b21lclNlYXJjaHskQ3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgbGFzdCBDVVNUT01FUlVTRVJJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzQ2MsIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkZvcm1hdCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VtYWlsQWRkcmVzc2VzQ2MnLAogICAgICAgICAgICBWYWx1ZSA9PiBcQEVtYWlsQWRkcmVzc2VzQ2MsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0NjfSA9ICcnOwogICAgfQoKICAgICMgc2V0IHByZXNlbGVjdGVkIHZhbHVlcyBmb3IgVG8gZmllbGQKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VG99ICYmICRQYXJhbXtUb30gbmUgJycgJiYgISRDdXN0b21lckNvdW50ZXIgKSB7CgogICAgICAgICMgc3BsaXQgVG8gdmFsdWVzCiAgICAgICAgbXkgQEVtYWlsQWRkcmVzc2VzVG87CiAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJFBhcmFte1RvfSApICkgewoKICAgICAgICAgICAgbXkgJUN1c3RvbWVyU2VhcmNoID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEN1c3RvbWVyU2VhcmNoIGhhc2ggY291bGQgaGF2ZSBvbmUgaXRlbSBmcm9tIGVhY2ggYmFja2VuZCwgc28gaW5zZXJ0IGp1c3QgdGhlIGZpcnN0IG9uZS4KICAgICAgICAgICAgaWYgKCVDdXN0b21lclNlYXJjaCkgewogICAgICAgICAgICAgICAgQ1VTVE9NRVJVU0VSSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICggc29ydCBrZXlzICVDdXN0b21lclNlYXJjaCApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFbWFpbEFkZHJlc3Nlc1RvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkQ3VzdG9tZXJTZWFyY2h7JEN1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGxhc3QgQ1VTVE9NRVJVU0VSSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoIEBFbWFpbEFkZHJlc3Nlc1RvLCB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkRW1haWxBZGRyZXNzT2JqZWN0LT5Gb3JtYXQoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdFbWFpbEFkZHJlc3Nlc1RvJywKICAgICAgICAgICAgVmFsdWUgPT4gXEBFbWFpbEFkZHJlc3Nlc1RvLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtUb30gPSAnJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtUaWNrZXRCYWNrVHlwZX0sCiAgICAgICAgRGF0YSA9PiB7CgogICAgICAgICAgICAjICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICB7CiAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkR5bmFtaWNGaWVsZDo6TWFzaycpLT5FZGl0U2VjdGlvblJlbmRlcigKICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgPT4gJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gJFBhcmFte1Zpc2liaWxpdHl9LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgICAgIER5bmFtaWNGaWVsZFZhbHVlcyAgID0+ICRQYXJhbXtEeW5hbWljRmllbGR9LAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUGFyYW17REZQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkfS0+JSosCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICB9CgogICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICcnOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IHRoZSBjdXN0b21lciB1c2VyIGFkZHJlc3MgYm9vayBpZiB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRDdXN0b21lclVzZXJBZGRyZXNzQm9va30gKSB7CiAgICAgICAgJFBhcmFte09wdGlvbkN1c3RvbWVyVXNlckFkZHJlc3NCb29rfSA9IDE7CiAgICB9CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICB9CgogICAgbXkgJExvYWRlZEZvcm1EcmFmdDsKICAgIGlmICggJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgJExvYWRlZEZvcm1EcmFmdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0R2V0KAogICAgICAgICAgICBGb3JtRHJhZnRJRCA9PiAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSwKICAgICAgICAgICAgT2JqZWN0SUQgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEdldENvbnRlbnQgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFydGljbGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIE9ubHlMYXN0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKEBBcnRpY2xlcykgewogICAgICAgICAgICBteSAkTGFzdEFydGljbGUgPSAkQXJ0aWNsZXNbMF07CgogICAgICAgICAgICBteSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lOwogICAgICAgICAgICBpZiAoICRMYXN0QXJ0aWNsZS0+e0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlU3lzdGVtVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRMYXN0QXJ0aWNsZS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RBcnRpY2xlU3lzdGVtVGltZSA9ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWVPYmplY3QtPlRvRXBvY2goKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdFN5c3RlbVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRm9ybURyYWZ0U3lzdGVtVGltZSA9ICRGb3JtRHJhZnRTeXN0ZW1UaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CgogICAgICAgICAgICBpZiAoICEkTGFzdEFydGljbGVTeXN0ZW1UaW1lIHx8ICRGb3JtRHJhZnRTeXN0ZW1UaW1lIDw9ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Rm9ybURyYWZ0T3V0ZGF0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRMb2FkZWRGb3JtRHJhZnQpICkgewoKICAgICAgICAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlQnlOYW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZUJ5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZXhwbGFuYXRvcnkgbWVzc2FnZSBhYm91dCBhc3RlcmlzawogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXN0ZXJpc2tFeHBsYW5hdGlvbicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgRm9ybURyYWZ0ICAgICAgPT4gJENvbmZpZy0+e0Zvcm1EcmFmdH0sCiAgICAgICAgICAgIEZvcm1EcmFmdElEICAgID0+ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9LAogICAgICAgICAgICBGb3JtRHJhZnRUaXRsZSA9PiAkTG9hZGVkRm9ybURyYWZ0ID8gJExvYWRlZEZvcm1EcmFmdC0+e1RpdGxlfSA6ICcnLAogICAgICAgICAgICBGb3JtRHJhZnRNZXRhICA9PiAkTG9hZGVkRm9ybURyYWZ0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmail.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBjM2JjNmEyYzA4ZDdiN2I3YzI0YzYwOGMyNWJmNmViNDg5NzcxMDM0IC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSBibGVzcyB7JVBhcmFtfSwgJFR5cGU7CgogICAgIyBmcm9udGVuZCBzcGVjaWZpYyBjb25maWcKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgIG15ICREZWZpbml0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6TWFzaycpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIE1hc2sgPT4gJFNlbGYtPntBY3Rpb259LAogICAgKSB8fCB7fTsKCiAgICAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57TWFza307CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gICA9IHt9OwoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIEkKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHsgJER5bmFtaWNGaWVsZExpc3QgLy8gW10gfSApIHsKICAgICAgICBpZiAoIGV4aXN0cyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSBkZWxldGUgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gLy8ge307CgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJFBhcmFtZXRlcnMtPiUqICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+eyRBdHRyaWJ1dGV9ID0gJFBhcmFtZXRlcnMtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCAkU2VsZi0+e01hc2tEZWZpbml0aW9ufS0+QCosIHsKICAgICAgICAgICAgICAgIERGICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgPyAxIDogMCwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIElJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc30tPiUqICkgewogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX0gPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyREeW5hbWljRmllbGROYW1lfSAvLyB7fTsKCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgIyBtZXRob2RzIHdoaWNoIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICRTZWxmLT57RmllbGRNZXRob2RzfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ0Rlc3QnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFRvcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFVzZXJzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFJlc3BvbnNpYmxlcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0TmV4dFN0YXRlcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRQcmlvcml0aWVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U2VydmljZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU0xBSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFNMQXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTdGFuZGFyZFRlbXBsYXRlcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdUeXBlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFR5cGVzCiAgICAgICAgfSwKICAgIF07CgogICAgIyBkZXBlbmRlbmNpZXMgb2Ygc3RhbmRhcmQgZmllbGRzIHdoaWNoIGFyZSBub3QgZGVmaW5lZCB2aWEgQUNMcwogICAgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9ID0gewogICAgICAgIERlc3QgPT4gewogICAgICAgICAgICBOZXdVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTmV3UmVzcG9uc2libGVJRCAgID0+IDEsCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgU0xBSUQgICAgID0+IDEsCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAxLCAgICAjQ3VzdG9tZXJVc2VyIHVwZGF0ZXMgY2FuIGJlIHN1Ym1pdHRlZCBhcyBFbGVtZW50Q2hhbmdlZDogU2VydmljZUlECiAgICAgICAgfSwKICAgICAgICBDdXN0b21lclVzZXIgPT4gewogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIE93bmVyQWxsID0+IHsKICAgICAgICAgICAgTmV3VXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZXNwb25zaWJsZUFsbCA9PiB7CiAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gMSwKICAgICAgICB9LAogICAgfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAmJiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gIX4gL0FjdGlvbj1BZ2VudFRpY2tldEVtYWlsLyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgIG15ICREZWJ1ZyA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBUbyBDYyBCY2MgVGltZVVuaXRzIFByaW9yaXR5SUQgU3ViamVjdCBCb2R5CiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBPd25lckFsbCBSZXNwb25zaWJsZUFsbCBOZXdSZXNwb25zaWJsZUlEIE5ld1VzZXJJRAogICAgICAgIE5leHRTdGF0ZUlEIFN0YW5kYXJkVGVtcGxhdGVJRCBEZXN0IEFydGljbGVJRCBMaW5rVGlja2V0SUQKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW07CiAgICAkQUNMQ29tcGF0R2V0UGFyYW17T3duZXJJRH0gPSAkR2V0UGFyYW17TmV3VXNlcklEfTsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CgogICAgIyBNdWx0aXBsZUN1c3RvbWVyIFRvLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJUbyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlclRvKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJUbyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudDsKCiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQgJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBNdWx0aXBsZUN1c3RvbWVyIENjLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlckNjICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudENjOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lcktleV8nIC4gJENvdW50ICkgfHwgJyc7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gPSAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gJiYgJEN1c3RvbWVyRXJyb3JDYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQ2MgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4Q2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJDYywgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRDYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgTXVsdGlwbGVDdXN0b21lciBCY2MtZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQmNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJCY2MgKSB7CiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgJENvdW50ID4gMV8wMDA7ICAgICMgYmFpbCBvdXQgd2hlbiB0aGUgbnVtYmVyIG9mIGN1c3RvbWVycyBpcyBhYm5vcm1hbGx5IGhpZ2gKCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKCiAgICAgICAgICAgIG5leHQgQ09VTlQgdW5sZXNzICRDdXN0b21lckVsZW1lbnRCY2M7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JjY30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRDdXN0b21lckVsZW1lbnRCY2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gJiYgJEN1c3RvbWVyRXJyb3JCY2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJCY2MsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0JjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRCY2MsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYW4gZW1wdHkgdmFsdWUgaWYgbm90IGRlZmluZWQKICAgICRHZXRQYXJhbXtDY30gID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0NjfTsKICAgICRHZXRQYXJhbXtCY2N9ID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0JjY307CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9ybSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkUXVldWVPYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwogICAgbXkgJE1haW5PYmplY3QgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgZnJvbnRlbmQgc3BlY2lmaWMgY29uZmlnCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiMgUm90aGVyIE9TUyAvIElUU01Db3JlIC0gY2FsY3VsYXRlIFByaW9yaXR5IHZpYSBDSVAgbWF0cml4CiAgICBteSAkQ0lQQ2FsY3VsYXRlID0gJENvbmZpZy0+e1ByaW9yaXR5QnlDSVB9IC8vICRDb25maWdPYmplY3QtPkdldCgnSVRTTTo6RnJvbnRlbmQ6OkNJUEFsbG9jYXRpb25EZWZhdWx0Jyk7CiAgICBteSAkU2VydmljZU9iamVjdDsKICAgIG15ICRDSVBBbGxvY2F0ZU9iamVjdDsKICAgIGlmICggJENJUENhbGN1bGF0ZSApIHsKICAgICAgICAkU2VydmljZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwogICAgICAgICRDSVBBbGxvY2F0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKTsKCiAgICAgICAgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9e1NlcnZpY2VJRH17UHJpb3JpdHlJRH0gICAgICAgICAgICAgICAgICAgID0gMTsKICAgICAgICAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9e1ByaW9yaXR5SUR9ICAgICAgPSAxOwogICAgICAgICRTZWxmLT57SW50ZXJuYWxEZXBlbmRhbmN5fXtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fXtQcmlvcml0eUlEfSA9IDE7CiAgICB9CiMgRU8gSVRTTUNvcmUKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGQgfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CiAgICAgICAgbXkgJVRpY2tldDsKICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBoZWFkZXIgYW5kIG5hdmlnYXRpb24gYmFyCiAgICAgICAgbXkgJE91dHB1dCA9IGpvaW4gJycsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigpLAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgaWYgdGhlcmUgaXMgbm8gdGlja2V0IGlkIQogICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVkJyApIHsKCiAgICAgICAgICAgICMgbm90aWZ5IGluZm8KICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnVGlja2V0ICIlcyIgY3JlYXRlZCEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBMaW5rID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPScKICAgICAgICAgICAgICAgICAgICAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9CiAgICAgICAgICAgICYmICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwvCiAgICAgICAgICAgICYmICRTZWxmLT57UmVxdWVzdGVkVVJMfSAgICAgICAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwuKkxpbmtUaWNrZXRJRD0vCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNwbGl0IGFydGljbGUgaWYgZ2l2ZW4KICAgICAgICAjIGdldCBBcnRpY2xlSUQKICAgICAgICBteSAlQXJ0aWNsZTsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIG15ICRBcnRpY2xlRnJvbSA9ICcnOwogICAgICAgIG15ICVTcGxpdFRpY2tldERhdGE7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKCiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IG5lZWQgcm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgaW5mb3JtYXRpb24gZnJvbSBvcmlnaW5hbCB0aWNrZXQgKFNwbGl0VGlja2V0KS4KICAgICAgICAgICAgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAlQXJ0aWNsZSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgYXJ0aWNsZSBpcyBmcm9tIHRoZSBzYW1lIFRpY2tldElEIGFzIHdlIGNoZWNrZWQgcGVybWlzc2lvbnMgZm9yLgogICAgICAgICAgICBpZiAoICRBcnRpY2xle1RpY2tldElEfSBuZSAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0FydGljbGUgZG9lcyBub3QgYmVsb25nIHRvIHRpY2tldCAlcyEnLCAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNhdmUgYXJ0aWNsZSBmcm9tIGZvciBhZGRyZXNzZXMgbGlzdAogICAgICAgICAgICAkQXJ0aWNsZUZyb20gPSAkQXJ0aWNsZXtGcm9tfTsKCiAgICAgICAgICAgICMgaWYgVG8gaXMgcHJlc2VudAogICAgICAgICAgICAjIGFuZCBpcyBubyBhIHF1ZXVlCiAgICAgICAgICAgICMgYW5kIGFsc28gaXMgbm8gYSBzeXN0ZW0gYWRkcmVzcwogICAgICAgICAgICAjIHNldCBUbyBhcyBhcnRpY2xlIGZyb20KICAgICAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkQXJ0aWNsZXtUb30gKSApIHsKICAgICAgICAgICAgICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWUgKCBzb3J0IGtleXMgJXsgJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPntDdXN0b21lclBhbmVsT3duU2VsZWN0aW9ufS0+eyRRdWV1ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRRdWV1ZXN7JFF1ZXVlfSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJVF1ZXVlTG9va3VwICAgICAgICAgPSByZXZlcnNlICVRdWV1ZXM7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0xvb2t1cCA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0xpc3QoKTsKICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1BZGRyZXNzRW1haWw7CgogICAgICAgICAgICAgICAgaWYgKCRBcnRpY2xlRnJvbSkgewogICAgICAgICAgICAgICAgICAgIG15ICgkQXJ0aWNsZUZyb21BZGRyZXNzKSA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEFydGljbGVGcm9tICk7CiAgICAgICAgICAgICAgICAgICAgJFN5c3RlbUFkZHJlc3NFbWFpbCA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEFydGljbGVGcm9tQWRkcmVzcyApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFF1ZXVlTG9va3VweyAkQXJ0aWNsZXtUb30gfSAmJiBkZWZpbmVkICRTeXN0ZW1BZGRyZXNzTG9va3VweyRTeXN0ZW1BZGRyZXNzRW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlRnJvbSA9ICRBcnRpY2xle1RvfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBib2R5IHByZXBhcmF0aW9uIGZvciBwbGFpbiB0ZXh0IHByb2Nlc3NpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlU2FmZXR5Q2hlY2tSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXJ0aWNsZXtCb2R5fSwKCiAgICAgICAgICAgICAgICAjIFN0cmlwIG91dCBleHRlcm5hbCBjb250ZW50IGlmIEJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQgaXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIE5vRXh0U3JjTG9hZCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQnKSwKCiAgICAgICAgICAgICAgICAjIERpc2FsbG93IHBvdGVudGlhbGx5IHVuc2FmZSBjb250ZW50LgogICAgICAgICAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgTm9TVkcgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKCiAgICAgICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yIG15ICRLZXlDdXN0b21lclVzZXJMaXN0ICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xle0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlckxpc3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG11bHRpcGxlIGFkZHJlc3NlcyBsaXN0CiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgbXkgJENvdW50RnJvbSA9IHNjYWxhciBATXVsdGlwbGVDdXN0b21lciB8fCAxOwogICAgICAgIG15ICVDdXN0b21lckRhdGFGcm9tOwogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJEYXRhRnJvbSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRBcnRpY2xlRnJvbSApICkgewoKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gJENvdW50RnJvbSBlcSAnMScgPyAnY2hlY2tlZCAnIDogJyc7CiAgICAgICAgICAgIG15ICRFbWFpbEFkZHJlc3MgICAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKTsKICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskRW1haWx9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tIC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFBocmFzZSAgICAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0UmVhbE5hbWUoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSA9ICcnOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRDdXN0b21lckRhdGFGcm9te1VzZXJFbWFpbH0KICAgICAgICAgICAgICAgICYmICRDdXN0b21lckRhdGFGcm9te1VzZXJFbWFpbH0gZXEgJEVtYWlsQWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJLZXkgPSAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRFbWFpbEFkZHJlc3MpIHsKICAgICAgICAgICAgICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWxBZGRyZXNzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJMb2dpbiAoIHNvcnQga2V5cyAlTGlzdCApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBTZXQgcmlnaHQgb25lIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY3VzdG9tZXIgdXNlciB3aXRoIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGhyYXNlICYmICRMaXN0eyRVc2VyTG9naW59ID1+IC8kUGhyYXNlLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyS2V5ID0gJFVzZXJMb2dpbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgPSAkRW1haWxBZGRyZXNzOwogICAgICAgICAgICBpZiAoJFBocmFzZSkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRWxlbWVudCA9ICRQaHJhc2UgLiAiIDwkRW1haWxBZGRyZXNzPiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyU2VsZWN0ZWQgJiYgJEN1c3RvbWVyS2V5ICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEVtYWlsQWRkcmVzc30gPSAxOwogICAgICAgICAgICAkQ291bnRGcm9tKys7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTcGxpdFRpY2tldFBhcmFtOwoKICAgICAgICAjIGluIGNhc2Ugb2Ygc3BsaXQgYSBUaWNrZXRJRCBhbmQgQXJ0aWNsZUlEIGFyZSBhbHdheXMgZ2l2ZW4sIHNlbmQgdGhlIFRpY2tldElEIHRvIGNhbGN1bGF0ZQogICAgICAgICMgQUNMcyBiYXNlZCBvbiBwYXJlbnQgaW5mb3JtYXRpb24KICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBmaXggdG8gYnVnIyA4MDY4IEZpZWxkICYgRHluYW1pY0ZpZWxkIHByZXNlbGVjdGlvbiBvbiBUaWNrZXRTcGxpdAogICAgICAgICMgd2hlbiBzcGxpdHRpbmcgYSB0aWNrZXQgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZXMgbXVzdCByZW1haW4gaW4gdGhlIG5ldyB0aWNrZXQgc2NyZWVuCiAgICAgICAgIyB0aGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBTcGxpdFRpY2tldFBhcmFtIGhhc2gKICAgICAgICBpZiAoICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGluZm9ybWF0aW9uIGZyb20gb3JpZ2luYWwgdGlja2V0IChTcGxpdFRpY2tldCkKICAgICAgICAgICAgbXkgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBzaW1wbGUgSURzIHRvIHBhc3MgdGhlbSB0byB0aGUgbWFzawogICAgICAgICAgICBmb3IgbXkgJFNwbGl0UGFyYW0gKHF3KFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgUHJpb3JpdHlJRCkpIHsKICAgICAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFteyRTcGxpdFBhcmFtfSA9ICRTcGxpdFRpY2tldERhdGF7JFNwbGl0UGFyYW19OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBTdGF0ZUlEIGFzIE5leHRTdGF0ZUlECiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte05leHRTdGF0ZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7U3RhdGVJRH07CgogICAgICAgICAgICAjIHNldCBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VXNlclNlbGVjdGVkfSAgICAgICAgICAgID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtSZXNwb25zaWJsZUlEfTsKCiAgICAgICAgICAgICMgc2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ICAgICAgID0gMTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CgogICAgICAgICAgICAjIHNldCB0aGUgc2VsZWN0ZWQgcXVldWUgaW4gZm9ybWF0IElEfHxOYW1lCiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0Zyb21TZWxlY3RlZH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9IC4gJ3x8JyAuICRTcGxpdFRpY2tldERhdGF7UXVldWV9OwoKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVNwbGl0VGlja2V0RGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggJEtleSA9fiAvRHluYW1pY0ZpZWxkXF8oLiopLyApIHsKICAgICAgICAgICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtEeW5hbWljRmllbGR9eyQxfSA9ICRTcGxpdFRpY2tldERhdGF7JEtleX07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTcGxpdFRpY2tldFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBzZWxlY3RlZCB2YWx1ZXMgYXQgdGhlIHN0YXJ0CgogICAgICAgICMgaW4gY2FzZSBvZiB0aWNrZXQgc3BsaXQgc2V0ICRTZWxmLT57UXVldWVJRH0gYXMgdGhlIFF1ZXVlSUQgb2YgdGhlIG9yaWdpbmFsIHRpY2tldCwKICAgICAgICAjIGluIG9yZGVyIHRvIHNldCBjb3JyZWN0IEFDTHMgb24gcGFnZSBsb2FkIChpbml0aWFsKS4gU2VlIGJ1ZyA4Njg3LgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlU3BsaXRUaWNrZXRQYXJhbSApCiAgICAgICAgICAgICYmICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9CiAgICAgICAgICAgICYmICEkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9OwogICAgICAgICAgICAkR2V0UGFyYW17RGVzdH0gICAgPSAkU3BsaXRUaWNrZXRQYXJhbXtGcm9tU2VsZWN0ZWR9OwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgcHJlZGVmaW5lZCBRdWV1ZUlEIChpZiBubyBxdWV1ZSBmcm9tIHNwbGl0IHRpY2tldCBpcyBzZXQpLgogICAgICAgIGVsc2lmICggISRTZWxmLT57UXVldWVJRH0gJiYgJEdldFBhcmFte0Rlc3R9ICkgewogICAgICAgICAgICBteSBAUXVldWVQYXJ0cyA9IHNwbGl0KCAvXHxcfC8sICRHZXRQYXJhbXtEZXN0fSApOwogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVQYXJ0c1swXTsKICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RGVzdH0gPSAiJEdldFBhcmFte1F1ZXVlSUR9fHwkVXNlckRlZmF1bHRRdWV1ZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZG9uJ3QgdXNlIHRoZSBzcGxpdCB0aWNrZXQgc3RhdGUsIGp1c3QgdGhlIGRlZmF1bHQKICAgICAgICBpZiAoICRDb25maWctPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICBteSAlTmV4dFN0YXRlczsKCiAgICAgICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSB8fCAxLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gPSB7IHJldmVyc2UgJU5leHRTdGF0ZXMgfS0+eyAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSB9IC8vICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzcGxpdCB0aWNrZXQgaW5mbyBmb3IgdGhlIHJlc3QKICAgICAgICBpZiAoICRTcGxpdFRpY2tldFBhcmFte1VzZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtOZXdVc2VySUR9ID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFNwbGl0UGFyYW0gKHF3KFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgUHJpb3JpdHlJRCkpIHsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17JFNwbGl0UGFyYW19ID0gJFNwbGl0VGlja2V0RGF0YXskU3BsaXRQYXJhbX07CiAgICAgICAgfQoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBzcGxpdCBhIFRpY2tldElEIGFuZCBBcnRpY2xlSUQgYXJlIGFsd2F5cyBnaXZlbiwgR2V0IHRoZSB2YWx1ZQogICAgICAgICAgICAjIGZyb20gREIgdGhpcyBjYXNlcwogICAgICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZWxlY3QgVGlja2V0SUQgb3IgQXJ0aWNsZUlEIHRvIGdldCB0aGUgdmFsdWUgZGVwZW5kaW5nIG9uIGR5bmFtaWMgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgbXkgJE9iamVjdElEID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnCiAgICAgICAgICAgICAgICAgICAgPyAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgIDogJEFydGljbGV7QXJ0aWNsZUlEfTsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlIChzcGxpdCkKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdGhlcndpc2UgKG9uIGEgbmV3IHRpY2tldCkuIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBlbHNpZiAoICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBkeW5hbWljIGZpZWxkIGNvbmZpZyAoaWYgYW55KQogICAgICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwoKICAgICAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKICAgICAgICAjIGdhdGhlciBmaWVsZHMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIGhpZGRlbiB3aGVuIGF1dG9zZWxlY3RlZAogICAgICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgICAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICAgICAgbXkgQEhpZGVBdXRvc2VsZWN0ZWQgPSBncmVwIHsgIXJlZiggJEF1dG9zZWxlY3QtPnskX30gKSAmJiAkQXV0b3NlbGVjdC0+eyRffSA9PSAyIH0ga2V5cyAleyRBdXRvc2VsZWN0fTsKICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIG1hcCB7ICJEeW5hbWljRmllbGRfIiAuICRfIH0KICAgICAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChASGlkZUF1dG9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAgICAgJEhpZGVBdXRvc2VsZWN0ZWRKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxASGlkZUF1dG9zZWxlY3RlZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzOwoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvcmUgLSBjYWxjdWxhdGUgUHJpb3JpdHkgdmlhIENJUCBtYXRyaXgKICAgICAgICBpZiAoICRDSVBDYWxjdWxhdGUgJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9CiAgICAgICAgICAgICYmICggJEdldFBhcmFte0R5bmFtaWNGaWVsZH17RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX0gfHwgJEdldFBhcmFte1NlcnZpY2VJRH0gKSApIHsKCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhbiBpbml0aWFsIGNyaXRpY2FsaXR5IGFuZCBpbXBhY3QsIHRyaWdnZXIgcHJpb3JpdHkgY2FsY3VsYXRpb24KICAgICAgICAgICAgJENoYW5nZWRFbGVtZW50c3tEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAxOwogICAgICAgIH0KIyBFTyBJVFNNQ29yZQoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Vzc2FyeSBmb3IgRGVzdCkKICAgICAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgICAgICBEZXN0ICAgICAgICAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBOZXdSZXNwb25zaWJsZUlEICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQUNMUHJlc2VsZWN0aW9uICYmICEkSW5pdGlhbFJ1biApIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICAgICAgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze1NlcnZpY2VJRH0gfHwgdW5kZWYsICAgICAgIyBuZWVkZWQgZm9yIFNMQUlECiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9IGVxICctJyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyIkUXVldWVJRHx8JFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyAkUXVldWVJRCB9In0gPSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gJiYgISRTdGRGaWVsZFZhbHVlc3tEZXN0fXsgJEdldFBhcmFte0Rlc3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBJVFNNQ29yZSAtIGNhbGN1bGF0ZSBQcmlvcml0eSB2aWEgQ0lQIG1hdHJpeAogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEZpZWxkLT57RmllbGRJRH0gZXEgJ1ByaW9yaXR5SUQnICYmICRDSVBDYWxjdWxhdGUgJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGNyaXRpY2FsaXR5IGVpdGhlciBmcm9tIHRoZSBtYW51YWxseSBzZXQgZHluYW1pYyBmaWVsZCwgb3IgdGhlIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5ID0gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9OwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENyaXRpY2FsaXR5ICYmICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNlcnZpY2UgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDcml0aWNhbGl0eSA9ICRTZXJ2aWNle0NyaXRpY2FsaXR5fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3JpdGljYWxpdHkgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZWNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkgaWYgYW55IG9mIHRoZSBpbXBhY3RpbmcgZWxlbWVudHMgY2hhbmdlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hhbmdlZEVsZW1lbnRze0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSB8fCAkQ2hhbmdlZEVsZW1lbnRze1NlcnZpY2VJRH0gfHwgJENoYW5nZWRFbGVtZW50c3tEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkUHJpb3JpdHlJRCA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkQ3JpdGljYWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRTdGRGaWVsZFZhbHVlc3tQcmlvcml0eUlEfXsgJFByaW9yaXR5SUQgfSAmJiAkUHJpb3JpdHlJRCBuZSAkR2V0UGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSAgICAgICAgICAgPSAkUHJpb3JpdHlJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3tQcmlvcml0eUlEfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRze1ByaW9yaXR5SUR9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHdlIGVuZm9yY2UgQ0lQQWxsb2NhdGlvbiBpbiBhbnkgY2FzZSBkZWxldGUgYWxsIG90aGVyIHByaW9yaXR5IG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5SUR9ICYmICRDSVBDYWxjdWxhdGUgPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7UHJpb3JpdHlJRH0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9PiAkU3RkRmllbGRWYWx1ZXN7UHJpb3JpdHlJRH17ICRHZXRQYXJhbXtQcmlvcml0eUlEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiMgRU8gSVRTTUNvcmUKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH17ICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGVtcHR5IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICVOZXdDaGFuZ2VkRWxlbWVudHMsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICAgICAgaWYgKCAlQ2hhbmdlZEVsZW1lbnRzIHx8ICRJbml0aWFsUnVuICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVyVXNlcklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQXV0b3NlbGVjdCAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICAgICAgICAgIEFDTFByZXNlbGVjdGlvbiA9PiAkQUNMUHJlc2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIExvb3BQcm90ZWN0aW9uICA9PiBcJExvb3BQcm90ZWN0aW9uLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNvbWJpbmUgRmllbGRTdGF0ZXMKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEluaXRpYWxSdW4gPSAwOwogICAgICAgIH0KCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzID0gbWFwIHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gZGVmaW5lZCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskX30KICAgICAgICAgICAgICAgID8gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgOiB1bmRlZgogICAgICAgIH0gKCBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKTsKCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgaWYgKAogICAgICAgICAgICByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxCiAgICAgICAgICAgICdIQVNIJwogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RGVzdH0gJiYgJEdldFBhcmFte0Rlc3R9ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkMTsKICAgICAgICAgICAgICAgIG15ICVBZGRyZXNzID0gJFF1ZXVlT2JqZWN0LT5HZXRTeXN0ZW1BZGRyZXNzKCBRdWV1ZUlEID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJEFkZHJlc3N7RW1haWx9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJERlYnVnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgJE5ld1BhcmFtcyA9ICRPYmplY3QtPlJ1biggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICBpZiAoJE5ld1BhcmFtcykgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkTmV3UGFyYW1zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgbXkgJFN1YmplY3QgPSAkQXJ0aWNsZXtTdWJqZWN0fTsKICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgJFN1YmplY3QgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRCb2R5ID0gJEFydGljbGV7Qm9keX0gfHwgJyc7CiAgICAgICAgaWYgKCAhJEJvZHkgKSB7CiAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQgKGlmIGJvZHkgaXMgYmFzZWQgb24gY29uZmlnKQogICAgICAgIGlmICggISRHZXRQYXJhbXtBcnRpY2xlSUR9ICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tFbWFpbE5ldygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBOZXh0U3RhdGUgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ID8gJFN0ZEZpZWxkVmFsdWVze05leHRTdGF0ZUlEfXsgJEdldFBhcmFte05leHRTdGF0ZUlEfSB9IDogJycsCiAgICAgICAgICAgIEZyb21TZWxlY3RlZCAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEZXN0fSwKICAgICAgICAgICAgVXNlclNlbGVjdGVkICAgICAgICAgICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlclNlbGVjdGVkID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyAgICAgICAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgUHJpb3JpdGllcyAgICAgICAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze1ByaW9yaXR5SUR9LAogICAgICAgICAgICBUeXBlcyAgICAgICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZXMgICAgICAgICAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTTEFJRH0sCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VycyAgICAgICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7TmV3VXNlcklEfSwKICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBGcm9tTGlzdCAgICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgICAgID0+ICRBcnRpY2xle0Zyb219IC8vICcnLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgID0+ICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lckRhdGEgICAgICAgICAgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgTGlua1RpY2tldElEICAgICAgICAgICAgPT4gJEdldFBhcmFte0xpbmtUaWNrZXRJRH0gfHwgJycsCiAgICAgICAgICAgIEhpZGVBdXRvc2VsZWN0ZWQgICAgICAgID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgICAgPT4gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBUaW1lVW5pdHMgICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldFRpbWVVbml0cygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICksCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGRlbGl2ZXIgc2lnbmF0dXJlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2lnbmF0dXJlJyApIHsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApIHx8ICcnOwogICAgICAgIG15ICRRdWV1ZUlEICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUXVldWVJRCcgKTsKICAgICAgICBpZiAoICEkUXVldWVJRCApIHsKICAgICAgICAgICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICAgICAgKCRRdWV1ZUlEKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IHdpdGggZW1wdHkgc2lnbmF0dXJlIChubyBxdWV1ZSBzZWxlY3RlZCkgLSBpZiB3ZSBoYXZlIGEgcXVldWUsIGdldCB0aGUgc2lnLgogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlICA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICAkU2lnbmF0dXJlID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJE1pbWVUeXBlIC4gJzsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyB0aWNrZXQgYW5kIGFydGljbGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZU5ldycgKSB7CgogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBteSAkTmV4dFN0YXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV4dFN0YXRlSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVN0YXRlRGF0YTsKICAgICAgICBpZiAoJE5leHRTdGF0ZUlEKSB7CiAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkTmV4dFN0YXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICROZXh0U3RhdGUgICAgICAgID0gJFN0YXRlRGF0YXtOYW1lfTsKICAgICAgICBteSAkTmV3UmVzcG9uc2libGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdSZXNwb25zaWJsZUlEJyApIHx8ICcnOwogICAgICAgIG15ICROZXdVc2VySUQgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1VzZXJJRCcgKSAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJERlc3QgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgIyBzZWUgaWYgb25seSBhIG5hbWUgaGFzIGJlZW4gcGFzc2VkCiAgICAgICAgaWYgKCAkRGVzdCAmJiAkRGVzdCAhfiBteyBcQSAoXGQrKT8gXHwgXHwgLisgXHogfXhtcyApIHsKCiAgICAgICAgICAgICMgc2VlIGlmIHdlIGNhbiBnZXQgYW4gSUQgZm9yIHRoaXMgcXVldWUgbmFtZQogICAgICAgICAgICBteSAkRGVzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICREZXN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCREZXN0SUQpIHsKICAgICAgICAgICAgICAgICREZXN0ID0gJERlc3RJRCAuICd8fCcgLiAkRGVzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREZXN0ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICgkTmV3UXVldWVJRCkgPSBzcGxpdCggL1x8XHwvLCAkRGVzdCApOwogICAgICAgIGlmICggISROZXdRdWV1ZUlEICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICVBZGRyZXNzID0gJFF1ZXVlT2JqZWN0LT5HZXRTeXN0ZW1BZGRyZXNzKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICRBZGRyZXNze0VtYWlsfTsKICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRFeHBhbmRDdXN0b21lck5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgbXkgJUZyb21FeHRlcm5hbEN1c3RvbWVyOwogICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gICAgICAgICAgICA9ICROZXdRdWV1ZUlEOwogICAgICAgICRHZXRQYXJhbXtFeHBhbmRDdXN0b21lck5hbWV9ID0gJEV4cGFuZEN1c3RvbWVyTmFtZTsKCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlcgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhclRvJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJFeHBhbmRDdXN0b21lck5hbWUkQ291bnQiICkgfHwgMDsKICAgICAgICAgICAgaWYgKCAkQ291bnQgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENvdW50ID09IDIgJiYgJEl0ZW0gKSB7CiAgICAgICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIElUU01Db3JlIC0gY2FsY3VsYXRlIFByaW9yaXR5IHZpYSBDSVAgbWF0cml4CiAgICAgICAgaWYgKCAkQ0lQQ2FsY3VsYXRlICYmICRDSVBDYWxjdWxhdGUgPT0gMiAmJiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgY3JpdGljYWxpdHkgZWl0aGVyIGZyb20gdGhlIG1hbnVhbGx5IHNldCBkeW5hbWljIGZpZWxkLCBvciB0aGUgc2VydmljZQogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHkgPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX07CgogICAgICAgICAgICBpZiAoICEkQ3JpdGljYWxpdHkgJiYgJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlU2VydmljZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJENyaXRpY2FsaXR5ID0gJFNlcnZpY2V7Q3JpdGljYWxpdHl9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDcml0aWNhbGl0eSApIHsKICAgICAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJENJUEFsbG9jYXRlT2JqZWN0LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJENyaXRpY2FsaXR5LAogICAgICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkUHJpb3JpdHlJRCBuZSAkR2V0UGFyYW17UHJpb3JpdHlJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOyB3ZSBqdXN0IGVuZm9yY2UgdGhlIHByaW8gYW5kIHdyaXRlIGFuIGVycm9yIHRvIHRoZSBsb2cgZmlsZSBoZXJlCiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHb3QgUHJpb3JpdHlJRCAnJEdldFBhcmFte1ByaW9yaXR5SUR9JywgYnV0IENJUCBlbmZvcmNlcyAnJFByaW9yaXR5SUQnIC0gb3ZlcnJpZGluZyB0aGUgZnJvbnRlbmQgdmFsdWUuIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkUHJpb3JpdHlJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBJVFNNQ29yZQoKICAgICAgICAjIHNraXAgdmFsaWRhdGlvbiBvZiBoaWRkZW4gZmllbGRzCiAgICAgICAgbXkgJVZpc2liaWxpdHk7CgogICAgICAgICMgdHJhbnNmb3JtIGR5bmFtaWMgZmllbGQgZGF0YSBpbnRvIERGTmFtZSA9PiBERk5hbWUgcGFpcgogICAgICAgIG15ICVEeW5hbWljRmllbGRBY2wgPSBtYXAgeyAkXyA9PiAkXyB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKCiAgICAgICAgIyBjYWxsIHRpY2tldCBBQ0xzIGZvciBEeW5hbWljRmllbGRzIHRvIGNoZWNrIGZpZWxkIHZpc2liaWxpdHkKICAgICAgICBteSAkQUNMUmVzdWx0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0Zvcm0nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkQWNsLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTFJlc3VsdCkgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDAgfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAgICAgJFZpc2liaWxpdHl7ICdEeW5hbWljRmllbGRfJyAuICRGaWVsZCB9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVZpc2liaWxpdHkgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiAxIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0cyBpZiBlcnJvbmVvdXMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gaW52aXNpYmxlIGZpZWxkcwogICAgICAgICAgICBpZiAoICEkRXhwYW5kQ3VzdG9tZXJOYW1lICYmICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICAgICAgICAgIyBNYW5kYXRvcnkgaXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgYnkgJFNlbGYtPm5ldwogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZXhwYW5kIGN1c3RvbWVyIG5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YTsKICAgICAgICBpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGN1c3RvbWVyCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0OwogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgU2VhcmNoID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGp1c3Qgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzCiAgICAgICAgICAgICMgaWYganVzdCBvbmUsIGZpbGx1cCBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9IDA7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0rKzsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH0gICAgID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSA9ICRLZXlDdXN0b21lclVzZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9PSAxICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAgICAgICAgICAgICAgPSAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9OwogICAgICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0VXNlcn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgbW9yZSB0aGUgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzLCBzaG93IGxpc3QKICAgICAgICAgICAgIyBhbmQgY2xlYW4gQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBkb24ndCBjaGVjayBlbWFpbCBzeW50YXggb24gbXVsdGkgY3VzdG9tZXIgc2VsZWN0CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICcnOwoKICAgICAgICAgICAgICAgICMgY2xlYXIgdG8gaWYgdGhlcmUgaXMgbm8gY3VzdG9tZXIgZm91bmQKICAgICAgICAgICAgICAgIGlmICggISVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJvbSBhbmQgY3VzdG9tZXIgaWQgaWYgY3VzdG9tZXIgdXNlciBpcyBnaXZlbgogICAgICAgICMgVGhpcyBpcyB1c2VkIGJ5IEtlcm5lbDo6TW9kdWxlczo6QWRtaW5DdXN0b21lclVzZXIKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMiApIHsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRDdXN0b21lclVzZXJMaXN0eyRLZXlDdXN0b21lclVzZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9ICkgewogICAgICAgICAgICAgICAgbXkgJUV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntFbWFpbH0gPSAkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJNYWlsU3RyaW5nfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIgKSB7CiAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBQQVJBTUVURVIgaWYgISRHZXRQYXJhbXskUGFyYW1ldGVyfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEdldFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtZXRlciAuICdFcnJvclR5cGUnIH0gPSAkUGFyYW1ldGVyIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0ludmFsaWQnIH0gICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgQWRkcmVzc09iamVjdCA9PiAkRW1haWwsCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRQYXJhbWV0ZXIgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIGl0IGlzIG5vdCBhIHN1YmFjdGlvbiBhYm91dCBhdHRhY2htZW50cywgY2hlY2sgZm9yIHNlcnZlciBlcnJvcnMKICAgICAgICBpZiAoICEkRXhwYW5kQ3VzdG9tZXJOYW1lICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGVzdGluYXRpb25JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgZGF0ZSBpcyB2YWxpZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEV4cGFuZEN1c3RvbWVyTmFtZQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcGVuZGluZyBkYXRlIHRvIGEgZGF0ZXRpbWUgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIGVwb2NoCiAgICAgICAgICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IHx8ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPCAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNlcnZpY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNsYQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTTEFJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICEkR2V0UGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVHlwZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtUaW1lVW5pdHN9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgbXkgJUFydGljbGVQYXJhbTsKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJERlYnVnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU3RvcmVOZXcgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSm9ic3skSm9ifQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICAjIGFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgc3VibWl0CiAgICAgICAgICAgICAgICAjIHdpbGwgY29udGFpbiBvcHRpb25zIHRoYXQgd2VyZSBoaWRkZW4gZnJvbSB0aGUgYWdlbnQKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAUmVtb3ZlZE9wdGlvbnMgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW92ZWRPcHRpb24gKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gc2hpZnQgQFJlbW92ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdGlja2V0IHBhcmFtcwogICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkFydGljbGVPcHRpb24oICVHZXRQYXJhbSwgJUFydGljbGVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGVycm9ycwogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgIGlmICggJEVycm9ye1RvSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRFcnJvcntDY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRXJyb3J7QmNjSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQm9keSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IEJvZHkgYW5kIFN1YmplY3QgcGFyYW1ldGVycyBmb3IgT3V0cHV0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTdWJqZWN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkQm9keTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc2VydmljZXMKICAgICAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICEkU2VydmljZXMtPnsgJEdldFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaGVhZGVyIGFuZCBuYXZpZ2F0aW9uIGJhcgogICAgICAgICAgICBteSAkT3V0cHV0ID0gam9pbiAnJywKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigpLAogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza0VtYWlsTmV3KAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcnMgICA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJTZWxlY3RlZCAgICAgPT4gJE5ld1VzZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnMgPT4gJFNlbGYtPl9HZXRSZXNwb25zaWJsZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VyU2VsZWN0ZWQgPT4gJE5ld1Jlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBOZXh0U3RhdGUgID0+ICROZXh0U3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTTEFzICAgICAgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzID0+ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEN1c3RvbWVySUQgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgICAgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgRnJvbUxpc3QgICAgID0+ICRTZWxmLT5fR2V0VG9zKCksCiAgICAgICAgICAgICAgICBGcm9tU2VsZWN0ZWQgPT4gJERlc3QsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17U3ViamVjdH0gKSwKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRHZXRQYXJhbXtCb2R5fSApLAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFNpZ25hdHVyZSAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICAgICBGcm9tRXh0ZXJuYWxDdXN0b21lciA9PiBcJUZyb21FeHRlcm5hbEN1c3RvbWVyLAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyAgICAgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIERGRXJyb3JzICAgICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ1RpY2tldCc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmlzaWJpbGl0eXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgc3ViamVjdAogICAgICAgIG15ICRUbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CiAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRuLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICc8YnIvPjxici8+JyAuICRTaWduYXR1cmU7CgogICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIHB1c2ggQE5ld0F0dGFjaG1lbnREYXRhLCBcJXskQXR0YWNobWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICJcblxuIiAuICRTaWduYXR1cmU7CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cCBzZW5kZXIKICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgICAgICBteSAkU2VuZGVyICAgICAgICAgICAgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNlbmRlcigKICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0VtYWlsJyApOwoKICAgICAgICAjIHNlbmQgZW1haWwKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlU2VuZCgKICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSAgICAgICAgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgIEF0dGFjaG1lbnQgICAgICAgICAgID0+IFxAQXR0YWNobWVudERhdGEsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkQ29uZmlnLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkU2VuZGVyLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9CiAgICAgICAgICAgICAgICB8fCAiXCVcJSRHZXRQYXJhbXtUb30sICRHZXRQYXJhbXtDY30sICRHZXRQYXJhbXtCY2N9IiwKICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmlzaWJpbGl0eXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBhbGwgZm9ybSBkYXRhCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIGRlbGV0ZSBoaWRkZW4gZmllbGRzIGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAnSGlkZGVuRmllbGRzJywKICAgICAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsaW5rIHRpY2tldHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9CiAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0tPntMaW5rVHlwZX0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57RGlyZWN0aW9ufQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkR2V0UGFyYW17TGlua1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgcm8gcGVybWlzc2lvbiEiLAogICAgICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU291cmNlS2V5ID0gJEdldFBhcmFte0xpbmtUaWNrZXRJRH07CiAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICBpZiAoICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0gZXEgJ1NvdXJjZScgKSB7CiAgICAgICAgICAgICAgICAkU291cmNlS2V5ID0gJFRpY2tldElEOwogICAgICAgICAgICAgICAgJFRhcmdldEtleSA9ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGxpbmsgdGhlIHRpY2tldHMKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0FkZCgKICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9IHx8ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgb3duZXIgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxzZSBzZXQgb3duZXIgdG8gY3VycmVudCBhZ2VudCBidXQgZG8gbm90IGxvY2sgaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHJlc3BvbnNpYmxlIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoJE5ld1Jlc3BvbnNpYmxlSUQpIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICROZXdSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjbG9zZWQgdGlja2V0cyBnZXQgdW5sb2NrZWQKICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgIG15ICROZXh0U2NyZWVuID0gJFNlbGYtPntTZXNzaW9ufXtVc2VyQ3JlYXRlTmV4dE1hc2t9IHx8ICdBZ2VudFRpY2tldEVtYWlsO1N1YmFjdGlvbj1DcmVhdGVkJzsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJERlc3QgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApOwogICAgICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgRnJvbSBiYXNlZCBvbiBzZWxlY3RlZCBxdWV1ZQogICAgICAgIG15ICRRdWV1ZUlEID0gJyc7CiAgICAgICAgaWYgKCAkRGVzdCA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAkUXVldWVJRCA9ICQxOwogICAgICAgICAgICBteSAlQWRkcmVzcyA9ICRRdWV1ZU9iamVjdC0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkUXVldWVJRCApOwogICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkQWRkcmVzc3tFbWFpbH07CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXtEZXN0fSAgICA9ICREZXN0OwogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRBdXRvc2VsZWN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkF1dG9zZWxlY3QnKSB8fCB1bmRlZjsKICAgICAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkFDTFByZXNlbGVjdGlvbicpICkgewoKICAgICAgICAgICAgIyBnZXQgY2FjaGVkIHByZXNlbGVjdGlvbiBydWxlcwogICAgICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0QUNMJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQ29udmVyZ2VuY2UgPSAoCiAgICAgICAgICAgIFN0ZEZpZWxkcyA9PiAwLAogICAgICAgICAgICBGaWVsZHMgICAgPT4gMCwKICAgICAgICApOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHMgPSAkRWxlbWVudENoYW5nZWQgPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKICAgICAgICBpZiAoICRDaGFuZ2VkRWxlbWVudHN7U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJENoYW5nZWRFbGVtZW50c3tDdXN0b21lclVzZXJJRH0gPSAxOwogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVySUR9ICAgICA9IDE7CiAgICAgICAgfQogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gJUNoYW5nZWRFbGVtZW50czsKICAgICAgICBteSAlQ2hhbmdlZFN0ZEZpZWxkcyAgICAgICA9ICRFbGVtZW50Q2hhbmdlZCAmJiAkRWxlbWVudENoYW5nZWQgIX4gL15EeW5hbWljRmllbGRfLyA/ICVDaGFuZ2VkRWxlbWVudHMgOiAoKTsKCiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwogICAgICAgIG15ICVTdGRGaWVsZFZhbHVlczsKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgICAgIFZpc2liaWxpdHkgPT4ge30sCiAgICAgICAgICAgIEZpZWxkcyAgICAgPT4ge30sCiAgICAgICAgICAgIFNldHMgICAgICAgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHN0YW5kYXJkIGZpZWxkIGlucHV0CiAgICAgICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gKSB7CgogICAgICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICAgICAjIHdoaWNoIHN0YW5kYXJkIGZpZWxkcyB0byBjaGVjayAtIEZpZWxkSUQgPT4gR2V0UGFyYW1WYWx1ZSAobmVjZXNzYXJ5IGZvciBEZXN0KQogICAgICAgICAgICAgICAgbXkgJUNoZWNrID0gKAogICAgICAgICAgICAgICAgICAgIERlc3QgICAgICAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlSUQgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEFDTFByZXNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRGaWVsZElEIG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyRGaWVsZElEfSAmJiAkQ2hhbmdlZEVsZW1lbnRzeyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggc29ydCBrZXlzICVDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbi0+e1J1bGVzfXtUaWNrZXR9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEVsZW1lbnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEVsZW1lbnQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJENoZWNreyRGaWVsZElEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgICAgICAgICAgTUVUSE9EOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgTUVUSE9EIGlmICEkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH07CgogICAgICAgICAgICAgICAgICAgICMgdXNlICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSBmb3IgRGVzdD0+UXVldWVJRAogICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAjIG5lZWRlZCBmb3IgU0xBSUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17IiRRdWV1ZUlEfHwkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17ICRRdWV1ZUlEIH0ifSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyAkR2V0UGFyYW17RGVzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1F1ZXVlSUR9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57RGVzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIElUU01Db3JlIC0gY2FsY3VsYXRlIFByaW9yaXR5IHZpYSBDSVAgbWF0cml4CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnUHJpb3JpdHlJRCcgJiYgJENJUENhbGN1bGF0ZSAmJiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgY3JpdGljYWxpdHkgZWl0aGVyIGZyb20gdGhlIG1hbnVhbGx5IHNldCBkeW5hbWljIGZpZWxkLCBvciB0aGUgc2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ3JpdGljYWxpdHkgPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ3JpdGljYWxpdHkgJiYgJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlU2VydmljZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENyaXRpY2FsaXR5ID0gJFNlcnZpY2V7Q3JpdGljYWxpdHl9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDcml0aWNhbGl0eSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlY2FsY3VsYXRlIHRoZSBwcmlvcml0eSBpZiBhbnkgb2YgdGhlIGltcGFjdGluZyBlbGVtZW50cyBjaGFuZ2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDaGFuZ2VkRWxlbWVudHN7RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9IHx8ICRDaGFuZ2VkRWxlbWVudHN7U2VydmljZUlEfSB8fCAkQ2hhbmdlZEVsZW1lbnRze0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJENJUEFsbG9jYXRlT2JqZWN0LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRDcml0aWNhbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFN0ZEZpZWxkVmFsdWVze1ByaW9yaXR5SUR9eyAkUHJpb3JpdHlJRCB9ICYmICRQcmlvcml0eUlEIG5lICRHZXRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ICAgICAgICAgICA9ICRQcmlvcml0eUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRze1ByaW9yaXR5SUR9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7UHJpb3JpdHlJRH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgd2UgZW5mb3JjZSBDSVBBbGxvY2F0aW9uIGluIGFueSBjYXNlIGRlbGV0ZSBhbGwgb3RoZXIgcHJpb3JpdHkgb3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlJRH0gJiYgJENJUENhbGN1bGF0ZSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3tQcmlvcml0eUlEfSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0+ICRTdGRGaWVsZFZhbHVlc3tQcmlvcml0eUlEfXsgJEdldFBhcmFte1ByaW9yaXR5SUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KIyBFTyBJVFNNQ29yZQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgY3VycmVudCBzZWxlY3RlZCB2YWx1ZSBpcyBzdGlsbCB2YWxpZCBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfXsgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBub3QgZW1wdHkgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISVOZXdDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7U2V0c30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJEdldFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkQUpBWFJldHVybigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlncyA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgRHluRmllbGRTdGF0ZXMgICAgICA9PiBcJUR5bkZpZWxkU3RhdGVzLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgQUpBWCByZXR1cm4gZm9yIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSBAU3RkRmllbGRBSkFYOwogICAgICAgIG15ICVBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBEZXN0ID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOZXdVc2VySUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTTEFJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBUeXBlSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgICAgIGRlbGV0ZSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH07CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlU3RkRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgICAgIHB1c2ggQFN0ZEZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3skRmllbGR9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17JEZpZWxkfSwKICAgICAgICAgICAgICAgICV7ICRBdHRyaWJ1dGVzeyRGaWVsZH0gfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG15IEBUZW1wbGF0ZUFKQVg7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2htZW50cyBpZiBuZWVkZWQuCiAgICAgICAgaWYgKCAkQ2hhbmdlZFN0ZEZpZWxkc3tTdGFuZGFyZFRlbXBsYXRlSUR9ICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAgICAgICAgICMgc2V0IHRlbXBsYXRlIHRleHQsIHJlcGxhY2Ugc21hcnQgdGFncyAobGltaXRlZCBhcyB0aWNrZXQgaXMgbm90IGNyZWF0ZWQpCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgICA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgU3RkQXR0YWNobWVudE9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwoKICAgICAgICAgICAgICAgICMgYWRkIHN0ZC4gYXR0YWNobWVudHMgdG8gdGlja2V0CiAgICAgICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c0RhdGEgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudEdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgIyB3aGljaCByZW5kZXJzIHRoZW4gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHVwbG9hZGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBAVGlja2V0QXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBUaWNrZXRBdHRhY2htZW50cykgewogICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gJExheW91dE9iamVjdC0+SHVtYW5SZWFkYWJsZURhdGFTaXplKAogICAgICAgICAgICAgICAgICAgICAgICBTaXplID0+ICRBdHRhY2htZW50LT57RmlsZXNpemV9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVggPSAoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlVGVtcGxhdGVDcmVhdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVGlja2V0QXR0YWNobWVudHMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAVGlja2V0QXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgS2VlcERhdGEgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBARXh0ZW5kZWREYXRhOwoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgSk9COgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBuZXh0IEpPQiBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkRGVidWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIGdldCBBSkFYIHBhcmFtIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldFBhcmFtQUpBWCcpICkgewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IG9wdGlvbnMgdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIHZpc2libGUKICAgICAgICAgICAgICAgICMgdG8gdGhlIGFnZW50LiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAT3B0aW9uc1RvUmVtb3ZlID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskT3B0aW9uVG9SZW1vdmV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgIGlmICgkS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBARXh0ZW5kZWREYXRhLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAkTXVsdGlwbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NpZ25hdHVyZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAU3RkRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFN1YmFjdGlvbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtPd25lckFsbH0gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkS2V5R3JvdXBNZW1iZXIgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkS2V5R3JvdXBNZW1iZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSBvd25lciBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skS2V5TWVtYmVyfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UmVzcG9uc2libGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1Jlc3BvbnNpYmxlQWxsfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRLZXlHcm91cE1lbWJlciApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRLZXlHcm91cE1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJlc3BvbnNpYmxlIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleU1lbWJlciAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2UgZGVmYXVsdCBRdWV1ZSBpZiBub25lIGlzIHByb3ZpZGVkCiAgICAkUGFyYW17UXVldWVJRH0gPSAkUGFyYW17UXVldWVJRH0gfHwgMTsKCiAgICAjIGdldCBwcmlvcml0eQogICAgbXkgJVByaW9yaXRpZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyB1c2UgZGVmYXVsdCBRdWV1ZSBpZiBub25lIGlzIHByb3ZpZGVkCiAgICAkUGFyYW17UXVldWVJRH0gPSAkUGFyYW17UXVldWVJRH0gfHwgMTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHNlcnZpY2VzIGlmIHRoZXkgd2VyZSBub3QgZGV0ZXJtaW5lZCBpbiBhbiBBSkFYIGNhbGwKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1NlcnZpY2VzfSApIHsKICAgICAgICAkUGFyYW17U2VydmljZXN9ID0gJFNlbGYtPl9HZXRTZXJ2aWNlcyglUGFyYW0pOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJU5ld1RvcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3M7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICVUb3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPk1vdmVMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVG9zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc1F1ZXVlTGlzdCgpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nCiAgICAgICAgUVVFVUVJRDoKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVRvcyApIHsKCiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgIGlmICggISRRdWV1ZURhdGF7Q29tbWVudH0gKSB7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwoKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTaWduYXR1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgIG15ICRTaWduYXR1cmUgICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgIERhdGEgICAgPT4gXCVQYXJhbSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTaWduYXR1cmU7Cn0KCnN1YiBfR2V0VGltZVVuaXRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEFjY291bnRlZFRpbWUgPSAnJzsKCiAgICAjIEdldCBhY2NvdW50ZWQgdGltZSBpZiBBY2NvdW50VGltZSBjb25maWcgaXRlbSBpcyBlbmFibGVkLgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgJiYgZGVmaW5lZCAkUGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICAkQWNjb3VudGVkVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QXJ0aWNsZUFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkQWNjb3VudGVkVGltZSA/ICRBY2NvdW50ZWRUaW1lIDogJyc7Cn0KCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGVtcGxhdGVzOwogICAgbXkgJFF1ZXVlSUQgPSAkUGFyYW17UXVldWVJRH0gfHwgJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgbXkgJFVzZXJEZWZhdWx0UXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlVzZXJEZWZhdWx0UXVldWUnKSB8fCAnJzsKCiAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFVzZXJEZWZhdWx0UXVldWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFF1ZXVlSUQgJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgaWYgKCAhJFF1ZXVlSUQgJiYgJFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBnZXQgUXVldWVJRCBmcm9tIHRoZSB0aWNrZXQKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRRdWV1ZUlEID0gJFRpY2tldHtRdWV1ZUlEfSB8fCAnJzsKICAgIH0KCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrRW1haWxOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2V0IEpTIGRhdGEKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgU2hvd0N1c3RvbWVyVGlja2V0cyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlNob3dDdXN0b21lclRpY2tldHMnKSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtIaWRlQXV0b3NlbGVjdGVkfSApIHsKCiAgICAgICAgIyBhZGQgQXV0b3NlbGVjdCBKUwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTT25Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBDb2RlID0+ICJDb3JlLkZvcm0uSW5pdEhpZGVBdXRvc2VsZWN0ZWQoeyBGaWVsZElEczogJFBhcmFte0hpZGVBdXRvc2VsZWN0ZWR9IH0pOyIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHN0cmluZwogICAgJFBhcmFte09wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtVc2Vyc30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUnLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQYXJhbXtOZXh0U3RhdGVzfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtOZXh0U3RhdGV9IHx8ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgKTsKCiAgICAjIGJ1aWxkIERlc3RpbmF0aW9uIHN0cmluZwogICAgbXkgJU5ld1RvOwogICAgaWYgKCAkUGFyYW17RnJvbUxpc3R9ICkgewogICAgICAgIGZvciBteSAkS2V5RnJvbSAoIHNvcnQga2V5cyAleyAkUGFyYW17RnJvbUxpc3R9IH0gKSB7CiAgICAgICAgICAgICROZXdUb3siJEtleUZyb218fCRQYXJhbXtGcm9tTGlzdH0tPnskS2V5RnJvbX0ifSA9ICRQYXJhbXtGcm9tTGlzdH0tPnskS2V5RnJvbX07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhJFBhcmFte0Zyb21TZWxlY3RlZH0gKSB7CiAgICAgICAgbXkgJFVzZXJEZWZhdWx0UXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlVzZXJEZWZhdWx0UXVldWUnKSB8fCAnJzsKCiAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkVXNlckRlZmF1bHRRdWV1ZSApOwogICAgICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtGcm9tU2VsZWN0ZWR9ID0gIiRRdWV1ZUlEfHwkVXNlckRlZmF1bHRRdWV1ZSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgJFBhcmFte0Zyb21TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplIEZvcm1VcGRhdGUgJyAuICggJFBhcmFte0Vycm9yc30tPntEZXN0aW5hdGlvbkludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtGcm9tU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSBGb3JtVXBkYXRlICcgLiAoICRQYXJhbXtFcnJvcnN9LT57RGVzdGluYXRpb25JbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0N1c3RvbWVyRGF0YX0sCiAgICAgICAgICAgIE1heCAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlTWF4U2l6ZScpLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEtleUVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5RXJyb3J9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRLZXlFcnJvcn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBGcm9tIGV4dGVybmFsCiAgICBteSAkU2hvd0Vycm9ycyA9IDE7CiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9ICYmCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57RW1haWx9ICYmCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57Q3VzdG9tZXJ9CiAgICAgICAgKQogICAgewogICAgICAgICRTaG93RXJyb3JzID0gMDsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRnJvbUV4dGVybmFsQ3VzdG9tZXInLAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRGF0YUVtYWlsJywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0VtYWlsfSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0RhdGFDdXN0b21lcicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0tPntDdXN0b21lcn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSB9ICkgewogICAgICAgICAgICBpZiAoICEkU2hvd0Vycm9ycyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBlbXB0eSB2YWx1ZXMgZm9yIGVycm9ycwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yfSAgICA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckRpc2FibGVkfSA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaG93RXJyb3JzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckJjYyApIHsKICAgICAgICAkUGFyYW17QmNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckJjYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgVG8KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaG93RXJyb3JzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIrKywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtUb0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnVG9TZXJ2ZXJFcnJvck1zZycgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtUb0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17Q2NJbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIGlmICggJFBhcmFte0JjY0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JjY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtCY2NJbnZhbGlkfSA9ICcnOwogICAgfQoKICAgICMgYnVpbGQgdHlwZSBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplIEZvcm1VcGRhdGUgJyAuICggJFBhcmFte0Vycm9yc30tPntUeXBlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VHlwZXN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc2VydmljZSBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICA9PiAkUGFyYW17U2VydmljZXN9LAogICAgICAgICAgICBOYW1lICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlICcKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+ICRUcmVlVmlldywKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuZGF0b3J5ID0+ICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtTTEFzfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlICcKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtFcnJvcnN9LT57U0xBSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNMQU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBleGlzdHMgY3JlYXRlIHRlbXBsYXRlcyByZWdhcmRsZXNzIHRoZSBxdWV1ZQogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKS0+U3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiAnQ3JlYXRlJywKICAgICk7CgogICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkgewogICAgICAgICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlc30gfHwge30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IHx8ICcnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHByaW9yaXR5IHN0cmluZwogICAgaWYgKCAhJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eX0gPSAkQ29uZmlnLT57UHJpb3JpdHl9OwogICAgfQogICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17UHJpb3JpdGllc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkUGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgbXkgJFF1aWNrRGF0ZUJ1dHRvbnMgPSAkQ29uZmlnLT57UXVpY2tEYXRlQnV0dG9uc30gLy8gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEZWZhdWx0UXVpY2tEYXRlQnV0dG9ucycpOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgID0+IDAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgPT4gNSwKICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgIFF1aWNrRGF0ZUJ1dHRvbnMgICAgID0+ICRRdWlja0RhdGVCdXR0b25zLAogICAgKTsKCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3T3duZXJTZWxlY3Rpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcmVzcG9uc2libGUgc2VsZWN0aW9uCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1Jlc3BvbnNpYmxlU2VsZWN0aW9uJykKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LT57Jyd9ID0gJy0nOwogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZU9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlbmRlciBkeW5hbWljIGZpZWxkcwogICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkR5bmFtaWNGaWVsZDo6TWFzaycpLT5FZGl0U2VjdGlvblJlbmRlcigKICAgICAgICBDb250ZW50ICAgICAgICAgICAgICA9PiAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSwKICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzICAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZH0sCiAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBhcmFte0RGUG9zc2libGVWYWx1ZXN9LAogICAgICAgIEVycm9ycyAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gJFBhcmFte1Zpc2liaWxpdHl9LAogICAgICAgIE9iamVjdCAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkfS0+JSosCiAgICAgICAgfSwKICAgICk7CgogICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IHRoZSBjdXN0b21lciB1c2VyIGFkZHJlc3MgYm9vayBpZiB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRDdXN0b21lclVzZXJBZGRyZXNzQm9va30gKSB7CiAgICAgICAgJFBhcmFte09wdGlvbkN1c3RvbWVyVXNlckFkZHJlc3NCb29rfSA9IDE7CiAgICB9CgogICAgIyBzaG93IGN1c3RvbWVyIGVkaXQgbGluawogICAgbXkgJE9wdGlvbkN1c3RvbWVyID0gJExheW91dE9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBBY3Rpb24gPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CgogICAgbXkgJFNob3duT3B0aW9uc0Jsb2NrOwoKICAgIGlmICgkT3B0aW9uQ3VzdG9tZXIpIHsKCiAgICAgICAgIyBjaGVjayBpZiBuZWVkIHRvIGNhbGwgT3B0aW9ucyBibG9jawogICAgICAgIGlmICggISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPcHRpb25DdXN0b21lcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBleHBsYW5hdG9yeSBtZXNzYWdlIGFib3V0IGFzdGVyaXNrCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXN0ZXJpc2tFeHBsYW5hdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRFbWFpbCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmailOutbound.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiNGNlMTgzMjcxZTE1MjY2MTQyMTkxMjY5MzNmMjA0YzAxOTZhYjM0IC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7JVBhcmFtfSwgJFR5cGU7CgogICAgIyBUcnkgdG8gbG9hZCBkcmFmdCBpZiByZXF1ZXN0ZWQuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0Zvcm1EcmFmdH0KICAgICAgICAmJiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRJRCcgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+TG9hZEZvcm1EcmFmdCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApLAogICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICBteSAkRGVmaW5pdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6Ok1hc2snKS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBNYXNrID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICkgfHwge307CgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ICAgPSBbXTsKICAgICRTZWxmLT57TWFza0RlZmluaXRpb259ID0gJERlZmluaXRpb24tPntNYXNrfTsKCiAgICAjIGFsaWduIHN5c2NvbmZpZyBhbmQgdGlja2V0IG1hc2sgZGF0YSBJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7ICREeW5hbWljRmllbGRMaXN0IC8vIFtdIH0gKSB7CiAgICAgICAgaWYgKCBleGlzdHMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgIG15ICRQYXJhbWV0ZXJzID0gZGVsZXRlICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9IC8vIHt9OwoKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGQtPnskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2ggJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0tPkAqLCB7CiAgICAgICAgICAgICAgICBERiAgICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICRDb25maWctPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyID8gMSA6IDAsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoICRDb25maWctPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+e01hbmRhdG9yeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCosICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSUkKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfS0+JSogKSB7CiAgICAgICAgcHVzaCAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqLCAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyREeW5hbWljRmllbGROYW1lfSAvLyB7fTsKCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9Wy0xXXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dDsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIGFjdHVhbCBhY2wgYWN0aW9uIGRhdGEKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICgkQUNMKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgZm9yIGZhaWxlZCBkcmFmdCBsb2FkaW5nIHJlcXVlc3QuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xvYWRGb3JtRHJhZnQnICkKICAgICAgICAmJiAhJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTG9hZGluZyBkcmFmdCBmYWlsZWQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZW5kRW1haWwnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPlNlbmRFbWFpbCgpOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGVUZW1wbGF0ZScgKSB7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgICAgIHF3KAogICAgICAgICAgICAgICAgTmV3U3RhdGVJRCBOZXdQcmlvcml0eUlEIFRpbWVVbml0cyBJc1Zpc2libGVGb3JDdXN0b21lciBUaXRsZSBCb2R5IFN1YmplY3QgTmV3UXVldWVJRAogICAgICAgICAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZCBSZXBseVRvQXJ0aWNsZSBTdGFuZGFyZFRlbXBsYXRlSUQgQ3JlYXRlQXJ0aWNsZQogICAgICAgICAgICAgICAgRWxlbWVudENoYW5nZWQKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgfQoKICAgICAgICBteSAlVGlja2V0ICAgICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkVGlja2V0e0N1c3RvbWVyVXNlcklEfTsKICAgICAgICBteSAkUXVldWVJRCAgICAgID0gJFRpY2tldHtRdWV1ZUlEfTsKCiAgICAgICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc30gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCB8fCAnJywKICAgICAgICApOwoKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwoKICAgICAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICAgICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAgICAgIyB1cGRhdGUgdGlja2V0IGJvZHkgYW5kIGF0dGFjaG1lbnRzIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgKSB7CiAgICAgICAgICAgIG15IEBUaWNrZXRBdHRhY2htZW50czsKICAgICAgICAgICAgbXkgJFRlbXBsYXRlVGV4dDsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBhdHRhY2htZW50cyBmcm9tIHRoZSBVcGxvYWQgY2FjaGUKICAgICAgICAgICAgbXkgJFJlbW92ZVN1Y2Nlc3MgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSZW1vdmVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRm9ybSBhdHRhY2htZW50cyBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBsYXRlIHRleHQgYW5kIHNldCBuZXcgYXR0YWNobWVudHMgaWYgYSB0ZW1wbGF0ZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgU3RkQXR0YWNobWVudE9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwoKICAgICAgICAgICAgICAgICMgYWRkIHN0ZC4gYXR0YWNobWVudHMgdG8gdGlja2V0CiAgICAgICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRJRCApOwogICAgICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlbmQgYSBsaXN0IG9mIGF0dGFjaG1lbnRzIGluIHRoZSB1cGxvYWQgY2FjaGUgYmFjayB0byB0aGUgY2xpZW50IHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgIyB3aGljaCByZW5kZXJzIHRoZW4gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHVwbG9hZGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBAVGlja2V0QXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBUaWNrZXRBdHRhY2htZW50cykgewogICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gJExheW91dE9iamVjdC0+SHVtYW5SZWFkYWJsZURhdGFTaXplKAogICAgICAgICAgICAgICAgICAgICAgICBTaXplID0+ICRBdHRhY2htZW50LT57RmlsZXNpemV9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IHRoZSBmaXJzdCBhcnRpY2xlIG9mIHRoZSB0aWNrZXQuCiAgICAgICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgICAgICAgICBteSBATWV0YUFydGljbGVzICA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBPbmx5Rmlyc3QgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRNZXRhQXJ0aWNsZXNbMF0gfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgJXsgJE1ldGFBcnRpY2xlc1swXSB9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgdGhlIG1hdGNoaW5nIHNpZ25hdHVyZSBmb3IgdGhlIGN1cnJlbnQgdXNlcgogICAgICAgICAgICBteSAkU2lnbmF0dXJlID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TaWduYXR1cmUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhcHBlbmQgdGhlIHNpZ25hdHVyZSB0byB0aGUgYm9keSB0ZXh0CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlVGV4dCAuICc8YnI+PGJyPicgLiAkU2lnbmF0dXJlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZVRleHQgLiAiXG5cbiIgLiAkU2lnbmF0dXJlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAVGVtcGxhdGVBSkFYID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlTm90ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gPyAwIDogMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+QWpheFVwZGF0ZSgpOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPlNlbmRFbWFpbCgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT5Gb3JtKCk7CiAgICB9CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBGb3JtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUVycm9yOwogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgQUNMIGNvbXBhdGliaWxpdHkgdHJhbnNsYXRpb24KICAgICRBQ0xDb21wYXRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV4dFN0YXRlSUQnICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnR290IG5vIFRpY2tldElEIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnU3lzdGVtIEVycm9yIScpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgIyBnZXQgdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgbXkgJUdldFBhcmFtRXh0ZW5kZWQgPSAkU2VsZi0+X0dldEV4dGVuZGVkUGFyYW1zKCk7CgogICAgbXkgJUdldFBhcmFtICAgICAgICAgICAgPSAleyAkR2V0UGFyYW1FeHRlbmRlZHtHZXRQYXJhbX0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyICAgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lcn0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2MgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lckNjfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2MgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9OwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKCiAgICAgICAgICAgIG15ICRMb2NrID0gJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJExvY2spIHsKCiAgICAgICAgICAgICAgICAjIFNldCBuZXcgb3duZXIgaWYgdGlja2V0IG93bmVyIGlzIGRpZmZlcmVudCB0aGVuIGxvZ2dlZCB1c2VyLgogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0e093bmVySUR9ICE9ICRTZWxmLT57VXNlcklEfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBSZW1lbWJlciBwcmV2aW91cyBvd25lciwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc3RvcmUgdGlja2V0IG93bmVyIG9uIHVuZG8gYWN0aW9uLgogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXNMb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIHRpY2tldCBvd25lciB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCBzZWxlY3RlZCBvciBsYXN0IGN1c3RvbWVyIGFydGljbGUuCiAgICBteSAlRGF0YTsKICAgIGlmICggJEdldFBhcmFte0FydGljbGVJRH0gKSB7CiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICApOwogICAgICAgICVEYXRhID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBpZiBhcnRpY2xlIGlzIGZyb20gdGhlIHNhbWUgVGlja2V0SUQgYXMgd2UgY2hlY2tlZCBwZXJtaXNzaW9ucyBmb3IuCiAgICAgICAgaWYgKCAkRGF0YXtUaWNrZXRJRH0gbmUgJFNlbGYtPntUaWNrZXRJRH0gKSB7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0FydGljbGUgZG9lcyBub3QgYmVsb25nIHRvIHRpY2tldCAlcyEnLCAkU2VsZi0+e1RpY2tldElEfSApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIEdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUuCiAgICAgICAgbXkgQE1ldGFBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnY3VzdG9tZXInLAogICAgICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKEBNZXRhQXJ0aWNsZXMpIHsKICAgICAgICAgICAgJURhdGEgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRNZXRhQXJ0aWNsZXNbMF0gfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAleyAkTWV0YUFydGljbGVzWzBdIH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBzaWduYXR1cmUKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwogICAgJERhdGF7U2lnbmF0dXJlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICBEYXRhICAgICAgPT4gXCVEYXRhLAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggJEdldFBhcmFte0VtYWlsVGVtcGxhdGVJRH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlCiAgICAgICAgJERhdGF7U3RkVGVtcGxhdGV9ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICA9PiAkRGF0YXtBcnRpY2xlSUR9LAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtFbWFpbFRlbXBsYXRlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2lnbmF0dXJlCiAgICAgICAgJERhdGF7U2lnbmF0dXJlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGVtcHR5IHRoZSBib2R5IGZvciBwcmVwYXJhdGlvbgogICAgJERhdGF7Qm9keX0gPSAnJzsKCiAgICAjIHByZXBhcmUgYm9keSBmb3IgcmljaHRleHQgb3IgcGxhaW50ZXh0IGNvbnRlbnQKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgYWRkIHRoZSB0ZW1wCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RW1haWxUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAkRGF0YXtTdGRUZW1wbGF0ZX0gLiAnPGJyLz4nIC4gJERhdGF7Qm9keX07CiAgICAgICAgfQoKICAgICAgICAkRGF0YXtCb2R5fSA9ICREYXRhe0JvZHl9IC4gJERhdGF7U2lnbmF0dXJlfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGFkZCB0aGUgdGVtcAogICAgICAgIGlmICggJEdldFBhcmFte0VtYWlsVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7U3RkVGVtcGxhdGV9IC4gIlxuIiAuICREYXRhe0JvZHl9OwogICAgICAgIH0KCiAgICAgICAgJERhdGF7Qm9keX0gPSAkRGF0YXtCb2R5fSAuICREYXRhe1NpZ25hdHVyZX07CgogICAgICAgICMgcHJlcGFyZSBib2R5IGZvciBwbGFpbiB0ZXh0CiAgICAgICAgJERhdGF7Qm9keX0gPX4gcy9cdC8gL2c7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIGVtYWlsCiAgICBpZiAoICRHZXRQYXJhbXtFbWFpbFRlbXBsYXRlSUR9ICkgewogICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17RW1haWxUZW1wbGF0ZUlEfSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkSUQgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRJRCApOwogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEF0dGFjaG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgY2hlY2sgc29tZSB2YWx1ZXMKICAgIGZvciBteSAkUmVjaXBpZW50IChxdyhUbyBDYyBCY2MgU3ViamVjdCkpIHsKICAgICAgICBpZiAoICREYXRheyRSZWNpcGllbnR9ICkgewogICAgICAgICAgICBkZWxldGUgJERhdGF7JFJlY2lwaWVudH07CiAgICAgICAgfQogICAgfQoKICAgICMgcHV0ICYgZ2V0IGF0dHJpYnV0ZXMgbGlrZSBzZW5kZXIgYWRkcmVzcwogICAgJURhdGEgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPkF0dHJpYnV0ZXMoCiAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICBEYXRhICAgICAgPT4gXCVEYXRhLAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgcHJlcGFyZSB0aGUgc3ViamVjdAogICAgJERhdGF7U3ViamVjdH0gPX4gc3sgXEEgKD86IC4qPyA6IFxzKikgfXt9eG1zOwoKICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgaWYgKCByZWYoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSApIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFRpY2tldHtRdWV1ZUlEfTsKCiAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkTmV3UGFyYW1zID0gJE9iamVjdC0+UnVuKCAlRGF0YSwgJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgIGlmICgkTmV3UGFyYW1zKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkTmV3UGFyYW1zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgJUVycm9yID0gKCAlRXJyb3IsICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgcmVtZW1iZXIgZHluYW1pYyBmaWVsZCB2YWxpZGF0aW9uIHJlc3VsdHMgaWYgZXJyb25lb3VzCiAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXM7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCogKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CgogICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwogICAgfQoKICAgICMgZXh0cmFjdCBkeW5hbWljIGZpZWxkIHZhbHVlcyBmcm9tIHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0REZWYWx1ZXMgPQogICAgICAgIG1hcCAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXy0+e05hbWV9ID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gfSB9CiAgICAgICAgZ3JlcCB7ICRfLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgfQogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCo7CgogICAgIyBidWlsZCB2aWV3CiAgICAjIHN0YXJ0IHdpdGggcGFnZQogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgKTsKCiAgICAjIEluZm9ybSBhIHVzZXIgdGhhdCBhcnRpY2xlIHN1YmplY3Qgd2lsbCBiZSBlbXB0eSBpZiBjb250YWlucyBvbmx5IHRoZSB0aWNrZXQgaG9vayAoaWYgbm90aGluZyBpcyBtb2RpZmllZCkuCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICBEYXRhID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXJ0aWNsZSBzdWJqZWN0IHdpbGwgYmUgZW1wdHkgaWYgdGhlIHN1YmplY3QgY29udGFpbnMgb25seSB0aGUgdGlja2V0IGhvb2shJyksCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgIFRpY2tldE51bWJlciAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBUaXRsZSAgICAgICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICBDdXN0b21lcklEICAgICA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgTmV4dFN0YXRlcyAgICAgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICApLAogICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICA6ICcnCiAgICAgICAgKSwKICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgJURhdGEsCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIERGUG9zc2libGVWYWx1ZXMgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICBERlZhbHVlcyAgICAgICAgID0+IFwlVGlja2V0REZWYWx1ZXMsCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFNlbmRFbWFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcjsKICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgICMgQUNMIGNvbXBhdGliaWxpdHkgdHJhbnNsYXRpb24KICAgICRBQ0xDb21wYXRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV4dFN0YXRlSUQnICk7CgogICAgbXkgJUdldFBhcmFtRXh0ZW5kZWQgPSAkU2VsZi0+X0dldEV4dGVuZGVkUGFyYW1zKCk7CgogICAgbXkgJUdldFBhcmFtICAgICAgICAgICAgPSAleyAkR2V0UGFyYW1FeHRlbmRlZHtHZXRQYXJhbX0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyICAgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lcn0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2MgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lckNjfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2MgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9OwoKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgR2V0IGFuZCB2YWxpZGF0ZSBkcmFmdCBhY3Rpb24uCiAgICBteSAkRm9ybURyYWZ0QWN0aW9uID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdEFjdGlvbicgKTsKICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiAmJiAhJENvbmZpZy0+e0Zvcm1EcmFmdH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnRm9ybURyYWZ0IGZ1bmN0aW9uYWxpdHkgZGlzYWJsZWQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIG15ICVGb3JtRHJhZnRSZXNwb25zZTsKCiAgICAjIENoZWNrIGRyYWZ0IG5hbWUuCiAgICBpZiAoCiAgICAgICAgJEZvcm1EcmFmdEFjdGlvbgogICAgICAgICYmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJyB8fCAkRm9ybURyYWZ0QWN0aW9uIGVxICdVcGRhdGUnICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFRpdGxlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdFRpdGxlJyApOwoKICAgICAgICAjIEEgZHJhZnQgbmFtZSBpcyByZXF1aXJlZC4KICAgICAgICBpZiAoICEkVGl0bGUgKSB7CgogICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgiRHJhZnQgbmFtZSBpcyByZXF1aXJlZCEiKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hvc2VuIGRyYWZ0IG5hbWUgbXVzdCBiZSB1bmlxdWUuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnRMaXN0R2V0KAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgRFJBRlQ6CiAgICAgICAgICAgIGZvciBteSAkRm9ybURyYWZ0ICggQHskRm9ybURyYWZ0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgIyBObyBleGlzdGluZyBkcmFmdCB3aXRoIHNhbWUgbmFtZS4KICAgICAgICAgICAgICAgIG5leHQgRFJBRlQgaWYgJFRpdGxlIG5lICRGb3JtRHJhZnQtPntUaXRsZX07CgogICAgICAgICAgICAgICAgIyBTYW1lIG5hbWUgZm9yIHVwZGF0ZSBvbiBleGlzdGluZyBkcmFmdC4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJwogICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gZXEgJEZvcm1EcmFmdC0+e0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IERSQUZUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgQW5vdGhlciBkcmFmdCB3aXRoIHRoZSBjaG9zZW4gbmFtZSBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoICJGb3JtRHJhZnQgbmFtZSAlcyBpcyBhbHJlYWR5IGluIHVzZSEiLCAkVGl0bGUgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBsYXN0IERSQUZUOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgUGVyZm9ybSBkcmFmdCBhY3Rpb24gaW5zdGVhZCBvZiBzYXZpbmcgZm9ybSBkYXRhIGluIHRpY2tldC9hcnRpY2xlLgogICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uICYmICElRm9ybURyYWZ0UmVzcG9uc2UgKSB7CgogICAgICAgICMgUmVzZXQgRm9ybURyYWZ0SUQgdG8gcHJldmVudCB1cGRhdGluZyBleGlzdGluZyBkcmFmdC4KICAgICAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApIHsKCiAgICAgICAgICAgICMgbWVkZGxpbmcgd2l0aCB0aGUgaW5uYXJkcyBvZiBLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0CiAgICAgICAgICAgICRQYXJhbU9iamVjdC0+U2V0QXJyYXkoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ0Zvcm1EcmFmdElEJywKICAgICAgICAgICAgICAgIFZhbHVlcyA9PiBbJyddCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRm9ybURyYWZ0QWN0aW9uT2s7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbk9rID0gJFBhcmFtT2JqZWN0LT5TYXZlRm9ybURyYWZ0KAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdEZWxldGUnICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0RGVsZXRlKAogICAgICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgICAgIE9iamVjdElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRGb3JtRHJhZnRBY3Rpb25PaykgewogICAgICAgICAgICAkRm9ybURyYWZ0UmVzcG9uc2V7U3VjY2Vzc30gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0NvdWxkIG5vdCBwZXJmb3JtIHJlcXVlc3RlZCBkcmFmdCBhY3Rpb24hJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCVGb3JtRHJhZnRSZXNwb25zZSkgewoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IFwlRm9ybURyYWZ0UmVzcG9uc2UsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkSXRlbSAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkSXRlbTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRJdGVtIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgIG15ICVTdGF0ZURhdGE7CgogICAgaWYgKCAkR2V0UGFyYW17Q29tcG9zZVN0YXRlSUR9ICkgewogICAgICAgICVTdGF0ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoCiAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtDb21wb3NlU3RhdGVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkTmV4dFN0YXRlID0gJFN0YXRlRGF0YXtOYW1lfTsKCiAgICAjIGNoZWNrIHBlbmRpbmcgZGF0ZQogICAgaWYgKCBkZWZpbmVkICRTdGF0ZURhdGF7VHlwZU5hbWV9ICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAjIGNvbnZlcnQgcGVuZGluZyBkYXRlIHRvIGEgZGF0ZXRpbWUgb2JqZWN0CiAgICAgICAgbXkgJFBlbmRpbmdEYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgU2Vjb25kID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gZXBvY2gKICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgaWYgKCAhJFBlbmRpbmdEYXRlVGltZU9iamVjdCB8fCAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IDwgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFRvCiAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICRFcnJvcnsnVG9JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgY2hlY2sgYm9keQogICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBjaGVjayBzdWJqZWN0CiAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICApCiAgICB7CiAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgaW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbnQgdGlja2V0CiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgcmVtZW1iZXIgZHluYW1pYyBmaWVsZCB2YWxpZGF0aW9uIHJlc3VsdHMgaWYgZXJyb25lb3VzCiAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CgogICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICMgTWFuZGF0b3J5IGlzIGFkZGVkIHRvIHRoZSBjb25maWdzIGJ5ICRTZWxmLT5uZXcKICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICREeW5hbWljRmllbGRDb25maWctPntNYW5kYXRvcnl9LAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9wYWdhdGUgdmFsaWRhdGlvbiBlcnJvciB0byB0aGUgRXJyb3IgdmFyaWFibGUgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGZyb250ZW5kCiAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICREeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgIH0KCiAgICB9CgogICAgIyB0cmFuc2Zvcm0gcGVuZGluZyB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17WWVhcn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNb250aH0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtEYXl9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17SG91cn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNaW51dGV9CiAgICAgICAgKQogICAgewogICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICMgY2hlY2sgc29tZSB2YWx1ZXMKICAgIExJTkU6CiAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICBuZXh0IExJTkUgaWYgISRHZXRQYXJhbXskTGluZX07CiAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEdldFBhcmFteyRMaW5lfSApICkgewogICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdFcnJvclR5cGUnIH0gPSAkTGluZSAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdJbnZhbGlkJyB9ICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgQWRkcmVzc09iamVjdCA9PiAkRW1haWwsCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkSXNMb2NhbCkgewogICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdJc0xvY2FsQWRkcmVzcycgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBNYWtlIHN1cmUgc2VuZGVyIGlzIGNvcnJlY3Qgb25lLiBTZWUgYnVnIzE0ODcyICggaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDg3MiApLgogICAgJEdldFBhcmFte0Zyb219ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPlNlbmRlcigKICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0gKSB7CgogICAgICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IHNhdmUgZm9ybSBpZiBhIGRyYWZ0IHdhcyBsb2FkZWQuCiAgICAgICAgJUVycm9yID0gKCBMb2FkZWRGb3JtRHJhZnQgPT4gMSApOwogICAgfQoKICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgbXkgJUFydGljbGVQYXJhbTsKICAgIGlmICggcmVmKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkTXVsdGlwbGU7CgogICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFN0b3JlTmV3ID0+IDEsCiAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG9wdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3Rpb24KICAgICAgICAgICAgIyBhbmQgYWRkIHRoZW0gYmFjayB0byB0aGUgc2VsZWN0aW9uIHNvIHRoYXQgdGhlIHN1Ym1pdAogICAgICAgICAgICAjIHdpbGwgY29udGFpbiBvcHRpb25zIHRoYXQgd2VyZSBoaWRkZW4gZnJvbSB0aGUgYWdlbnQKICAgICAgICAgICAgbXkgJEtleSA9ICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRPcHRpb25zVG9SZW1vdmVBSkFYJykgKSB7CiAgICAgICAgICAgICAgICBteSBAUmVtb3ZlZE9wdGlvbnMgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CiAgICAgICAgICAgICAgICBpZiAoQFJlbW92ZWRPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRNdWx0aXBsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW92ZWRPcHRpb24gKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkR2V0UGFyYW17JEtleX0gfSwgJFJlbW92ZWRPcHRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9IHNoaWZ0IEBSZW1vdmVkT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGlja2V0IHBhcmFtcwogICAgICAgICAgICAlQXJ0aWNsZVBhcmFtID0gKAogICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICRPYmplY3QtPkFydGljbGVPcHRpb24oCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGVycm9ycwogICAgICAgICAgICAlRXJyb3IgPSAoCiAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFuIGVycm9yLgogICAgIyBBbiBlcnJvciBpcyBub3QgbmVjZXNzYXJpbHkgYmFkLCBvZnRlbiBpdCBpcyBqdXN0IHRoYXQgYSBmb3JtIGRyYWZ0IGhhcyBiZWVuIGxvYWRlZC4KICAgIGlmICglRXJyb3IpIHsKICAgICAgICBteSAkUXVldWVJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFF1ZXVlSUQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgICAgICMgZXh0cmFjdCBkeW5hbWljIGZpZWxkIHZhbHVlcyBmcm9tIHRpY2tldCBkYXRhCiAgICAgICAgbXkgJVRpY2tldERGVmFsdWVzID0KICAgICAgICAgICAgbWFwICB7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSB9IH0KICAgICAgICAgICAgZ3JlcCB7ICRfLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgfQogICAgICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqOwoKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBXaGVuIGEgZHJhZnQgaXMgbG9hZGVkLCBpbmZvcm0gYSB1c2VyIHRoYXQgYXJ0aWNsZSBzdWJqZWN0IHdpbGwgYmUgZW1wdHkKICAgICAgICAjIGlmIGNvbnRhaW5zIG9ubHkgdGhlIHRpY2tldCBob29rIChpZiBub3RoaW5nIGlzIG1vZGlmaWVkKS4KICAgICAgICBpZiAoICRFcnJvcntMb2FkZWRGb3JtRHJhZnR9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgIERhdGEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdBcnRpY2xlIHN1YmplY3Qgd2lsbCBiZSBlbXB0eSBpZiB0aGUgc3ViamVjdCBjb250YWlucyBvbmx5IHRoZSB0aWNrZXQgaG9vayEnCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpY2tldE51bWJlciAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgIEF0dGFjaG1lbnRzICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgIERGRXJyb3JzICAgICAgICAgPT4gXCVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0LAogICAgICAgICAgICBERlZhbHVlcyAgICAgICAgID0+IFwlVGlja2V0REZWYWx1ZXMsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgcmVwbGFjZSA8T1RPQk9fVElDS0VUX1NUQVRFPiB3aXRoIG5leHQgdGlja2V0IHN0YXRlIG5hbWUKICAgIGlmICgkTmV4dFN0YXRlKSB7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKCZsdDt8PClPVE9CT19USUNLRVRfU1RBVEUoJmd0O3w+KS8kTmV4dFN0YXRlL2c7CiAgICB9CgogICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50cwogICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICk7CiAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICB9CgogICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgIyByZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMKICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICBpZiAoICRDb250ZW50SUQgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApICkgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICB9CiAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAjIHZlcmlmeSBIVE1MIGRvY3VtZW50CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIGVtYWlsCiAgICBteSAkVG8gPSAnJzsKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRHZXRQYXJhbXskS2V5fTsKICAgICAgICBpZiAoJFRvKSB7CiAgICAgICAgICAgICRUbyAuPSAnLCAnOwogICAgICAgIH0KICAgICAgICAkVG8gLj0gJEdldFBhcmFteyRLZXl9OwogICAgfQoKICAgICMgR2V0IGF0dHJpYnV0ZXMgbGlrZSBzZW5kZXIgYWRkcmVzcy4KICAgIG15ICVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPkF0dHJpYnV0ZXMoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRGF0YSAgICAgPT4ge30sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15ICRBcnRpY2xlSUQgICAgID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnRW1haWwnICktPkFydGljbGVTZW5kKAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gJEdldFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSAvLyAwLAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdFbWFpbEFnZW50JywKICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiXCVcJSRUbyIsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJERhdGF7RnJvbX0sCiAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgIEJjYyAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCY2N9LAogICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAoKICAgICAgICAjIFdlIHN0YXJ0IGEgbmV3IGNvbW11bmljYXRpb24gaGVyZSwgc28gZG9uJ3Qgc2VuZCBhbnkgcmVmZXJlbmNlcy4KICAgICAgICAjICAgVGhpcyBtaWdodCBsZWFkIHRvIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmUgKGRvbWFpbiBuYW1lczsgc2VlIGJ1ZyMxMTI0NikuCiAgICAgICAgSW5SZXBseVRvICA9PiAnJywKICAgICAgICBSZWZlcmVuY2VzID0+ICcnLAogICAgICAgIENoYXJzZXQgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICBNaW1lVHlwZSAgID0+ICRNaW1lVHlwZSwKICAgICAgICBBdHRhY2htZW50ID0+IFxAQXR0YWNobWVudERhdGEsCiAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICk7CgogICAgIyBlcnJvciBwYWdlCiAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyB0aW1lIGFjY291bnRpbmcKICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IGR5bmFtaWMgZmllbGRzCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICMgc2V0IHRoZSBvYmplY3QgSUQgKFRpY2tldElEIG9yIEFydGljbGVJRCkgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCBjb25maWd1cmF0aW9uCiAgICAgICAgbXkgJE9iamVjdElEID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyA/ICRBcnRpY2xlSUQgOiAkU2VsZi0+e1RpY2tldElEfTsKCiAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBzdGF0ZQogICAgaWYgKCROZXh0U3RhdGUpIHsKICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdGF0ZVNldCgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgU3RhdGUgICAgID0+ICROZXh0U3RhdGUsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG91bGQgSSBzZXQgYW4gdW5sb2NrPwogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIGFsbCBmb3JtIGRhdGEKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAjIElmIGZvcm0gd2FzIGNhbGxlZCBiYXNlZCBvbiBhIGRyYWZ0LAogICAgIyAgIGRlbGV0ZSBkcmFmdCBzaW5jZSBpdHMgY29udGVudCBoYXMgbm93IGJlZW4gdXNlZC4KICAgIGlmICgKICAgICAgICAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9CiAgICAgICAgJiYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0RGVsZXRlKAogICAgICAgICAgICBGb3JtRHJhZnRJRCA9PiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9LAogICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkIG5vdCBkZWxldGUgZHJhZnQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVkaXJlY3QKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRTdGF0ZURhdGF7VHlwZU5hbWV9CiAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pCiAgICAgICAgJiYgISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVkaXJlY3RBZnRlckNsb3NlRGlzYWJsZWQnKQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgVVJMID0+ICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9IHx8ICdBY3Rpb249QWdlbnREYXNoYm9hcmQnICksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xlSUQiLAogICAgKTsKfQoKc3ViIEFqYXhVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW07CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgJEFDTENvbXBhdEdldFBhcmFte05leHRTdGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXh0U3RhdGVJRCcgKTsKCiAgICBteSAlR2V0UGFyYW1FeHRlbmRlZCA9ICRTZWxmLT5fR2V0RXh0ZW5kZWRQYXJhbXMoKTsKICAgIG15ICVHZXRQYXJhbSAgICAgICAgID0gJXsgJEdldFBhcmFtRXh0ZW5kZWR7R2V0UGFyYW19IH07CgogICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgICMgTWFrZSBzdXJlIHNlbmRlciBpcyBjb3JyZWN0IG9uZS4gU2VlIGJ1ZyMxNDg3MiAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NzIgKS4KICAgICRHZXRQYXJhbXtGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSBARXh0ZW5kZWREYXRhOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgSk9CIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkTXVsdGlwbGU7CgogICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICMgZ2V0IEFKQVggcGFyYW0gdmFsdWVzCiAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRQYXJhbUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbiB2aXNpYmxlCiAgICAgICAgICAgICMgdG8gdGhlIGFnZW50LiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgbXkgQE9wdGlvbnNUb1JlbW92ZSA9ICRPYmplY3QtPkdldE9wdGlvbnNUb1JlbW92ZUFKQVgoJUdldFBhcmFtKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyRPcHRpb25Ub1JlbW92ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgIGlmICgkS2V5KSB7CiAgICAgICAgICAgICAgICBwdXNoIEBFeHRlbmRlZERhdGEsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+ICRNdWx0aXBsZSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRJdGVtICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRJdGVtOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZEl0ZW0gfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICk7CgogICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICBteSBARHluYW1pY0ZpZWxkQUpBWDsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICApOwoKICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc30gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgfQoKICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfTsKICAgIH0KCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ29tcG9zZVN0YXRlSUQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtDb21wb3NlU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZXh0IHN0YXRlcwogICAgbXkgJU5leHRTdGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICBteSAlU3RhdGU7CiAgICBpZiAoICEkUGFyYW17Q29tcG9zZVN0YXRlSUR9ICkgewogICAgICAgICRTdGF0ZXtTZWxlY3RlZFZhbHVlfSA9ICRDb25maWctPntTdGF0ZURlZmF1bHR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte0NvbXBvc2VTdGF0ZUlEfTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte05leHRTdGF0ZXN9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnQ29tcG9zZVN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUnLAogICAgICAgICVTdGF0ZSwKICAgICk7CgogICAgaWYgKCAhJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudH0gKSB7CiAgICAgICAgJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSA9ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3IgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRFcnJvcn0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRFcnJvcn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRRdWlja0RhdGVCdXR0b25zID0gJENvbmZpZy0+e1F1aWNrRGF0ZUJ1dHRvbnN9IC8vICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6RGVmYXVsdFF1aWNrRGF0ZUJ1dHRvbnMnKTsKCiAgICAjIHBlbmRpbmcgZGF0YSBzdHJpbmcKICAgICRQYXJhbXtQZW5kaW5nRGF0ZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJVBhcmFtLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgID0+IDAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgPT4gNSwKICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgRGlmZlRpbWUgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKSB8fCAwLAogICAgICAgIENsYXNzICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFcnJvcnN9LT57RGF0ZUludmFsaWR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJyAnLAogICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICAgICBRdWlja0RhdGVCdXR0b25zICAgICA9PiAkUXVpY2tEYXRlQnV0dG9ucywKICAgICk7CgogICAgIyBNdWx0aXBsZS1BdXRvY29tcGxldGUKICAgICMgQ2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjQ3VzdG9tZXJFcnJvckV4cGxhbmF0aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJDYyApIHsKICAgICAgICAkUGFyYW17Q2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJDYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgQmNjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckJjYyApIHsKICAgICAgICAkUGFyYW17QmNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckJjYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgVG8KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlcisrLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RvSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1RvSXNMb2NhbEFkZHJlc3N9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57QmNjRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICB7CiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3MgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gJFNlbGYtPntEeW5hbWljRmllbGR9LT5AKjsKCiAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkR5bmFtaWNGaWVsZDo6TWFzaycpLT5FZGl0U2VjdGlvblJlbmRlcigKICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgPT4gJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkQ29uZmlncywKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLAogICAgICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgICA9PiAkUGFyYW17REZWYWx1ZXN9LAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUGFyYW17REZQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAkUGFyYW17REZWYWx1ZXN9LT4lKiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyB0aGUgY3VzdG9tZXIgdXNlciBhZGRyZXNzIGJvb2sgaWYgdGhlIG1vZHVsZSBpcyByZWdpc3RlcmVkLgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50Q3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2t9ICkgewogICAgICAgICRQYXJhbXtPcHRpb25DdXN0b21lclVzZXJBZGRyZXNzQm9va30gPSAxOwogICAgfQoKICAgICMgYnVpbGQgdGV4dCB0ZW1wbGF0ZSBzdHJpbmcKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyktPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgVHlwZSAgPT4gJ0VtYWlsJywKICAgICk7CgogICAgbXkgJFF1ZXVlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICVQYXJhbSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB8fCAnJywKICAgICk7CgogICAgaWYgKAogICAgICAgIElzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcwogICAgICAgICAgICAgICAgfHwgKCAkUGFyYW17UXVldWV9ICYmIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFF1ZXVlU3RhbmRhcmRUZW1wbGF0ZXMgfHwge30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IHx8ICcnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSB9LCAkQXR0YWNobWVudDsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRMb2FkZWRGb3JtRHJhZnQ7CiAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewogICAgICAgICRMb2FkZWRGb3JtRHJhZnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdEdldCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgIE9iamVjdElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBHZXRDb250ZW50ICA9PiAwLAogICAgICAgICk7CgogICAgICAgIG15IEBBcnRpY2xlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBPbmx5TGFzdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmIChAQXJ0aWNsZXMpIHsKICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlID0gJEFydGljbGVzWzBdOwoKICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlU3lzdGVtVGltZTsKICAgICAgICAgICAgaWYgKCAkTGFzdEFydGljbGUtPntDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTGFzdEFydGljbGUtPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgPSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdFN5c3RlbVRpbWUgPSAkRm9ybURyYWZ0U3lzdGVtVGltZU9iamVjdC0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgaWYgKCAhJExhc3RBcnRpY2xlU3lzdGVtVGltZSB8fCAkRm9ybURyYWZ0U3lzdGVtVGltZSA8PSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAgICAgJFBhcmFte0Zvcm1EcmFmdE91dGRhdGVkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkTG9hZGVkRm9ybURyYWZ0KSApIHsKCiAgICAgICAgJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZUJ5TmFtZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VCeX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgRm9ybURyYWZ0ICAgICAgPT4gJENvbmZpZy0+e0Zvcm1EcmFmdH0sCiAgICAgICAgICAgIEZvcm1EcmFmdElEICAgID0+ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9LAogICAgICAgICAgICBGb3JtRHJhZnRUaXRsZSA9PiAkTG9hZGVkRm9ybURyYWZ0ID8gJExvYWRlZEZvcm1EcmFmdC0+e1RpdGxlfSA6ICcnLAogICAgICAgICAgICBGb3JtRHJhZnRNZXRhICA9PiAkTG9hZGVkRm9ybURyYWZ0LAogICAgICAgIH0sCiAgICApOwp9CgpzdWIgX0dldEV4dGVuZGVkUGFyYW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhUbyBDYyBCY2MgU3ViamVjdCBCb2R5IENvbXBvc2VTdGF0ZUlEIElzVmlzaWJsZUZvckN1c3RvbWVyIElzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudAogICAgICAgIEFydGljbGVJRCBUaW1lVW5pdHMgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgRm9ybURyYWZ0SUQgVGl0bGUpCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICBpZiAoIGRlZmluZWQgJFZhbHVlICkgewogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkVmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgICRHZXRQYXJhbXtFbWFpbFRlbXBsYXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VtYWlsVGVtcGxhdGVJRCcgKSB8fCAnJzsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJUbyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlclRvKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJUbyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudDsKCiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQgJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudCApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWUgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZSA9ICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQ2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyQ2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQ2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAxOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAkQ3VzdG9tZXJzTnVtYmVyQ2MgKSB7CiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgJENvdW50ID4gMV8wMDA7ICAgICMgYmFpbCBvdXQgd2hlbiB0aGUgbnVtYmVyIG9mIGN1c3RvbWVycyBpcyBhYm5vcm1hbGx5IGhpZ2gKCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50Q2M7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlDYyAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQ2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gPSAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gJiYgJEN1c3RvbWVyRXJyb3JDYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQ2MgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4Q2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJDYysrOwogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yQ2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eENjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lclF1ZXVlQ2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUNjID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQ2MsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQ2MsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyQmNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckJjYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAxOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAkQ3VzdG9tZXJzTnVtYmVyQmNjICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50QmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50QmNjOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5QmNjICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QmNjfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gPSAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQmNjID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eEJjYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlQmNjID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQmNjLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZUJjYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgKTsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7RW1haWx9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tFbWFpbH07Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmailResend.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiMjllZmMyNTBkMTZkYzM0NWUwMGY1MTFjZjkwNDUwOWJjZDM1ZDdjIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbFJlc2VuZC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbFJlc2VuZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIEdldCBmb3JtIElELgogICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPlByZXBhcmVGb3JtSUQoCiAgICAgICAgUGFyYW1PYmplY3QgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBUaWNrZXRJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdFbWFpbCcgKTsKCiAgICAjIEdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZS4KICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgQ2hlY2sgcGVybWlzc2lvbnMuCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgRXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IGFydGljbGUgYWN0aW9uLgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRDb25maWctPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgQUNMIHJlc3RyaWN0aW9ucy4KICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICMgQ2hlY2sgaWYgQUNMIHJlc3RyaWN0aW9ucyBleGlzdC4KICAgIGlmICgkQUNMKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgU2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbi4KICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxCiAgICApOwoKICAgICMgR2V0IGxvY2sgc3RhdGUuCiAgICBteSAkVGlja2V0QmFja1R5cGUgPSAnVGlja2V0QmFjayc7CiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CgogICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgaWYgKCAkTG9jayAmJiAoICRUaWNrZXR7T3duZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgKSB7CgogICAgICAgICAgICAgICAgIyBSZW1lbWJlciBwcmV2aW91cyBvd25lciwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc3RvcmUgdGlja2V0IG93bmVyIG9uIHVuZG8gYWN0aW9uLgogICAgICAgICAgICAgICAgJFRpY2tldHtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRUaWNrZXRCYWNrVHlwZSAuPSAnVW5kbyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgbXkgJUdldFBhcmFtOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICAgICAgRnJvbSBUbyBDYyBCY2MgU3ViamVjdCBCb2R5IEluUmVwbHlUbyBSZWZlcmVuY2VzIEFydGljbGVJRAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnQgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgVGltZVVuaXRzIEZvcm1JRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CgogICAgaWYgKCAhJEdldFBhcmFte0FydGljbGVJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQXJ0aWNsZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEhhc2ggZm9yIGxvb2t1cCBvZiBkdXBsaWNhdGVkIGVudHJpZXMuCiAgICBteSAlQWRkcmVzc2VzTGlzdDsKCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJUbyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyVG8pIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlclRvICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50OwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRTZWxlY3RlZCBlcSAkQ291bnQgPyAnY2hlY2tlZCAnIDogJycgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudCApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzLgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eCAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lclF1ZXVlIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWUgPSAkQ291bnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXIsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAkQ3VzdG9tZXJTZWxlY3RlZCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2csCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlckNjICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudENjOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZUNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJRdWV1ZV8nIC4gJENvdW50ICkgfHwgJyc7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDY30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9ID0gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQ2MgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudENjICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ICYmICRDdXN0b21lckVycm9yQ2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXhDYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWVDYyA9ICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckNjLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0NjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZUNjLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJCY2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlckJjYyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudEJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudEJjYzsKCiAgICAgICAgICAgIG15ICRDdXN0b21lcktleUJjYyAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZUJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JjY30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBlbWFpbCBhZGRyZXNzLgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQmNjICAgID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRDdXN0b21lckVsZW1lbnRCY2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcy4KICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQmNjID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eEJjYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlQmNjID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQmNjLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZUJjYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwogICAgbXkgJE1haW5PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIFNlbmQgZW1haWwuCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VuZEVtYWlsJyApIHsKCiAgICAgICAgIyBDaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbi4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAgICAgIyBDaGVjayBzb21lIHZhbHVlcy4KICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISRHZXRQYXJhbXskTGluZX07CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskTGluZX0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdFcnJvclR5cGUnIH0gPSAkTGluZSAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRMaW5lIC4gJ0lzTG9jYWxBZGRyZXNzJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRXJyb3J7VG9Jc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEVycm9ye0NjSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFcnJvcntCY2NJc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhLgogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgc29tZSB2YWx1ZXMuCiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBMSU5FIGlmICEkR2V0UGFyYW17JExpbmV9OwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkR2V0UGFyYW17JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgc3ViamVjdC4KICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRFcnJvcntTdWJqZWN0SW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgYm9keS4KICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICRFcnJvcntCb2R5SW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgdGltZSB1bml0cy4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9ye1RpbWVVbml0c0ludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgUHJlcGFyZSBzdWJqZWN0LgogICAgICAgIG15ICRUbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVG4sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUFydGljbGVQYXJhbTsKCiAgICAgICAgIyBSdW4gY29tcG9zZSBtb2R1bGVzLgogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIFVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMuCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9ICk7CgogICAgICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBSdW4gbW9kdWxlLgogICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTdG9yZU5ldyA9PiAxLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIGFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUKICAgICAgICAgICAgICAgICMgICBzdWJtaXQgd2lsbCBjb250YWluIG9wdGlvbnMgdGhhdCB3ZXJlIGhpZGRlbiBmcm9tIHRoZSBhZ2VudC4KICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAUmVtb3ZlZE9wdGlvbnMgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW92ZWRPcHRpb24gKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gc2hpZnQgQFJlbW92ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgVGlja2V0IHBhcmFtcy4KICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sICVBcnRpY2xlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEdldCBlcnJvcnMuCiAgICAgICAgICAgICAgICAlRXJyb3IgPSAoCiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlfSA9ICRHZXRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXRCYWNrVHlwZSAgICAgID0+ICRUaWNrZXRCYWNrVHlwZSwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgR2V0IHByZS1sb2FkZWQgYXR0YWNobWVudHMuCiAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgc3VibWl0IGF0dGFjaG1lbnQuCiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIEdldCByZWNpcGllbnRzLgogICAgICAgIG15ICRSZWNpcGllbnRzID0gJyc7CiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKCiAgICAgICAgICAgIG5leHQgTElORSBpZiAhJEdldFBhcmFteyRMaW5lfTsKCiAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgJFJlY2lwaWVudHMgLj0gJywgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAkR2V0UGFyYW17JExpbmV9OwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyBSZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMuCiAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzLgogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkuCiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICRHZXRQYXJhbXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudERhdGEgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIFZlcmlmeSBIVE1MIGRvY3VtZW50LgogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICAgICAgaWYgKCAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50fSApIHsKICAgICAgICAgICAgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJEdldFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSA/IDEgOiAwOwogICAgICAgIH0KCiAgICAgICAgIyBTZW5kIGVtYWlsLgogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnRW1haWxSZXNlbmQnLAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiXCVcJSRSZWNpcGllbnRzIiwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0Zyb219LAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgSW5SZXBseVRvICAgICAgICAgICAgPT4gJEdldFBhcmFte0luUmVwbHlUb30sCiAgICAgICAgICAgIFJlZmVyZW5jZXMgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZWZlcmVuY2VzfSwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgRXJyb3IgcGFnZS4KICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgVGltZSBhY2NvdW50aW5nLgogICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgYWxsIGZvcm0gZGF0YQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBMb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAuCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENoZWNrIGZvciBTTUlNRSAvIFBHUCBpZiBjdXN0b21lciBoYXMgY2hhbmdlZC4KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgbXkgQEV4dGVuZGVkRGF0YTsKCiAgICAgICAgIyBSdW4gY29tcG9zZSBtb2R1bGVzLgogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIFVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMuCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgTG9hZCBtb2R1bGUuCiAgICAgICAgICAgICAgICBuZXh0IEpPQiBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRNdWx0aXBsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUnVuIG1vZHVsZS4KICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIEdldCBBSkFYIHBhcmFtIHZhbHVlcy4KICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRQYXJhbUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJE9iamVjdC0+R2V0UGFyYW1BSkFYKCVHZXRQYXJhbSkgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEdldCBvcHRpb25zIHRoYXQgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbiB2aXNpYmxlIHRvIHRoZSBhZ2VudC4gVGhlc2Ugb3B0aW9ucyB3aWxsIGJlCiAgICAgICAgICAgICAgICAjICAgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAT3B0aW9uc1RvUmVtb3ZlID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskT3B0aW9uVG9SZW1vdmV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgaWYgKCRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFeHRlbmRlZERhdGEsIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+ICRNdWx0aXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDE1MCwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFydGljbGUgZGF0YS4KICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICk7CiAgICAgICAgbXkgJURhdGEgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFydGljbGUgdG8gcXVvdGUuCiAgICAgICAgJERhdGF7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgIEF0dGFjaG1lbnRzSW5jbHVkZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEuCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFN5c3RlbUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpOwoKICAgICAgICAjIEdldCBvbmx5IGVtYWlsIGFkZHJlc3MgaW4gJ1RvJyAoanVzdCAnc29tZUBleGFtcGxlLmNvbScpLgogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRhe1RvfSApICkgewogICAgICAgICAgICAkRGF0YXtUb0VtYWlsfSA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICk7CiAgICAgICAgfQoKICAgICAgICAjIEZpbmQgZHVwbGljYXRlIGFkZHJlc3Nlcy4KICAgICAgICBteSAlUmVjaXBpZW50OwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBpZiAoICREYXRheyRUeXBlfSApIHsKICAgICAgICAgICAgICAgIG15ICROZXdMaW5lID0gJyc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkRGF0YXskVHlwZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWRkcmVzcyA9IGxjICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICk7CgogICAgICAgICAgICAgICAgICAgICMgT25seSB1c2UgZW1haWwgYWRkcmVzc2VzIHdpdGggJ0AnIGluc2lkZS4KICAgICAgICAgICAgICAgICAgICBpZiAoICRBZGRyZXNzICYmICRBZGRyZXNzID1+IC9ALyAmJiAhJFJlY2lwaWVudHskQWRkcmVzc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnR7JEFkZHJlc3N9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkU3lzdGVtQWRkcmVzcy0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkQWRkcmVzcywKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRJc0xvY2FsICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCROZXdMaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0xpbmUgLj0gJywgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdMaW5lIC49ICRFbWFpbEFkZHJlc3NPYmplY3QtPkZvcm1hdCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheyRUeXBlfSA9ICROZXdMaW5lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIHNvbWUgdmFsdWVzLgogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISREYXRheyRMaW5lfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJERhdGF7JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAiSW52YWxpZCIgfSA9ICIgU2VydmVyRXJyb3IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJERhdGF7RnJvbX0gKSB7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRhe0Zyb219ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRnJvbUludmFsaWQifSAuPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUnVuIGNvbXBvc2UgbW9kdWxlcy4KICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIExvYWQgbW9kdWxlLgogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSApOwoKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUnVuIG1vZHVsZS4KICAgICAgICAgICAgICAgIG15ICROZXdQYXJhbXMgPSAkT2JqZWN0LT5SdW4oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCROZXdQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJE5ld1BhcmFtczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgZXJyb3JzLgogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQnVpbGQgdmlldy4KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgVGlja2V0QmFja1R5cGUgPT4gJFRpY2tldEJhY2tUeXBlLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIG15ICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn07CiAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnR9ICkgewogICAgICAgICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRQYXJhbXtHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lcn0gPyAxIDogMDsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJc1Zpc2libGVGb3JDdXN0b21lcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRJc1Zpc2libGVGb3JDdXN0b21lciwKICAgICAgICB9LAogICAgKTsKCiAgICAjIFByZXBhcmUgZXJyb3JzIGZvciB0aGUgb3V0cHV0LgogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskRXJyb3J9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskRXJyb3J9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEhhbmRsZSBtdWx0aXBsZSBhdXRvY29tcGxldGUgaW4gcmVjaXBpZW50IGZpZWxkcy4KICAgICRQYXJhbXtUb30gPSAoIHNjYWxhciBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSA/ICcnIDogJFBhcmFte1RvfSApOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUb30gJiYgJFBhcmFte1RvfSBuZSAnJyApIHsKICAgICAgICAkUGFyYW17VG9JbnZhbGlkfSA9ICcnOwogICAgfQogICAgJFBhcmFte0NjfSA9ICggc2NhbGFyIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9IH0gPyAnJyA6ICRQYXJhbXtDY30gKTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17Q2N9ICYmICRQYXJhbXtDY30gbmUgJycgKSB7CiAgICAgICAgJFBhcmFte0NjSW52YWxpZH0gPSAnJzsKICAgIH0KICAgICRQYXJhbXtCY2N9ID0gKCBzY2FsYXIgQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gPyAnJyA6ICRQYXJhbXtCY2N9ICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0JjY30gJiYgJFBhcmFte0JjY30gbmUgJycgKSB7CiAgICAgICAgJFBhcmFte0JjY0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgIyBQcm9jZXNzIHRoZSAnQ2MnIGZpZWxkLgogICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgU2V0IGN1c3RvbWVyIGNvdW50ZXIuCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJDYywKICAgICAgICB9LAogICAgKTsKCiAgICAjIFByb2Nlc3MgdGhlICdCY2MnIGZpZWxkLgogICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjJyAuICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJCY2MgKSB7CiAgICAgICAgJFBhcmFte0JjY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgU2V0IGN1c3RvbWVyIGNvdW50ZXIuCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjLAogICAgICAgIH0sCiAgICApOwoKICAgICMgUHJvY2VzcyB0aGUgJ1RvJyBmaWVsZC4KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBTZXQgY3VzdG9tZXIgY291bnRlci4KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIsCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17VG9JbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG9TZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgU2V0IHByZXNlbGVjdGVkIHZhbHVlcyBmb3IgJ0JjYycgZmllbGQuCiAgICBpZiAoICRQYXJhbXtCY2N9ICYmICRQYXJhbXtCY2N9IG5lICcnICYmICEkQ3VzdG9tZXJDb3VudGVyQmNjICkgewoKICAgICAgICAjIHNwbGl0IENjIHZhbHVlcwogICAgICAgIG15IEBFbWFpbEFkZHJlc3Nlc0JjYzsKICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkUGFyYW17QmNjfSApICkgewoKICAgICAgICAgICAgbXkgJUN1c3RvbWVyU2VhcmNoID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICggc29ydCBrZXlzICVDdXN0b21lclNlYXJjaCApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFbWFpbEFkZHJlc3Nlc0JjYywgewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEN1c3RvbWVyU2VhcmNoeyRDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzQmNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkRW1haWxBZGRyZXNzT2JqZWN0LT5Gb3JtYXQoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdFbWFpbEFkZHJlc3Nlc0JjYycsCiAgICAgICAgICAgIFZhbHVlID0+IFxARW1haWxBZGRyZXNzZXNCY2MsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0JjY30gPSAnJzsKICAgIH0KCiAgICAjIHNldCBwcmVzZWxlY3RlZCB2YWx1ZXMgZm9yIENjIGZpZWxkCiAgICBpZiAoICRQYXJhbXtDY30gJiYgJFBhcmFte0NjfSBuZSAnJyAmJiAhJEN1c3RvbWVyQ291bnRlckNjICkgewoKICAgICAgICAjIHNwbGl0IENjIHZhbHVlcwogICAgICAgIG15IEBFbWFpbEFkZHJlc3Nlc0NjOwogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRQYXJhbXtDY30gKSApIHsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclNlYXJjaCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApLAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVDdXN0b21lclNlYXJjaCkgewogICAgICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJTZWFyY2ggKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNDYywgewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEN1c3RvbWVyU2VhcmNoeyRDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzQ2MsIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkZvcm1hdCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VtYWlsQWRkcmVzc2VzQ2MnLAogICAgICAgICAgICBWYWx1ZSA9PiBcQEVtYWlsQWRkcmVzc2VzQ2MsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0NjfSA9ICcnOwogICAgfQoKICAgICMgc2V0IHByZXNlbGVjdGVkIHZhbHVlcyBmb3IgVG8gZmllbGQKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VG99ICYmICRQYXJhbXtUb30gbmUgJycgJiYgISRDdXN0b21lckNvdW50ZXIgKSB7CgogICAgICAgICMgc3BsaXQgVG8gdmFsdWVzCiAgICAgICAgbXkgQEVtYWlsQWRkcmVzc2VzVG87CiAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJFBhcmFte1RvfSApICkgewoKICAgICAgICAgICAgbXkgJUN1c3RvbWVyU2VhcmNoID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICggc29ydCBrZXlzICVDdXN0b21lclNlYXJjaCApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFbWFpbEFkZHJlc3Nlc1RvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkQ3VzdG9tZXJTZWFyY2h7JEN1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNUbywgewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRW1haWxBZGRyZXNzZXNUbycsCiAgICAgICAgICAgIFZhbHVlID0+IFxARW1haWxBZGRyZXNzZXNUbywKICAgICAgICApOwoKICAgICAgICAkUGFyYW17VG99ID0gJyc7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17VGlja2V0QmFja1R5cGV9LAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBTaG93IHRpbWUgYWNjb3VudGluZyBib3guCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnJzsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyB0aGUgY3VzdG9tZXIgdXNlciBhZGRyZXNzIGJvb2sgaWYgdGhlIG1vZHVsZSBpcyByZWdpc3RlcmVkLgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50Q3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2t9ICkgewogICAgICAgICRQYXJhbXtPcHRpb25DdXN0b21lclVzZXJBZGRyZXNzQm9va30gPSAxOwogICAgfQoKICAgICMgQWRkIHJpY2ggdGV4dCBlZGl0b3IuCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIFVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4uCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIFNldCB1cCByaWNoIHRleHQgZWRpdG9yLgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IGF0dGFjaG1lbnRzLgogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSB9LCAkQXR0YWNobWVudDsKICAgIH0KCiAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBDcmVhdGUgJiByZXR1cm4gb3V0cHV0LgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentTicketForward.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiNGNlMTgzMjcxZTE1MjY2MTQyMTkxMjY5MzNmMjA0YzAxOTZhYjM0IC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRGb3J3YXJkLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZvcndhcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7JVBhcmFtfSwgJFR5cGU7CgogICAgIyBUcnkgdG8gbG9hZCBkcmFmdCBpZiByZXF1ZXN0ZWQuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0Zvcm1EcmFmdH0KICAgICAgICAmJiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRJRCcgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+TG9hZEZvcm1EcmFmdCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApLAogICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICBteSAkRGVmaW5pdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6Ok1hc2snKS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBNYXNrID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICkgfHwge307CgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ICAgPSBbXTsKICAgICRTZWxmLT57TWFza0RlZmluaXRpb259ID0gJERlZmluaXRpb24tPntNYXNrfTsKCiAgICAjIGFsaWduIHN5c2NvbmZpZyBhbmQgdGlja2V0IG1hc2sgZGF0YSBJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7ICREeW5hbWljRmllbGRMaXN0IC8vIFtdIH0gKSB7CiAgICAgICAgaWYgKCBleGlzdHMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgIG15ICRQYXJhbWV0ZXJzID0gZGVsZXRlICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9IC8vIHt9OwoKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGQtPnskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2ggJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0tPkAqLCB7CiAgICAgICAgICAgICAgICBERiAgICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICRDb25maWctPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyID8gMSA6IDAsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoICRDb25maWctPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+e01hbmRhdG9yeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCosICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSUkKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfS0+JSogKSB7CiAgICAgICAgcHVzaCAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqLCAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyREeW5hbWljRmllbGROYW1lfSAvLyB7fTsKCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9Wy0xXXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBmb3IgKAogICAgICAgIHF3KFRvIENjIEJjYyBTdWJqZWN0IEJvZHkgSW5SZXBseVRvIFJlZmVyZW5jZXMgQ29tcG9zZVN0YXRlSUQgSXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50CiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgQXJ0aWNsZUlEIFRpbWVVbml0cyBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBGb3JtRHJhZnRJRCBUaXRsZSkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICBpZiAoIGRlZmluZWQgJFZhbHVlICkgewogICAgICAgICAgICAkU2VsZi0+e0dldFBhcmFtfS0+eyRffSA9ICRWYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntHZXRQYXJhbX0tPntGb3J3YXJkVGVtcGxhdGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9yd2FyZFRlbXBsYXRlSUQnICkgfHwgJyc7CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgJFNlbGYtPntBQ0xDb21wYXRHZXRQYXJhbX0tPntOZXh0U3RhdGVJRH0gPSAkU2VsZi0+e0dldFBhcmFtfS0+e0NvbXBvc2VTdGF0ZUlEfTsKCiAgICAjIEdldCBmb3JtIElELgogICAgJFNlbGYtPntHZXRQYXJhbX0tPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPlByZXBhcmVGb3JtSUQoCiAgICAgICAgUGFyYW1PYmplY3QgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPntHZXRQYXJhbX0tPntGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICgkQUNMKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgZm9yIGZhaWxlZCBkcmFmdCBsb2FkaW5nIHJlcXVlc3QuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xvYWRGb3JtRHJhZnQnICkKICAgICAgICAmJiAhJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTG9hZGluZyBkcmFmdCBmYWlsZWQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZW5kRW1haWwnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPlNlbmRFbWFpbCgpOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+QWpheFVwZGF0ZSgpOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPlNlbmRFbWFpbCgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT5Gb3JtKCk7CiAgICB9CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBGb3JtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUVycm9yOwogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtID0gJXsgJFNlbGYtPntBQ0xDb21wYXRHZXRQYXJhbX0gfTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdHb3Qgbm8gVGlja2V0SUQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdTeXN0ZW0gRXJyb3IhJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICBteSAlR2V0UGFyYW1FeHRlbmRlZCA9ICRTZWxmLT5fR2V0RXh0ZW5kZWRQYXJhbXMoKTsKCiAgICBteSAlR2V0UGFyYW0gICAgICAgICAgICA9ICV7ICRHZXRQYXJhbUV4dGVuZGVke0dldFBhcmFtfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXIgICAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYyAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQ2N9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYyA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJCY2N9IH07CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewoKICAgICAgICAgICAgbXkgJExvY2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkTG9jaykgewoKICAgICAgICAgICAgICAgICMgU2V0IG5ldyBvd25lciBpZiB0aWNrZXQgb3duZXIgaXMgZGlmZmVyZW50IHRoZW4gbG9nZ2VkIHVzZXIuCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHByZXZpb3VzIG93bmVyLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVzdG9yZSB0aWNrZXQgb3duZXIgb24gdW5kbyBhY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1ByZXZpb3VzT3duZXJ9ID0gJFRpY2tldHtPd25lcklEfTsKCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgU2hvdyBsb2NrIHN0YXRlLgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBqb2luICcnLAogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nKSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHNlbGVjdGVkIG9yIGxhc3QgY3VzdG9tZXIgYXJ0aWNsZS4KICAgIG15ICVEYXRhOwogICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICk7CiAgICAgICAgJURhdGEgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIGFydGljbGUgZXhpc3RzLgogICAgICAgIGlmICggISVEYXRhICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0FydGljbGUgJXMgY291bGQgbm90IGJlIGZvdW5kIScsICRHZXRQYXJhbXtBcnRpY2xlSUR9ICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgR2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZS4KICAgICAgICBteSBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgSWYgdGhlIHRpY2tldCBoYXMgbm8gY3VzdG9tZXIgYXJ0aWNsZSwgZ2V0IHRoZSBsYXN0IGFnZW50IGFydGljbGUuCiAgICAgICAgaWYgKCAhQEFydGljbGVzICkgewogICAgICAgICAgICBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBGaW5hbGx5LCBpZiBldmVyeXRoaW5nIGZhaWxlZCwgZ2V0IGxhdGVzdCBhcnRpY2xlLgogICAgICAgIGlmICggIUBBcnRpY2xlcyApIHsKICAgICAgICAgICAgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPbmx5TGFzdCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZXMpIHsKICAgICAgICAgICAgJURhdGEgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGV9ICktPkFydGljbGVHZXQoCiAgICAgICAgICAgICAgICAleyRBcnRpY2xlfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIHNpZ25hdHVyZQogICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CiAgICAkRGF0YXtTaWduYXR1cmV9ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TaWduYXR1cmUoCiAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFydGljbGVJRCA9PiAkRGF0YXtBcnRpY2xlSUR9LAogICAgICAgIERhdGEgICAgICA9PiBcJURhdGEsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAkR2V0UGFyYW17Rm9yd2FyZFRlbXBsYXRlSUR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZQogICAgICAgICREYXRhe1N0ZFRlbXBsYXRlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17Rm9yd2FyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2lnbmF0dXJlCiAgICAgICAgJERhdGF7U2lnbmF0dXJlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBib2R5IHByZXBhcmF0aW9uIGZvciBwbGFpbiB0ZXh0IHByb2Nlc3NpbmcKICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+QXJ0aWNsZVF1b3RlKAogICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkRGF0YXtUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgRm9ybUlEICAgICAgICAgICAgID0+ICRTZWxmLT57R2V0UGFyYW19LT57Rm9ybUlEfSwKICAgICAgICBVcGxvYWRDYWNoZU9iamVjdCAgPT4gJFVwbG9hZENhY2hlT2JqZWN0LAogICAgICAgIEF0dGFjaG1lbnRzSW5jbHVkZSA9PiAxLAogICAgKTsKCiAgICBteSAlU2FmZXR5Q2hlY2tSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICBTdHJpbmcgPT4gJERhdGF7Qm9keX0sCgogICAgICAgICMgU3RyaXAgb3V0IGV4dGVybmFsIGNvbnRlbnQgaWYgQmxvY2tMb2FkaW5nUmVtb3RlQ29udGVudCBpcyBlbmFibGVkLgogICAgICAgIE5vRXh0U3JjTG9hZCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQnKSwKCiAgICAgICAgIyBEaXNhbGxvdyBwb3RlbnRpYWxseSB1bnNhZmUgY29udGVudC4KICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICBOb0VtYmVkICAgICAgPT4gMSwKICAgICAgICBOb1NWRyAgICAgICAgPT4gMSwKICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICk7CiAgICAkRGF0YXtCb2R5fSA9ICRTYWZldHlDaGVja1Jlc3VsdHtTdHJpbmd9OwoKICAgICMgSWYgYXJ0aWNsZSBpcyBub3QgYSBNSU1FQmFzZSBhcnRpY2xlLCBpbmNsdWRlIHNlbmRlciBuYW1lIGZvciBjb3JyZWN0IHF1b3RpbmcuCiAgICBpZiAoICEkRGF0YXtGcm9tfSApIHsKICAgICAgICBteSAlQXJ0aWNsZUZpZWxkcyA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVGaWVsZHMoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtTZW5kZXJ9ID0gJEFydGljbGVGaWVsZHN7U2VuZGVyfS0+e1ZhbHVlfSAvLyAnJzsKICAgIH0KCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHByZXBhcmUgYm9keSwgc3ViamVjdCwgUmVwbHlUbywgLi4uCiAgICAgICAgJERhdGF7Qm9keX0gPSAnPGJyLz4nIC4gJERhdGF7Qm9keX07CiAgICAgICAgaWYgKCAkRGF0YXtDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgJERhdGF7Q3JlYXRlVGltZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKCAkRGF0YXtDcmVhdGVUaW1lfSApOwogICAgICAgICAgICAkRGF0YXtCb2R5fSAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICI6ICREYXRhe0NyZWF0ZVRpbWV9PGJyLz4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgfQogICAgICAgIGZvciBteSAkS2V5IChxdyhTdWJqZWN0IFJlcGx5VG8gUmVwbHktVG8gQ2MgVG8gRnJvbSBTZW5kZXIpKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JEtleX0gKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5VGV4dCA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkS2V5KTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7JEtleX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAiJEtleVRleHQ6ICRWYWx1ZTxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgU3RyaW5nID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UXVvdGUnKSB8fCAnJywKICAgICAgICApOwogICAgICAgIGlmICgkUXVvdGUpIHsKCiAgICAgICAgICAgICMgcXVvdGUgdGV4dAogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICI8YmxvY2txdW90ZSB0eXBlPVwiY2l0ZVwiPiREYXRhe0JvZHl9PC9ibG9ja3F1b3RlPlxuIjsKCiAgICAgICAgICAgICMgY2xlYW51cCBub24tY29tcGF0aWJsZSB0YWdzCiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENsZWFudXAoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICI8YnIvPiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CiAgICAgICAgbXkgJEZyb20gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhe0Zyb219IHx8ICREYXRhe1NlbmRlcn0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEZvcndhcmRlZE1lc3NhZ2VGcm9tID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdGb3J3YXJkZWQgbWVzc2FnZSBmcm9tJyk7CiAgICAgICAgbXkgJEVuZEZvcndhcmRlZE1lc3NhZ2UgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdFbmQgZm9yd2FyZGVkIG1lc3NhZ2UnKTsKCiAgICAgICAgJERhdGF7Qm9keX0gPSAiPGJyLz4tLS0tICRGb3J3YXJkZWRNZXNzYWdlRnJvbSAkRnJvbSAtLS08YnIvPjxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgICREYXRhe0JvZHl9IC49ICI8YnIvPi0tLS0gJEVuZEZvcndhcmRlZE1lc3NhZ2UgLS0tPGJyLz4iOwogICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7U2lnbmF0dXJlfSAuICREYXRhe0JvZHl9OwoKICAgICAgICBpZiAoICRHZXRQYXJhbXtGb3J3YXJkVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7U3RkVGVtcGxhdGV9IC4gJzxici8+JyAuICREYXRhe0JvZHl9OwogICAgICAgIH0KCiAgICAgICAgJERhdGF7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBwcmVwYXJlIGJvZHksIHN1YmplY3QsIFJlcGx5VG8sIC4uLgogICAgICAgICREYXRhe0JvZHl9ID1+IHMvXHQvIC9nOwogICAgICAgIG15ICRRdW90ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UXVvdGUnKTsKICAgICAgICBpZiAoJFF1b3RlKSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID1+IHMvXG4vXG4kUXVvdGUgL2c7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIlxuJFF1b3RlICIgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIlxuIiAuICREYXRhe0JvZHl9OwogICAgICAgIH0KICAgICAgICBpZiAoICREYXRhe0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAkRGF0YXtDcmVhdGVUaW1lfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICREYXRhe0NyZWF0ZVRpbWV9ICk7CiAgICAgICAgICAgICREYXRhe0JvZHl9ICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdEYXRlJykgLgogICAgICAgICAgICAgICAgIjogJERhdGF7Q3JlYXRlVGltZX1cbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CiAgICAgICAgZm9yIChxdyhTdWJqZWN0IFJlcGx5VG8gUmVwbHktVG8gQ2MgVG8gRnJvbSBTZW5kZXIpKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JF99ICkgewogICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJF8pIC4KICAgICAgICAgICAgICAgICAgICAiOiAkRGF0YXskX31cbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEZvcndhcmRlZE1lc3NhZ2VGcm9tID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdGb3J3YXJkZWQgbWVzc2FnZSBmcm9tJyk7CiAgICAgICAgbXkgJEVuZEZvcndhcmRlZE1lc3NhZ2UgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdFbmQgZm9yd2FyZGVkIG1lc3NhZ2UnKTsKCiAgICAgICAgbXkgJEZyb20gPSAkRGF0YXtGcm9tfSB8fCAkRGF0YXtTZW5kZXJ9OwoKICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbi0tLS0gJEZvcndhcmRlZE1lc3NhZ2VGcm9tICRGcm9tIC0tLVxuXG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgJERhdGF7Qm9keX0gLj0gIlxuLS0tLSAkRW5kRm9yd2FyZGVkTWVzc2FnZSAtLS1cbiI7CiAgICAgICAgJERhdGF7Qm9keX0gPSAkRGF0YXtTaWduYXR1cmV9IC4gJERhdGF7Qm9keX07CgogICAgICAgIGlmICggJEdldFBhcmFte0ZvcndhcmRUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAkRGF0YXtTdGRUZW1wbGF0ZX0gLiAiXG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHN0ZC4gYXR0YWNobWVudCBvYmplY3QKICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIGVtYWlsCiAgICBpZiAoICRHZXRQYXJhbXtGb3J3YXJkVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtGb3J3YXJkVGVtcGxhdGVJRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57R2V0UGFyYW19LT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBmb3J3YXJkIHByZXNlbGVjdGVkIHN0YXRlCiAgICAgICAgbXkgJUZvcndhcmQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpLT5TdGFuZGFyZFRlbXBsYXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17Rm9yd2FyZFRlbXBsYXRlSUR9LAogICAgICAgICk7CiAgICAgICAgJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSB8fD0gJEZvcndhcmR7UHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEfTsKICAgIH0KCiAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntHZXRQYXJhbX0tPntGb3JtSUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICBmb3IgbXkgJFJlY2lwaWVudCAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgIGlmICggJERhdGF7JFJlY2lwaWVudH0gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskUmVjaXBpZW50fTsKICAgICAgICB9CiAgICB9CgogICAgIyBwdXQgJiBnZXQgYXR0cmlidXRlcyBsaWtlIHNlbmRlciBhZGRyZXNzCiAgICAlRGF0YSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+QXR0cmlidXRlcygKICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIERhdGEgICAgICA9PiBcJURhdGEsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBBY3Rpb24gICAgPT4gJ0ZvcndhcmQnLAogICAgKTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIGlmICggcmVmKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgdXNlIHRpY2tldCBRdWV1ZUlEIGluIGNvbXBvc2UgbW9kdWxlcwogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJE5ld1BhcmFtcyA9ICRPYmplY3QtPlJ1biggJURhdGEsICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoJE5ld1BhcmFtcykgewogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJE5ld1BhcmFtczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICVFcnJvciA9ICggJUVycm9yLCAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHRzIGlmIGVycm9uZW91cwogICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICREeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CiAgICB9CgogICAgIyBleHRyYWN0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZyb20gdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXRERlZhbHVlcyA9CiAgICAgICAgbWFwICB7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSB9IH0KICAgICAgICBncmVwIHsgJF8tPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyB9CiAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9LT5AKjsKCiAgICAjIGJ1aWxkIHZpZXcKICAgICMgc3RhcnQgd2l0aCBwYWdlCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICApOwoKICAgICMgYnVpbGQgcmVmZXJlbmNlcyBzdHJpbmcKICAgIG15ICRSZWZlcmVuY2VzID0gZGVmaW5lZCAkRGF0YXtSZWZlcmVuY2VzfSA/ICREYXRhe1JlZmVyZW5jZXN9IC4gJyAnIDogJyc7CiAgICAkUmVmZXJlbmNlcyAuPSBkZWZpbmVkICREYXRhe01lc3NhZ2VJRH0gPyAkRGF0YXtNZXNzYWdlSUR9IDogJyc7CgogICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgVGlja2V0TnVtYmVyICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFRpdGxlICAgICAgICAgID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBTTEFJRCAgICAgICAgICA9PiAkVGlja2V0e1NMQUlEfSwKICAgICAgICBOZXh0U3RhdGVzICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICksCiAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgIDogJycKICAgICAgICApLAogICAgICAgIEVycm9ycyAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgICAgIEF0dGFjaG1lbnRzICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAlRGF0YSwKICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgSW5SZXBseVRvICAgICAgICA9PiAkRGF0YXtNZXNzYWdlSUR9LAogICAgICAgIFJlZmVyZW5jZXMgICAgICAgPT4gJFJlZmVyZW5jZXMsCiAgICAgICAgREZQb3NzaWJsZVZhbHVlcyA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgIERGVmFsdWVzICAgICAgICAgPT4gXCVUaWNrZXRERlZhbHVlcywKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgU2VuZEVtYWlsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUVycm9yOwogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtID0gJXsgJFNlbGYtPntBQ0xDb21wYXRHZXRQYXJhbX0gfTsKCiAgICBteSAlR2V0UGFyYW1FeHRlbmRlZCA9ICRTZWxmLT5fR2V0RXh0ZW5kZWRQYXJhbXMoKTsKCiAgICBteSAlR2V0UGFyYW0gICAgICAgICAgICA9ICV7ICRHZXRQYXJhbUV4dGVuZGVke0dldFBhcmFtfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXIgICAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYyAgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQ2N9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYyA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJCY2N9IH07CgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIEdldCBhbmQgdmFsaWRhdGUgZHJhZnQgYWN0aW9uLgogICAgbXkgJEZvcm1EcmFmdEFjdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRBY3Rpb24nICk7CiAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gJiYgISRDb25maWctPntGb3JtRHJhZnR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0Zvcm1EcmFmdCBmdW5jdGlvbmFsaXR5IGRpc2FibGVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlRm9ybURyYWZ0UmVzcG9uc2U7CgogICAgIyBDaGVjayBkcmFmdCBuYW1lLgogICAgaWYgKAogICAgICAgICRGb3JtRHJhZnRBY3Rpb24KICAgICAgICAmJiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgfHwgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJyApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRUaXRsZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRUaXRsZScgKTsKCiAgICAgICAgIyBBIGRyYWZ0IG5hbWUgaXMgcmVxdWlyZWQuCiAgICAgICAgaWYgKCAhJFRpdGxlICkgewoKICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoIkRyYWZ0IG5hbWUgaXMgcmVxdWlyZWQhIiksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENob3NlbiBkcmFmdCBuYW1lIG11c3QgYmUgdW5pcXVlLgogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkRm9ybURyYWZ0TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0TGlzdEdldCgKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIERSQUZUOgogICAgICAgICAgICBmb3IgbXkgJEZvcm1EcmFmdCAoIEB7JEZvcm1EcmFmdExpc3R9ICkgewoKICAgICAgICAgICAgICAgICMgTm8gZXhpc3RpbmcgZHJhZnQgd2l0aCBzYW1lIG5hbWUuCiAgICAgICAgICAgICAgICBuZXh0IERSQUZUIGlmICRUaXRsZSBuZSAkRm9ybURyYWZ0LT57VGl0bGV9OwoKICAgICAgICAgICAgICAgICMgU2FtZSBuYW1lIGZvciB1cGRhdGUgb24gZXhpc3RpbmcgZHJhZnQuCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICYmICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScKICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9IGVxICRGb3JtRHJhZnQtPntGb3JtRHJhZnRJRH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBEUkFGVDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEFub3RoZXIgZHJhZnQgd2l0aCB0aGUgY2hvc2VuIG5hbWUgYWxyZWFkeSBleGlzdHMuCiAgICAgICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCAiRm9ybURyYWZ0IG5hbWUgJXMgaXMgYWxyZWFkeSBpbiB1c2UhIiwgJFRpdGxlICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbGFzdCBEUkFGVDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFBlcmZvcm0gZHJhZnQgYWN0aW9uIGluc3RlYWQgb2Ygc2F2aW5nIGZvcm0gZGF0YSBpbiB0aWNrZXQvYXJ0aWNsZS4KICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiAmJiAhJUZvcm1EcmFmdFJlc3BvbnNlICkgewoKICAgICAgICAjIFJlc2V0IEZvcm1EcmFmdElEIHRvIHByZXZlbnQgdXBkYXRpbmcgZXhpc3RpbmcgZHJhZnQuCiAgICAgICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gKSB7CgogICAgICAgICAgICAjIG1lZGRsaW5nIHdpdGggdGhlIGlubmFyZHMgb2YgS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdAogICAgICAgICAgICAkUGFyYW1PYmplY3QtPlNldEFycmF5KAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdGb3JtRHJhZnRJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZXMgPT4gWycnXQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEZvcm1EcmFmdEFjdGlvbk9rOwogICAgICAgIGlmICgKICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJwogICAgICAgICAgICB8fAogICAgICAgICAgICAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRQYXJhbU9iamVjdC0+U2F2ZUZvcm1EcmFmdCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnRGVsZXRlJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uT2sgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkRm9ybURyYWZ0QWN0aW9uT2spIHsKICAgICAgICAgICAgJEZvcm1EcmFmdFJlc3BvbnNle1N1Y2Nlc3N9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdDb3VsZCBub3QgcGVyZm9ybSByZXF1ZXN0ZWQgZHJhZnQgYWN0aW9uIScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICglRm9ybURyYWZ0UmVzcG9uc2UpIHsKCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJUZvcm1EcmFmdFJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZEl0ZW0gKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkSXRlbSB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICBteSAlU3RhdGVEYXRhOwoKICAgIGlmICggJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSApIHsKICAgICAgICAlU3RhdGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17Q29tcG9zZVN0YXRlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE5leHRTdGF0ZSA9ICRTdGF0ZURhdGF7TmFtZX07CgogICAgIyBjaGVjayBwZW5kaW5nIGRhdGUKICAgIGlmICggZGVmaW5lZCAkU3RhdGVEYXRhe1R5cGVOYW1lfSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgIyBjcmVhdGUgYSBkYXRldGltZSBvYmplY3QgYmFzZWQgb24gcGVuZGluZyBkYXRlCiAgICAgICAgbXkgJFBlbmRpbmdEYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgU2Vjb25kID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gZXBvY2gKICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgaWYgKCAhJFBlbmRpbmdEYXRlVGltZU9iamVjdCB8fCAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IDwgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFRvCiAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICRFcnJvcnsnVG9JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgY2hlY2sgYm9keQogICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBjaGVjayBzdWJqZWN0CiAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICApCiAgICB7CiAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgaW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbnQgdGlja2V0CiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIHByZXBhcmUgdGhlIHN1YmplY3QKICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIEFjdGlvbiAgICAgICA9PiAnRm9yd2FyZCcsCiAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSB8fCAnJywKICAgICk7CgogICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0cyBpZiBlcnJvbmVvdXMKICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwogICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICREeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAoKICAgICAgICAgICAgIyBNYW5kYXRvcnkgaXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgYnkgJFNlbGYtPm5ldwogICAgICAgICAgICBNYW5kYXRvcnkgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e01hbmRhdG9yeX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgIExJTkU6CiAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICBuZXh0IExJTkUgdW5sZXNzICRHZXRQYXJhbXskTGluZX07CgogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskTGluZX0gKSApIHsKICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnRXJyb3JUeXBlJyB9ID0gJExpbmUgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTWFrZSBzdXJlIHNlbmRlciBpcyBjb3JyZWN0IG9uZS4gU2VlIGJ1ZyMxNDg3MiAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NzIgKS4KICAgICRHZXRQYXJhbXtGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewoKICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBzYXZlIGZvcm0gaWYgYSBkcmFmdCB3YXMgbG9hZGVkLgogICAgICAgICVFcnJvciA9ICggTG9hZGVkRm9ybURyYWZ0ID0+IDEgKTsKICAgIH0KCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIG15ICVBcnRpY2xlUGFyYW07CiAgICBpZiAoIHJlZiggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpICkgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBTdG9yZU5ldyA9PiAxLAogICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAgICMgYW5kIGFkZCB0aGVtIGJhY2sgdG8gdGhlIHNlbGVjdGlvbiBzbyB0aGF0IHRoZSBzdWJtaXQKICAgICAgICAgICAgIyB3aWxsIGNvbnRhaW4gb3B0aW9ucyB0aGF0IHdlcmUgaGlkZGVuIGZyb20gdGhlIGFnZW50CiAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgbXkgQFJlbW92ZWRPcHRpb25zID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwogICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGlmICgkTXVsdGlwbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdmVkT3B0aW9uIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSBzaGlmdCBAUmVtb3ZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57R2V0UGFyYW19LT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvcgogICAgaWYgKCVFcnJvcikgewogICAgICAgIG15ICRRdWV1ZUlEID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVJRCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICAgICAgIyBleHRyYWN0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZyb20gdGlja2V0IGRhdGEKICAgICAgICBteSAlVGlja2V0REZWYWx1ZXMgPQogICAgICAgICAgICBtYXAgIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkXy0+e05hbWV9IH0gfQogICAgICAgICAgICBncmVwIHsgJF8tPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyB9CiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCo7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICApOwoKICAgICAgICAjIFRPREQ6IE5vdGlmaWNhdGlvbiBhYm91dCBGb3JtRHJhZnQKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpY2tldE51bWJlciAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIFNMQUlEICAgICAgICAgID0+ICRUaWNrZXR7U0xBSUR9LAogICAgICAgICAgICBOZXh0U3RhdGVzICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBERkVycm9ycyAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgREZWYWx1ZXMgICAgICAgICA9PiBcJVRpY2tldERGVmFsdWVzLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIHJlcGxhY2UgPE9UT0JPX1RJQ0tFVF9TVEFURT4gd2l0aCBuZXh0IHRpY2tldCBzdGF0ZSBuYW1lCiAgICBpZiAoJE5leHRTdGF0ZSkgewogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLygmbHQ7fDwpT1RPQk9fVElDS0VUX1NUQVRFKCZndDt8PikvJE5leHRTdGF0ZS9nOwogICAgfQoKICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudHMKICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0dldFBhcmFtfS0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICApOwogICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgfQoKICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgaWYgKCAkQ29udGVudElEICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSApIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICMgSUYgdGhlIGltYWdlIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGJvZHkgc2V0IGl0IGFzIGlubGluZS4KICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ID1+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gPSAnaW5saW5lJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSB7CgogICAgICAgICAgICAgICAgICAgICMgSWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5LgogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICB9CiAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAjIHZlcmlmeSBIVE1MIGRvY3VtZW50CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIGVtYWlsCiAgICBteSAkVG8gPSAnJzsKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRHZXRQYXJhbXskS2V5fTsKICAgICAgICBpZiAoJFRvKSB7CiAgICAgICAgICAgICRUbyAuPSAnLCAnOwogICAgICAgIH0KICAgICAgICAkVG8gLj0gJEdldFBhcmFteyRLZXl9OwogICAgfQoKICAgIG15ICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgaWYgKCAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50fSApIHsKICAgICAgICAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPSAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID8gMSA6IDA7CiAgICB9CgogICAgbXkgJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKAogICAgICAgIENoYW5uZWxOYW1lID0+ICdFbWFpbCcsCiAgICApOwoKICAgICMgR2V0IGF0dHJpYnV0ZXMgbGlrZSBzZW5kZXIgYWRkcmVzcy4KICAgIG15ICVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPkF0dHJpYnV0ZXMoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRGF0YSAgICAgPT4ge30sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkQXJ0aWNsZUlEID0gJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gJElzVmlzaWJsZUZvckN1c3RvbWVyLAogICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdGb3J3YXJkJywKICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiXCVcJSRUbyIsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJERhdGF7RnJvbX0sCiAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgIEJjYyAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCY2N9LAogICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgIEluUmVwbHlUbyAgICAgICAgICAgID0+ICRHZXRQYXJhbXtJblJlcGx5VG99LAogICAgICAgIFJlZmVyZW5jZXMgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZWZlcmVuY2VzfSwKICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICApOwoKICAgICMgZXJyb3IgcGFnZQogICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgdGltZSBhY2NvdW50aW5nCiAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBkeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAjIHNldCB0aGUgb2JqZWN0IElEIChUaWNrZXRJRCBvciBBcnRpY2xlSUQpIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgIG15ICRPYmplY3RJRCA9ICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgPyAkQXJ0aWNsZUlEIDogJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc3RhdGUKICAgIGlmICgkTmV4dFN0YXRlKSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIFN0YXRlICAgICA9PiAkTmV4dFN0YXRlLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdWxkIEkgc2V0IGFuIHVubG9jaz8KICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSBhbGwgZm9ybSBkYXRhCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntHZXRQYXJhbX0tPntGb3JtSUR9ICk7CgogICAgIyBJZiBmb3JtIHdhcyBjYWxsZWQgYmFzZWQgb24gYSBkcmFmdCwKICAgICMgICBkZWxldGUgZHJhZnQgc2luY2UgaXRzIGNvbnRlbnQgaGFzIG5vdyBiZWVuIHVzZWQuCiAgICBpZiAoCiAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgT2JqZWN0SUQgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgZGVsZXRlIGRyYWZ0IScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlZGlyZWN0CiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkU3RhdGVEYXRhe1R5cGVOYW1lfQogICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaQogICAgICAgICYmICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlJlZGlyZWN0QWZ0ZXJDbG9zZURpc2FibGVkJykKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSB8fCAnQWN0aW9uPUFnZW50RGFzaGJvYXJkJyApLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRTZWxmLT57VGlja2V0SUR9O0FydGljbGVJRD0kQXJ0aWNsZUlEIiwKICAgICk7Cn0KCnN1YiBBamF4VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtID0gJXsgJFNlbGYtPntBQ0xDb21wYXRHZXRQYXJhbX0gfTsKCiAgICBteSAlR2V0UGFyYW1FeHRlbmRlZCA9ICRTZWxmLT5fR2V0RXh0ZW5kZWRQYXJhbXMoKTsKCiAgICBteSAlR2V0UGFyYW0gPSAleyAkR2V0UGFyYW1FeHRlbmRlZHtHZXRQYXJhbX0gfTsKCiAgICBteSBARXh0ZW5kZWREYXRhOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgSk9COgogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IEpPQiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAlRGF0YSA9ICRPYmplY3QtPkRhdGEoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAjIGdldCBBSkFYIHBhcmFtIHZhbHVlcwogICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0UGFyYW1BSkFYJykgKSB7CiAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJE9iamVjdC0+R2V0UGFyYW1BSkFYKCVHZXRQYXJhbSkgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgb3B0aW9ucyB0aGF0IGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3Rpb24gdmlzaWJsZQogICAgICAgICAgICAjIHRvIHRoZSBhZ2VudC4gVGhlc2Ugb3B0aW9ucyB3aWxsIGJlIGFkZGVkIGFnYWluIG9uIHN1Ym1pdC4KICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgIG15IEBPcHRpb25zVG9SZW1vdmUgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRPcHRpb25Ub1JlbW92ZSAoQE9wdGlvbnNUb1JlbW92ZSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskT3B0aW9uVG9SZW1vdmV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICBpZiAoJEtleSkgewogICAgICAgICAgICAgICAgcHVzaCBARXh0ZW5kZWREYXRhLCB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAkTXVsdGlwbGUsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkSXRlbSAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkSXRlbTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRJdGVtIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICVHZXRQYXJhbSwKICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICApOwoKICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgbXkgQER5bmFtaWNGaWVsZEFKQVg7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgIH0KCiAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICkgfHwgJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH07CiAgICB9CgogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NvbXBvc2VTdGF0ZUlEJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17Q29tcG9zZVN0YXRlSUR9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEBFeHRlbmRlZERhdGEsCiAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmV4dCBzdGF0ZXMKICAgIG15ICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgbXkgJVN0YXRlOwogICAgaWYgKCAhJFBhcmFte0NvbXBvc2VTdGF0ZUlEfSApIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtDb21wb3NlU3RhdGVJRH07CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtOZXh0U3RhdGVzfSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NvbXBvc2VTdGF0ZUlEJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlJywKICAgICAgICAlU3RhdGUsCiAgICApOwoKICAgICRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0gPSAkQ29uZmlnLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJEZWZhdWx0fTsKICAgIGlmICggJFNlbGYtPntHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnR9ICkgewogICAgICAgICRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0gPSAkU2VsZi0+e0dldFBhcmFtfS0+e0lzVmlzaWJsZUZvckN1c3RvbWVyfSA/IDEgOiAwOwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3IgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRFcnJvcn0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRFcnJvcn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHVzZWQgY2FsZW5kYXIKICAgIG15ICRDYWxlbmRhciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0Q2FsZW5kYXJHZXQoCiAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgU0xBSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgKTsKCiAgICBteSAkUXVpY2tEYXRlQnV0dG9ucyA9ICRDb25maWctPntRdWlja0RhdGVCdXR0b25zfSAvLyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkRlZmF1bHRRdWlja0RhdGVCdXR0b25zJyk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICA9PiAwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgID0+IDUsCiAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIERpZmZUaW1lICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICcgJywKICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICA9PiAxLAogICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICAgPT4gJENhbGVuZGFyLAogICAgICAgIFF1aWNrRGF0ZUJ1dHRvbnMgICAgID0+ICRRdWlja0RhdGVCdXR0b25zLAogICAgKTsKCiAgICAjIE11bHRpcGxlLUF1dG9jb21wbGV0ZQogICAgIyBDYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjQ3VzdG9tZXJFcnJvckV4cGxhbmF0aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyQmNjICkgewogICAgICAgICRQYXJhbXtCY2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBUbwogICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJFcnJvckV4cGxhbmF0aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyKyssCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17VG9JbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RvU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17VG9Jc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtDY0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0NjRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtDY0lzTG9jYWxBZGRyZXNzfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0JjY0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JjY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0JjY0lzTG9jYWxBZGRyZXNzfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyByZW5kZXIgZHluYW1pYyBmaWVsZHMKICAgIHsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQ29uZmlncyA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqOwoKICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RHluYW1pY0ZpZWxkOjpNYXNrJyktPkVkaXRTZWN0aW9uUmVuZGVyKAogICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICA9PiAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgPT4gXCVEeW5hbWljRmllbGRDb25maWdzLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgICAgIER5bmFtaWNGaWVsZFZhbHVlcyAgID0+ICRQYXJhbXtERlZhbHVlc30sCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQYXJhbXtERlBvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICAgPT4gJFBhcmFte0RGRXJyb3JzfSwKICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICRQYXJhbXtERlZhbHVlc30tPiUqLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IHRoZSBjdXN0b21lciB1c2VyIGFkZHJlc3MgYm9vayBpZiB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRDdXN0b21lclVzZXJBZGRyZXNzQm9va30gKSB7CiAgICAgICAgJFBhcmFte09wdGlvbkN1c3RvbWVyVXNlckFkZHJlc3NCb29rfSA9IDE7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRBdHRhY2htZW50LT57Q29udGVudElEfSApOwogICAgICAgICAgICBpZiAoICRQYXJhbXtCb2R5fSA9fiAvQ29udGVudElEPVxRJENvbnRlbnRJRExpbmtFbmNvZGVcRS9pICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICB9CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkTG9hZGVkRm9ybURyYWZ0OwogICAgaWYgKCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKICAgICAgICAkTG9hZGVkRm9ybURyYWZ0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnRHZXQoCiAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9LAogICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgR2V0Q29udGVudCAgPT4gMCwKICAgICAgICApOwoKICAgICAgICBteSBAQXJ0aWNsZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgT25seUxhc3QgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoQEFydGljbGVzKSB7CiAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZSA9ICRBcnRpY2xlc1swXTsKCiAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWU7CiAgICAgICAgICAgIGlmICggJExhc3RBcnRpY2xlLT57Q3JlYXRlVGltZX0gKSB7CiAgICAgICAgICAgICAgICBteSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExhc3RBcnRpY2xlLT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdEFydGljbGVTeXN0ZW1UaW1lID0gJExhc3RBcnRpY2xlU3lzdGVtVGltZU9iamVjdC0+VG9FcG9jaCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRm9ybURyYWZ0U3lzdGVtVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRTeXN0ZW1UaW1lID0gJEZvcm1EcmFmdFN5c3RlbVRpbWVPYmplY3QtPlRvRXBvY2goKTsKCiAgICAgICAgICAgIGlmICggISRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgfHwgJEZvcm1EcmFmdFN5c3RlbVRpbWUgPD0gJExhc3RBcnRpY2xlU3lzdGVtVGltZSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtGb3JtRHJhZnRPdXRkYXRlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJExvYWRlZEZvcm1EcmFmdCkgKSB7CgogICAgICAgICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VCeU5hbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlck5hbWUoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlQnl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBleHBsYW5hdG9yeSBtZXNzYWdlIGFib3V0IGFzdGVyaXNrCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXN0ZXJpc2tFeHBsYW5hdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Rm9yd2FyZCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBGb3JtRHJhZnQgICAgICA9PiAkQ29uZmlnLT57Rm9ybURyYWZ0fSwKICAgICAgICAgICAgRm9ybURyYWZ0SUQgICAgPT4gJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgIEZvcm1EcmFmdFRpdGxlID0+ICRMb2FkZWRGb3JtRHJhZnQgPyAkTG9hZGVkRm9ybURyYWZ0LT57VGl0bGV9IDogJycsCiAgICAgICAgICAgIEZvcm1EcmFmdE1ldGEgID0+ICRMb2FkZWRGb3JtRHJhZnQsCiAgICAgICAgfSwKICAgICk7Cn0KCnN1YiBfR2V0RXh0ZW5kZWRQYXJhbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbSA9ICV7ICRTZWxmLT57R2V0UGFyYW19IH07CgogICAgIyBoYXNoIGZvciBjaGVjayBkdXBsaWNhdGVkIGVudHJpZXMKICAgIG15ICVBZGRyZXNzZXNMaXN0OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXI7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyVG8gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyVG9DdXN0b21lcicgKSB8fCAwOwogICAgbXkgJFNlbGVjdGVkICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyU2VsZWN0ZWQnICkgICAgICAgICAgICAgICAgfHwgJyc7CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJUbykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXIgICAgPSAxOwogICAgICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJUbyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudDsKCiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQgJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudCApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWUgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZSA9ICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQ2MgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXInICkgfHwgMDsKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJDYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJDYyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudENjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKCiAgICAgICAgICAgIG5leHQgQ09VTlQgdW5sZXNzICRDdXN0b21lckVsZW1lbnRDYzsKCiAgICAgICAgICAgIG15ICRDdXN0b21lcktleUNjICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lcktleV8nIC4gJENvdW50ICkgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWVDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q2N9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSA9ICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQ2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckNjICAgID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRDdXN0b21lckVsZW1lbnRDYyApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSAmJiAkQ3VzdG9tZXJFcnJvckNjIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXhDYyAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlckNjKys7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQ2MgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4Q2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWVDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlQ2MgPSAkQ291bnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJDYywgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyUXVldWUgICAgPT4gJEN1c3RvbWVyUXVldWVDYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQmNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJCY2MgKSB7CiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgJENvdW50ID4gMV8wMDA7ICAgICMgYmFpbCBvdXQgd2hlbiB0aGUgbnVtYmVyIG9mIGN1c3RvbWVycyBpcyBhYm5vcm1hbGx5IGhpZ2gKCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKCiAgICAgICAgICAgIG5leHQgQ09VTlQgdW5sZXNzICRDdXN0b21lckVsZW1lbnRCY2M7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlCY2MgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lcktleV8nIC4gJENvdW50ICkgICB8fCAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyUXVldWVCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJRdWV1ZV8nIC4gJENvdW50ICkgfHwgJyc7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtCY2N9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRCY2M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSA9ICRDdXN0b21lckVsZW1lbnRCY2M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQmNjICAgID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRDdXN0b21lckVsZW1lbnRCY2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gJiYgJEN1c3RvbWVyRXJyb3JCY2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQmNjID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eEJjYyAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yQmNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lclF1ZXVlQmNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWVCY2MgPSAkQ291bnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJCY2MsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0JjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQmNjLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoCiAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICApOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AgentTicketMerge.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA5YTRmYTA4Y2RkODE1Nzk4YjI5YjY4NDg1NDdlY2Y1OTAwZDFkNjRhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRNZXJnZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRNZXJnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGJsZXNzIHslUGFyYW19LCAkVHlwZTsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcjsKICAgIG15ICVHZXRQYXJhbTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFRpY2tldElEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgY29uZmlnIHBhcmFtCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoJEFDTCkgewoKICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuIGlmIEFDTCBwcm9oaWJpdHMgdGhpcyBhY3Rpb24KICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlICYmIHdyaXRlIChsb2NrKSBwZXJtaXNzaW9ucwogICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewoKICAgICAgICAgICAgbXkgJExvY2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2V0IG5ldyBvd25lciBpZiB0aWNrZXQgb3duZXIgaXMgZGlmZmVyZW50IHRoZW4gbG9nZ2VkIHVzZXIuCiAgICAgICAgICAgIGlmICggJExvY2sgJiYgKCAkVGlja2V0e093bmVySUR9ICE9ICRTZWxmLT57VXNlcklEfSApICkgewoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICRQYXJhbXtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGJhY2sgbGluawogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBzaG93IGJhY2sgbGluawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICApOwogICAgfQoKICAgICMgbWVyZ2UgYWN0aW9uCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTWVyZ2UnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBhbGwgcGFyYW1ldGVycwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyggRnJvbSBUbyBTdWJqZWN0IEJvZHkgSW5mb3JtU2VuZGVyIE1haW5UaWNrZXROdW1iZXIgKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiBubyByaWNoIHRleHQgaXMgdXNlZAogICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICEkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+V3JhcFBsYWluVGV4dCgKICAgICAgICAgICAgICAgIE1heENoYXJhY3RlcnMgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSwKICAgICAgICAgICAgICAgIFBsYWluVGV4dCAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgICAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICAgICAjIHJlbW92aW5nIGJsYW5rIHNwYWNlcyBmcm9tIHRoZSB0aWNrZXQgbnVtYmVyCiAgICAgICAgJENoZWNrSXRlbU9iamVjdC0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiA9PiBcJEdldFBhcmFteydNYWluVGlja2V0TnVtYmVyJ30sCiAgICAgICAgICAgIFRyaW1MZWZ0ICA9PiAxLAogICAgICAgICAgICBUcmltUmlnaHQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHNvbWUgc3R1ZmYKICAgICAgICBteSAkTWFpblRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkR2V0UGFyYW17J01haW5UaWNrZXROdW1iZXInfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNvdXJjZSBhbmQgdGFyZ2V0IFRpY2tldElEIGFyZSB0aGUgc2FtZSAoYnVnIzg2NjcpCiAgICAgICAgaWYgKCAkTWFpblRpY2tldElEICYmICRNYWluVGlja2V0SUQgPT0gJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IG1lcmdlIHRpY2tldCB3aXRoIGl0c2VsZiEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZm9yIGVycm9ycwogICAgICAgIGlmICggISRNYWluVGlja2V0SUQgKSB7CiAgICAgICAgICAgICRFcnJvcnsnTWFpblRpY2tldE51bWJlckludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXtJbmZvcm1TZW5kZXJ9ICkgewogICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoIFRvIFN1YmplY3QgQm9keSApKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JFBhcmFtZXRlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvcndhcmQgZW1haWwgYWRkcmVzcyhlcykKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXtUb30gKSApIHsKCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICAgICAgICAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzT2JqZWN0ICA9PiAkRW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkSXNMb2NhbCkgewojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUb0Vycm9yTXNnID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAkVG9FcnJvck1zZyApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnVG9DdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZycgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAgICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0luZm9ybVNlbmRlckNoZWNrZWR9ID0gJEdldFBhcmFte0luZm9ybVNlbmRlcn0gPyAnY2hlY2tlZCAnIDogJyc7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRNZXJnZScsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyAlUGFyYW0sICVHZXRQYXJhbSwgJVRpY2tldCwgJUVycm9yIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkTWFpblRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFRpY2tldE1lcmdlUmVzdWx0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TWVyZ2UoCiAgICAgICAgICAgIE1haW5UaWNrZXRJRCAgPT4gJE1haW5UaWNrZXRJRCwKICAgICAgICAgICAgTWVyZ2VUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57VGlja2V0SUR9ID09ICRNYWluVGlja2V0SUQKICAgICAgICAgICAgfHwgISRUaWNrZXRNZXJnZVJlc3VsdAogICAgICAgICAgICB8fCAkVGlja2V0TWVyZ2VSZXN1bHQgZXEgJ05vVmFsaWRNZXJnZVN0YXRlcycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUaWNrZXRNZXJnZVJlc3VsdCBlcSAnTm9WYWxpZE1lcmdlU3RhdGVzJyApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ05vIG1lcmdlIHN0YXRlIGZvdW5kISBQbGVhc2UgYWRkIGEgdmFsaWQgbWVyZ2Ugc3RhdGUgYmVmb3JlIG1lcmdlIGFjdGlvbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE1lcmdlJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJVRpY2tldCB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzZW5kIGN1c3RvbWVyIGluZm8/CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0luZm9ybVNlbmRlcn0gKSB7CiAgICAgICAgICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKCZsdDt8PClPVE9CT19USUNLRVQoJmd0O3w+KS8kVGlja2V0e1RpY2tldE51bWJlcn0vZzsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fQogICAgICAgICAgICAgICAgICAgID1+IHMvKCZsdDt8PClPVE9CT19NRVJHRV9UT19USUNLRVQoJmd0O3w+KS8kR2V0UGFyYW17J01haW5UaWNrZXROdW1iZXInfS9nOwoKICAgICAgICAgICAgICAgIG15ICRFbWFpbEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5CYWNrZW5kRm9yQ2hhbm5lbCgKICAgICAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSA9PiAnRW1haWwnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnU2VuZEFuc3dlcicsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gIk1lcmdlIGluZm8gdG8gJyRHZXRQYXJhbXtUb30nLiIsCiAgICAgICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0Zyb219LAogICAgICAgICAgICAgICAgICAgIEVtYWlsICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtFbWFpbH0sCiAgICAgICAgICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewoKICAgICAgICAgICAgICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBtZXJnZWQgdGlja2V0CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRNYWluVGlja2V0SUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICAgICAjIEdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUuCiAgICAgICAgbXkgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIElmIHRoZSB0aWNrZXQgaGFzIG5vIGN1c3RvbWVyIGFydGljbGUsIGdldCB0aGUgbGFzdCBhZ2VudCBhcnRpY2xlLgogICAgICAgIGlmICggIUBBcnRpY2xlcyApIHsKICAgICAgICAgICAgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRmluYWxseSwgaWYgZXZlcnl0aGluZyBmYWlsZWQsIGdldCBsYXRlc3QgYXJ0aWNsZS4KICAgICAgICBpZiAoICFAQXJ0aWNsZXMgKSB7CiAgICAgICAgICAgIEBBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT25seUxhc3QgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVBcnRpY2xlOwogICAgICAgIGZvciBteSAkQXJ0aWNsZSAoQEFydGljbGVzKSB7CiAgICAgICAgICAgICVBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRBcnRpY2xlfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgJXskQXJ0aWNsZX0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1lcmdlIGJveAogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgc2FsdXRhdGlvbgogICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwogICAgICAgIG15ICRTYWx1dGF0aW9uICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2FsdXRhdGlvbigKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgID0+IHsKICAgICAgICAgICAgICAgICVBcnRpY2xlLAoKICAgICAgICAgICAgICAgICMgTk9URSBpbiBjYXNlIHRoYXQgd2UgYW5zd2VyIHRvIGEgY3VzdG9tZXIsIHRoZSBmb3JtZXIgc2VuZGVyICh0aGUgY3VzdG9tZXIpCiAgICAgICAgICAgICAgICAjICAgbm93IGJlY29tZXMgdGhlIG5ldyByZWNpcGllbnQgYW5kIHRoZSBmb3JtZXIgcmVjaXBpZW50ICh0aGUgT1RPQk8gc3lzdGVtKQogICAgICAgICAgICAgICAgIyAgIG5vdyBiZWNvbWVzIHRoZSBuZXcgc2VuZGVyCiAgICAgICAgICAgICAgICBGcm9tID0+ICRBcnRpY2xle1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgPyAkQXJ0aWNsZXtUb30gICA6ICRBcnRpY2xle0Zyb219LAogICAgICAgICAgICAgICAgVG8gICA9PiAkQXJ0aWNsZXtTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInID8gJEFydGljbGV7RnJvbX0gOiAkQXJ0aWNsZXtUb30sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHNpZ25hdHVyZQogICAgICAgIG15ICRTaWduYXR1cmUgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgID0+IHslQXJ0aWNsZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHN1YmplY3QgLi4uCiAgICAgICAgJEFydGljbGV7U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgZnJvbSAuLi4KICAgICAgICBpZiAoICRBcnRpY2xle1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICRBcnRpY2xle1RvfSA9ICRBcnRpY2xle0Zyb219OwogICAgICAgIH0KCiAgICAgICAgbXkgJUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgJEFydGljbGV7RnJvbX0gPSAkQWRkcmVzc3tGb3JtYXR0ZWRBZGRyZXNzfTsKCiAgICAgICAgIyBhZGQgc2FsdXRhdGlvbiBhbmQgc2lnbmF0dXJlIHRvIGJvZHkKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICBteSAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TWVyZ2VUZXh0JyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNhbHV0YXRpb24KICAgICAgICAgICAgICAgIC4gJzxici8+PGJyLz4nCiAgICAgICAgICAgICAgICAuICRCb2R5CiAgICAgICAgICAgICAgICAuICc8YnIvPjxici8+JwogICAgICAgICAgICAgICAgLiAkU2lnbmF0dXJlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2FsdXRhdGlvbgogICAgICAgICAgICAgICAgLiAiXG5cbiIKICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNZXJnZVRleHQnKQogICAgICAgICAgICAgICAgLiAiXG5cbiIKICAgICAgICAgICAgICAgIC4gJFNpZ25hdHVyZTsKICAgICAgICB9CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhwbGFuYXRvcnkgbWVzc2FnZSBhYm91dCBhc3RlcmlzawogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXN0ZXJpc2tFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE1lcmdlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlVGlja2V0LCAlQXJ0aWNsZSwgfQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Output/HTML/ArticleAction/AgentTicketCompose.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkN2RhYTczZWUzZjQzZjE2NTdjZDY4M2I2YTE3NDBiY2MyMmQ3OGQ4IC0gS2VybmVsL091dHB1dC9IVE1ML0FydGljbGVBY3Rpb24vQWdlbnRUaWNrZXRDb21wb3NlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkFydGljbGVBY3Rpb246OkFnZW50VGlja2V0Q29tcG9zZTsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgojIG9wdGlvbmFsIEFjbEFjdGlvbkxvb2t1cApzdWIgQ2hlY2tBY2Nlc3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIENoZWNrIG5lZWRlZCBzdHVmZi4KICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXQgQXJ0aWNsZSBDaGFubmVsTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2hhbm5lbE5hbWV9IGVxICdFbWFpbCcgJiYgJFBhcmFte0FydGljbGV9LT57U2VuZGVyVHlwZX0gZXEgJ3N5c3RlbScgKSB7CgogICAgICAgICMgc2tpcCBlbWFpbCBub3RpZmljYXRpb25zCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgaWYgbW9kdWxlIGlzIHJlZ2lzdGVyZWQKICAgIHJldHVybiBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldENvbXBvc2V9OwoKICAgICMgY2hlY2sgQWNsCiAgICByZXR1cm4gaWYgISRQYXJhbXtBY2xBY3Rpb25Mb29rdXB9LT57QWdlbnRUaWNrZXRDb21wb3NlfTsKCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZScpOwogICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgbXkgJE9rID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0fS0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gaWYgISRPazsKICAgIH0KICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgbXkgJExvY2tlZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXR9LT57VGlja2V0SUR9CiAgICAgICAgKTsKICAgICAgICBpZiAoJExvY2tlZCkgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldH0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuIGlmICEkQWNjZXNzT2s7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgR2V0Q29uZmlnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBDaGVjayBuZWVkZWQgc3R1ZmYuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0IEFydGljbGUgU3RhbmRhcmRUZW1wbGF0ZXMgVHlwZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBTdGFuZGFyZFJlc3BvbnNlc1N0cmcKICAgICMgbXkgJVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gJXsgJFBhcmFte1N0YW5kYXJkUmVzcG9uc2VzfSB8fCB7fSB9OwogICAgbXkgJVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gJXsgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfS0+e0Fuc3dlcn0gfHwge30gfTsKCiAgICAjIGdldCByZXZlcnMgU3RhbmRhcmRSZXNwb25zZUhhc2ggYmVjYXVzZSB3ZSBuZWVkIHRvIHNvcnQgYnkgVmFsdWVzCiAgICAjIGZyb20gJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCB3ZSBnZXQgdmFsdWUgb2YgS2V5IGJ5ICVTdGFuZGFyZFJlc3BvbnNlSGFzaCBWYWx1ZQogICAgIyBhbmQgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSBpcyBjcmVhdGVkIGFzIGFycmF5IG9mIGhhc2hlcyB3aXRoIGVsZW1lbnRzIEtleSBhbmQgVmFsdWUKCiAgICBteSAlUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gcmV2ZXJzZSAlU3RhbmRhcmRSZXNwb25zZUhhc2g7CiAgICBteSBAU3RhbmRhcmRSZXNwb25zZUFycmF5ICAgICAgID0gbWFwIHsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRSZXZlcnNlU3RhbmRhcmRSZXNwb25zZUhhc2h7JF99LAogICAgICAgICAgICBWYWx1ZSA9PiAkXwogICAgICAgIH0KICAgIH0gc29ydCB2YWx1ZXMgJVN0YW5kYXJkUmVzcG9uc2VIYXNoOwoKICAgICMgdXNlIHRoaXMgYXJyYXkgdHdpY2UgKGFsc28gZm9yIFJlcGx5IEFsbCksIHNvIGNvcHkgaXQgZmlyc3QKICAgIG15IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXlSZXBseUFsbCA9IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXk7CgogICAgbXkgQE1lbnVJdGVtczsKICAgIGlmIChAU3RhbmRhcmRSZXNwb25zZUFycmF5KSB7CgogICAgICAgICMgYnVpbGQgSFRNTCBzdHJpbmcKICAgICAgICBteSAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgIElEICAgICAgICAgICA9PiAnUmVzcG9uc2VJRCcgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBTbWFsbCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICAgICAgICAgICAgPT4gJ0Ryb3Bkb3duJywKICAgICAgICAgICAgRHJvcGRvd25UeXBlICAgICAgICAgID0+ICdSZXBseScsCiAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZXBseScpLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgID0+ICdSZXBseScgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBSZXNwb25zZUVsZW1lbnRJRCAgICAgPT4gJ1Jlc3BvbnNlSUQnIC4gJFBhcmFte0FydGljbGV9LT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgcmVwbHkgYWxsIGlzIG5lZWRlZAogICAgbXkgJFJlY2lwaWVudHMgPSAnJzsKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhGcm9tIFRvIENjKSkgewogICAgICAgIG5leHQgS0VZIGlmICEkUGFyYW17QXJ0aWNsZX0tPnskS2V5fTsKICAgICAgICBpZiAoJFJlY2lwaWVudHMpIHsKICAgICAgICAgICAgJFJlY2lwaWVudHMgLj0gJywgJzsKICAgICAgICB9CiAgICAgICAgJFJlY2lwaWVudHMgLj0gJFBhcmFte0FydGljbGV9LT57JEtleX07CiAgICB9CiAgICBteSAkUmVjaXBpZW50Q291bnQgPSAwOwogICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgICAgICBteSBAQWRkcmVzc2VzICAgICAgICAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkUmVjaXBpZW50cyApOwogICAgICAgIEFERFJFU1M6CiAgICAgICAgZm9yIG15ICRBZGRyZXNzIChAQWRkcmVzc2VzKSB7CiAgICAgICAgICAgIG15ICRFbWFpbCA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEFkZHJlc3MgKTsKCiAgICAgICAgICAgIG5leHQgQUREUkVTUyB1bmxlc3MgJEVtYWlsOwoKICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbCwKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXR9LT57VGlja2V0SUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFERFJFU1MgaWYgJElzTG9jYWw7CgogICAgICAgICAgICAkUmVjaXBpZW50Q291bnQrKzsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIEBTdGFuZGFyZFJlc3BvbnNlQXJyYXlSZXBseUFsbCAmJiAkUmVjaXBpZW50Q291bnQgPiAxICkgewoKICAgICAgICBteSAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgIElEICAgICAgICAgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBTbWFsbCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQFN0YW5kYXJkUmVzcG9uc2VBcnJheVJlcGx5QWxsLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBEcm9wZG93blR5cGUgICAgICAgICAgPT4gJ1JlcGx5JywKICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXNTdHJnID0+ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1JlcGx5IEFsbCcpLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgID0+ICdSZXBseUFsbCcgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBSZXBseUFsbCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVzcG9uc2VFbGVtZW50SUQgICAgID0+ICdSZXNwb25zZUlEQWxsJyAuICRQYXJhbXtBcnRpY2xlfS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gQE1lbnVJdGVtczsKfQoKMTsK</File>
        <File Location="scripts/test/PostMaster/AddressPool.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6TW9ja1RpbWUgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlJlZ2lzdGVyRHJpdmVyOwoKb3VyICRTZWxmOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+IDAsCik7CgpteSAkUXVldWVPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwpteSAkVGlja2V0T2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKbXkgJEFydGljbGVPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7Cm15ICRTeXN0ZW1BZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlICA9PiAxLAogICAgICAgIFVzZVRtcEFydGljbGVEaXIgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpGaXhlZFRpbWVTZXQoKTsKCiMgUG9vbCB8ICAgICAgICBBZGRyZXNzIHwgUXVldWUKIyAgIFAxICAgYTFwMUBvdG9iby5vcmcgICAgICBxMQojICAgUDEgICBhMnAxQG90b2JvLm9yZwojICAgUDIgICBhMXAyQG90b2JvLm9yZyAgICAgIHEyCiMgICBQMiAgIGEycDJAb3RvYm8ub3JnICAgICAgcTUKIyAgIFAzICAgYTFwM0BvdG9iby5vcmcgICAgICBxMwojICAgUDMgICBhMnAzQG90b2JvLm9yZwojICAgICAgICAgIGF4QG90b2JvLm9yZwoKIyBQb29sIHwgRGVmUXVldWUKIyAgIFAxICAgICAgICAgcTQKIyAgIFAyICAgICAgICAgcTUKIyAgIFAzICAgICAgICAgcTMKIyAgICAgICAgICAgICAgcTUKCiMgYWRkIHN5c3RlbSBhZGRyZXNzZXMKbXkgJVN5c3RlbUFkZHJlc3NJRHM7CmZvciBteSAkQWRkcmVzcyAocXcvYTFQMUBvdG9iby5vcmcgYTFwMkBvdG9Cby5vcmcgYTFwM0BvdG9iby5vcmcgYTJwMkBvdG9iby5vcmcgdW51c2VkQG90b2JvLm9yZy8pIHsKICAgIG15ICRTeXN0ZW1BZGRyZXNzSUQgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0FkZCgKICAgICAgICBOYW1lICAgICA9PiAkQWRkcmVzcywKICAgICAgICBSZWFsbmFtZSA9PiAnQVBUZXN0JywKICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgIFF1ZXVlSUQgID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgJFN5c3RlbUFkZHJlc3NJRHN7JEFkZHJlc3N9ID0gJFN5c3RlbUFkZHJlc3NJRDsKfQoKbXkgJVF1ZXVlQWRkcmVzc2VzID0gKAogICAgcTEgPT4gJ2ExUDFAb3RvYm8ub3JnJywKICAgIHEyID0+ICdhMXAyQG90b0JvLm9yZycsCiAgICBxMyA9PiAnYTFwM0BvdG9iby5vcmcnLAogICAgcTQgPT4gJ3VudXNlZEBvdG9iby5vcmcnLAogICAgcTUgPT4gJ2EycDJAb3RvYm8ub3JnJywKKTsKCiMgYWRkIHF1ZXVlcwpteSAlUXVldWVJRHM7CmZvciBteSAkUXVldWUgKCBrZXlzICVRdWV1ZUFkZHJlc3NlcyApIHsKICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUFkZCgKICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJFF1ZXVlLAogICAgICAgIFZhbGlkSUQgICAgICAgICA9PiAxLAogICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgIFN5c3RlbUFkZHJlc3NJRCA9PiAkU3lzdGVtQWRkcmVzc0lEc3sgJFF1ZXVlQWRkcmVzc2VzeyRRdWV1ZX0gfSwKICAgICAgICBTYWx1dGF0aW9uSUQgICAgPT4gMSwKICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJFF1ZXVlSURzeyRRdWV1ZX0gPSAkUXVldWVJRDsKCiAgICAjIHVwZGF0ZSBzeXN0ZW0gYWRkcmVzcwogICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgSUQgPT4gJFN5c3RlbUFkZHJlc3NJRHN7ICRRdWV1ZUFkZHJlc3Nlc3skUXVldWV9IH0sCiAgICApOwoKICAgICRTeXN0ZW1BZGRyZXNzRGF0YXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwoKICAgICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzVXBkYXRlKAogICAgICAgICVTeXN0ZW1BZGRyZXNzRGF0YSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cn0KCiMgc2V0IGFkZHJlc3MgcG9vbHMKewogICAgbXkgJUFkZHJlc3NQb29sRGF0YSA9ICgKICAgICAgICBQb29sMDEgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ1AxJywKICAgICAgICAgICAgRW1haWxzID0+IFsKICAgICAgICAgICAgICAgICdhMXAxQG90b2JvLm9yZycsCiAgICAgICAgICAgICAgICAnYTJwMUBvdG9iby5vcmcnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBEZWZhdWx0UXVldWUgPT4gJ3E0JywKICAgICAgICB9LAogICAgICAgIFBvb2wwMiA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnUDInLAogICAgICAgICAgICBFbWFpbHMgPT4gWwogICAgICAgICAgICAgICAgJ2ExcDJAb3RvYm8ub3JnJywKICAgICAgICAgICAgICAgICdhMnAyQG90b2JvLm9yZycsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERlZmF1bHRRdWV1ZSA9PiAncTUnLAogICAgICAgIH0sCiAgICAgICAgUG9vbDAzID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdQMycsCiAgICAgICAgICAgIEVtYWlscyA9PiBbCiAgICAgICAgICAgICAgICAnQTFwM0BvdG9iby5vcmcnLAogICAgICAgICAgICAgICAgJ0EycDNAb3RvYm8ub3JnJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGVmYXVsdFF1ZXVlID0+ICdxMycsCiAgICAgICAgfSwKICAgICk7CgogICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIEtleSAgID0+ICdQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCcsCiAgICAgICAgVmFsdWUgPT4gXCVBZGRyZXNzUG9vbERhdGEsCiAgICApOwp9CgojIFN0YXJ0IHRlc3RzCgojIFRlc3Q6IFRpY2tldCN4IGluIHExIChpZ25vcmUgZGVmcXVldWUgb2YgYTJwMSksIFRpY2tldCN5IGluIHEyLCBub3RoaW5nIGluIHE1Cm15ICRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2EycDFAb3RvYm8ub3JHLCBhMXAxQG90b2JvLm9yRywgYTFwMkBvdG9iby5vckcsIG5vdEBvdXJzLmNvbScsCiAgICBTdWJqZWN0ICAgPT4gJ0luaXRpYWwnLAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzMUB0ZXN0PicsCik7CgpteSAoICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsLCAxICk7CgojIHR3byB0aWNrZXRzIHNob3VsZCBiZSBjcmVhdGVkLi4uCiRTZWxmLT5JcygKICAgIHNjYWxhciBAVGlja2V0SURzLAogICAgMiwKICAgICJNYWlsMSAtIGNyZWF0ZSB0d28gdGlja2V0cy4iLAopOwoKbXkgQFRlc3RUaWNrZXRzOwpmb3IgbXkgJElEIChAVGlja2V0SURzKSB7CiAgICBwdXNoIEBUZXN0VGlja2V0cywgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJElEICkKICAgIH07Cn0KCiMgdGlja2V0IDEgc2hvdWxkIGJlIGluIHExCiRTZWxmLT5JcygKICAgICRUZXN0VGlja2V0c1swXXtRdWV1ZX0gLy8gJycsCiAgICAncTEnLAogICAgIk1haWwxIC0gVGlja2V0MSBpcyBpbiBxMS4iLAopOwoKIyB0aWNrZXQgMiBzaG91bGQgYmUgaW4gcTIKJFNlbGYtPklzKAogICAgJFRlc3RUaWNrZXRzWzFde1F1ZXVlfSAvLyAnJywKICAgICdxMicsCiAgICAiTWFpbDEgLSBUaWNrZXQyIGlzIGluIHEyLiIsCik7CgpteSBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICBUaWNrZXRJRCA9PiAkVGVzdFRpY2tldHNbMF17VGlja2V0SUR9LAopOwoKIyB0aWNrZXQgMSBzaG91bGQgaGF2ZSBleGFjdGx5IDEgYXJ0aWNsZQokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFydGljbGVzLAogICAgMSwKICAgICJNYWlsMSAtIFRpY2tldDEgaGFzIDEgYXJ0aWNsZS4iLAopOwoKIyBUZXN0OiBUaWNrZXQxI051bWJlciAtPiBGb2xsb3dVcCBpbiBxMiwgTmV3IGluIHEzIChkZWZxdWV1ZSkKbXkgJE5ld1N1YmplY3QgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICBUaWNrZXROdW1iZXIgPT4gJFRlc3RUaWNrZXRzWzBde1RpY2tldE51bWJlcn0sCiAgICBTdWJqZWN0ICAgICAgPT4gJ0luaXRpYWwnLAogICAgQWN0aW9uICAgICAgID0+ICdSZXBseScsCik7CgokRW1haWwgPSBHZW5lcmF0ZUVtYWlsKAogICAgVG8gICAgICAgID0+ICdhMXAyQG9Ub2JvLm9yZywgYTJwM0BvdG9iby5vckcnLAogICAgU3ViamVjdCAgID0+ICROZXdTdWJqZWN0LAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzMkB0ZXN0PicsCik7CgooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCgkRW1haWwpOwoKIyB0d28gYXJ0aWNsZXMgc2hvdWxkIGJlIGNyZWF0ZWQuLi4KJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAyLAogICAgIk1haWwyIC0gY3JlYXRlIHR3byBhcnRpY2xlcy4iLAopOwoKIyB0aWNrZXQgMSBzaG91bGQgYmUgdGlja2V0IDIgb2YgbGFzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzBdLAogICAgJFRlc3RUaWNrZXRzWzFde1RpY2tldElEfSwKICAgICJNYWlsMiAtIFRpY2tldDEgaXMgb2xkIFRpY2tldDIuIiwKKTsKCnB1c2ggQFRlc3RUaWNrZXRzLCB7CiAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRUaWNrZXRJRHNbMV0gKSwKfTsKCiMgdGlja2V0IDMgc2hvdWxkIGJlIGluIHEzCiRTZWxmLT5JcygKICAgICRUZXN0VGlja2V0c1syXXtRdWV1ZX0gLy8gJycsCiAgICAncTMnLAogICAgIk1haWwyIC0gVGlja2V0MiBpcyBpbiBxMy4iLAopOwoKIyBrZWVwIGZvciBsYXRlcgpteSAkRW1haWwyID0gJEVtYWlsOwoKIyBUZXN0OiBSZSBUaWNrZXQzI051bWJlciBjcmVhdGVzIGFydGljbGUgaW4gVGlja2V0MQokTmV3U3ViamVjdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgIFRpY2tldE51bWJlciA9PiAkVGVzdFRpY2tldHNbMl17VGlja2V0TnVtYmVyfSwKICAgIFN1YmplY3QgICAgICA9PiAnSW5pdGlhbCcsCiAgICBBY3Rpb24gICAgICAgPT4gJ1JlcGx5JywKKTsKCiRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2ExcDFAb3RvYm8ub3JnJywKICAgIFN1YmplY3QgICA9PiAkTmV3U3ViamVjdCwKICAgIE1lc3NhZ2VJRCA9PiAnPDIwMjMwMjE0MDAyODE0LkFkZHJlc3NQb29sczNAdGVzdD4nLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoJEVtYWlsKTsKCiMgdGlja2V0IDEgc2hvdWxkIGJlIHRpY2tldCAxIG9mIHRoZSBmaXJzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzBdLAogICAgJFRlc3RUaWNrZXRzWzBde1RpY2tldElEfSwKICAgICJNYWlsMyAtIFRpY2tldDEgaXMgb2xkIFRpY2tldDEuIiwKKTsKCkBBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgIFRpY2tldElEID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXRJRH0sCik7CgojIHRpY2tldCAxIHNob3VsZCBoYXZlIDIgYXJ0aWNsZXMKJFNlbGYtPklzKAogICAgc2NhbGFyIEBBcnRpY2xlcywKICAgIDIsCiAgICAiTWFpbDMgLSBUaWNrZXQxIGhhcyAyIGFydGljbGVzLiIsCik7CgojIGNsZWFuIGFsbCBUaWNrZXRudW1iZXJzCm15ICRDbGVhbmVkU3ViamVjdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgIFRpY2tldE51bWJlciA9PiAkVGVzdFRpY2tldHNbMF17VGlja2V0TnVtYmVyfSwKICAgIFN1YmplY3QgICAgICA9PiAnJwogICAgICAgIC4gJ1snIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpIC4gJFRlc3RUaWNrZXRzWzBde1RpY2tldE51bWJlcn0gLiAnXScKICAgICAgICAuICdbJyAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJykgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKSAuICRUZXN0VGlja2V0c1sxXXtUaWNrZXROdW1iZXJ9IC4gJ10nCiAgICAgICAgLiAnWycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgLiAkVGVzdFRpY2tldHNbMl17VGlja2V0TnVtYmVyfSAuICddJwogICAgICAgIC4gJ1snIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpIC4gJzIwMDMwMzAxMTIzNDEyMzQwMDAxXSBUZXN0JywKICAgIFNpemUgPT4gMCwKKTsKCiMgYWxsIGxpbmtlZCB0aWNrZXQgbnVtYmVycyBhcmUgY2xlYW5lZAokU2VsZi0+SXMoCiAgICAkQ2xlYW5lZFN1YmplY3QsCiAgICAnWycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgLiAnMjAwMzAzMDExMjM0MTIzNDAwMDFdIFRlc3QnLAogICAgIlRpY2tldFN1YmplY3RDbGVhbiBpbmNsdWRlcyBpbnRlcmRpdiB0aWNrZXQgbnVtYmVycy4iLAopOwoKIyBUZXN0OiBzdGFuZGFyZCBjYXNlCiRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2F4QG90b2JvLm9yZycsCiAgICBTdWJqZWN0ICAgPT4gJ0tlaW4gUG9vbCcsCiAgICBNZXNzYWdlSUQgPT4gJzwyMDIzMDIxNDAwMjgxNC5BZGRyZXNzUG9vbHM0QHRlc3Q+JywKKTsKCiggJFJldHVybiwgQFRpY2tldElEcyApID0gUmVhZEVtYWlsKCRFbWFpbCk7CgojIG9uZSB0aWNrZXQgc2hvdWxkIGJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAxLAogICAgIk1haWw0IC0gYSB0aWNrZXQgaXMgY3JlYXRlZC4iLAopOwoKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFRpY2tldElEc1swXSApOwoKIyB0aWNrZXQgaXMgaW4gZGVmYXVsdCBxdWV1ZQokU2VsZi0+SXMoCiAgICAkVGlja2V0e1F1ZXVlfSwKICAgICRDb25maWdPYmplY3QtPkdldCgnUG9zdG1hc3RlckRlZmF1bHRRdWV1ZScpLAogICAgIk1haWw0IC0gdGlja2V0IGlzIGNyZWF0ZWQgaW4gZGVmIHF1ZXVlLiIsCik7CgojIFRlc3Q6IGlnbm9yZSBhbHJlYWR5IHJlY2VpdmVkIG1haWxzCiggJFJldHVybiwgQFRpY2tldElEcyApID0gUmVhZEVtYWlsKCRFbWFpbDIpOwoKIyBubyB0aWNrZXQgc2hvdWxkIGJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgJFJldHVybiwKICAgIDUsCiAgICAiTWFpbDUgLSBtYWlsIGlnbm9yZWQuIiwKKTsKCiMgbm8gdGlja2V0IHNob3VsZCBiZSBjcmVhdGVkCiRTZWxmLT5JcygKICAgIHNjYWxhciBAVGlja2V0SURzLAogICAgMCwKICAgICJNYWlsNSAtIG5vIGFydGljbGUuIiwKKTsKCiMgVGVzdDogUmUgVGlja2V0MyNOdW1iZXIgY3JlYXRlcyBhcnRpY2xlIGluIFRpY2tldDEKJE5ld1N1YmplY3QgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICBUaWNrZXROdW1iZXIgPT4gJFRlc3RUaWNrZXRzWzJde1RpY2tldE51bWJlcn0sCiAgICBTdWJqZWN0ICAgICAgPT4gJ0luaXRpYWwnLAogICAgQWN0aW9uICAgICAgID0+ICdSZXBseScsCik7CgokRW1haWwgPSBHZW5lcmF0ZUVtYWlsKAogICAgVG8gICAgICAgID0+ICdhMXAxQG90b2JvLm9yZywgYTFwMkBvdG9iby5vcmcnLAogICAgU3ViamVjdCAgID0+ICROZXdTdWJqZWN0LAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzNkB0ZXN0PicsCiAgICBYSGVhZGVyICAgPT4gIlxuWC1PVE9CTy1Gb2xsb3dVcC1RdWV1ZTogcTUiLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoJEVtYWlsKTsKCiMgdGlja2V0IDEgc2hvdWxkIGJlIHRpY2tldCAxIG9mIHRoZSBmaXJzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzBdLAogICAgJFRlc3RUaWNrZXRzWzBde1RpY2tldElEfSwKICAgICJNYWlsNiAtIFRpY2tldDEgaXMgb2xkIFRpY2tldDEuIiwKKTsKCiMgdGlja2V0IDIgc2hvdWxkIGJlIHRpY2tldCAyIG9mIHRoZSBmaXJzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzFdLAogICAgJFRlc3RUaWNrZXRzWzFde1RpY2tldElEfSwKICAgICJNYWlsNiAtIFRpY2tldDIgaXMgb2xkIFRpY2tldDIuIiwKKTsKCmZvciBteSAkaSAoIDAsIDEgKSB7CiAgICAkVGVzdFRpY2tldHNbJGldID0geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRUaWNrZXRJRHNbJGldICkgfTsKfQoKIyB0aWNrZXRxdWV1ZSAxIHNob3VsZCBzdGlsbCBiZSBxMQokU2VsZi0+SXMoCiAgICAkVGVzdFRpY2tldHNbMF0tPntRdWV1ZX0sCiAgICAncTEnLAogICAgIk1haWw2IC0gUXVldWUgb2YgVGlja2V0IDEgaXMgcTEuIiwKKTsKCiMgdGlja2V0cXVldWUgMiBzaG91bGQgbm93IGJlIHE1IG9mIHRoZSBYLU9UT0JPLUZvbGxvd1VwLVF1ZXVlIGhlYWRlcgokU2VsZi0+SXMoCiAgICAkVGVzdFRpY2tldHNbMV0tPntRdWV1ZX0sCiAgICAncTUnLAogICAgIk1haWw2IC0gUXVldWUgb2YgVGlja2V0IDIgaXMgcTUuIiwKKTsKCiMgVGVzdDogRG8gbm90IGlnbm9yZSBtYWlscyBzZW50IGZyb20gdGhlIHN5c3RlbQpteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnRW1haWwnICk7CiRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXRJRH0sCiAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAnIlAxIiA8YTFwMUBvdG9iby5vcmc+JywKICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICciUDIiIDxhMXAyQG90b2JvLm9yZz4nLAogICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLAogICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ3RoZSBtZXNzYWdlIHRleHQnLAogICAgTWVzc2FnZUlEICAgICAgICAgICAgPT4gJzwyMDIzMDIxNDAwMjgxNC5BZGRyZXNzUG9vbHM3QHRlc3Q+JywKICAgIENvbnRlbnRUeXBlICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1JywKICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdBZGROb3RlJywKICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICdTb21lIGZyZWUgdGV4dCEnLAogICAgTm9BZ2VudE5vdGlmeSAgICAgICAgPT4gMSwKKTsKCiROZXdTdWJqZWN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgVGlja2V0TnVtYmVyID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXROdW1iZXJ9LAogICAgU3ViamVjdCAgICAgID0+ICdzb21lIHNob3J0IGRlc2NyaXB0aW9uJywKICAgIEFjdGlvbiAgICAgICA9PiAnUmVwbHknLAopOwoKJEVtYWlsID0gR2VuZXJhdGVFbWFpbCgKICAgIFRvICAgICAgICA9PiAnYTFwMkBvdG9iby5vcmcnLAogICAgU3ViamVjdCAgID0+ICROZXdTdWJqZWN0LAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzN0B0ZXN0PicsCik7CgooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCgkRW1haWwpOwoKIyBvbmUgYXJ0aWNsZSBzaG91bGQgYmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDEsCiAgICAiTWFpbDcgLSBvbmUgYXJ0aWNsZS4iLAopOwoKIyB0aWNrZXQgMSBzaG91bGQgYmUgdGlja2V0IDIgb2YgdGhlIGZpcnN0IGVtYWlsCiRTZWxmLT5JcygKICAgICRUaWNrZXRJRHNbMF0sCiAgICAkVGVzdFRpY2tldHNbMV17VGlja2V0SUR9LAogICAgIk1haWw3IC0gVGlja2V0MSBpcyBvbGQgVGlja2V0Mi4iLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoJEVtYWlsKTsKCiMgb24gc2Vjb25kIHJvdW5kIHRob3VnaCwgbWFpbCBzaG91bGQgYmUgaWdub3JlZAokU2VsZi0+SXMoCiAgICAkUmV0dXJuLAogICAgNSwKICAgICJNYWlsNy41IC0gbWFpbCBpZ25vcmVkLiIsCik7CgojIG5vIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDAsCiAgICAiTWFpbDcuNSAtIG5vIGFydGljbGUuIiwKKTsKCiMgVGVzdDogRGlzcGF0Y2hpbmcgdmlhIFF1ZXVlCiRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2ExcDFAb3RvYm8ub3JnJywKICAgIFN1YmplY3QgICA9PiAnTmV3JywKICAgIE1lc3NhZ2VJRCA9PiAnPDIwMjMwMjE0MDAyODE0LkFkZHJlc3NQb29sczhAdGVzdD4nLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoICRFbWFpbCwgJFF1ZXVlSURze3EyfSApOwoKIyB0d28gdGlja2V0cyBzaG91bGQgYmUgY3JlYXRlZC4uLgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDIsCiAgICAiTWFpbDggLSBjcmVhdGUgdHdvIHRpY2tldHMuIiwKKTsKCm15IEBUZXN0OFRpY2tldHM7CmZvciBteSAkSUQgKEBUaWNrZXRJRHMpIHsKICAgIHB1c2ggQFRlc3Q4VGlja2V0cywgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJElEICkKICAgIH07Cn0KCiMgdGlja2V0IDEgc2hvdWxkIGJlIGluIHEyCiRTZWxmLT5JcygKICAgICRUZXN0OFRpY2tldHNbMF17UXVldWV9IC8vICcnLAogICAgJ3EyJywKICAgICJNYWlsOCAtIFRpY2tldDEgaXMgaW4gcTIuIiwKKTsKCiMgdGlja2V0IDIgc2hvdWxkIGJlIGluIHExCiRTZWxmLT5JcygKICAgICRUZXN0OFRpY2tldHNbMV17UXVldWV9IC8vICcnLAogICAgJ3ExJywKICAgICJNYWlsOCAtIFRpY2tldDIgaXMgaW4gcTEuIiwKKTsKCiMgVGVzdDogRGlzcGF0Y2hpbmcgdmlhIFF1ZXVlIHNlY29uZCByb3VuZAooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsLCAkUXVldWVJRHN7cTN9ICk7CgojIG9uZSBhZGRpdGlvbmFsIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZC4uLgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDEsCiAgICAiTWFpbDguNSAtIG9uZSB0aWNrZXQuIiwKKTsKCm15ICggJExpbmtlZFRpY2tldE51bWJlciwgJExpbmtlZFRpY2tldElEICkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKS0+RmluZExpbmtlZFRpY2tldCgKICAgIFRpY2tldElEICAgID0+ICRUaWNrZXRJRHNbMF0sCiAgICBBZGRyZXNzUG9vbCA9PiAnUG9vbDAyJywKICAgIFVzZXJJRCAgICAgID0+IDEsCik7CgojIC4uLmFuZCBiZSBsaW5rZWQgdG8gdGhlIGZvcm1lciBvbmVzCiRTZWxmLT5JcygKICAgICRMaW5rZWRUaWNrZXRJRCwKICAgICRUZXN0OFRpY2tldHNbMF17VGlja2V0SUR9LAogICAgIk1haWw4LjUgLSBjb3JyZWN0bHkgbGlua2VkLiIsCik7CgojIFRlc3Q6IERpc3BhdGNoaW5nIHZpYSBRdWV1ZSB0aGlyZCB0aW1lIHVubHVja3kKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoICRFbWFpbCwgJFF1ZXVlSURze3EzfSApOwoKIyBvbiB0aGlyZCByb3VuZCB0aG91Z2gsIG1haWwgc2hvdWxkIGJlIGlnbm9yZWQsIGFzIGFsbCBwb29scyBhcmUgZnVsbAokU2VsZi0+SXMoCiAgICAkUmV0dXJuLAogICAgNSwKICAgICJNYWlsOC42IC0gbWFpbCBpZ25vcmVkLiIsCik7CgojIG5vIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDAsCiAgICAiTWFpbDguNiAtIG5vIGFydGljbGUuIiwKKTsKCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KJFNlbGYtPkRvbmVUZXN0aW5nKCk7CgpzdWIgR2VuZXJhdGVFbWFpbCB7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAkUGFyYW17WEhlYWRlcn0gLy89ICcnOwoKICAgIHJldHVybiA8PCJFTkQiOwpGcm9tIHNreXdhbGtlclxAb3RvYm8ub3JnIEZyaSBEZWMgMjEgMjM6NTk6MjQgMjAwMQpSZXR1cm4tUGF0aDogPHNreXdhbGtlclxAb3RvYm8ub3JnPgpSZWNlaXZlZDogKGZyb20gc2t5d2Fsa2VyXEBsb2NhbGhvc3QpCiAgICBieSBhdnJvLmRlICg4LjExLjMvOC4xMS4zL1N1U0UgTGludXggOC4xMS4xLTAuNSkgaWQgZjNNTVNFMzAzNjk0CiAgICBmb3IgbWFydGluXEBsb2NhbGhvc3Q7IEZyaSwgMjEgRGVjIDIwMDEgMjM6NTk6MjQgKzAyMDAKRGF0ZTogRnJpLCAyMSBEZWMgMjAwMSAyMzo1OToyNCArMDIwMApGcm9tOiBTa3l3YWxrZXIgQXR0YWNobWVudCA8c2t5d2Fsa2VyXEBvdG9iby5vcmc+ClRvOiAkUGFyYW17VG99ClN1YmplY3Q6ICRQYXJhbXtTdWJqZWN0fQpNZXNzYWdlLUlEOiAkUGFyYW17TWVzc2FnZUlEfQpNaW1lLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lJFBhcmFte1hIZWFkZXJ9ClgtT3BlcmF0aW5nLVN5c3RlbTogTGludXggMi40LjEwLTRHQiBpNjg2ClgtVXB0aW1lOiAxMjoyM2FtICB1cCAgNToxOSwgIDYgdXNlcnMsICBsb2FkIGF2ZXJhZ2U6IDAuMTEsIDAuMTMsIDAuMTgKQ29udGVudC1MZW5ndGg6IDEzOQpMaW5lczogMTEKClRoaXMgaXMgdGhlIGZpcnN0IHRlc3QuCgpBZGlvcyAuLi4KCiAgTGl0dGxlICJTa3l3YWxrZXIiCgotLQpTeXN0ZW0gVGVzdGVyIEkgLSA8c2t5d2Fsa2VyXEBvdG9iby5vcmc+Ci0tCk9sZCBwcm9ncmFtbWVycyBuZXZlciBkaWUuIFRoZXkganVzdCBicmFuY2ggdG8gYSBuZXcgYWRkcmVzcy4KRU5ECn0KCiMjIG5vIGNyaXRpYyAoUGVybDo6Q3JpdGljOjpQb2xpY3k6OlN1YnJvdXRpbmVzOjpSZXF1aXJlQXJnVW5wYWNraW5nKQoKc3ViIFJlYWRFbWFpbCB7CgogICAgIyBzdGFydCBhIG5ldyBpbmNvbWluZyBjb21tdW5pY2F0aW9uCiAgICBteSAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpDb21tdW5pY2F0aW9uTG9nJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBUcmFuc3BvcnQgICA9PiAnRW1haWwnLAogICAgICAgICAgICBEaXJlY3Rpb24gICA9PiAnSW5jb21pbmcnLAogICAgICAgICAgICBBY2NvdW50VHlwZSA9PiAnU1RESU4nLAogICAgICAgIH0sCiAgICApOwoKICAgICMgc3RhcnQgb2JqZWN0IGxvZyBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24KICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdGFydCggT2JqZWN0TG9nVHlwZSA9PiAnQ29ubmVjdGlvbicgKTsKCiAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ0Nvbm5lY3Rpb24nLAogICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OlBvc3RNYXN0ZXI6OlJlYWQnLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gJ1JlYWQgRW1haWwgZnJvbSBBZGRyZXNzUG9vbFRlc3QuJywKICAgICk7CgogICAgIyBzdGFydCBvYmplY3QgbG9nIGZvciB0aGUgZW1haWwgcHJvY2Vzc2luZwogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZ1N0YXJ0KCBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJyApOwoKICAgICMgcmVtZW1iZXIgdGhlIHJldHVybiBjb2RlIHRvIHN0b3AgdGhlIGNvbW11bmljdGFpb24gbGF0ZXIgd2l0aCBhIHByb3BlciBzdGF0dXMKICAgIG15ICRQb3N0TWFzdGVyUmV0dXJuQ29kZSA9IDA7CiAgICBteSBAUmV0dXJuOwoKICAgICMgV3JhcCB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBzY3JpcHQgaW4gYW4gImV2YWwiIGJsb2NrIHNvIHRoYXQgYW55CiAgICAjIHVuZXhwZWN0ZWQgKGJ1dCBwcm9iYWJseSB0cmFuc2llbnQpIGZhdGFsIGVycm9ycyAoc3VjaCBhcyB0aGUKICAgICMgZGF0YWJhc2UgYmVpbmcgdW5hdmFpbGFibGUpIGNhbiBiZSB0cmFwcGVkIHdpdGhvdXQgY2F1c2luZyBhCiAgICAjIGJvdW5jZQogICAgZXZhbCB7CgogICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6UG9zdE1hc3Rlcjo6UmVhZCcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJ1Byb2Nlc3NpbmcgZW1haWwgd2l0aCBQb3N0TWFzdGVyIG1vZHVsZS4nLAogICAgICAgICk7CgogICAgICAgIG15ICRQb3N0TWFzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIENvbW11bmljYXRpb25Mb2dPYmplY3QgPT4gJENvbW11bmljYXRpb25Mb2dPYmplY3QsCiAgICAgICAgICAgICAgICBFbWFpbCAgICAgICAgICAgICAgICAgID0+IFsgc3BsaXQoIC9cbi8sICRfWzBdICkgXSwKICAgICAgICAgICAgICAgIFRydXN0ZWQgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBAUmV0dXJuID0gJFBvc3RNYXN0ZXJPYmplY3QtPlJ1biggUXVldWVJRCA9PiAkX1sxXSApOwoKICAgICAgICBpZiAoICEkUmV0dXJuWzBdICkgewoKICAgICAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpQb3N0TWFzdGVyOjpSZWFkJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJ1Bvc3RNYXN0ZXIgbW9kdWxlIGV4aXRlZCB3aXRoIGVycm9ycywgY291bGQgbm90IHByb2Nlc3MgZW1haWwuIFBsZWFzZSByZWZlciB0byB0aGUgbG9nIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5Db21tdW5pY2F0aW9uU3RvcCggU3RhdHVzID0+ICdGYWlsZWQnICk7CgogICAgICAgICAgICBkaWUgIkNvdWxkIG5vdCBwcm9jZXNzIGVtYWlsLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGxvZyFcbiI7CiAgICAgICAgfQoKICAgICAgICBteSAkRHVtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkR1bXAoIFxAUmV0dXJuICk7CiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpQb3N0TWFzdGVyOjpSZWFkJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiRW1haWwgcHJvY2Vzc2luZyB3aXRoIFBvc3RNYXN0ZXIgbW9kdWxlIGNvbXBsZXRlZCwgcmV0dXJuIGRhdGE6ICREdW1wIiwKICAgICAgICApOwoKICAgICAgICAkUG9zdE1hc3RlclJldHVybkNvZGUgPSAkUmV0dXJuWzBdOwogICAgfTsKCiAgICBpZiAoJEApIHsKCiAgICAgICAgIyBBbiB1bmV4cGVjdGVkIHByb2JsZW0gb2NjdXJyZWQgKGZvciBleGFtcGxlLCB0aGUgZGF0YWJhc2Ugd2FzCiAgICAgICAgIyB1bmF2YWlsYWJsZSkuIFJldHVybiBhbiBFWF9URU1QRkFJTCBlcnJvciB0byBjYXVzZSB0aGUgbWFpbAogICAgICAgICMgcHJvZ3JhbSB0byByZXF1ZXVlIHRoZSBtZXNzYWdlIGluc3RlYWQgb2YgaW1tZWRpYXRlbHkgYm91bmNpbmcKICAgICAgICAjIGl0OyBzZWUgc3lzZXhpdHMuaC4gTW9zdCBtYWlsIHByb2dyYW1zIHdpbGwgcmV0cnkgYW4KICAgICAgICAjIEVYX1RFTVBGQUlMIGRlbGl2ZXJ5IGZvciBhYm91dCBmb3VyIGRheXMsIHRoZW4gYm91bmNlIHRoZQogICAgICAgICMgbWVzc2FnZS4pCiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkQDsKCiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpQb3N0TWFzdGVyOjpSZWFkJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCwgbWVzc2FnZTogJE1lc3NhZ2UiLAogICAgICAgICk7CgogICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgU3RhdHVzICAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICApOwogICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdDb25uZWN0aW9uJywKICAgICAgICAgICAgU3RhdHVzICAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICApOwogICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5Db21tdW5pY2F0aW9uU3RvcCggU3RhdHVzID0+ICdGYWlsZWQnICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ0Nvbm5lY3Rpb24nLAogICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OlBvc3RNYXN0ZXI6OlJlYWQnLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gJ0Nsb3NpbmcgY29ubmVjdGlvbiBmcm9tIFNURElOLicsCiAgICApOwoKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgIFN0YXR1cyAgICAgICAgPT4gJ1N1Y2Nlc3NmdWwnLAogICAgKTsKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ0Nvbm5lY3Rpb24nLAogICAgICAgIFN0YXR1cyAgICAgICAgPT4gJ1N1Y2Nlc3NmdWwnLAogICAgKTsKCiAgICBteSAlUmV0dXJuQ29kZU1hcCA9ICgKICAgICAgICAwID0+ICdGYWlsZWQnLCAgICAgICAgIyBlcnJvciAoYWxzbyBmYWxzZSkKICAgICAgICAxID0+ICdTdWNjZXNzZnVsJywgICAgIyBuZXcgdGlja2V0IGNyZWF0ZWQKICAgICAgICAyID0+ICdTdWNjZXNzZnVsJywgICAgIyBmb2xsb3cgdXAgLyBvcGVuL3Jlb3BlbgogICAgICAgIDMgPT4gJ1N1Y2Nlc3NmdWwnLCAgICAjIGZvbGxvdyB1cCAvIGNsb3NlIC0+IG5ldyB0aWNrZXQKICAgICAgICA0ID0+ICdGYWlsZWQnLCAgICAgICAgIyBmb2xsb3cgdXAgLyBjbG9zZSAtPiByZWplY3QKICAgICAgICA1ID0+ICdTdWNjZXNzZnVsJywgICAgIyBpZ25vcmVkIChiZWNhdXNlIG9mIFgtT1RPQk8tSWdub3JlIGhlYWRlcikKICAgICk7CgogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPkNvbW11bmljYXRpb25TdG9wKAogICAgICAgIFN0YXR1cyA9PiAkUmV0dXJuQ29kZU1hcHskUG9zdE1hc3RlclJldHVybkNvZGV9IC8vICdGYWlsZWQnLAogICAgKTsKCiAgICByZXR1cm4gQFJldHVybjsKfQo=</File>
        <File Location="doc/en/DiscreteSystemAddresses.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
</otrs_package>