<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>AppointmentToTicket</Name>
    <Version>10.1.7</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-10-28 10:53:37" Version="10.1.7">Tidied.</ChangeLog>
    <ChangeLog Date="2025-02-26 13:31:57" Version="10.1.6">Issue #1: Fixed variable initialization and scoping in js.</ChangeLog>
    <ChangeLog Date="2025-02-26 13:20:35" Version="10.1.5">- Add CustomerKey for TicketCreation.
- Translations &amp; OTOBO Updates</ChangeLog>
    <ChangeLog Date="2024-01-24 17:46:52" Version="10.1.4">Fix AJAXUpdate for Queues.</ChangeLog>
    <ChangeLog Date="2023-10-04 11:52:19" Version="10.1.3">Fixed service selection treeview.
Updated to OTOBO 10.1.8.</ChangeLog>
    <ChangeLog Date="2022-06-30 08:38:40" Version="10.1.2">Add more fields, activate FormUpdates which also enables ACL content (not visibility) restrictions.</ChangeLog>
    <ChangeLog Date="2022-06-22 06:39:11" Version="10.1.1">Initial release.</ChangeLog>
    <Description Lang="en">This package brings the functionality to automatically create a ticket with configurable parameters to a freely chooseable point in time in relation to an appointment.</Description>
    <Description Lang="hu">Ez a csomag azt a funkciót adja hozzá, hogy automatikusan létre lehessen hozni egy beállítható paraméterekkel rendelkező jegyet egy szabadon választható időpontra egy naptáridőponttal kapcsolatban.</Description>
    <Framework>10.1.x</Framework>
    <CodeUninstall Type="pre">

        # create the package name
        my $CodeModule = 'var::packagesetup::AppointmentToTicket';

        $Kernel::OM-&gt;Get($CodeModule)-&gt;CodeUninstall();
    </CodeUninstall>
    <BuildCommitID>d38f5072fcde4fd3d7c60ec140962ab2c1d70dfc</BuildCommitID>
    <BuildDate>2026-10-28 10:53:41</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AgentAppointmentEdit.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBjMTRjYTU1YThiMWQzZDY4NmU4MDNjMTM5ODgxM2I4M2QyMjA5MWU1IC0gS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50QXBwb2ludG1lbnRFZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntFbXB0eVN0cmluZ30gPSAnLSc7CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgZnJvbnRlbmQgc3BlY2lmaWMgY29uZmlnCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgbWV0aG9kcyB3aGljaCBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgc3RhbmRhcmQgZmllbGRzCiAgICAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gPSBbCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdEZXN0JywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRUb3MKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFN0YXRlcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRQcmlvcml0aWVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U2VydmljZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU0xBSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFNMQXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnVHlwZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRUeXBlcwogICAgICAgIH0sCiAgICBdOwoKICAgICMgZGVwZW5kYW5jaWVzIG9mIHN0YW5kYXJkIGZpZWxkcyB3aGljaCBhcmUgbm90IGRlZmluZWQgdmlhIEFDTHMKICAgICRTZWxmLT57SW50ZXJuYWxEZXBlbmRhbmN5fSA9IHsKICAgICAgICBTZXJ2aWNlSUQgPT4gewogICAgICAgICAgICBTTEFJRCAgICAgPT4gMSwKICAgICAgICAgICAgU2VydmljZUlEID0+IDEsICAgICNDdXN0b21lclVzZXIgdXBkYXRlcyBjYW4gYmUgc3VibWl0dGVkIGFzIEVsZW1lbnRDaGFuZ2VkOiBTZXJ2aWNlSUQKICAgICAgICB9LAogICAgICAgIEN1c3RvbWVyVXNlciA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAxLAogICAgICAgIH0sCiAgICB9OwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5hbWVzIG9mIGFsbCBwYXJhbWV0ZXJzCiAgICBteSBAUGFyYW1OYW1lcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgUEFSQU1OQU1FOgogICAgZm9yIG15ICRLZXkgKEBQYXJhbU5hbWVzKSB7CgogICAgICAgICMgc2tpcCB0aGUgQWN0aW9uIHBhcmFtZXRlciwgaXQncyBnaXZpbmcgQnVpbGREYXRlU2VsZWN0aW9uIHByb2JsZW1zIGZvciBzb21lIHJlYXNvbgogICAgICAgIG5leHQgUEFSQU1OQU1FIGlmICRLZXkgZXEgJ0FjdGlvbic7CgogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKCiAgICAgICAgbXkgJVNhZmVHZXRQYXJhbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+U2FmZXR5KAogICAgICAgICAgICBTdHJpbmcgICAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICAgICAgTm9PYmplY3QgICAgID0+IDEsCiAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICBOb1NWRyAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm9JbWcgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vSW50U3JjTG9hZCA9PiAxLAogICAgICAgICAgICBOb0V4dFNyY0xvYWQgPT4gMSwKICAgICAgICAgICAgTm9KYXZhU2NyaXB0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFNhZmVHZXRQYXJhbXtTdHJpbmd9OwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CgogICAgIyBNdWx0aXBsZUN1c3RvbWVyIEZyb20tZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyOwogICAgbXkgJEN1c3RvbWVyc051bWJlciA9ICRHZXRQYXJhbXsnQ3VzdG9tZXJUaWNrZXRDb3VudGVyRnJvbUN1c3RvbWVyJ30gfHwgMDsKICAgICMgQ29udGFpbnMgdXNlciBuYW1lCiAgICBteSAkU2VsZWN0ZWQgPSAkR2V0UGFyYW17J0N1c3RvbWVyU2VsZWN0ZWQnfSB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlcikgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAxOwogICAgICAgIGZvciBteSAkQ291bnQgKCAwIC4uLiAkQ3VzdG9tZXJzTnVtYmVyICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ICA9ICRHZXRQYXJhbXsnQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnR9OwogICAgICAgICAgICBteSAkQ3VzdG9tZXJTZWxlY3RlZCA9ICRTZWxlY3RlZCA9PSAkQ291bnQgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJEdldFBhcmFteydDdXN0b21lcktleV8nIC4gJENvdW50fSB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50KSB7CgogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnQpICkgewogICAgICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgIG15ICRDb25maWdPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQiKTsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkZpZWxkUmVzdHJpY3Rpb25zJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgIG15ICRQbHVnaW5PYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7CgogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKCBEYXRhID0+IFtdICk7CgogICAgbXkgJVBlcm1pc3Npb25MZXZlbCA9ICgKICAgICAgICAncm8nICAgICAgICA9PiAxLAogICAgICAgICdtb3ZlX2ludG8nID0+IDIsCiAgICAgICAgJ2NyZWF0ZScgICAgPT4gMywKICAgICAgICAnbm90ZScgICAgICA9PiA0LAogICAgICAgICdvd25lcicgICAgID0+IDUsCiAgICAgICAgJ3ByaW9yaXR5JyAgPT4gNiwKICAgICAgICAncncnICAgICAgICA9PiA3LAogICAgKTsKCiAgICBteSAkUGVybWlzc2lvbnMgPSAncncnOwoKI1JvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgZ2V0IER5bmFtaWMgZmllbGRzIGZvciBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwojRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sKICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGVkaXQgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXRNYXNrJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIHVzZXIncyB2YWxpZCBjYWxlbmRhcnMKICAgICAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWQgPT4gJ3ZhbGlkJywKICAgICAgICApOwogICAgICAgIG15IEBDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0cmFuc2Zvcm0gZGF0YSBmb3Igc2VsZWN0IGJveAogICAgICAgIG15IEBDYWxlbmRhckRhdGEgPSBtYXAgewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkXy0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJF8tPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICB9CiAgICAgICAgfSBAQ2FsZW5kYXJzOwoKICAgICAgICAjIHRyYW5zZm9ybSBkYXRhIGZvciBJRCBsb29rdXAKICAgICAgICBteSAlQ2FsZW5kYXJMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0NhbGVuZGFySUR9ID0+ICRfLT57Q2FsZW5kYXJOYW1lfQogICAgICAgIH0gQENhbGVuZGFyczsKCiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFyRGF0YSkgewoKICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICBteSAkQ2FsZW5kYXJQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0tleX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb25MZXZlbHskQ2FsZW5kYXJQZXJtaXNzaW9ufSA8IDMgKSB7CgogICAgICAgICAgICAgICAgIyBwZXJtaXNzaW9ucyA8IGNyZWF0ZQogICAgICAgICAgICAgICAgJENhbGVuZGFyLT57RGlzYWJsZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkZWZpbmUgeWVhciBib3VuZGFyaWVzCiAgICAgICAgbXkgKCAlWWVhclBlcmlvZFBhc3QsICVZZWFyUGVyaW9kRnV0dXJlICk7CiAgICAgICAgZm9yIG15ICRGaWVsZCAocXcgKFN0YXJ0IEVuZCBSZWN1cnJlbmNlVW50aWwpKSB7CiAgICAgICAgICAgICRZZWFyUGVyaW9kUGFzdHskRmllbGR9ID0gJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSA9IDU7CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCB1c2UgZGF0ZSBzZWxlY3Rpb24gdGltZSB6b25lIGNhbGN1bGF0aW9uIGJ5IGRlZmF1bHQKICAgICAgICBteSAkT3ZlcnJpZGVUaW1lWm9uZSA9IDE7CgogICAgICAgIG15ICVBcHBvaW50bWVudDsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBub24tZXhpc3RlbnQgYXBwb2ludG1lbnQKICAgICAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdBcHBvaW50bWVudCBub3QgZm91bmQhJyksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB1c2UgdGltZSB6b25lIGNhbGN1bGF0aW9uIGlmIGVkaXRpbmcgZXhpc3RpbmcgYXBwb2ludG1lbnRzCiAgICAgICAgICAgICMgYnV0IG9ubHkgaWYgbm90IGRlYWxpbmcgd2l0aCBhbiBhbGwgZGF5IGFwcG9pbnRtZW50CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE92ZXJyaWRlVGltZVpvbmUgPSAkQXBwb2ludG1lbnR7QWxsRGF5fSB8fCAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgICAgICRQZXJtaXNzaW9ucyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJQZXJtaXNzaW9uR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IHN0YXJ0IHRpbWUgY29tcG9uZW50cy4KICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZVNldHRpbmdzID0gJFN0YXJ0VGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWVDb21wb25lbnRzOwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRTdGFydFRpbWVTZXR0aW5nc30gKSB7CiAgICAgICAgICAgICAgICAkU3RhcnRUaW1lQ29tcG9uZW50cy0+eyJTdGFydCRLZXkifSA9ICRTdGFydFRpbWVTZXR0aW5ncy0+eyRLZXl9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCBlbmQgdGltZSBjb21wb25lbnRzLgogICAgICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtFbmRUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEVuZCB0aW1lcyBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgYXJlIGluY2x1c2l2ZSwgc3VidHJhY3Qgd2hvbGUgZGF5LgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtBbGxEYXl9ICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgICAgIERheXMgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lT2JqZWN0IDwgJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRFbmRUaW1lU2V0dGluZ3MgPSAkRW5kVGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lQ29tcG9uZW50czsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskRW5kVGltZVNldHRpbmdzfSApIHsKICAgICAgICAgICAgICAgICRFbmRUaW1lQ29tcG9uZW50cy0+eyJFbmQkS2V5In0gPSAkRW5kVGltZVNldHRpbmdzLT57JEtleX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVBcHBvaW50bWVudCA9ICggJUFwcG9pbnRtZW50LCAleyRTdGFydFRpbWVDb21wb25lbnRzfSwgJXskRW5kVGltZUNvbXBvbmVudHN9ICk7CgogICAgICAgICAgICAjIEdldCByZWN1cnJlbmNlIHVudGlsIGNvbXBvbmVudHMuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbFNldHRpbmdzID0gJFJlY3VycmVuY2VVbnRpbFRpbWVPYmplY3QtPkdldCgpOwogICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbENvbXBvbmVudHM7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRFbmRUaW1lU2V0dGluZ3N9ICkgewogICAgICAgICAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxDb21wb25lbnRzLT57IlJlY3VycmVuY2VVbnRpbCRLZXkifSA9ICRSZWN1cnJlbmNlVW50aWxTZXR0aW5ncy0+eyRLZXl9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVBcHBvaW50bWVudCA9ICggJUFwcG9pbnRtZW50LCAleyRSZWN1cnJlbmNlVW50aWxDb21wb25lbnRzfSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFJlY2FsY3VsYXRlIHllYXIgYm91bmRhcmllcyBmb3IgYnVpbGQgc2VsZWN0aW9uIG1ldGhvZC4KICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAgICAgbXkgJERhdGVUaW1lU2V0dGluZ3MgPSAkRGF0ZVRpbWVPYmplY3QtPkdldCgpOwoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnQgRW5kIFJlY3VycmVuY2VVbnRpbCkpIHsKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50eyIke0ZpZWxkfVllYXIifSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkRGlmZiA9ICRBcHBvaW50bWVudHsiJHtGaWVsZH1ZZWFyIn0gLSAkRGF0ZVRpbWVTZXR0aW5ncy0+e1llYXJ9OwogICAgICAgICAgICAgICAgICAgIGlmICggJERpZmYgPiAwICYmIGFicyAkRGlmZiA+ICRZZWFyUGVyaW9kRnV0dXJleyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRZZWFyUGVyaW9kRnV0dXJleyRGaWVsZH0gPSBhYnMgJERpZmY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERpZmYgPCAwICYmIGFicyAkRGlmZiA+ICRZZWFyUGVyaW9kUGFzdHskRmllbGR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkWWVhclBlcmlvZFBhc3R7JEZpZWxkfSA9IGFicyAkRGlmZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmluZ30gKSB7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVR5cGUgPSAkR2V0UGFyYW17UmVjdXJyZW5jZVR5cGV9IHx8ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVHlwZX07CgogICAgICAgICAgICAgICAgaWYgKCAkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbVdlZWtseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte0RheXN9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtEYXlzfSA9ICRHZXRQYXJhbXtEYXlzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBEYXlzID0gQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3BsYXkgc2VsZWN0ZWQgZGF5cyBhY2NvcmRpbmcgdG8gdXNlciB0aW1lem9uZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJERheU9mZnNldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREYXkgKEBEYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERheSArPSAkRGF5T2Zmc2V0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREYXkgPT0gOCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERheSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RGF5c30gPSBqb2luKCAiLCIsIEBEYXlzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbU1vbnRobHknICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkRGF5T2Zmc2V0ID0gJFNlbGYtPl9EYXlPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtNb250aERheXN9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aERheXN9ID0gJEdldFBhcmFte01vbnRoRGF5c307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSBATW9udGhEYXlzID0gQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3BsYXkgc2VsZWN0ZWQgZGF5cyBhY2NvcmRpbmcgdG8gdXNlciB0aW1lem9uZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJERheU9mZnNldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRNb250aERheSAoQE1vbnRoRGF5cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRNb250aERheSArPSAkRGF5T2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERhdGVUaW1lU2V0dGluZ3MtPntEYXl9ID09IDMyICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTW9udGhEYXkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhEYXlzfSA9IGpvaW4oICIsIiwgQE1vbnRoRGF5cyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJlY3VycmVuY2VUeXBlIGVxICdDdXN0b21ZZWFybHknICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkRGF5T2Zmc2V0ID0gJFNlbGYtPl9EYXlPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtNb250aHN9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aHN9ID0gJEdldFBhcmFte01vbnRoc307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSBATW9udGhzID0gQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aHN9ID0gam9pbiggIiwiLCBATW9udGhzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIGlmIGRlYWxpbmcgd2l0aCB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRJRH0gPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50VGlja2V0SUQoCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRSdWxlID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICAgICA9PiAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEdldCBkYXRlIHR5cGVzIGZyb20gdGhlIHRpY2tldCBhcHBvaW50bWVudCBydWxlLgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUnVsZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhTdGFydERhdGUgRW5kRGF0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJ1bGUtPnskVHlwZX0gZXEgJ0ZpcnN0UmVzcG9uc2VUaW1lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFJ1bGUtPnskVHlwZX0gZXEgJ1VwZGF0ZVRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkUnVsZS0+eyRUeXBlfSBlcSAnU29sdXRpb25UaW1lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFJ1bGUtPnskVHlwZX0gZXEgJ1BlbmRpbmdUaW1lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVhZE9ubHlTdGFydH0gICAgPSAxIGlmICRUeXBlIGVxICdTdGFydERhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlYWRPbmx5RHVyYXRpb259ID0gMSBpZiAkVHlwZSBlcSAnRW5kRGF0ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZS0+eyRUeXBlfSA9fiAvXlBsdXNfWzAtOV0rJC8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVhZE9ubHlEdXJhdGlvbn0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZWxlY3RlZCB0aW1lc3RhbXAKICAgICAgICBteSAkU2VsZWN0ZWRUaW1lc3RhbXAgPSBzcHJpbnRmKAogICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLAogICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgLy8gJEdldFBhcmFte1N0YXJ0WWVhcn0sCiAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAvLyAkR2V0UGFyYW17U3RhcnRNb250aH0sCiAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydERheX0gICAvLyAkR2V0UGFyYW17U3RhcnREYXl9CiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgY3VycmVudCBkYXRlIGNvbXBvbmVudHMuCiAgICAgICAgbXkgJFNlbGVjdGVkU3lzdGVtVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTZWxlY3RlZFRpbWVzdGFtcCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRTZWxlY3RlZFN5c3RlbVRpbWVTZXR0aW5ncyA9ICRTZWxlY3RlZFN5c3RlbVRpbWVPYmplY3QtPkdldCgpOwoKICAgICAgICAjIFNldCBjdXJyZW50IGRhdGUgY29tcG9uZW50cyBpZiBub3QgZGVmaW5lZC4KICAgICAgICAkQXBwb2ludG1lbnR7RGF5c30gICAgICAvLz0gJFNlbGVjdGVkU3lzdGVtVGltZVNldHRpbmdzLT57RGF5T2ZXZWVrfTsKICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhEYXlzfSAvLz0gJFNlbGVjdGVkU3lzdGVtVGltZVNldHRpbmdzLT57RGF5fTsKICAgICAgICAkQXBwb2ludG1lbnR7TW9udGhzfSAgICAvLz0gJFNlbGVjdGVkU3lzdGVtVGltZVNldHRpbmdzLT57TW9udGh9OwoKICAgICAgICAjIGNhbGVuZGFyIElEIHNlbGVjdGlvbgogICAgICAgIG15ICRDYWxlbmRhcklEID0gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9IC8vICRHZXRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAgICAgIyBjYWxlbmRhciBuYW1lCiAgICAgICAgaWYgKCRDYWxlbmRhcklEKSB7CiAgICAgICAgICAgICRQYXJhbXtDYWxlbmRhck5hbWV9ID0gJENhbGVuZGFyTG9va3VweyRDYWxlbmRhcklEfTsKICAgICAgICB9CgogICAgICAgICMgY2FsZW5kYXIgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte0NhbGVuZGFySURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBDYWxlbmRhckRhdGEsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDYWxlbmRhcklEJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhbGwgZGF5CiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17QWxsRGF5fSB8fAogICAgICAgICAgICAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSAmJiAkQXBwb2ludG1lbnR7QWxsRGF5fSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlTdHJpbmd9ICA9IFRyYW5zbGF0YWJsZSgnWWVzJyk7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlDaGVja2VkfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CgogICAgICAgICAgICAjIHN0YXJ0IGRhdGUKICAgICAgICAgICAgJFBhcmFte1N0YXJ0RGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAvLyAkR2V0UGFyYW17U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZW5kIGRhdGUKICAgICAgICAgICAgJFBhcmFte0VuZERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kWWVhcn0gIC8vICRHZXRQYXJhbXtFbmRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNb250aH0gLy8gJEdldFBhcmFte0VuZE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmREYXl9ICAgLy8gJEdldFBhcmFte0VuZERheX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17QWxsRGF5U3RyaW5nfSAgPSBUcmFuc2xhdGFibGUoJ05vJyk7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlDaGVja2VkfSA9ICcnOwoKICAgICAgICAgICAgIyBzdGFydCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtTdGFydERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1vbnRofSAgLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgICAvLyAkR2V0UGFyYW17U3RhcnREYXl9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0SG91cn0gICAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZW5kIGRhdGUKICAgICAgICAgICAgJFBhcmFte0VuZERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZFllYXJ9ICAgLy8gJEdldFBhcmFte0VuZFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZE1vbnRofSAgLy8gJEdldFBhcmFte0VuZE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmREYXl9ICAgIC8vICRHZXRQYXJhbXtFbmREYXl9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZEhvdXJ9ICAgLy8gJEdldFBhcmFte0VuZEhvdXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZE1pbnV0ZX0gLy8gJEdldFBhcmFte0VuZE1pbnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXJ0RGF0ZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgU3RhcnRIb3VyICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtTdGFydEhvdXJ9ICAgLy8gJEdldFBhcmFte1N0YXJ0SG91cn0sCiAgICAgICAgICAgIFN0YXJ0TWludXRlICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRNaW51dGV9IC8vICRHZXRQYXJhbXtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUJlZm9yZVByZWZpeCA9PiAnRW5kJywKICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gJiYgJEdldFBhcmFte1JlYWRPbmx5U3RhcnR9ID8gMCA6IDEsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7U3RhcnR9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7U3RhcnR9LAogICAgICAgICAgICBPdmVycmlkZVRpbWVab25lICAgICAgICAgPT4gJE92ZXJyaWRlVGltZVpvbmUsCiAgICAgICAgKTsKCiAgICAgICAgIyBlbmQgZGF0ZSBzdHJpbmcKICAgICAgICAkUGFyYW17RW5kRGF0ZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICA9PiAnRW5kJywKICAgICAgICAgICAgRW5kSG91ciAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e0VuZEhvdXJ9ICAgLy8gJEdldFBhcmFte0VuZEhvdXJ9LAogICAgICAgICAgICBFbmRNaW51dGUgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7RW5kTWludXRlfSAvLyAkR2V0UGFyYW17RW5kTWludXRlfSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBWYWxpZGF0ZURhdGVBZnRlclByZWZpeCA9PiAnU3RhcnQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICYmICRHZXRQYXJhbXtSZWFkT25seUR1cmF0aW9ufSA/IDAgOiAxLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7RW5kfSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7RW5kfSwKICAgICAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSAgICAgICAgPT4gJE92ZXJyaWRlVGltZVpvbmUsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbWFpbiBvYmplY3QKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgbXkgJFRlYW1JRHMgPSAkQXBwb2ludG1lbnR7VGVhbUlEfTsKICAgICAgICAgICAgaWYgKCAhJFRlYW1JRHMgKSB7CiAgICAgICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgICAgICRUZWFtSURzID0gXEBUZWFtSURzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkUmVzb3VyY2VJRHMgPSAkQXBwb2ludG1lbnR7UmVzb3VyY2VJRH07CiAgICAgICAgICAgIGlmICggISRSZXNvdXJjZUlEcyApIHsKICAgICAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdSZXNvdXJjZUlEW10nICk7CiAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRHMgPSBcQFJlc291cmNlSURzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgICAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICAjIGdldCBhbGxvd2VkIHRlYW0gbGlzdCBmb3IgY3VycmVudCB1c2VyCiAgICAgICAgICAgIG15ICVUZWFtTGlzdCA9ICRUZWFtT2JqZWN0LT5BbGxvd2VkVGVhbUxpc3QoCiAgICAgICAgICAgICAgICBQcmV2ZW50RW1wdHkgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRlYW0gbmFtZXMKICAgICAgICAgICAgbXkgQFRlYW1OYW1lczsKICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyRUZWFtSURzfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgJFRlYW1MaXN0eyRUZWFtSUR9IGlmICRUZWFtTGlzdHskVGVhbUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNjYWxhciBAVGVhbU5hbWVzICkgewogICAgICAgICAgICAgICAgJFBhcmFte1RlYW1OYW1lc30gPSBqb2luKCAnPGJyPicsIEBUZWFtTmFtZXMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtUZWFtTmFtZXN9ID0gJFNlbGYtPntFbXB0eVN0cmluZ307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGVhbSBsaXN0IHN0cmluZwogICAgICAgICAgICAkUGFyYW17VGVhbUlEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVRlYW1MaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZWFtSURzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUZWFtSUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaXRlcmF0ZSB0aHJvdWdoIHNlbGVjdGVkIHRlYW1zCiAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3RBbGw7CiAgICAgICAgICAgIFRFQU1JRDoKICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyRUZWFtSURzfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVEVBTUlEIGlmICEkVGVhbUlEOwoKICAgICAgICAgICAgICAgICMgZ2V0IGxpc3Qgb2YgdGVhbSBtZW1iZXJzCiAgICAgICAgICAgICAgICBteSAlVGVhbVVzZXJMaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1Vc2VyTGlzdCgKICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVUZWFtVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFRlYW1Vc2VyTGlzdHskVXNlcklEfSA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJVRlYW1Vc2VyTGlzdEFsbCA9ICggJVRlYW1Vc2VyTGlzdEFsbCwgJVRlYW1Vc2VyTGlzdCApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlc291cmNlIG5hbWVzCiAgICAgICAgICAgIG15IEBSZXNvdXJjZU5hbWVzOwogICAgICAgICAgICBmb3IgbXkgJFJlc291cmNlSUQgKCBAeyRSZXNvdXJjZUlEc30gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBSZXNvdXJjZU5hbWVzLCAkVGVhbVVzZXJMaXN0QWxseyRSZXNvdXJjZUlEfSBpZiAkVGVhbVVzZXJMaXN0QWxseyRSZXNvdXJjZUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNjYWxhciBAUmVzb3VyY2VOYW1lcyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZU5hbWVzfSA9IGpvaW4oICc8YnI+JywgQFJlc291cmNlTmFtZXMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZU5hbWVzfSA9ICRTZWxmLT57RW1wdHlTdHJpbmd9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRlYW0gdXNlciBsaXN0IHN0cmluZwogICAgICAgICAgICAkUGFyYW17UmVzb3VyY2VJRFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUZWFtVXNlckxpc3RBbGwsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlc291cmNlSURzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZXNvdXJjZUlEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSAgICAgICA9IDA7CiAgICAgICAgbXkgJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAnQ3VzdG9tRGFpbHknOyAgICAjIGRlZmF1bHQKCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKCiAgICAgICAgICAgICMgZnJvbSBhcHBvaW50bWVudAogICAgICAgICAgICAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfTsKICAgICAgICAgICAgaWYgKCAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSA9fiAvQ3VzdG9tLyApIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlID0gJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGU7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSAgICAgICA9ICdDdXN0b20nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgdHlwZQogICAgICAgIG15IEBSZWN1cnJlbmNlVHlwZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTmV2ZXInKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0RhaWx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgRGF5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdXZWVrbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBXZWVrJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdNb250aGx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgTW9udGgnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1llYXJseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0V2ZXJ5IFllYXInKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJVJlY3VycmVuY2VUeXBlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBAUmVjdXJyZW5jZVR5cGVzOwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAkUmVjdXJyZW5jZVR5cGVMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZVR5cGV9LAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSB0eXBlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVHlwZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAUmVjdXJyZW5jZVR5cGVzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVjdXJyZW5jZVR5cGUnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHJlY3VycmVuY2UgY3VzdG9tIHR5cGUKICAgICAgICBteSBAUmVjdXJyZW5jZUN1c3RvbVR5cGVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tRGFpbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdEYWlseScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnV2Vla2x5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21Nb250aGx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTW9udGhseScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnWWVhcmx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlUmVjdXJyZW5jZUN1c3RvbVR5cGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXM7CiAgICAgICAgbXkgJFJlY3VycmVuY2VDdXN0b21UeXBlID0gJFJlY3VycmVuY2VDdXN0b21UeXBlTG9va3VweyRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlfTsKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICBsYyAkUmVjdXJyZW5jZUN1c3RvbVR5cGUsCiAgICAgICAgKSBpZiAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgJiYgJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbSc7CgogICAgICAgICMgcmVjdXJyZW5jZSBjdXN0b20gdHlwZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY3VycmVuY2VDdXN0b21UeXBlJywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIHJlY3VycmVuY2UgaW50ZXJ2YWwKICAgICAgICBteSAkU2VsZWN0ZWRJbnRlcnZhbCA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8IDE7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSApIHsKICAgICAgICAgICAgbXkgJVJlY3VycmVuY2VJbnRlcnZhbExvb2t1cCA9ICgKICAgICAgICAgICAgICAgICdDdXN0b21EYWlseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdkYXkocyknLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdDdXN0b21XZWVrbHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnd2VlayhzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbU1vbnRobHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnbW9udGgocyknLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdDdXN0b21ZZWFybHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAneWVhcihzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgJiYgJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbScgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2V2ZXJ5JykKICAgICAgICAgICAgICAgICAgICAuICcgJyAuICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9IC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkUmVjdXJyZW5jZUludGVydmFsTG9va3VweyRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgaW50ZXJ2YWwgc2VsZWN0aW9uICgxLTMxKQogICAgICAgIG15IEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWw7CiAgICAgICAgZm9yICggbXkgJERheU51bWJlciA9IDE7ICREYXlOdW1iZXIgPCAzMjsgJERheU51bWJlcisrICkgewogICAgICAgICAgICBwdXNoIEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWwsIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICREYXlOdW1iZXIsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRGF5TnVtYmVyLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFxAUmVjdXJyZW5jZUN1c3RvbUludGVydmFsLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZWxlY3RlZEludGVydmFsLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdSZWN1cnJlbmNlSW50ZXJ2YWwnLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBsaW1pdAogICAgICAgIG15ICRSZWN1cnJlbmNlTGltaXQgPSAxOwogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VDb3VudH0gKSB7CiAgICAgICAgICAgICRSZWN1cnJlbmNlTGltaXQgPSAyOwoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFJlY3VycmVuY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdmb3IgJXMgdGltZShzKScsICRBcHBvaW50bWVudHtSZWN1cnJlbmNlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJlbmNlIGxpbWl0IHN0cmluZwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlTGltaXRTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCd1bnRpbCAuLi4nKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gMiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ2ZvciAuLi4gdGltZShzKScpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRSZWN1cnJlbmNlTGltaXQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVjdXJyZW5jZUxpbWl0JywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lID0gMDsKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgICAgICMgR2V0IGN1cnJlbnQgYW5kIHN0YXJ0IHRpbWUgZm9yIGRpZmZlcmVuY2UuCiAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lICAgICAgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpOwogICAgICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9ICAvLyAkR2V0UGFyYW17U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+ICRBcHBvaW50bWVudHtTdGFydERheX0gICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0SG91cn0gICAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gJEFwcG9pbnRtZW50e1N0YXJ0TWludXRlfSAvLyAkR2V0UGFyYW17U3RhcnRNaW51dGV9LAogICAgICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRTdGFydFRpbWVPYmplY3QtPlRvRXBvY2goKTsKCiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxEaWZmVGltZSA9ICRTdGFydFRpbWUgLSAkU3lzdGVtVGltZSArIDYwICogNjAgKiAyNCAqIDM7ICAgICMgc3RhcnQgKzMgZGF5cwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsRGF5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VWYWx1ZX0gLj0gJywgJyAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAndW50aWwgJXMnLCAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVjdXJyZW5jZSB1bnRpbCBkYXRlIHN0cmluZwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVW50aWxTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgPT4gJ1JlY3VycmVuY2VVbnRpbCcsCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICAgICA9PiAkUmVjdXJyZW5jZVVudGlsRGlmZlRpbWUsCiAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ID0+ICdTdGFydCcsCiAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICBPdmVycmlkZVRpbWVab25lICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZQogICAgICAgIG15IEBOb3RpZmljYXRpb25UZW1wbGF0ZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTm8gbm90aWZpY2F0aW9uJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdTdGFydCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMCApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMzAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCA1ICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc5MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDE1ICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcxODAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAzMCApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMzYwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzcyMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgaG91cihzKSBiZWZvcmUnLCAyICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc0MzIwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDEyICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc4NjQwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBkYXkocykgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMTcyODAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGRheShzKSBiZWZvcmUnLCAyICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc2MDQ4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgd2VlayBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXN0b20nKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVOb3RpZmljYXRpb25UZW1wbGF0ZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQE5vdGlmaWNhdGlvblRlbXBsYXRlczsKICAgICAgICBteSAkU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZSA9ICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25UZW1wbGF0ZX0gfHwgJzAnOwogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25WYWx1ZX0gPSAkTm90aWZpY2F0aW9uVGVtcGxhdGVMb29rdXB7JFNlbGVjdGVkTm90aWZpY2F0aW9uVGVtcGxhdGV9OwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxATm90aWZpY2F0aW9uVGVtcGxhdGVzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkTm90aWZpY2F0aW9uVGVtcGxhdGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTm90aWZpY2F0aW9uVGVtcGxhdGUnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMKICAgICAgICBteSBATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnbWludXRlKHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdob3VycycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2hvdXIocyknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2RheXMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdkYXkocyknKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVOb3RpZmljYXRpb25DdXN0b21Vbml0TG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHM7CiAgICAgICAgbXkgJFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdCA9ICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9IHx8ICdtaW51dGVzJzsKCiAgICAgICAgIyBub3RpZmljYXRpb24gY3VzdG9tIHVuaXRzIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21Vbml0c1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgcG9pbnQgb2YgdGltZQogICAgICAgIG15IEBOb3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cycpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZTsKICAgICAgICBteSAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWUgPSAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0KICAgICAgICAgICAgfHwgJ2JlZm9yZXN0YXJ0JzsKCiAgICAgICAgIyBub3RpZmljYXRpb24gY3VzdG9tIHVuaXRzIHBvaW50IG9mIHRpbWUgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBOb3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIEV4dHJhY3QgdGhlIGRhdGUgdW5pdHMgZm9yIHRoZSBjdXN0b20gZGF0ZSBzZWxlY3Rpb24uCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lU2V0dGluZ3MgPSB7fTsKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gKSB7CiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncyA9ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgfQoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gZGF0ZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyICAgPT4gJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntZZWFyfSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aCAgPT4gJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntNb250aH0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5ICAgID0+ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVNldHRpbmdzLT57RGF5fSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyICAgPT4gJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntIb3VyfSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGUgPT4gJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtTdGFydH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgICAgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1N0YXJ0fSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgcmFkaW8gYnV0dG9uIGZvciBjdXN0b20gZGF0ZSB0aW1lIGFuZCByZWxhdGl2ZSBpbnB1dAogICAgICAgICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IHx8PSAnJzsKCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewogICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dFJhZGlvfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXRSYWRpb30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXRSYWRpb30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KCiAgICAgICAgIyBub3RpZmljYXRpb24gY3VzdG9tIHN0cmluZyB2YWx1ZQogICAgICAgIGlmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAncmVsYXRpdmUnICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fQogICAgICAgICAgICAgICAgJiYgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gfHw9IDA7CiAgICAgICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uVmFsdWV9IC49ICcsICcKICAgICAgICAgICAgICAgICAgICAuICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0KICAgICAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgICAgIC4gJE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRMb29rdXB7JFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdH0KICAgICAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgICAgIC4gJE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZUxvb2t1cHskU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgbXkgJUZ1dHVyZVRhc2s7CiAgICAgICAgaWYgKCAlQXBwb2ludG1lbnQgKSB7CiAgICAgICAgICAgIG15ICRUYXNrSUQ7CiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e0Z1dHVyZVRhc2tJRH0gKSB7CiAgICAgICAgICAgICAgICAkVGFza0lEID0gJEFwcG9pbnRtZW50e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBPbmx5IGZvciBwYXJlbnQgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e1JlY3VycmluZ30gKSB7CiAgICAgICAgICAgICAgICAjIENoZWNrIGFsbCBhcHBvaW50bWVudHMgb2Ygc2VyaWVzIGZvciBmdXR1cmUgdGFzayBpZAogICAgICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgdW5zaGlmdCBAQXBwb2ludG1lbnRMaXN0LCBcJVBhcmVudEFwcG9pbnRtZW50OwoKICAgICAgICAgICAgICAgIEFQUE9JTlRNRU5UTElTVDoKICAgICAgICAgICAgICAgIGZvciBteSAkUmVjdXJyaW5nQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudExpc3QpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXNrSUQgPSAkUmVjdXJyaW5nQXBwb2ludG1lbnQtPntGdXR1cmVUYXNrSUR9OwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEFQUE9JTlRNRU5UTElTVDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkVGFza0lEICkgewogICAgICAgICAgICAgICAgJUZ1dHVyZVRhc2sgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrR2V0KAogICAgICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkVGFza0lELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIHRpY2tldCB0ZW1wbGF0ZQogICAgICAgIG15IEBUaWNrZXRUZW1wbGF0ZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTm8gdGlja2V0IGNyZWF0aW9uJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdTdGFydCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMCApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMzAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCA1ICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc5MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDE1ICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcxODAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAzMCApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMzYwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzcyMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgaG91cihzKSBiZWZvcmUnLCAyICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc0MzIwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDEyICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc4NjQwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBkYXkocykgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnMTcyODAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGRheShzKSBiZWZvcmUnLCAyICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICc2MDQ4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgd2VlayBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXN0b20nKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVUaWNrZXRUZW1wbGF0ZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFRpY2tldFRlbXBsYXRlczsKCiAgICAgICAgbXkgJFNlbGVjdGVkVGlja2V0VGVtcGxhdGUgPSBkZWZpbmVkICRGdXR1cmVUYXNre0RhdGF9ID8gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0gOiAnMCc7CiAgICAgICAgJFBhcmFte1RpY2tldFZhbHVlfSA9ICRUaWNrZXRUZW1wbGF0ZUxvb2t1cHskU2VsZWN0ZWRUaWNrZXRUZW1wbGF0ZX07CgogICAgICAgICMgdGlja2V0IHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtUaWNrZXRTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBUaWNrZXRUZW1wbGF0ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRUaWNrZXRUZW1wbGF0ZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRUZW1wbGF0ZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGN1c3RvbSB1bml0cwogICAgICAgIG15IEBUaWNrZXRDdXN0b21Vbml0cyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdtaW51dGUocyknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnaG91cihzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnZGF5cycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2RheShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJVRpY2tldEN1c3RvbVVuaXRMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBUaWNrZXRDdXN0b21Vbml0czsKICAgICAgICBteSAkU2VsZWN0ZWRUaWNrZXRDdXN0b21Vbml0ID0gKCAkRnV0dXJlVGFza3tEYXRhfSA/ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0fSA6ICcnICkgfHwgJ21pbnV0ZXMnOwoKICAgICAgICAjIHRpY2tldCBjdXN0b20gdW5pdHMgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1RpY2tldEN1c3RvbVVuaXRzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAVGlja2V0Q3VzdG9tVW5pdHMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRUaWNrZXRDdXN0b21Vbml0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCcsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lCiAgICAgICAgbXkgQFRpY2tldEN1c3RvbVVuaXRzUG9pbnRPZlRpbWUgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcycpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVUaWNrZXRDdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBUaWNrZXRDdXN0b21Vbml0c1BvaW50T2ZUaW1lOwogICAgICAgIG15ICRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXRQb2ludE9mVGltZSA9ICggJEZ1dHVyZVRhc2t7RGF0YX0gPyAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9IDogJycgKQogICAgICAgICAgICB8fCAnYmVmb3Jlc3RhcnQnOwoKICAgICAgICAjIHRpY2tldCBjdXN0b20gdW5pdHMgcG9pbnQgb2YgdGltZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tVW5pdHNQb2ludE9mVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQFRpY2tldEN1c3RvbVVuaXRzUG9pbnRPZlRpbWUsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRUaWNrZXRDdXN0b21Vbml0UG9pbnRPZlRpbWUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgRXh0cmFjdCB0aGUgZGF0ZSB1bml0cyBmb3IgdGhlIGN1c3RvbSBkYXRlIHNlbGVjdGlvbi4KICAgICAgICBteSAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVTZXR0aW5ncyA9IHt9OwogICAgICAgIGlmICggJEZ1dHVyZVRhc2t7RGF0YX0gJiYgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21EYXRlVGltZX0gKSB7CiAgICAgICAgICAgIG15ICRUaWNrZXRDdXN0b21EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MgPSAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QtPkdldCgpOwogICAgICAgIH0KCiAgICAgICAgIyB0aWNrZXQgY3VzdG9tIGRhdGUgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdUaWNrZXRDdXN0b21EYXRlVGltZScsCiAgICAgICAgICAgIFRpY2tldEN1c3RvbURhdGVUaW1lWWVhciAgID0+ICRUaWNrZXRDdXN0b21EYXRlVGltZVNldHRpbmdzLT57WWVhcn0sCiAgICAgICAgICAgIFRpY2tldEN1c3RvbURhdGVUaW1lTW9udGggID0+ICRUaWNrZXRDdXN0b21EYXRlVGltZVNldHRpbmdzLT57TW9udGh9LAogICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZURheSAgICA9PiAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e0RheX0sCiAgICAgICAgICAgIFRpY2tldEN1c3RvbURhdGVUaW1lSG91ciAgID0+ICRUaWNrZXRDdXN0b21EYXRlVGltZVNldHRpbmdzLT57SG91cn0sCiAgICAgICAgICAgIFRpY2tldEN1c3RvbURhdGVUaW1lTWludXRlID0+ICRUaWNrZXRDdXN0b21EYXRlVGltZVNldHRpbmdzLT57TWludXRlfSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7U3RhcnR9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICAgICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtTdGFydH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHJhZGlvIGJ1dHRvbiBmb3IgY3VzdG9tIGRhdGUgdGltZSBhbmQgcmVsYXRpdmUgaW5wdXQKICAgICAgICBpZiAoICRGdXR1cmVUYXNre0RhdGF9ICkgewogICAgICAgICAgICAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0gfHw9ICcnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRnV0dXJlVGFza3tEYXRhfSAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKICAgICAgICAgICAgJFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lSW5wdXRSYWRpb30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRGdXR1cmVUYXNre0RhdGF9ICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSBlcSAncmVsYXRpdmUnICkgewogICAgICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQoKICAgICAgICAjIHRpY2tldCBjdXN0b20gc3RyaW5nIHZhbHVlCiAgICAgICAgaWYgKCAkRnV0dXJlVGFza3tEYXRhfSAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKICAgICAgICAgICAgJFBhcmFte1RpY2tldFZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEZ1dHVyZVRhc2t7RGF0YX0gJiYgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0fQogICAgICAgICAgICAgICAgJiYgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdENvdW50fSB8fD0gMDsKICAgICAgICAgICAgICAgICRQYXJhbXtUaWNrZXRWYWx1ZX0gLj0gJywgJwogICAgICAgICAgICAgICAgICAgIC4gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0KICAgICAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgICAgIC4gJFRpY2tldEN1c3RvbVVuaXRMb29rdXB7JFNlbGVjdGVkVGlja2V0Q3VzdG9tVW5pdH0KICAgICAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgICAgIC4gJFRpY2tldEN1c3RvbVVuaXRQb2ludE9mVGltZUxvb2t1cHskU2VsZWN0ZWRUaWNrZXRDdXN0b21Vbml0UG9pbnRPZlRpbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICAgICAgIyBnZXQgcGx1Z2luIGxpc3QKICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0gPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaXN0KCk7CgogICAgICAgICMgbmV3IGFwcG9pbnRtZW50IHBsdWdpbiBzZWFyY2gKICAgICAgICBpZiAoICRHZXRQYXJhbXtQbHVnaW5LZXl9ICYmICggJEdldFBhcmFte1NlYXJjaH0gfHwgJEdldFBhcmFte09iamVjdElEfSApICkgewoKICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJEdldFBhcmFte1BsdWdpbktleX0gfSBrZXlzICV7ICRQYXJhbXtQbHVnaW5MaXN0fSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2VhcmNoIHVzaW5nIHBsdWdpbgogICAgICAgICAgICAgICAgbXkgJFJlc3VsdExpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5TZWFyY2goCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5EYXRhfS0+eyAkR2V0UGFyYW17UGx1Z2luS2V5fSB9ID0gW107CiAgICAgICAgICAgICAgICBteSBATGlua0FycmF5ID0gc29ydCBrZXlzICV7JFJlc3VsdExpc3R9OwoKICAgICAgICAgICAgICAgICMgYWRkIHBvc3NpYmxlIGxpbmtzCiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoQExpbmtBcnJheSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1BsdWdpbkRhdGF9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0gfSwgewogICAgICAgICAgICAgICAgICAgICAgICBMaW5rSUQgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rTmFtZSA9PiAkUmVzdWx0TGlzdC0+eyRMaW5rSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rVVJMICA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0tPntQbHVnaW5VUkx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtJRAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0tPntMaW5rTGlzdH0gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBMaW5rQXJyYXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYXBwb2ludG1lbnQgcGx1Z2luIGxpbmtzCiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyAkUGFyYW17UGx1Z2luTGlzdH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBATGlua0FycmF5OwoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5EYXRhfS0+eyRQbHVnaW5LZXl9ID0gW107CiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17UGx1Z2luRGF0YX0tPnskUGx1Z2luS2V5fSB9LCAkTGlua0xpc3QtPnskTGlua0lEfTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBMaW5rQXJyYXksICRMaW5rTGlzdC0+eyRMaW5rSUR9LT57TGlua0lEfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0tPnskUGx1Z2luS2V5fS0+e0xpbmtMaXN0fSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQExpbmtBcnJheSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICAgICAgICMgaHRtbCBtYXNrIG91dHB1dAojICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiMgICAgICAgICAgICAgTmFtZSA9PiAnRWRpdE1hc2snLAojICAgICAgICAgICAgIERhdGEgPT4gewojICAgICAgICAgICAgICAgICAlUGFyYW0sCiMgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKIyAgICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAojICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uTGV2ZWwgPT4gJFBlcm1pc3Npb25MZXZlbHskUGVybWlzc2lvbnN9LAojICAgICAgICAgICAgIH0sCiMgICAgICAgICApOwoKICAgICAgICAjIEJ1aWxkIHRpY2tldCBmaWVsZHMKICAgICAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIEZldGNoIGR5bmFtaWMgZmllbGQgY29uZmlncwogICAgICAgIG15IEBEeW5hbWljRmllbGRDb25maWdzOwogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQER5bmFtaWNGaWVsZENvbmZpZ3MgPSBkZWZpbmVkICREeW5hbWljRmllbGRDb25maWdzUmVmID8gQHsgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgfSA6ICgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RGVzdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJEdldFBhcmFte0Rlc3R9ICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRHZXRQYXJhbXtEZXN0fTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAlRnV0dXJlVGFzayApIHsKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntRdWV1ZUlEfTsKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWVJRCA9PiAkR2V0UGFyYW17UXVldWVJRH0gKTsKICAgICAgICAgICAgJEdldFBhcmFte05leHRTdGF0ZUlEfSA9ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U3RhdGVJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtUeXBlSUR9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntUeXBlSUR9OwogICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VydmljZUlEfTsKICAgICAgICAgICAgJEdldFBhcmFte1NMQUlEfSA9ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U0xBSUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFVzZXJEZWZhdWx0UXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlVzZXJEZWZhdWx0UXVldWUnKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkVXNlckRlZmF1bHRRdWV1ZSkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkVXNlckRlZmF1bHRRdWV1ZSApOwogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlfSA9ICIkR2V0UGFyYW17VGlja2V0UXVldWVJRH18fCRVc2VyRGVmYXVsdFF1ZXVlIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBARHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdCB3aXRoIGFwcHJvYWNoIGZvciBhcnJheQogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+IHsgJER5bmFtaWNGaWVsZENvbmZpZy0+JSosIE5hbWUgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ1tdJyB9LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEBEeW5hbWljRmllbGRDb25maWdzICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIGEgdXNlciBzcGVjaWZpYyBkZWZhdWx0IHZhbHVlIGZvcgogICAgICAgICAgICAjIHRoZSBkeW5hbWljIGZpZWxkLCBvdGhlcndpc2Ugd2lsbCB1c2UgRHluYW1pYyBGaWVsZCBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBkeW5hbWljIGZpZWxkIGNvbmZpZyAoaWYgYW55KQogICAgICAgICAgICAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJyc7CgogICAgICAgICAgICAjIG92ZXJyaWRlIHRoZSB2YWx1ZSBmcm9tIHVzZXIgcHJlZmVyZW5jZXMgaWYgaXMgc2V0CiAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9fSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAlRnV0dXJlVGFzayAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0R5bmFtaWNGaWVsZHN9LT57JER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9fSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57RHluYW1pY0ZpZWxkc30tPnskRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX19OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsdWU7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGRIVE1MRGF0YTsKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICRpICggMCAuLiAkI0R5bmFtaWNGaWVsZENvbmZpZ3MgKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZ3NbJGldICk7CgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZENvbmZpZ3NbJGldOwoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTERhdGF7ICREeW5hbWljRmllbGRDb25maWctPntGaWVsZE9yZGVyfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgID0+ICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15IEBEeW5hbWljRmllbGRIVE1MOwogICAgICAgIGZvciBteSAkS2V5IChzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAlRHluYW1pY0ZpZWxkSFRNTERhdGEpIHsKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkSFRNTCwgJER5bmFtaWNGaWVsZEhUTUxEYXRheyRLZXl9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGZ1dHVyZSB0YXNrIGV4aXN0cywgdHJhbnNmb3JtIGV4aXN0aW5nIGRhdGEgaW50byBuZWVkZSBzdHJ1Y3R1cmUKICAgICAgICBpZiAoJUZ1dHVyZVRhc2spIHsKICAgICAgICAgICAgbXkgQEN1c3RvbWVyVXNlclN0cmluZ3MgPSBzcGxpdCgnLCcsICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tZXJVc2VyfSk7CiAgICAgICAgICAgIGlmICggQEN1c3RvbWVyVXNlclN0cmluZ3MgKSB7CiAgICAgICAgICAgICAgICBteSAkQ291bnQgPSAxOwogICAgICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJTdHJpbmcgKCBAQ3VzdG9tZXJVc2VyU3RyaW5ncyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyU3RyaW5nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAlQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCA9PiAkQ291bnQrKywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCA9PiAnIicgLiAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9IC4gJyAnIC4gJEN1c3RvbWVyVXNlcntVc2VyTGFzdG5hbWV9IC4gJyIgPCcgLiAkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH0gLiAnPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICggJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTZWxlY3RlZEN1c3RvbWVyVXNlcn0gZXEgJEN1c3RvbWVyVXNlclN0cmluZyA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgPT4gJEN1c3RvbWVyVXNlcntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ID0+ICRDb3VudCsrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ID0+ICRDdXN0b21lclVzZXJTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICggJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTZWxlY3RlZEN1c3RvbWVyVXNlcn0gZXEgJEN1c3RvbWVyVXNlclN0cmluZyA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJycm9yTXNnID0+ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRHZXRQYXJhbXtTZWxlY3RlZEN1c3RvbWVyVXNlcn0gPSAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1NlbGVjdGVkQ3VzdG9tZXJVc2VyfTsKICAgICAgICB9CgoKICAgICAgICAjIGZvciBlYWNoIHN0YW5kYXJkIGZpZWxkIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkLCBydW4gdGhlIGRlZmluZWQgbWV0aG9kCiAgICAgICAgbXkgJFF1ZXVlVmFsdWVzID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBteSAkUHJpb3JpdHlWYWx1ZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBteSAkU3RhdGVWYWx1ZXMgPSAkU2VsZi0+X0dldFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIG15ICRUeXBlVmFsdWVzID0gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIG15ICRTZXJ2aWNlVmFsdWVzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIG15ICRTTEFWYWx1ZXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIEJ1aWxkIHF1ZXVlIGh0bWwgc3RyaW5nCiAgICAgICAgbXkgJFF1ZXVlSFRNTFN0cmluZzsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJFF1ZXVlSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ01hbmRhdG9yeSBWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gJFF1ZXVlVmFsdWVzLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAwLAogICAgICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUXVldWVIVE1MU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnTWFuZGF0b3J5IFZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZScsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiAkUXVldWVWYWx1ZXMsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgID0+IDAsCiAgICAgICAgICAgICAgICBPbkNoYW5nZVN1Ym1pdCA9PiAwLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgdHlwZSBzdHJpbmcKICAgICAgICBteSAkVHlwZUhUTUxTdHJpbmc7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICAgICAkVHlwZUhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkJyAuICggJFBhcmFte0Vycm9yc30tPntUeXBlSURJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVHlwZVZhbHVlcywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzdGF0ZSBzdHJpbmcKICAgICAgICBteSAkU3RhdGVIVE1MU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGF0ZVZhbHVlcywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9IHx8ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gfHwgJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIE1hbmRhdG9yeSAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VydmljZSBhbmQgU0xBIHN0cmluZwogICAgICAgIG15ICRTZXJ2aWNlSFRNTFN0cmluZzsKICAgICAgICBteSAkU0xBSFRNTFN0cmluZzsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgICAgICRTZXJ2aWNlSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSAnCiAgICAgICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJREludmFsaWR9IHx8ICcnICksCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VWYWx1ZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU0xBSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplICcKICAgICAgICAgICAgICAgICAgICAuICggJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTTEFJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTTEFWYWx1ZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCgoKICAgICAgICAjIGdldCBwcmlvcml0eSBkYXRhCiAgICAgICAgaWYgKCAhJEdldFBhcmFte1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5fSA9ICRDb25maWctPntQcmlvcml0eX07CiAgICAgICAgfQogICAgICAgIGlmICggJUZ1dHVyZVRhc2sgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57UHJpb3JpdHlJRH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHByaW9yaXR5IGh0bWwgc3RyaW5nCiAgICAgICAgbXkgJFByaW9yaXR5SFRNTFN0cmluZzsKICAgICAgICBpZiAoICRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZScsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+ICRQcmlvcml0eVZhbHVlcywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRHZXRQYXJhbXtQcmlvcml0eX0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJCNNdWx0aXBsZUN1c3RvbWVyICE9IC0xID8gJycgOiAnSGlkZGVuJzsKICAgICAgICAkUGFyYW17QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lcn0gPSAoJFBhcmFte1RpY2tldEFydGljbGVWaXNpYmxlRm9yQ3VzdG9tZXJ9IHx8ICggJUZ1dHVyZVRhc2sgJiYgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyfSkpID8gJ2NoZWNrZWQ9Y2hlY2tlZCcgOiAnJzsKCiAgICAgICAgaWYgKCAlRnV0dXJlVGFzayApIHsKICAgICAgICAgICAgIyBodG1sIG1hc2sgb3V0cHV0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRWRpdE1hc2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskRnV0dXJlVGFza3tEYXRhfSB8fCBce319LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25MZXZlbCA9PiAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30sCiAgICAgICAgICAgICAgICAgICAgUXVldWVIVE1MU3RyaW5nID0+ICRRdWV1ZUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlIVE1MU3RyaW5nID0+ICRQcmlvcml0eUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUhUTUxTdHJpbmcgPT4gJFR5cGVIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFN0YXRlSFRNTFN0cmluZyA9PiAkU3RhdGVIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VIVE1MU3RyaW5nID0+ICRTZXJ2aWNlSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuZGF0b3J5ID0+ICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgICAgIFNMQUhUTUxTdHJpbmcgPT4gJFNMQUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgU0xBTWFuZGF0b3J5ID0+ICRDb25maWctPntTTEFNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcQER5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBodG1sIG1hc2sgb3V0cHV0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRWRpdE1hc2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbkxldmVsID0+ICRQZXJtaXNzaW9uTGV2ZWx7JFBlcm1pc3Npb25zfSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUhUTUxTdHJpbmcgPT4gJFF1ZXVlSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eUhUTUxTdHJpbmcgPT4gJFByaW9yaXR5SFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBUeXBlSFRNTFN0cmluZyA9PiAkVHlwZUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgU3RhdGVIVE1MU3RyaW5nID0+ICRTdGF0ZUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUhUTUxTdHJpbmcgPT4gJFNlcnZpY2VIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5kYXRvcnkgPT4gJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgU0xBSFRNTFN0cmluZyA9PiAkU0xBSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTTEFNYW5kYXRvcnkgPT4gJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFxARHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgICAgIGlmICggQE11bHRpcGxlQ3VzdG9tZXIgKSB7CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEBNdWx0aXBsZUN1c3RvbWVyICkgewogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlcisrLAogICAgICAgICAgICB9LAogICAgICAgICk7CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25MZXZlbCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRQZXJtaXNzaW9uTGV2ZWx7JFBlcm1pc3Npb25zfSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VkaXRBcHBvaW50bWVudElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9IC8vICcnLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRWRpdFBhcmVudElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEFwcG9pbnRtZW50e1BhcmVudElEfSAvLyAnJywKICAgICAgICApOwoKICAgICAgICAjIGdldCByZWdpc3RlcmVkIGxvY2F0aW9uIGxpbmtzCiAgICAgICAgbXkgJExvY2F0aW9uTGlua0NvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRBcHBvaW50bWVudEVkaXQ6OkxvY2F0aW9uOjpMaW5rJykgLy8ge307CiAgICAgICAgZm9yIG15ICRDb25maWdLZXkgKCBzb3J0IGtleXMgJXskTG9jYXRpb25MaW5rQ29uZmlnfSApIHsKCiAgICAgICAgICAgICMgc2hvdyBsaW5rIGljb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb2NhdGlvbkxpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gPT4gJEFwcG9pbnRtZW50e0xvY2F0aW9ufSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAleyAkTG9jYXRpb25MaW5rQ29uZmlnLT57JENvbmZpZ0tleX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQUpBWCA9PiAxLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkL2VkaXQgYXBwb2ludG1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFZGl0QXBwb2ludG1lbnQnICkgewoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgaWYgKCRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0pIHsKICAgICAgICAgICAgIyBWYWxpZGF0ZSBpbmNvbWluZyB2YWx1ZXMKICAgICAgICAgICAgbXkgJFF1ZXVlVmFsdWVzID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRRdWV1ZVZhbHVlcy0+eyRHZXRQYXJhbXtEZXN0fX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIGRlc3QhJyApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTdGF0ZVZhbHVlcyA9ICRTZWxmLT5fR2V0U3RhdGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU3RhdGVWYWx1ZXMtPnskR2V0UGFyYW17TmV4dFN0YXRlSUR9fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTZXJ2aWNlVmFsdWVzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICgkR2V0UGFyYW17U2VydmljZUlEfSB8fCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0pICYmICEkU2VydmljZVZhbHVlcy0+eyRHZXRQYXJhbXtTZXJ2aWNlSUR9fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgc2VydmljZSEnICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTTEFWYWx1ZXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAoJEdldFBhcmFte1NMQUlEfSB8fCAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSkgJiYgISRTTEFWYWx1ZXMtPnskR2V0UGFyYW17U0xBSUR9fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgU0xBIScgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFR5cGVWYWx1ZXMgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgICEkVHlwZVZhbHVlcy0+eyRHZXRQYXJhbXtUeXBlSUR9fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgdHlwZSEnICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRQcmlvcml0eVZhbHVlcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFByaW9yaXR5VmFsdWVzLT57JEdldFBhcmFte1ByaW9yaXR5SUR9fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgcHJpb3JpdHkhJyApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEFwcG9pbnRtZW50VGlja2V0CgogICAgICAgIG15ICVBcHBvaW50bWVudDsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICAgICAgJFBlcm1pc3Npb25zID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFJlcXVpcmVkUGVybWlzc2lvbiA9IDI7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NhbGVuZGFySUR9ICYmICRHZXRQYXJhbXtDYWxlbmRhcklEfSAhPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gKSB7CgogICAgICAgICAgICAgICAgIyBpbiBvcmRlciB0byBtb3ZlIGFwcG9pbnRtZW50IHRvIGFub3RoZXIgY2FsZW5kYXIsIHVzZXIgbmVlZHMgImNyZWF0ZSIgcGVybWlzc2lvbgogICAgICAgICAgICAgICAgJFJlcXVpcmVkUGVybWlzc2lvbiA9IDM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb25MZXZlbHskUGVybWlzc2lvbnN9IDwgJFJlcXVpcmVkUGVybWlzc2lvbiApIHsKCiAgICAgICAgICAgICAgICAjIG5vIHBlcm1pc3Npb24KCiAgICAgICAgICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgICA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEdldFBhcmFte0FsbERheX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRZZWFyfSwgJEdldFBhcmFte1N0YXJ0TW9udGh9LCAkR2V0UGFyYW17U3RhcnREYXl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLAogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFllYXJ9LCAkR2V0UGFyYW17RW5kTW9udGh9LCAkR2V0UGFyYW17RW5kRGF5fQogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBQcmV2ZW50IHN0b3JpbmcgZW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgIGlmICggJEVuZFRpbWVPYmplY3QgPCAkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QgPSAkU3RhcnRUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIE1ha2UgZW5kIHRpbWUgaW5jbHVzaXZlLCBhZGQgd2hvbGUgZGF5LgogICAgICAgICAgICAkRW5kVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkRW5kVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17UmVjdXJyaW5nfSAmJiAkR2V0UGFyYW17VXBkYXRlVHlwZX0gJiYgJEdldFBhcmFte1VwZGF0ZURlbHRhfSApIHsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2FsY3VsYXRlIG5ldyBzdGFydC9lbmQgdGltZXMuCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1VwZGF0ZVR5cGV9IGVxICdTdGFydFRpbWUnICkgewogICAgICAgICAgICAgICAgJFN0YXJ0VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgICAgIFNlY29uZHMgPT4gJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VXBkYXRlVHlwZX0gZXEgJ0VuZFRpbWUnICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgICAgICBTZWNvbmRzID0+ICRHZXRQYXJhbXtVcGRhdGVEZWx0YX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU3RhcnRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJFN0YXJ0VGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSAgID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0WWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TW9udGh9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0SG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0WWVhcn0sICRHZXRQYXJhbXtTdGFydE1vbnRofSwgJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRIb3VyfSwgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIENvbnZlcnQgc3RhcnQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntVc2VyVGltZVpvbmV9ICkgewogICAgICAgICAgICAgICAgICAgICRTdGFydFRpbWVPYmplY3QtPlRvT1RPQk9UaW1lWm9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17RW5kWWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZE1vbnRofQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RW5kRGF5fQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RW5kSG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZE1pbnV0ZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kWWVhcn0sICRHZXRQYXJhbXtFbmRNb250aH0sICRHZXRQYXJhbXtFbmREYXl9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRIb3VyfSwgJEdldFBhcmFte0VuZE1pbnV0ZX0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBDb252ZXJ0IGVuZCB0aW1lIHRvIGxvY2FsIHRpbWUuCiAgICAgICAgICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgYWxyZWFkeSBjYWxjdWxhdGVkIGxvY2FsIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBQcmV2ZW50IHN0b3JpbmcgZW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lT2JqZWN0IDwgJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQXBwb2ludG1lbnR7RW5kVGltZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUHJldmVudCByZWN1cnJlbmNlIHVudGlsIGRhdGVzIGJlZm9yZSBzdGFydCB0aW1lLgogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmluZ30gJiYgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFJlY3VycmVuY2VVbnRpbE9iamVjdCA8ICRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSA9ICRHZXRQYXJhbXtTdGFydFRpbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmluZyBhcHBvaW50bWVudAogICAgICAgIGlmICggJEdldFBhcmFte1JlY3VycmluZ30gJiYgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSApIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ1llYXJseScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tJyApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBEYXlzID0gc3BsaXQoICIsIiwgJEdldFBhcmFte0RheXN9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFxARGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVTZXR0aW5ncyA9ICRTdGFydFRpbWVPYmplY3QtPkdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICRTdGFydFRpbWVTZXR0aW5ncy0+e0RheU9mV2Vla30gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte01vbnRoRGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBzcGxpdCggIiwiLCAkR2V0UGFyYW17TW9udGhEYXlzfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQE1vbnRoRGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVTZXR0aW5ncyA9ICRTdGFydFRpbWVPYmplY3QtPkdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICRTdGFydFRpbWVTZXR0aW5ncy0+e0RheX0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbVllYXJseScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TW9udGhzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQE1vbnRocyA9IHNwbGl0KCAiLCIsICRHZXRQYXJhbXtNb250aHN9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFxATW9udGhzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZVNldHRpbmdzID0gJFN0YXJ0VGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFsgJFN0YXJ0VGltZVNldHRpbmdzLT57TW9udGh9IF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gPSAkR2V0UGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVudGlsIC4uLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUxpbWl0fSBlcSAnMScKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxZZWFyfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbE1vbnRofQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbERheX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbFllYXJ9LCAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxEYXl9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUHJldmVudCByZWN1cnJlbmNlIHVudGlsIGRhdGVzIGJlZm9yZSBzdGFydCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkUmVjdXJyZW5jZVVudGlsT2JqZWN0IDwgJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRHZXRQYXJhbXtTdGFydFRpbWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlQ291bnR9ID0gdW5kZWY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZm9yIC4uLiB0aW1lKHMpCiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VMaW1pdH0gZXEgJzInICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgbm90aWZpY2F0aW9uIGN1c3RvbSB0eXBlLCBpZiBzdXBwbGllZC4KICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte05vdGlmaWNhdGlvblRlbXBsYXRlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9IG5lICdDdXN0b20nICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJ2RhdGV0aW1lJzsKCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGV9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGltZVpvbmUgPT4gJFNlbGYtPntVc2VyVGltZVpvbmV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntVc2VyVGltZVpvbmV9ICkgewogICAgICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIG15ICVGdXR1cmVUYXNrOwogICAgICAgIGlmICggJUFwcG9pbnRtZW50ICkgewogICAgICAgICAgICBteSAkVGFza0lEOwogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICAgICAgJFRhc2tJRCA9ICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgT25seSBmb3IgcGFyZW50IGFwcG9pbnRtZW50cwogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewogICAgICAgICAgICAgICAgIyBDaGVjayBhbGwgYXBwb2ludG1lbnRzIG9mIHNlcmllcyBmb3IgZnV0dXJlIHRhc2sgaWQKICAgICAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnRJRCA9PiAkQXBwb2ludG1lbnR7UGFyZW50SUR9IHx8ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gfHwgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICk7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudExpc3QsIFwlUGFyZW50QXBwb2ludG1lbnQ7CgogICAgICAgICAgICAgICAgQVBQT0lOVE1FTlRMSVNUOgogICAgICAgICAgICAgICAgZm9yIG15ICRSZWN1cnJpbmdBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmluZ0FwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhc2tJRCA9ICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQVBQT0lOVE1FTlRMSVNUOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRUYXNrSUQgKSB7CiAgICAgICAgICAgICAgICAlRnV0dXJlVGFzayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICAgICAgVGFza0lEID0+ICRUYXNrSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSBARHluYW1pY0ZpZWxkQ29uZmlnczsKICAgICAgICBpZiAoICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0gJiYgZGVmaW5lZCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWY9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICBARHluYW1pY0ZpZWxkQ29uZmlncyA9IGRlZmluZWQgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgPyBAeyAkRHluYW1pY0ZpZWxkQ29uZmlnc1JlZiB9IDogKCk7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBARHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFZhbGlkYXRlIGR5bmFtaWMgZmllbGQgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSA/ICRQb3NzaWJsZVZhbHVlcyA6IHVuZGVmLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgIHx8IChyZWYoJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0pIGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9KSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3Qgd2l0aCBhcHByb2FjaCBmb3IgYXJyYXkKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiB7ICREeW5hbWljRmllbGRDb25maWctPiUqLCBOYW1lID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdbXScgfSwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBARHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9ICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAjIHRvIHN0b3JlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSBkYXRhYmFzZSAob3IgdW5kZWZpbmVkKQogICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHZhbHVlIGZyb20gZHluYW1pYyBmaWVsZCBjb25maWcgKGlmIGFueSkKICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwoKICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB1c2VyIHByZWZlcmVuY2VzIGlmIGlzIHNldAogICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRDb25maWctPntOYW1lfX0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWU9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZHN9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgIyBQYXJzZSBwb3NzaWJseSBtdWx0aXBsZSBjdXN0b21lciB1c2VycwogICAgICAgIGlmICggQE11bHRpcGxlQ3VzdG9tZXIgKSB7CiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyIChATXVsdGlwbGVDdXN0b21lcikgewogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklkZW50aWZpZXIgPSAkQ3VzdG9tZXJVc2VyLT57Q3VzdG9tZXJLZXl9ID8gJEN1c3RvbWVyVXNlci0+e0N1c3RvbWVyS2V5fSA6ICRDdXN0b21lclVzZXItPntDdXN0b21lckVsZW1lbnR9OwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyLT57Q3VzdG9tZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJJZGVudGlmaWVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSAuPSAiLCRDdXN0b21lclVzZXJJZGVudGlmaWVyIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJ9ID0gJEN1c3RvbWVyVXNlcklkZW50aWZpZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZmV0Y2ggY3VzdG9tZXIgaWQgZm9yIHNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICBteSAlU2VsZWN0ZWRDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkR2V0UGFyYW17U2VsZWN0ZWRDdXN0b21lclVzZXJ9LAogICAgICAgICk7CiAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJVNlbGVjdGVkQ3VzdG9tZXJVc2VyRGF0YSA/ICRTZWxlY3RlZEN1c3RvbWVyVXNlckRhdGF7Q3VzdG9tZXJJRH0gOiAnJzsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgICAgICMgdGVhbQogICAgICAgIGlmICggJEdldFBhcmFteydUZWFtSURbXSd9ICkgewogICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1RlYW1JRH0gPSBcQFRlYW1JRHM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17VGVhbUlEfSA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZXMKICAgICAgICBpZiAoICRHZXRQYXJhbXsnUmVzb3VyY2VJRFtdJ30gKSB7CiAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gXEBSZXNvdXJjZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIGRlYWxpbmcgd2l0aCB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgcmVhZG9ubHkgdmFsdWVzIHN0YXkgdW5jaGFuZ2VkLgogICAgICAgICAgICAkR2V0UGFyYW17VGl0bGV9ICAgICAgPSAkQXBwb2ludG1lbnR7VGl0bGV9OwogICAgICAgICAgICAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtBbGxEYXl9ICAgICA9IHVuZGVmOwogICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyaW5nfSAgPSB1bmRlZjsKCiAgICAgICAgICAgIG15ICRSdWxlID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUmVjYWxjdWxhdGUgZW5kIHRpbWUgYmFzZWQgb24gdGltZSBwcmVzZXQuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgaWYgKCAkUnVsZS0+e0VuZERhdGV9ID1+IC9eUGx1c18oWzAtOV0rKSQvICYmICRHZXRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRQcmVzZXQgPSBpbnQgJDE7CgogICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sICAgICMgYmFzZSBvbiBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBDYWxjdWxhdGUgZW5kIHRpbWUgdXNpbmcgcHJlc2V0IHZhbHVlLgogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIE1pbnV0ZXMgPT4gJFByZXNldCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRFbmRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgIyByZXNldCBlbXB0eSBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIG15ICRQYXJhbSAoIHNvcnQga2V5cyAlR2V0UGFyYW0gKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskUGFyYW19ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwYXNzIGN1cnJlbnQgdXNlciBJRAogICAgICAgICRHZXRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAjIEdldCBwYXNzZWQgcGx1Z2luIHBhcmFtZXRlcnMuCiAgICAgICAgbXkgQFBsdWdpblBhcmFtcyA9IGdyZXAgeyAkXyA9fiAvXlBsdWdpbl8vIH0ga2V5cyAlR2V0UGFyYW07CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBpZiAoICFAUGx1Z2luUGFyYW1zICkgewogICAgICAgICAgICAjIENvbWluZyBmcm9tIGVpdGhlciBkcmFnIGFuZCBkcm9wIG9yIHJlc2l6ZSwgZmlsbGluZyBwYXJhbXMgd2l0aCBleGlzdGluZyBkYXRhIGlmIHByZXNlbnQKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkRnV0dXJlVGFza0lEOwogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0lEID0gJEFwcG9pbnRtZW50e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9IHx8ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJEFwcG9pbnRtZW50e1BhcmVudElEfSB8fCAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gfHwgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnRMaXN0LCBcJVBhcmVudEFwcG9pbnRtZW50OwogICAgICAgICAgICAgICAgICAgIEFQUE9JTlRNRU5UUkVDVVJSSU5HOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUmVjdXJyaW5nQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudExpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVjdXJyaW5nQXBwb2ludG1lbnQtPntGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tJRCA9ICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEFQUE9JTlRNRU5UUkVDVVJSSU5HOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEZ1dHVyZVRhc2tJRCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlRnV0dXJlVGFzayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkRnV0dXJlVGFza0lELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0FwcG9pbnRtZW50VGlja2V0fSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGV0ZXJtaW5lIHRpY2tldCBjdXN0b20gdHlwZSwgaWYgc3VwcGxpZWQuCiAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpY2tldFRlbXBsYXRlfSBuZSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b219ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VGlja2V0Q3VzdG9tfSA9ICdyZWxhdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VGlja2V0Q3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZURheX0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lTWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QtPlRvT1RPQk9UaW1lWm9uZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0gPSAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSGFuZGxlIFRpY2tldCBDcmVhdGlvbiBvbiBBcHBvaW50bWVudAogICAgICAgIGlmICgkR2V0UGFyYW17QXBwb2ludG1lbnRUaWNrZXR9KSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0gPSB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICAgICAgICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRUaW1lfSwKICAgICAgICAgICAgICAgIEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbX0sCiAgICAgICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICBDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEZXN0fSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyICAgICAgPT4gJEdldFBhcmFte1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+ICRHZXRQYXJhbXtUaWNrZXRBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZHN9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+JSosCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17QXBwb2ludG1lbnRUaWNrZXR9ID0gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICAgICAgICAgICAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0VGVtcGxhdGV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0VGltZX0sCiAgICAgICAgICAgICAgICBDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b219LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwKICAgICAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAogICAgICAgICAgICAgICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RGVzdH0sCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZEN1c3RvbWVyVXNlciAgICAgID0+ICRHZXRQYXJhbXtTZWxlY3RlZEN1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciA9PiAkR2V0UGFyYW17VGlja2V0QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lcn0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGRzfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICAgICBpZiAoJUFwcG9pbnRtZW50KSB7CgogICAgICAgICAgICAjIENvbnRpbnVlIG9ubHkgaWYgY29taW5nIGZyb20gZWRpdCBzY3JlZW4KICAgICAgICAgICAgIyAgICh0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGFzc2VkIHBsdWdpbiBwYXJhbWV0ZXIpLgogICAgICAgICAgICBpZiAoQFBsdWdpblBhcmFtcykgewoKICAgICAgICAgICAgICAgICMgR2V0IGFsbCByZWxhdGVkIGFwcG9pbnRtZW50cyBiZWZvcmUgdGhlIHVwZGF0ZS4KICAgICAgICAgICAgICAgIG15IEBSZWxhdGVkQXBwb2ludG1lbnRzICA9ICggJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICk7CiAgICAgICAgICAgICAgICBteSBAQ2FsZW5kYXJBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcGFyZW50LCBpbmNsdWRlIGFueSBjaGlsZCBhcHBvaW50bWVudHMuCiAgICAgICAgICAgICAgICBwdXNoIEBSZWxhdGVkQXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJF8tPntQYXJlbnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJF8tPntQYXJlbnRJRH0gZXEgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBSZW1vdmUgYWxsIGV4aXN0aW5nIGxpbmtzLgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50QXBwb2ludG1lbnRJRCAoQFJlbGF0ZWRBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEN1cnJlbnRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmtzIGNvdWxkIG5vdCBiZSBkZWxldGVkIGZvciBhcHBvaW50bWVudCAkQ3VycmVudEFwcG9pbnRtZW50SUQhIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ID8gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9IDogJFN1Y2Nlc3M7CgogICAgICAgIGlmICgkQXBwb2ludG1lbnRJRCkgewoKICAgICAgICAgICAgIyBDb250aW51ZSBvbmx5IGlmIGNvbWluZyBmcm9tIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICMgICAodGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVyKS4KICAgICAgICAgICAgaWYgKEBQbHVnaW5QYXJhbXMpIHsKCiAgICAgICAgICAgICAgICAjIEdldCBmcmVzaCBhcHBvaW50bWVudCBkYXRhLgogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFByb2Nlc3MgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgbXkgQFJlbGF0ZWRBcHBvaW50bWVudHMgID0gKCRBcHBvaW50bWVudElEKTsKICAgICAgICAgICAgICAgIG15IEBDYWxlbmRhckFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBwYXJlbnQsIGluY2x1ZGUgYW55IGNoaWxkIGFwcG9pbnRtZW50cyBhcyB3ZWxsLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAkXy0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdyZXAgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudElECiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBQcm9jZXNzIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luUGFyYW0gKEBQbHVnaW5QYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkUGx1Z2luRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkR2V0UGFyYW17JFBsdWdpblBhcmFtfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRQbHVnaW5LZXkgPSAkUGx1Z2luUGFyYW07CiAgICAgICAgICAgICAgICAgICAgJFBsdWdpbktleSA9fiBzL15QbHVnaW5fLy87CgogICAgICAgICAgICAgICAgICAgICMgRXhlY3V0ZSBsaW5rIGFkZCBtZXRob2Qgb2YgdGhlIHBsdWdpbi4KICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkUGx1Z2luRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggQHskUGx1Z2luRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGluayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzID8gMSA6IDAsCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgQUpBWCB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgbXkgJERlc3QgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgIyBUT0RPIENoZWNrIGhvdyB0aGlzIGlzIHVzZWQgbGF0ZXIgb24gc2luY2UgaW4gY2FzZSBvZiBleHRlcm5hbCBjdXN0b21lciB1c2VyLCBzZWxlY3RlZCBpcyBub3QgaW4gU2VsZWN0ZWRDdXN0b21lciBidXQgaW4gQ3VzdG9tZXJTZWxlY3RlZAogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CiAgICAgICAgbXkgJFF1ZXVlSUQgICAgICAgID0gJyc7CgogICAgICAgICRRdWV1ZUlEID0gJERlc3Q7CiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb252ZXJnZW5jZSA9ICgKICAgICAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAkRWxlbWVudENoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICRFbGVtZW50Q2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzICAgICAgID0gJEVsZW1lbnRDaGFuZ2VkICYmICRFbGVtZW50Q2hhbmdlZCAhfiAvXkR5bmFtaWNGaWVsZF8vID8gKCAkRWxlbWVudENoYW5nZWQgPT4gMSApIDogKCk7CgogICAgICAgIG15ICRMb29wUHJvdGVjdGlvbiA9IDEwMDsKICAgICAgICBteSAlU3RkRmllbGRWYWx1ZXM7CiAgICAgICAgbXkgJUR5bkZpZWxkU3RhdGVzID0gKAogICAgICAgICAgICBWaXNpYmlsaXR5ID0+IHt9LAogICAgICAgICAgICBGaWVsZHMgICAgID0+IHt9LAogICAgICAgICk7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Nlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgRGVzdCAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tUaWNrZXRTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAjIG5lZWRlZCBmb3IgU0xBSUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17JFF1ZXVlSUR9ID0gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyRRdWV1ZUlEfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBjdXJyZW50IHNlbGVjdGlvbiBvZiBRdWV1ZUlEIChEZXN0IHdpbGwgYmUgZG9uZSB0b2dldGhlciB3aXRoIHRoZSBvdGhlciBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1F1ZXVlSUR9ICYmICEkU3RkRmllbGRWYWx1ZXN7RGVzdH17ICRHZXRQYXJhbXtEZXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkR2V0UGFyYW17UXVldWVJRH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPntEZXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgY3VycmVudCBzZWxlY3RlZCB2YWx1ZSBpcyBzdGlsbCB2YWxpZCBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfXsgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBub3QgZW1wdHkgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISVOZXdDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjb21iaW5lIEZpZWxkU3RhdGVzCiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICRJbmRleCAoIHNvcnQga2V5cyAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9ICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGR9LT5bJEluZGV4XTsKCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JEluZGV4fXtOb3RBQ0xSZWR1Y2libGV9CiAgICAgICAgICAgICAgICA/ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0KICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRJbmRleH17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfHwgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JEluZGV4fXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBkeW5hbWljIGZpZWxkIHZpc2liaWxpdHkKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gKSApIHsKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzdHJpY3Rpb25zX1Zpc2liaWxpdHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFKQVggcmV0dXJuIGZvciB0aGUgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgQFN0ZEZpZWxkQUpBWDsKICAgICAgICBteSAlQXR0cmlidXRlcyA9ICgKICAgICAgICAgICAgRGVzdCA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU0xBSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFR5cGVJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICAgICAgZGVsZXRlICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVTdGRGaWVsZFZhbHVlcyApIHsKICAgICAgICAgICAgcHVzaCBAU3RkRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVzeyRGaWVsZH0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXskRmllbGR9LAogICAgICAgICAgICAgICAgJXsgJEF0dHJpYnV0ZXN7JEZpZWxkfSB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIEBTdGRGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZUFwcG9pbnRtZW50JyApIHsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gMDsKICAgICAgICAgICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICAgICAgICAgICMgUHJldmVudCBkZWxldGluZyB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBHZXQgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzIGJlZm9yZSB0aGUgZGVsZXRpb24uCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAkXy0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdyZXAgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgIH0gQENhbGVuZGFyQXBwb2ludG1lbnRzOwoKICAgICAgICAgICAgICAgICMgUmVtb3ZlIGFsbCBleGlzdGluZyBsaW5rcy4KICAgICAgICAgICAgICAgIGZvciBteSAkQ3VycmVudEFwcG9pbnRtZW50SUQgKEBSZWxhdGVkQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRDdXJyZW50QXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCBmb3IgYXBwb2ludG1lbnQgJEN1cnJlbnRBcHBvaW50bWVudElEISIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yID0gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9ucyEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgPT4gJEVycm9yLAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGVQcmVmZXJlbmNlcycgKSB7CgogICAgICAgIG15ICRTdWNjZXNzID0gMDsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59ICYmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZWZhdWx0Vmlld30gfHwgJEdldFBhcmFte0NhbGVuZGFyU2VsZWN0aW9ufQogICAgICAgICAgICAgICAgfHwgKCAkR2V0UGFyYW17U2hvd25SZXNvdXJjZXN9ICYmICRHZXRQYXJhbXtUZWFtSUR9ICkKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtTaG93bkFwcG9pbnRtZW50c30KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleTsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0RlZmF1bHRWaWV3fSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ID0gJ0RlZmF1bHRWaWV3JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtDYWxlbmRhclNlbGVjdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdDYWxlbmRhclNlbGVjdGlvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17U2hvd25SZXNvdXJjZXN9ICYmICRHZXRQYXJhbXtUZWFtSUR9ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgICAgICAgPSAnU2hvd25SZXNvdXJjZXMnOwogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAiLSRHZXRQYXJhbXtUZWFtSUR9IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtTaG93bkFwcG9pbnRtZW50c30gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdTaG93bkFwcG9pbnRtZW50cyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcicgLiAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59IC4gJFByZWZlcmVuY2VLZXkgLiAkUHJlZmVyZW5jZUtleVN1ZmZpeCwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkR2V0UGFyYW17JFByZWZlcmVuY2VLZXl9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGVsc2lmICggJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAmJiAkR2V0UGFyYW17UmVzdG9yZURlZmF1bHRTZXR0aW5nc30gKSB7CiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlS2V5OwogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleVN1ZmZpeCA9ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVzdG9yZURlZmF1bHRTZXR0aW5nc30gZXEgJ1Nob3duUmVzb3VyY2VzJyAmJiAkR2V0UGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ICAgICAgID0gJ1Nob3duUmVzb3VyY2VzJzsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gIi0kR2V0UGFyYW17VGVhbUlEfSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYmxhbmsgdXNlciBwcmVmZXJlbmNlcwogICAgICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyJyAuICRHZXRQYXJhbXtPdmVydmlld1NjcmVlbn0gLiAkUHJlZmVyZW5jZUtleSAuICRQcmVmZXJlbmNlS2V5U3VmZml4LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVhbSBsaXN0IHNlbGVjdGlvbiB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZWFtVXNlckxpc3QnICkgewogICAgICAgIG15IEBUZWFtSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RlYW1JRFtdJyApOwogICAgICAgIG15ICVUZWFtVXNlckxpc3RBbGw7CgogICAgICAgICMgQ2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZC4KICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICBURUFNSUQ6CiAgICAgICAgICAgIGZvciBteSAkVGVhbUlEIChAVGVhbUlEcykgewogICAgICAgICAgICAgICAgbmV4dCBURUFNSUQgaWYgISRUZWFtSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB0ZWFtIG1lbWJlcnMKICAgICAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVRlYW1Vc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGVhbVVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlVGVhbVVzZXJMaXN0QWxsID0gKCAlVGVhbVVzZXJMaXN0QWxsLCAlVGVhbVVzZXJMaXN0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVhbVVzZXJMaXN0ID0+IFwlVGVhbVVzZXJMaXN0QWxsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgfQoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgpzdWIgX0RheU9mZnNldEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBvcmlnaW5hbCBkYXRlIGNvbXBvbmVudHMuCiAgICBteSAkT3JpZ2luYWxUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1RpbWV9LAogICAgICAgIH0sCiAgICApOwogICAgbXkgJE9yaWdpbmFsVGltZVNldHRpbmdzID0gJE9yaWdpbmFsVGltZU9iamVjdC0+R2V0KCk7CgogICAgIyBHZXQgZGVzdGluYXRpb24gdGltZSBhY2NvcmRpbmcgdG8gdXNlciB0aW1lem9uZS4KICAgIG15ICREZXN0aW5hdGlvblRpbWVPYmplY3QgPSAkT3JpZ2luYWxUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgJERlc3RpbmF0aW9uVGltZU9iamVjdC0+VG9UaW1lWm9uZSggVGltZVpvbmUgPT4gJFNlbGYtPntVc2VyVGltZVpvbmV9ICk7CiAgICBteSAkRGVzdGluYXRpb25UaW1lU2V0dGluZ3MgPSAkRGVzdGluYXRpb25UaW1lT2JqZWN0LT5HZXQoKTsKCiAgICAjIENvbXBhcmUgZGF5cyBvZiB0d28gdGltZXMuCiAgICBpZiAoICRPcmlnaW5hbFRpbWVTZXR0aW5ncy0+e0RheX0gPT0gJERlc3RpbmF0aW9uVGltZVNldHRpbmdzLT57RGF5fSApIHsKICAgICAgICByZXR1cm4gMDsgICAgIyBzYW1lIGRheQogICAgfQogICAgZWxzaWYgKCAkT3JpZ2luYWxUaW1lT2JqZWN0ID4gJERlc3RpbmF0aW9uVGltZU9iamVjdCApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldApzdWIgX0dldFByaW9yaXRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBteSAlUHJpb3JpdGllczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3M7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSApIHsKICAgICAgICAlTmV3VG9zID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVRvczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVRvcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVUb3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzUXVldWVMaXN0KCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjcmVhdGUgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICk7CiAgICAgICAgbXkgJFN5c3RlbUFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpOwogICAgICAgIG15ICRRdWV1ZU9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgICAgIFFVRVVFSUQ6CiAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICVUb3MgKSB7CgogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICMgcGVybWlzc2lvbiBjaGVjaywgY2FuIHdlIGNyZWF0ZSBuZXcgdGlja2V0cyBpbiBxdWV1ZQogICAgICAgICAgICBuZXh0IFFVRVVFSUQgaWYgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH07CgogICAgICAgICAgICBteSAkU3RyaW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblN0cmluZycpCiAgICAgICAgICAgICAgICB8fCAnPFJlYWxuYW1lPiA8PEVtYWlsPj4gLSBRdWV1ZTogPFF1ZXVlPic7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWU+LyRRdWV1ZURhdGF7TmFtZX0vZzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZUNvbW1lbnQ+LyRRdWV1ZURhdGF7Q29tbWVudH0vZzsKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICBpZiAoICEkUXVldWVEYXRhe0NvbW1lbnR9ICkgewogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBze1xzK1x6fXt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgbmUgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgICAgIG15ICVTeXN0ZW1BZGRyZXNzRGF0YSA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKCiAgICByZXR1cm4gXCVOZXdUb3M7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHR5cGUKICAgIG15ICVUeXBlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKc3ViIF9HZXRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgIG15ICVOZXh0U3RhdGVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlTmV4dFN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgc2V0dGluZyBjdXN0b21lciB1c2VyIGlkCiAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJFBhcmFte1NlbGVjdGVkQ3VzdG9tZXJVc2VyfTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHNlcnZpY2VzIGlmIHRoZXkgd2VyZSBub3QgZGV0ZXJtaW5lZCBpbiBhbiBBSkFYIGNhbGwKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1NlcnZpY2VzfSApIHsKICAgICAgICAkUGFyYW17U2VydmljZXN9ID0gJFNlbGYtPl9HZXRTZXJ2aWNlcyglUGFyYW0pOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgoxOwo=</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentAppointmentEdit.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBjMTRjYTU1YThiMWQzZDY4NmU4MDNjMTM5ODgxM2I4M2QyMjA5MWU1IC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZ2VudEFwcG9pbnRtZW50RWRpdC50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFZGl0TWFzayIpICVdCjxkaXYgY2xhc3M9IklubmVyQ29udGVudCI+CiAgICA8Zm9ybSBpZD0iRWRpdEFwcG9pbnRtZW50Rm9ybSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJDaGFsbGVuZ2VUb2tlbiIgbmFtZT0iQ2hhbGxlbmdlVG9rZW4iIHZhbHVlPSJbJSBFbnYoIlVzZXJDaGFsbGVuZ2VUb2tlbiIpIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBY3Rpb24iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlN1YmFjdGlvbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRWRpdEFwcG9pbnRtZW50Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkFwcG9pbnRtZW50SUQiIG5hbWU9IkFwcG9pbnRtZW50SUQiIHZhbHVlPSJbJSBEYXRhLkFwcG9pbnRtZW50SUQgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmluZyIgbmFtZT0iUmVjdXJyaW5nIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJpbmcgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VEYXlzIiBuYW1lPSJSZWN1cnJlbmNlRGF5cyIgdmFsdWU9IlslIERhdGEuUmVjdXJyZW5jZURheXMgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VNb250aHMiIG5hbWU9IlJlY3VycmVuY2VNb250aHMiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VNb250aHMgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VNb250aERheXMiIG5hbWU9IlJlY3VycmVuY2VNb250aERheXMiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VNb250aERheXMgfCBodG1sICVdIi8+CiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBSkFYQWN0aW9uIiBuYW1lPSJBSkFYQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFzaWMgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpdGxlIlslIElGIERhdGEuUGVybWlzc2lvbkxldmVsID49IDIgJV0gY2xhc3M9Ik1hbmRhdG9yeSJbJSBFTkQgJV0+WyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXTxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIEVORCAlXVslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iVGl0bGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9wPgpbJSBFTFNFICVdClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpdGxlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGl0bGUiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgLz4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlc2NyaXB0aW9uIj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iRGVzY3JpcHRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkRlc2NyaXB0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iRGVzY3JpcHRpb24iIG5hbWU9IkRlc2NyaXB0aW9uIiBjbGFzcz0iVzc1cGMiIHJvd3M9IjQiPlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdPC90ZXh0YXJlYT4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxvY2F0aW9uIj5bJSBUcmFuc2xhdGUoIkxvY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTG9jYXRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkxvY2F0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iTG9jYXRpb24iIG5hbWU9IkxvY2F0aW9uIiB2YWx1ZT0iWyUgRGF0YS5Mb2NhdGlvbiB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgLz4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxvY2F0aW9uTGluayIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iTG9jYXRpb25MaW5rIEhpZGRlbiBbJSBEYXRhLkNTU0NsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5VUkwgfCBodG1sICVdWyUgRGF0YS5Mb2NhdGlvbiB8IHVyaSAlXSIgZGF0YS1iYXNlLXVybD0iWyUgRGF0YS5VUkwgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVGV4dCkgfCBodG1sICVdIiB0YXJnZXQ9IlslIERhdGEuVGFyZ2V0IHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIFslIERhdGEuSWNvbk5hbWUgfCBodG1sICVdIj48L2k+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJMb2NhdGlvbkxpbmsiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIlslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0gY2xhc3M9Ik1hbmRhdG9yeSJbJSBFTkQgJV0+ClslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ClslIEVORCAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXToKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMyAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IkNhbGVuZGFySUQiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJJRFN0cmcgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+ClslIElGIERhdGEuVGVhbUlEU3RyZyAlXQogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIlJlc291cmNlIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJUZWFtSUQiPlslIFRyYW5zbGF0ZSgiVGVhbSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRlYW1JRCIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuVGVhbU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlRlYW1JRFN0cmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc291cmNlSUQiPlslIFRyYW5zbGF0ZSgiQWdlbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJSZXNvdXJjZUlEIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5SZXNvdXJjZU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc291cmNlSURTdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBFTkQgJV0KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJEYXRlL1RpbWUiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXJ0RGF5Ij5bJSBUcmFuc2xhdGUoIlN0YXJ0IGRhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiAoIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5SZWFkT25seVN0YXJ0ICkgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iU3RhcnREYXkiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLlN0YXJ0RGF0ZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdGFydERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIFslIERhdGEuU3RhcnREYXRlU3RyaW5nICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJFbmREYXkiPlslIFRyYW5zbGF0ZSgiRW5kIGRhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiAoIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5SZWFkT25seUR1cmF0aW9uICkgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iRW5kRGF5IiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5FbmREYXRlIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkVuZERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkVuZERhdGVTdHJpbmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFsbERheSI+WyUgVHJhbnNsYXRlKCJBbGwtZGF5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJBbGxEYXkiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5BbGxEYXlTdHJpbmcpIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iQWxsRGF5IiBuYW1lPSJBbGxEYXkiIFslIERhdGEuQWxsRGF5Q2hlY2tlZCAlXSAvPgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjdXJyZW5jZVR5cGUiPlslIFRyYW5zbGF0ZSgiUmVwZWF0IikgfCBodG1sICVdOjwvbGFiZWw+ClslIElGIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QYXJlbnRJRCAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPGJyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkVkaXRQYXJlbnQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08L2E+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJSZWN1cnJlbmNlVHlwZSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuUmVjdXJyZW5jZVZhbHVlIHwgaHRtbCAlXTwvcD4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBFTFNFICVdClslIElGIERhdGEuUGFyZW50SUQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPGJyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkVkaXRQYXJlbnQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L2Rpdj4KWyUgRUxTRSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VUeXBlU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkZyZXF1ZW5jeSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFdmVyeSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjdXJyZW5jZUludGVydmFsU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlJlY3VycmVuY2VJbnRlcnZhbFRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dERheSBIaWRkZW4iPlslIFRyYW5zbGF0ZSgiZGF5KHMpIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dFdlZWsgSGlkZGVuIj5bJSBUcmFuc2xhdGUoIndlZWsocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0TW9udGggSGlkZGVuIj5bJSBUcmFuc2xhdGUoIm1vbnRoKHMpIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dFllYXIgSGlkZGVuIj5bJSBUcmFuc2xhdGUoInllYXIocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkRheXMiIG5hbWU9IkRheXMiIHZhbHVlPSJbJSBEYXRhLkRheXMgJV0iIC8+CgojIFdlZWtseSB0YWJsZSBzdGFydAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iQnV0dG9uVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSIxIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNb25kYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNb24iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlR1ZXNkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUdWUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIldlZG5lc2RheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIldlZCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVGh1cnNkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaHUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZyaWRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkZyaSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2F0dXJkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTYXQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1bmRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN1biIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgojIFdlZWtseSB0YWJsZSBlbmQKCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Ik1vbnRoRGF5cyIgbmFtZT0iTW9udGhEYXlzIiB2YWx1ZT0iWyUgRGF0YS5Nb250aERheXMgJV0iIC8+CgojIE1vbnRobHkgdGFibGUgc3RhcnQKICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkJ1dHRvblRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBDb3VudCA9IDEgJV0KWyUgV0hJTEUgQ291bnQgPCAzMiAlXQpbJSBJRiBDb3VudCAlIDcgPT0gMSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgpbJSBFTkQgJV0KCiMgam9pbiBzdHJpbmdzIChNb250aGx5MSwgTW9udGhseTIsLi4uKQpbJSBNb250aGx5Q291bnQgPSAiTW9udGhseSIgXyBDb3VudCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iWyUgQ291bnQgJV0iIHRpdGxlPSJbJSBDb3VudCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBDb3VudCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBJRiBDb3VudCAlIDcgPT0gMCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgRU5EICVdCgpbJSBDb3VudCA9IENvdW50ICsgMSAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgojIE1vbnRobHkgdGFibGUgZW5kCgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Ik1vbnRocyIgbmFtZT0iTW9udGhzIiB2YWx1ZT0iWyUgRGF0YS5Nb250aHMgJV0iIC8+CgojIFllYXJseSB0YWJsZSBzdGFydAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iQnV0dG9uVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkphbnVhcnkiKSB8IGh0bWwgJV0iIHZhbHVlPSIxIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkphbiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGZWJydWFyeSIpIHwgaHRtbCAlXSIgdmFsdWU9IjIiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRmViIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1hcmNoIikgfCBodG1sICVdIiB2YWx1ZT0iMyIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNYXIiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQXByaWwiKSB8IGh0bWwgJV0iIHZhbHVlPSI0IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFwciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTWF5X2xvbmciKSB8IGh0bWwgJV0iIHZhbHVlPSI1IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1heSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJKdW5lIikgfCBodG1sICVdIiB2YWx1ZT0iNiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJKdW4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSnVseSIpIHwgaHRtbCAlXSIgdmFsdWU9IjciID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSnVsIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF1Z3VzdCIpIHwgaHRtbCAlXSIgdmFsdWU9IjgiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXVnIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXB0ZW1iZXIiKSB8IGh0bWwgJV0iIHZhbHVlPSI5IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlcCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJPY3RvYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTAiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT2N0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk5vdmVtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTEiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm92IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlY2VtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTIiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRGVjIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiMgWWVhcmx5IHRhYmxlIGVuZAoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VMaW1pdERpdiIgY2xhc3M9IkZpZWxkIEhpZGRlbiI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VMaW1pdFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iUmVjdXJyZW5jZVVudGlsRGl2IiBjbGFzcz0iRmllbGQgSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VVbnRpbERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VVbnRpbFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iUmVjdXJyZW5jZUNvdW50RGl2IiBjbGFzcz0iRmllbGQgSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iUmVjdXJyZW5jZUNvdW50IiBuYW1lPSJSZWN1cnJlbmNlQ291bnQiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VDb3VudCB8IGh0bWwgJV0iIHNpemU9IjEiIG1heGxlbmd0aD0iMiIgLz4KICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgoKICAgICAgICAgICAgPGxhYmVsIGZvcj0iTm90aWZpY2F0aW9uVGVtcGxhdGUiPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTm90aWZpY2F0aW9uVGVtcGxhdGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLk5vdGlmaWNhdGlvblZhbHVlIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25TdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYiPgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQiPlslIFRyYW5zbGF0ZSgiUmVsYXRpdmUgcG9pbnQgb2YgdGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgoKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQiIHZhbHVlPSIiIGlkPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0IiBbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXRSYWRpbyAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50IiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCIgdmFsdWU9IlslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgfCBodG1sICVdIiBzaXplPSIxIiBtYXhsZW5ndGg9IjIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21Vbml0c1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQiPlslIFRyYW5zbGF0ZSgiRGF0ZS9UaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0IiB2YWx1ZT0iIiBpZD0iTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21EYXRlVGltZVN0cmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICA8L2ZpZWxkc2V0PgoKWyUgSUYgRGF0YS5QbHVnaW5MaXN0ICVdCiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTGluayIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KWyUgRk9SRUFDSCBLZXkgSU4gRGF0YS5QbHVnaW5MaXN0LmtleXMgJV0KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5OYW1lKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdCiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IlslIEtleSB8IGh0bWwgJV0iIHR5cGU9InRleHQiIGRhdGEtcGx1Z2luLWtleT0iWyUgS2V5IHwgaHRtbCAlXSIgZGF0YS1wbHVnaW4tdXJsPSJbJSBEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5VUkwgfCBodG1sICVdIiBjbGFzcz0iUGx1Z2luRmllbGQgVzkwcGMiIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUGx1Z2luX1slIEtleSB8IGh0bWwgJV0iIG5hbWU9IlBsdWdpbl9bJSBLZXkgfCBodG1sICVdIiB2YWx1ZT0nWyUgRGF0YS5QbHVnaW5MaXN0LiRLZXkuTGlua0xpc3QgfHwgIltdIiAlXScgLz4KWyUgRUxTRSAlXQpbJSBJRiBEYXRhLlBsdWdpbkRhdGEuJEtleS5zaXplID09IDAgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJSZWFkT25seVZhbHVlIj4tPC9wPgpbJSBFTkQgJV0KWyUgRU5EICVdCiMga2VlcCBmb2xsb3dpbmcgYmxvY2sgb24gYSBzaW5nbGUgbGluZSwgc28gOmVtcHR5IENTUyBzZWxlY3RvciB3b3VsZCB3b3JrIQogICAgICAgICAgICAgICAgPGRpdiBpZD0iUGx1Z2luQ29udGFpbmVyX1slIEtleSB8IGh0bWwgJV0iWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXSBjbGFzcz0iUGx1Z2luQ29udGFpbmVyIlslIEVORCAlXT5bJSBGT1JFQUNIIExpbmsgSU4gRGF0YS5QbHVnaW5EYXRhLiRLZXkgJV08ZGl2IGNsYXNzPSJMaW5rX1slIExpbmsuTGlua0lEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgTGluay5MaW5rVVJMICVdIj5bJSBMaW5rLkxpbmtOYW1lIHwgaHRtbCAlXTwvYT5bJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgaHJlZj0iIyIgZGF0YS1wbHVnaW4ta2V5PSJbJSBLZXkgfCBodG1sICVdIiBkYXRhLWxpbmstaWQ9IlslIExpbmsuTGlua0lEIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPlslIEVORCAlXQogICAgICAgICAgICAgICAgPC9kaXY+WyUgRU5EICVdPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIEVORCAlXQogICAgICAgIDwvZmllbGRzZXQ+ClslIEVORCAlXQojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJUaWNrZXQgQ3JlYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpY2tldFRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIlRpY2tldCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBUaWNrZXRUZW1wbGF0ZVNlbGVjdGlvbiI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpY2tldFRlbXBsYXRlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UaWNrZXRWYWx1ZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuVGlja2V0U3RyZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCIgY2xhc3M9IkFwcG9pbnRtZW50VGlja2V0Q3VzdG9tVGltZSI+WyUgVHJhbnNsYXRlKCJSZWxhdGl2ZSBwb2ludCBvZiB0aW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24gQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCIgdmFsdWU9IiIgaWQ9IlRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQiIFslIERhdGEuVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvICVdPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQiIG5hbWU9IlRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50IiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCB8IGh0bWwgJV0iIHNpemU9IjEiIG1heGxlbmd0aD0iMiIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpY2tldEN1c3RvbVVuaXRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGlja2V0Q3VzdG9tVW5pdHNQb2ludE9mVGltZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dCIgY2xhc3M9IkFwcG9pbnRtZW50VGlja2V0Q3VzdG9tVGltZSI+WyUgVHJhbnNsYXRlKCJEYXRlL1RpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiBBcHBvaW50bWVudFRpY2tldEN1c3RvbVRpbWUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0IiB2YWx1ZT0iIiBpZD0iVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dCIgWyUgRGF0YS5UaWNrZXRDdXN0b21EYXRlVGltZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlRpY2tldEN1c3RvbURhdGVUaW1lU3RyZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgaWQ9IlNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRTZWxlY3RlZEN1c3RvbWVyVXNlciB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJGcm9tQ3VzdG9tZXIiIGNsYXNzPSJNYW5kYXRvcnkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRnJvbUN1c3RvbWVyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJGcm9tQ3VzdG9tZXIiIHZhbHVlPSIiIGNsYXNzPSJDdXN0b21lckF1dG9Db21wbGV0ZSBXNzVwYyBbJSBEYXRhLkZyb21JbnZhbGlkIHwgaHRtbCAlXSIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGcm9tQ3VzdG9tZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGcm9tU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGluY2x1ZGUgYXQgbGVhc3Qgb25lIGN1c3RvbWVyIGZvciB0aGUgdGlja2V0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkZyb21TZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFslIERhdGEuQ3VzdG9tZXJIaWRkZW5Db250YWluZXIgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVGcm9tQ3VzdG9tZXIgU3BhY2luZ1RvcFNtYWxsIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkN1c3RvbWVyU2VsZWN0ZWQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCB0aGlzIGN1c3RvbWVyIGFzIHRoZSBtYWluIGN1c3RvbWVyLiIpIHwgaHRtbCAlXSIgaWQ9IkN1c3RvbWVyU2VsZWN0ZWQiIGNsYXNzPSJDdXN0b21lclRpY2tldFJhZGlvIiB0eXBlPSJyYWRpbyIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lcktleSIgaWQ9IkN1c3RvbWVyS2V5IiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIiBuYW1lPSJDdXN0b21lclRpY2tldFRleHQiIGlkPSJDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVtb3ZlQ3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIFRpY2tldCBDdXN0b21lciBVc2VyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudEZyb21DdXN0b21lciIgY2xhc3M9IkN1c3RvbWVyQ29udGFpbmVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcFNtYWxsICI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclNlbGVjdGVkIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgdGhpcyBjdXN0b21lciBhcyB0aGUgbWFpbiBjdXN0b21lci4iKSB8IGh0bWwgJV0iIGlkPSJDdXN0b21lclNlbGVjdGVkX1slIERhdGEuQ291bnQgJV0iIGNsYXNzPSJDdXN0b21lclRpY2tldFJhZGlvIiB0eXBlPSJyYWRpbyIgdmFsdWU9IlslIERhdGEuQ291bnQgfCBodG1sICVdIiBbJSBEYXRhLkN1c3RvbWVyU2VsZWN0ZWQgfCBodG1sICVdICBbJSBEYXRhLkN1c3RvbWVyRGlzYWJsZWQgfCBodG1sICVdIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgaWQ9IkN1c3RvbWVyS2V5X1slIERhdGEuQ291bnQgfCBodG1sICVdIiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJLZXkgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlbW92ZUN1c3RvbWVyVGlja2V0X1slIERhdGEuQ291bnQgJV0iIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiIG5hbWU9IlJlbW92ZUN1c3RvbWVyVGlja2V0X1slIERhdGEuQ291bnQgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkV4cGxhbmF0aW9uIEVycm9yIj5bJSBUcmFuc2xhdGUoIlBsZWFzZSByZW1vdmUgdGhpcyBlbnRyeSBhbmQgZW50ZXIgYSBuZXcgb25lIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgZHVlIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJETlMgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBhbmQgdGhlIGVycm9yIGxvZy4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGUgc3ludGF4IG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpcyBpbmNvcnJlY3QuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lciIpICVdCgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIk11bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXIiIGlkPSJDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXIiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJDb3VudGVyIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDdXN0b21lcklEIiBpZD0iQ3VzdG9tZXJJRCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIvPgpbJSBJRiBEYXRhLlR5cGVIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGlja2V0VHlwZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgnVHlwZScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZUhUTUxTdHJpbmcgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldFR5cGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldFR5cGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkRlc3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCdRdWV1ZScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVIVE1MU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBJRiBEYXRhLlNlcnZpY2VIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgWyUgSUYgRGF0YS5TZXJ2aWNlTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTZXJ2aWNlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlSFRNTFN0cmluZyAlXQogICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5TZXJ2aWNlTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIFslIElGIERhdGEuU0xBTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTTEFJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFIVE1MU3RyaW5nICVdCiAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlNMQU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUHJpb3JpdHkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCdQcmlvcml0eScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUHJpb3JpdHlIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5leHRTdGF0ZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgnU3RhdGUnKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXRlSFRNTFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJUaWNrZXRBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyIj5bJSBUcmFuc2xhdGUoJ0FydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXInKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iVGlja2V0QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciIgaWQ9IlRpY2tldEFydGljbGVWaXNpYmxlRm9yQ3VzdG9tZXIiIHZhbHVlPSIiIFslIERhdGEuQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciB8IGh0bWwgJV0gdHlwZT0iY2hlY2tib3giIC8+CiAgICAgICAgICAgIDwvZGl2PgpbJSBGT1JFQUNIIER5bmFtaWNGaWVsZCBJTiBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICBbJSBEeW5hbWljRmllbGQuTGFiZWwgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRHluYW1pY0ZpZWxkLkZpZWxkICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KICAgICAgIDwvZmllbGRzZXQ+CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgPC9mb3JtPgo8L2Rpdj4KCjxkaXYgY2xhc3M9IkNvbnRlbnRGb290ZXIgQ2VudGVyIj4KWyUgSUYgIURhdGEuUGVybWlzc2lvbkxldmVsIHx8IERhdGEuUGVybWlzc2lvbkxldmVsID4gMSAlXQogICAgPGJ1dHRvbiBpZD0iRWRpdEZvcm1TdWJtaXQiIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+ClslIEVORCAlXQpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJiYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAyICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybUNvcHkiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJDb3B5IikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtZmlsZXMtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+ClslIEVORCAlXQpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJiYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAyICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybURlbGV0ZSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBFTkQgJV0KICAgIDxidXR0b24gaWQ9IkVkaXRGb3JtQ2FuY2VsIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdE1hc2siKSAlXQo=</File>
        <File Location="Custom/Kernel/System/Calendar/Appointment.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBjMTRjYTU1YThiMWQzZDY4NmU4MDNjMTM5ODgxM2I4M2QyMjA5MWU1IC0gS2VybmVsL1N5c3RlbS9DYWxlbmRhci9BcHBvaW50bWVudC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIpOwoKIyBjb3JlIG1vZHVsZXMKdXNlIERpZ2VzdDo6TUQ1OwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCAtIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgYXBwb2ludG1lbnQgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQXBwb2ludG1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRDcmVhdGUoKQoKY3JlYXRlcyBhIG5ldyBhcHBvaW50bWVudC4KCiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgUGFyZW50SUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHZhbGlkIFBhcmVudElEIGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIHZhbGlkIENhbGVuZGFySUQKICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgICAgPT4gJ2p3aW9qaS1md2ppbycsICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgcHJvdmlkZSBkZXNpcmVkIFVuaXF1ZUlEOyBpZiB0aGVyZSBpcyBhbHJlYWR5IGV4aXN0aW5nIEFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIHdpdGggc2FtZSBVbmlxdWVJRCwgc3lzdGVtIHdpbGwgZGVsZXRlIGl0CiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFRpdGxlCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsICAgICAgICAgIyAob3B0aW9uYWwpIERlc2NyaXB0aW9uCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIExvY2F0aW9uCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMAogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICA9PiBbIDEgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBpZiBzdXBwbGllZAogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICA9PiBbIDEsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBpZiBzdXBwbGllZAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBmbGFnIHRoZSBhcHBvaW50bWVudCBhcyByZWN1cnJpbmcgKHBhcmVudCBvbmx5ISkKICAgICAgICBSZWN1cnJpbmdSYXcgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgc2tpcCBsb29wIGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzIChkbyBub3QgY3JlYXRlIG9jY3VycmVuY2VzISkKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgICAgPT4gJ0RhaWx5JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBSZWN1cnJpbmcpIFBvc3NpYmxlICJEYWlseSIsICJXZWVrbHkiLCAiTW9udGhseSIsICJZZWFybHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCgogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgICA9PiBbMSwgMywgNV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIEN1c3RvbSBSZWN1cnJpbmcpIFJlY3VycmVuY2UgcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21XZWVrbHk6IDEtTW9uLCAyLVR1ZSwuLi4sIDctU3VuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbU1vbnRobHk6IDEtMXN0LCAyLTJuZCwuLiwgMzF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21ZZWFybHk6IDEtSmFuLCAyLUZlYiwuLi4sIDEyLURlYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEhvdyBtYW55IEFwcG9pbnRtZW50cyB0byBjcmVhdGUKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUmVwZWF0aW5nIGludGVydmFsIChkZWZhdWx0IDEpCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFVudGlsIGRhdGUKICAgICAgICBSZWN1cnJlbmNlSUQgICAgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRXhwZWN0ZWQgc3RhcnQgdGltZSBmb3IgdGhpcyBvY2N1cnJlbmNlCiAgICAgICAgUmVjdXJyZW5jZUV4Y2x1ZGUgICAgID0+IFsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFdoaWNoIHNwZWNpZmljIG9jY3VycmVuY2VzIHRvIGV4Y2x1ZGUKICAgICAgICAgICAgJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgdGltZSB0byBleGVjdXRlIHRoZSBub3RpZmljYXRpb24gZXZlbnQKICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgPT4gJ0N1c3RvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGVtcGxhdGUgdG8gYmUgdXNlZCBmb3Igbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVHlwZSBvZiB0aGUgY3VzdG9tIHRlbXBsYXRlIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJyZWxhdGl2ZSIsICJkYXRldGltZSIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICcxMicsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyBjb3VudCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgdW5pdCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLCAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIGV4ZWN1dGUgZm9yIGN1c3RvbSB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgImJlZm9yZXN0YXJ0IiwgImFmdGVyc3RhcnQiLCAiYmVmb3JlZW5kIiwgImFmdGVyZW5kIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBOb3RpZmljYXRpb24gZGF0ZSB0aW1lIGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgSUQgKGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERhdGEgZm9yIHRpY2tldCBjcmVhdGlvbgogICAgICAgICAgICBUaW1lID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIHRpY2tldCBjcmVhdCBldmVudAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciB0aWNrZXQgcG9pbnQgb2YgdGltZQogICAgICAgICAgICBDdXN0b20gPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgdGlja2V0IHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnICAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgICAgIEN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBRdWV1ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgcXVldWUKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGN1c3RvbWVyIGlkCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAndGVzdEB0ZXN0LmNvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBjdXN0b21lciB1c2VyCiAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0+ICd0ZXN0JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgVXNlcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHVzZXIgaWQKICAgICAgICAgICAgT3duZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IG93bmVyIGlkCiAgICAgICAgICAgIExvY2sgPT4gJ3VubG9jaycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBsb2NrIHN0YXRlCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBwcmlvcml0eQogICAgICAgICAgICBTdGF0ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc3RhdGUKICAgICAgICAgICAgU2VydmljZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHNlcnZpY2UKICAgICAgICAgICAgU0xBSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2VyIHNlcnZpY2UgbGV2ZWwgYWdyZWVtZW50CiAgICAgICAgICAgIFR5cGVJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCB0eXBlIGlkCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5hbWUgdmFsdWUgY29tYmluYXRpb25zIGZvciBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTEgPT4gVmFsdWUxLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTIgPT4gVmFsdWUyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBJZiB0aGUgZmlyc3QgVGlja2V0IEFydGljbGUgaXMgdmlzaWJsZSBmb3IgdGhlIEN1c3RvbWVyCiAgICAgICAgfSwKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICApOwoKcmV0dXJucyBwYXJlbnQgQXBwb2ludG1lbnRJRCBpZiBzdWNjZXNzZnVsCgpFdmVudHM6CiAgICBBcHBvaW50bWVudENyZWF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgJFNlbGYtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGlmIFJlY3VycmluZyBpcyBwcm92aWRlZCwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG11c3QgYmUgcHJlc2VudAogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgIkRhaWx5IiwgICAgICAgIldlZWtseSIsICAgICAgICJNb250aGx5IiwgICAgICAgIlllYXJseSIsCiAgICAgICAgICAgICJDdXN0b21EYWlseSIsICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlY3VycmVuY2VUeXBlfQogICAgICAgICAgICB8fCAhZ3JlcCB7ICRfIGVxICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfSBAUmVjdXJyZW5jZVR5cGVzCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVHlwZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAhJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlRnJlcXVlbmN5IG5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8PSAxOwoKICAgIGlmICggJFBhcmFte1VuaXF1ZUlEfSAmJiAhJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFte1VuaXF1ZUlEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgYXBwb2ludG1lbnQgd2l0aCBzYW1lIFVuaXF1ZUlECiAgICAgICAgaWYgKCAlQXBwb2ludG1lbnQgJiYgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUGFyZW50SUQKICAgIGlmICggJFBhcmFte1BhcmVudElEfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17UGFyZW50SUR9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQYXJlbnRJRCBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDaGVjayBTdGFydFRpbWUuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICEkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBTdGFydFRpbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIFVuaXF1ZUlECiAgICBpZiAoICEkUGFyYW17VW5pcXVlSUR9ICkgewogICAgICAgICRQYXJhbXtVbmlxdWVJRH0gPSAkU2VsZi0+R2V0VW5pcXVlSUQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBFbmRUaW1lLgogICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICEkRW5kVGltZU9iamVjdCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgRW5kVGltZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYXJyYXkgcmVmcwogICAgbXkgJUFycmF5czsKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhUZWFtSUQgUmVzb3VyY2VJRCBSZWN1cnJlbmNlRnJlcXVlbmN5IFJlY3VycmVuY2VFeGNsdWRlKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiBAeyAkUGFyYW17JFBhcmFtZXRlcn0gLy8gW10gfSApIHsKICAgICAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbm90IEFSUkFZUkVGISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAQXJyYXkgPSBAeyAkUGFyYW17JFBhcmFtZXRlcn0gfTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgICAgICAgICAgQEFycmF5ID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAQXJyYXk7CgogICAgICAgICAgICAkQXJyYXlzeyRQYXJhbWV0ZXJ9ID0gam9pbiggJywnLCBAQXJyYXkgKSBpZiBAQXJyYXk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbnVtYmVycwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFJlY3VycmluZyBSZWN1cnJlbmNlQ291bnQgUmVjdXJyZW5jZUludGVydmFsKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUmVjdXJyZW5jZVVudGlsCiAgICBpZiAoICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAjIFVzdWFsbHkgaG91ciwgbWludXRlIGFuZCBzZWNvbmQgPSAwLiBJbiB0aGlzIGNhc2UsIHRha2UgdGltZSBmcm9tIFN0YXJ0VGltZS4KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFJlY3VycmVuY2VVbnRpbE9iamVjdAogICAgICAgICAgICB8fCAkU3RhcnRUaW1lT2JqZWN0ID4gJFJlY3VycmVuY2VVbnRpbE9iamVjdAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBSZWN1cnJlbmNlVW50aWwhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgQEJpbmQ7CgogICAgIyBwYXJlbnQgSUQgc3VwcGxpZWQKICAgIG15ICRQYXJlbnRJRENvbCA9IG15ICRQYXJlbnRJRFZhbCA9ICcnOwogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICRQYXJlbnRJRENvbCA9ICdwYXJlbnRfaWQsJzsKICAgICAgICAkUGFyZW50SURWYWwgPSAnPywnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17UGFyZW50SUR9OwoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCByZWN1cnJpbmcgZmllbGRzCiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJpbmd9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZVR5cGV9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlQ291bnR9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VVbnRpbH07CiAgICB9CgogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtVbmlxdWVJRH0sIFwkUGFyYW17VGl0bGV9LCBcJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICBcJFBhcmFte0xvY2F0aW9ufSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1N0YXJ0VGltZX0sICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfSwgICBcJFBhcmFte0FsbERheX0sCiAgICAgICAgXCRBcnJheXN7VGVhbUlEfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRBcnJheXN7UmVzb3VyY2VJRH0sICAgICAgICAgIFwkUGFyYW17UmVjdXJyaW5nfSwgXCRQYXJhbXtSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfSwKICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VJRH0sICAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUV4Y2x1ZGV9LAogICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uRGF0ZX0sICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgIFwkUGFyYW17VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9LCAgICAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9OwoKICAgIG15ICRTUUwgPSAiCiAgICAgICAgSU5TRVJUIElOVE8gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICAgICAgKCRQYXJlbnRJRENvbCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAogICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsLCByZWN1cl91bnRpbCwgcmVjdXJfaWQsIHJlY3VyX2V4Y2x1ZGUsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfYnkpCiAgICAgICAgVkFMVUVTICgkUGFyZW50SURWYWwgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywKICAgICAgICAgICAgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KQogICAgIjsKCiAgICAjIGNyZWF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICRBcHBvaW50bWVudElEOwoKICAgICMgcmV0dXJuIHBhcmVudCBpZCBmb3IgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRQYXJhbXtQYXJlbnRJRH07CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgaWQgZm9yIHBhcmVudCBhcHBvaW50bWVudAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAgICAgV0hFUkUgdW5pcXVlX2lkID0gPyBBTkQgcGFyZW50X2lkIElTIE5VTEwKICAgICAgICAgICAgJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VuaXF1ZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRSb3dbMF0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBpZiB0aGVyZSBpcyBub3QgYXBwb2ludG1lbnQgY3JlYXRlZAogICAgICAgIGlmICggISRBcHBvaW50bWVudElEICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2FuXCd0IGdldCBBcHBvaW50bWVudElEIGZyb20gSU5TRVJUIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSAmJiAhJFBhcmFte1JlY3VycmluZ1Jhd30gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nQ3JlYXRlKAogICAgICAgICAgICBQYXJlbnRJRCAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBpZiAoICRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0gJiYgISRQYXJhbXtQYXJlbnRJRH0gKSB7CiAgICAgICAgbXkgJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEID0gMDsKICAgICAgICBteSAkRXhlY3V0aW9uVGltZTsKICAgICAgICBteSAkQ3VycmVudERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewoKICAgICAgICAgICAgIyBHZXQgbmVhcmVzdCB1cGNvbWluZyBldmVudAogICAgICAgICAgICAjIElmIGFsbCBldmVudHMgYXJlIGluIHRoZSBwYXN0LCBubyBmdXR1cmUgdGFzayBpcyBjcmVhdGVkCiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkU2VsZi0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQgKTsKICAgICAgICAgICAgdW5zaGlmdCBAQXBwb2ludG1lbnRMaXN0LCBcJVBhcmVudEFwcG9pbnRtZW50OwoKICAgICAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudExpc3QpIHsKCiAgICAgICAgICAgICAgICAjIFRha2Ugc21hbGxlc3QgcG9zaXRpdmUgZGlzdGFuY2UgZnJvbSBjdXJyZW50IHRpbWUKICAgICAgICAgICAgICAgICMgVGFrZSBleGVjdXRpb24gdGltZSBvZiBmdXR1cmUgdGFzayBhcyByZWZlcmVuY2UKICAgICAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU2VsZi0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJEFwcG9pbnRtZW50LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPkNvbXBhcmUoIERhdGVUaW1lT2JqZWN0ID0+ICRDdXJyZW50RGF0ZVRpbWVPYmplY3QgKSA+IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICAgICAgJEV4ZWN1dGlvblRpbWUgICAgICAgICAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEFQUE9JTlRNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTZWxmLT5BcHBvaW50bWVudFRvVGlja2V0RXhlY3V0aW9uVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldFRlbXBsYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldEN1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+Q29tcGFyZSggRGF0ZVRpbWVPYmplY3QgPT4gJEN1cnJlbnREYXRlVGltZU9iamVjdCApID4gMCApIHsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudElEOwogICAgICAgICAgICAgICAgJEV4ZWN1dGlvblRpbWUgICAgICAgICAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCkgewogICAgICAgICAgICBteSAkVGFza0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza0FkZCgKICAgICAgICAgICAgICAgIEV4ZWN1dGlvblRpbWUgPT4gJEV4ZWN1dGlvblRpbWUsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdBcHBvaW50bWVudFRpY2tldCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgICAgICAgICAgICA9PiAkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFRhc2tJRCkgewogICAgICAgICAgICAgICAgJFBhcmFte0Z1dHVyZVRhc2tJRH0gPSAkVGFza0lEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGlja2V0IHRhc2sgZm9yIGFwcG9pbnRtZW50ICRBcHBvaW50bWVudElEIGNvdWxkIG5vdCBiZSBjcmVhdGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU1FMID0gIgogICAgICAgICAgICAgICAgVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgICAgICAgICBTRVQgZnV0dXJlX3Rhc2tfaWQgPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgIjsKICAgICAgICAgICAgQEJpbmQgPSAoIFwkVGFza0lELCBcJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEICk7CgogICAgICAgICAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgICAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEFwcG9pbnRtZW50SUQ7Cn0KCj1oZWFkMiBBcHBvaW50bWVudExpc3QoKQoKZ2V0IGEgaGFzaCBvZiBBcHBvaW50bWVudHMuCgogICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJyonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHRpdGxlLCB3aWxkY2FyZCBzdXBwb3J0ZWQKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICcqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBkZXNjcmlwdGlvbiwgd2lsZGNhcmQgc3VwcG9ydGVkCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICA9PiAnKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgbG9jYXRpb24sIHdpbGRjYXJkIHN1cHBvcnRlZAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHN0YXJ0IGRhdGUKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBlbmQgZGF0ZQogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHRlYW0KICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSByZXNvdXJjZQojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBwYXJlbnQgaWQsIHJldHVybnMgb25seSBjaGlsZHJlbgojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBSZXN1bHQgICAgICAgICAgICAgID0+ICdIQVNIJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpLCBIQVNIfEFSUkFZCiAgICApOwoKcmV0dXJucyBhbiBhcnJheSBvZiBoYXNoZXMgd2l0aCBzZWxlY3QgQXBwb2ludG1lbnQgZGF0YSBvciBzaW1wbGUgYXJyYXkgb2YgQXBwb2ludG1lbnRJRHM6CgpSZXN1bHQgPT4gJ0hBU0gnOgoKICAgIEBBcHBvaW50bWVudHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgPT4gMCwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciByZWN1cnJpbmcgKHBhcmVudCkgYXBwb2ludG1lbnRzIG9ubHkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAyLAogICAgICAgICAgICBQYXJlbnRJRCAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHJlY3VycmVkIChjaGlsZCkgYXBwb2ludG1lbnRzIG9ubHkKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgID0+ICcyMDE2MDEwMVQxODAwMDAtQTc4QjU3QGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgID0+ICcyMDE2LTAxLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgVGVhbUlEICAgICAgICA9PiBbIDEgXSwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgQWxsRGF5ICAgICAgICA9PiAwLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgICAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTgwMDAwLUE3OEI1N0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGVhbUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEgXSwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNjoxMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAnMTAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICAgICAgICAgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAgICMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEKICAgICAgICB9LAogICAgICAgIC4uLgogICAgKTsKClJlc3VsdCA9PiAnQVJSQVknOgoKICAgIEBBcHBvaW50bWVudHMgPSAoIDEsIDIsIC4uLiApCgo9Y3V0CgpzdWIgQXBwb2ludG1lbnRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGFycmF5IG9mIGhhc2hlcyBieSBkZWZhdWx0CiAgICAkUGFyYW17UmVzdWx0fSA9ICRQYXJhbXtSZXN1bHR9IHx8ICdIQVNIJzsKCiAgICAjIGNhY2hlIGtleXMKICAgIG15ICRDYWNoZVR5cGUgICAgICAgID0gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9OwogICAgbXkgJENhY2hlS2V5VGl0bGUgICAgPSAkUGFyYW17VGl0bGV9ICAgICAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RGVzYyAgICAgPSAkUGFyYW17RGVzY3JpcHRpb259IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5TG9jYXRpb24gPSAkUGFyYW17TG9jYXRpb259ICAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5U3RhcnQgICAgPSAkUGFyYW17U3RhcnRUaW1lfSAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RW5kICAgICAgPSAkUGFyYW17RW5kVGltZX0gICAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5VGVhbSAgICAgPSAkUGFyYW17VGVhbUlEfSAgICAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5UmVzb3VyY2UgPSAkUGFyYW17UmVzb3VyY2VJRH0gIHx8ICdhbnknOwoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBteSAkQ2FjaGVLZXlQYXJlbnQgPSAkUGFyYW17UGFyZW50SUR9IHx8ICdhbnknOwoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUaXRsZX0gJiYgJFBhcmFte1RpdGxlfSA9fiAvXltcKl0rJC8gKSB7CiAgICAgICAgJENhY2hlS2V5VGl0bGUgPSAnYW55JzsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkUGFyYW17RGVzY3JpcHRpb259ICYmICRQYXJhbXtEZXNjcmlwdGlvbn0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleURlc2MgPSAnYW55JzsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkUGFyYW17TG9jYXRpb259ICYmICRQYXJhbXtMb2NhdGlvbn0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleUxvY2F0aW9uID0gJ2FueSc7CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICBteSAkQ2FjaGVLZXkgPSAiJENhY2hlS2V5VGl0bGUtJENhY2hlS2V5RGVzYy0kQ2FjaGVLZXlMb2NhdGlvbi0kQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQtJENhY2hlS2V5VGVhbS0kQ2FjaGVLZXlSZXNvdXJjZS0kUGFyYW17UmVzdWx0fSI7CiAgICBteSAkQ2FjaGVLZXkgPSAiJENhY2hlS2V5VGl0bGUtJENhY2hlS2V5RGVzYy0kQ2FjaGVLZXlMb2NhdGlvbi0kQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQtJENhY2hlS2V5VGVhbS0kQ2FjaGVLZXlSZXNvdXJjZS0kQ2FjaGVLZXlQYXJlbnQtJFBhcmFte1Jlc3VsdH0iOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICBpZiAoIHJlZiAkRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgIHJldHVybiBAeyREYXRhfTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGNoZWNrIHRpbWUKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRFbmRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICAgbXkgJFNRTCA9ICcKIyAgICAgICAgIFNFTEVDVCBpZCwgcGFyZW50X2lkLCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAojICAgICAgICAgICAgIGVuZF90aW1lLCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgYWxsX2RheSwgcmVjdXJyaW5nLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAojICAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiMgICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZAojICAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAojICAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQ9PwojICAgICAnOwogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKICAgICAgICAgICAgZW5kX3RpbWUsIHRlYW1faWQsIHJlc291cmNlX2lkLCBhbGxfZGF5LCByZWN1cnJpbmcsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGZ1dHVyZV90YXNrX2lkCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFIGNhbGVuZGFyX2lkID0gPwogICAgJzsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgbXkgQEJpbmQ7CgogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAjIEZpbHRlciB0aXRsZSwgZGVzY3JpcHRpb24gYW5kIGxvY2F0aW9uIGZpZWxkcyBieSB1c2luZyBRdWVyeUNvbmRpdGlvbiBtZXRob2QsIHdoaWNoIHdpbGwKICAgICMgICByZXR1cm4gYmFja2VuZCBzcGVjaWZpYyBTUUwgc3RhdGVtZW50cyBpbiBvcmRlciB0byBwcm92aWRlIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggYW5kCiAgICAjICAgd2lsZGNhcmQgc3VwcG9ydC4KICAgIEZJTFRFUjoKICAgIGZvciBteSAkRmlsdGVyIChxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbikpIHsKICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJFBhcmFteyRGaWx0ZXJ9OwogICAgICAgICRTUUwgLj0gJyBBTkQgJyAuICREQk9iamVjdC0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICA9PiBsYyAkRmlsdGVyLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJFBhcmFteyRGaWx0ZXJ9LAogICAgICAgICAgICBTZWFyY2hQcmVmaXggPT4gJyonLAogICAgICAgICAgICBTZWFyY2hTdWZmaXggPT4gJyonLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJyBBTkQgKAogICAgICAgICAgICAoc3RhcnRfdGltZSA+PSA/IEFORCBzdGFydF90aW1lIDwgPykgT1IKICAgICAgICAgICAgKGVuZF90aW1lID4gPyBBTkQgZW5kX3RpbWUgPD0gPykgT1IKICAgICAgICAgICAgKHN0YXJ0X3RpbWUgPD0gPyBBTkQgZW5kX3RpbWUgPj0gPykKICAgICAgICApICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgISRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnIEFORCBlbmRfdGltZSA+PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAhJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICcgQU5EIHN0YXJ0X3RpbWUgPD0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17RW5kVGltZX07CiAgICB9CgogICAgJFNRTCAuPSAnIE9SREVSIEJZIGlkIEFTQyc7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSBAUmVzdWx0OwoKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHRlYW0gaWQKICAgICAgICBteSBAVGVhbUlEID0gc3BsaXQoIC8sLywgJFJvd1s5XSAvLyAnJyApOwogICAgICAgIGlmICggJFBhcmFte1RlYW1JRH0gKSB7CiAgICAgICAgICAgIG5leHQgUk9XIGlmICFncmVwIHsgJF8gPT0gJFBhcmFte1RlYW1JRH0gfSBAVGVhbUlEOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZSBpZAogICAgICAgICRSb3dbMTBdID0gJFJvd1sxMF0gPyAkUm93WzEwXSA6IDA7CiAgICAgICAgbXkgQFJlc291cmNlSUQgPSAkUm93WzEwXSA9fiAvLC8gPyBzcGxpdCggLywvLCAkUm93WzEwXSApIDogKCAkUm93WzEwXSApOwogICAgICAgIGlmICggJFBhcmFte1Jlc291cmNlSUR9ICkgewogICAgICAgICAgICBuZXh0IFJPVyBpZiAhZ3JlcCB7ICRfID09ICRQYXJhbXtSZXNvdXJjZUlEfSB9IEBSZXNvdXJjZUlEOwogICAgICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICMgcGFyZW50IGlkCiAgICAgICAgJFJvd1sxXSA9ICRSb3dbMV0gPyAkUm93WzFdIDogMDsKICAgICAgICBteSAkUGFyZW50SUQgPSAkUm93WzFdOwogICAgICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICAgICAgbmV4dCBST1cgaWYgKCAkUGFyYW17UGFyZW50SUR9ICE9ICRQYXJlbnRJRCApOwogICAgICAgIH0KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzNdLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbN10sCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s4XSwKICAgICAgICAgICAgVGVhbUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBcQFRlYW1JRCwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBcQFJlc291cmNlSUQsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxMV0sCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxMl0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxM10gfHwgJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxNF0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxNV0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJFJvd1sxNl0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJFJvd1sxN10sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJFJvd1sxOF0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJFJvd1sxOV0gfHwgJycsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgICAgICAgICAgICAgPT4gJFJvd1syMF0sCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICBGdXR1cmVUYXNrSUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMjFdLAojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICApOwogICAgICAgIHB1c2ggQFJlc3VsdCwgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICAjIGlmIFJlc3VsdCB3YXMgQVJSQVksIG91dHB1dCBvbmx5IElEcwogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQVJSQVknICkgewogICAgICAgIG15IEBSZXN1bHRMaXN0OwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBSZXN1bHQpIHsKICAgICAgICAgICAgcHVzaCBAUmVzdWx0TGlzdCwgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgfQogICAgICAgIEBSZXN1bHQgPSBAUmVzdWx0TGlzdDsKICAgIH0KCiAgICAjIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxAUmVzdWx0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gQFJlc3VsdDsKfQoKPWhlYWQyIEFwcG9pbnRtZW50RGF5cygpCgpnZXQgYSBoYXNoIG9mIGRheXMgd2l0aCBBcHBvaW50bWVudHMgaW4gYWxsIHVzZXIgY2FsZW5kYXJzLgoKICAgIG15ICVBcHBvaW50bWVudERheXMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGF5cygKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBzdGFydCBkYXRlCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZW5kIGRhdGUKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFZhbGlkIFVzZXJJRAogICAgKTsKCnJldHVybnMgYSBoYXNoIHdpdGggZGF5cyBhcyBrZXlzIGFuZCBudW1iZXIgb2YgQXBwb2ludG1lbnRzIGFzIHZhbHVlczoKCiAgICAlQXBwb2ludG1lbnREYXlzID0gewogICAgICAgICcyMDE2LTAxLTAxJyA9PiAxLAogICAgICAgICcyMDE2LTAxLTEzJyA9PiAyLAogICAgICAgICcyMDE2LTAxLTMwJyA9PiAxLAogICAgfTsKCj1jdXQKCnN1YiBBcHBvaW50bWVudERheXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNhY2hlIGtleXMKICAgIG15ICRDYWNoZVR5cGUgICAgID0gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0RheXMnIC4gJFBhcmFte1VzZXJJRH07CiAgICBteSAkQ2FjaGVLZXlTdGFydCA9ICRQYXJhbXtTdGFydFRpbWV9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RW5kICAgPSAkUGFyYW17RW5kVGltZX0gICB8fCAnYW55JzsKCiAgICAjIGNoZWNrIHRpbWUKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRFbmRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJERhdGEgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICA9PiAiJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kIiwKICAgICk7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAleyREYXRhfTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgbXkgJUdyb3VwTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICApOwogICAgbXkgQEdyb3VwSURzID0gc29ydCBrZXlzICVHcm91cExpc3Q7CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBTRUxFQ1QgY2Euc3RhcnRfdGltZSwgY2EuZW5kX3RpbWUKICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IGNhCiAgICAgICAgSk9JTiBjYWxlbmRhciBjIE9OIGNhLmNhbGVuZGFyX2lkID0gYy5pZAogICAgICAgIFdIRVJFIGMuZ3JvdXBfaWQgSU4gKCAke1woam9pbiAnLCAnLCBAR3JvdXBJRHMpfSApCiAgICAiOwoKICAgIG15IEBCaW5kOwoKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICdBTkQgKAogICAgICAgICAgICAoY2Euc3RhcnRfdGltZSA+PSA/IEFORCBjYS5zdGFydF90aW1lIDwgPykgT1IKICAgICAgICAgICAgKGNhLmVuZF90aW1lID4gPyBBTkQgY2EuZW5kX3RpbWUgPD0gPykgT1IKICAgICAgICAgICAgKGNhLnN0YXJ0X3RpbWUgPD0gPyBBTkQgY2EuZW5kX3RpbWUgPj0gPykKICAgICAgICApICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgISRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnQU5EIGNhLmVuZF90aW1lID49ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX07CiAgICB9CiAgICBlbHNpZiAoICEkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJ0FORCBjYS5zdGFydF90aW1lIDw9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0VuZFRpbWV9OwogICAgfQoKICAgICRTUUwgLj0gJ09SREVSIEJZIGNhLmlkIEFTQyc7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAoICRTdGFydFRpbWUsICRFbmRUaW1lICk7CgogICAgICAgICMgU3RhcnRUaW1lCiAgICAgICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSApIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRSb3dbMF0gbHQgJFBhcmFte1N0YXJ0VGltZX0gPyAkUGFyYW17U3RhcnRUaW1lfSA6ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgRW5kVGltZQogICAgICAgIGlmICggJFBhcmFte0VuZFRpbWV9ICkgewogICAgICAgICAgICAkRW5kVGltZSA9ICRSb3dbMV0gZ3QgJFBhcmFte0VuZFRpbWV9ID8gJFBhcmFte0VuZFRpbWV9IDogJFJvd1sxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFJvd1sxXTsKICAgICAgICB9CgogICAgICAgICMgR2V0IHN5c3RlbSB0aW1lcy4KICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yICgKICAgICAgICAgICAgbXkgJExvb3BUaW1lT2JqZWN0ID0gJFN0YXJ0VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgJExvb3BUaW1lT2JqZWN0IDwgJEVuZFRpbWVPYmplY3Q7CiAgICAgICAgICAgICRMb29wVGltZU9iamVjdC0+QWRkKCBEYXlzID0+IDEgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkTG9vcFRpbWUgPSAkTG9vcFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgICAgICAgICAkTG9vcFRpbWUgPX4gcy9ccy4qPyQvL2dzbTsKCiAgICAgICAgICAgIGlmICggJFJlc3VsdHskTG9vcFRpbWV9ICkgewogICAgICAgICAgICAgICAgJFJlc3VsdHskTG9vcFRpbWV9Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0eyRMb29wVGltZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICAgPT4gIiRDYWNoZUtleVN0YXJ0LSRDYWNoZUtleUVuZCIsCiAgICAgICAgVmFsdWUgPT4gXCVSZXN1bHQsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aGVhZDIgQXBwb2ludG1lbnRHZXQoKQoKR2V0IGFwcG9pbnRtZW50IGRhdGEuCgogICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFVuaXF1ZUlEICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywgIyAocmVxdWlyZWQpIHdpbGwgcmV0dXJuIG9ubHkgcGFyZW50IGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpSZXR1cm5zIGEgaGFzaDoKCiAgICAlQXBwb2ludG1lbnQgPSAoCiAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICA9PiAyLAogICAgICAgIFBhcmVudElEICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGZvciByZWN1cnJlZCAoY2hpbGQpIGFwcG9pbnRtZW50cwogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwKICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICA9PiAwLAogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgPT4gWyAxIF0sCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICA9PiBbIDEsIDMgXSwKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnRGFpbHknLAogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLAogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgIFJlY3VycmVuY2VJRCAgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgIFJlY3VycmVuY2VFeGNsdWRlICAgPT4gWwogICAgICAgICAgICAnMjAxNi0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDE2LTAxLTExIDAwOjAwOjAwJywKICAgICAgICBdLAogICAgICAgIE5vdGlmaWNhdGlvblRpbWUgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowOjAwJywKICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdENvdW50ICAgICAgID0+ICcxMicsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdCAgICAgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgICMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEKICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICAgICAgPT4gMiwKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgRnV0dXJlVGFza0lEID0+IDEsCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgKTsKCj1jdXQKCnN1YiBBcHBvaW50bWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcHBvaW50bWVudElEfQogICAgICAgICYmICEoICRQYXJhbXtVbmlxdWVJRH0gJiYgJFBhcmFte0NhbGVuZGFySUR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEFwcG9pbnRtZW50SUQgb3IgVW5pcXVlSUQgYW5kIENhbGVuZGFySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkRGF0YTsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgICREYXRhID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggcmVmICREYXRhIGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJXskRGF0YX07CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgQEJpbmQ7CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICAgbXkgJFNRTCA9ICcKIyAgICAgICAgIFNFTEVDVCBpZCwgcGFyZW50X2lkLCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAojICAgICAgICAgICAgIGVuZF90aW1lLCBhbGxfZGF5LCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgcmVjdXJyaW5nLCByZWN1cl90eXBlLCByZWN1cl9mcmVxLCByZWN1cl9jb3VudCwKIyAgICAgICAgICAgICByZWN1cl9pbnRlcnZhbCwgcmVjdXJfdW50aWwsIHJlY3VyX2lkLCByZWN1cl9leGNsdWRlLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAojICAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiMgICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsCiMgICAgICAgICAgICAgY2hhbmdlX2J5CiMgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiMgICAgICAgIFdIRVJFCiMgICAgICc7CiAgICBteSAkU1FMID0gJwogICAgICAgIFNFTEVDVCBpZCwgcGFyZW50X2lkLCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAogICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsLCByZWN1cl91bnRpbCwgcmVjdXJfaWQsIHJlY3VyX2V4Y2x1ZGUsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfYnksIGZ1dHVyZV90YXNrX2lkCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFCiAgICAnOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAkU1FMIC49ICdpZCA9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0FwcG9pbnRtZW50SUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAndW5pcXVlX2lkID0gPyBBTkQgY2FsZW5kYXJfaWQgPSA/IEFORCBwYXJlbnRfaWQgSVMgTlVMTCAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VW5pcXVlSUR9LCBcJFBhcmFte0NhbGVuZGFySUR9OwogICAgfQoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgdGVhbSBpZAogICAgICAgIG15IEBUZWFtSUQgPSBzcGxpdCggLywvLCAkUm93WzEwXSAvLyAnJyApOwoKICAgICAgICAjIHJlc291cmNlIGlkCiAgICAgICAgbXkgQFJlc291cmNlSUQgPSBzcGxpdCggLywvLCAkUm93WzExXSAvLyAnMCcgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIGZyZXF1ZW5jeQogICAgICAgIG15IEBSZWN1cnJlbmNlRnJlcXVlbmN5ID0gJFJvd1sxNF0gPyBzcGxpdCggLywvLCAkUm93WzE0XSApIDogdW5kZWY7CgogICAgICAgICMgcmVjdXJyZW5jZSBleGNsdWRlCiAgICAgICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gJFJvd1sxOV0gPyBzcGxpdCggLywvLCAkUm93WzE5XSApIDogdW5kZWY7CgogICAgICAgICRSZXN1bHR7QXBwb2ludG1lbnRJRH0gICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICRSZXN1bHR7UGFyZW50SUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICRSZXN1bHR7Q2FsZW5kYXJJRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzJdOwogICAgICAgICRSZXN1bHR7VW5pcXVlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzNdOwogICAgICAgICRSZXN1bHR7VGl0bGV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzRdOwogICAgICAgICRSZXN1bHR7RGVzY3JpcHRpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzVdOwogICAgICAgICRSZXN1bHR7TG9jYXRpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzZdOwogICAgICAgICRSZXN1bHR7U3RhcnRUaW1lfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzddOwogICAgICAgICRSZXN1bHR7RW5kVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzhdOwogICAgICAgICRSZXN1bHR7QWxsRGF5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzldOwogICAgICAgICRSZXN1bHR7VGVhbUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcQFRlYW1JRDsKICAgICAgICAkUmVzdWx0e1Jlc291cmNlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXEBSZXNvdXJjZUlEOwogICAgICAgICRSZXN1bHR7UmVjdXJyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzEyXTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VUeXBlfSAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxM107CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlRnJlcXVlbmN5fSAgICAgICAgICAgICAgICAgICA9IFxAUmVjdXJyZW5jZUZyZXF1ZW5jeTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VDb3VudH0gICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxNV07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlSW50ZXJ2YWx9ICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTZdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZVVudGlsfSAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzE3XTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VJRH0gICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxOF07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlRXhjbHVkZX0gICAgICAgICAgICAgICAgICAgICA9IFxAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25EYXRlfSAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjBdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICAgICAgICAgICAgICAgICAgPSAkUm93WzIxXSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbX0gICAgICAgICAgICAgICAgICAgID0gJFJvd1syMl0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gICA9ICRSb3dbMjNdIHx8IDA7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9ICAgICAgICA9ICRSb3dbMjRdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0gPSAkUm93WzI1XSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSAgICAgICAgICAgID0gJFJvd1syNl0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gICAgICAgICAgICAgICA9ICRSb3dbMjddOwogICAgICAgICRSZXN1bHR7Q3JlYXRlVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzI4XTsKICAgICAgICAkUmVzdWx0e0NyZWF0ZUJ5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syOV07CiAgICAgICAgJFJlc3VsdHtDaGFuZ2VUaW1lfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMzBdOwogICAgICAgICRSZXN1bHR7Q2hhbmdlQnl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMxXTsKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgJFJlc3VsdHtGdXR1cmVUYXNrSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMzJdOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIH0KCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyBjYWNoZQogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVSZXN1bHQ7Cn0KCj1oZWFkMiBBcHBvaW50bWVudFVwZGF0ZSgpCgp1cGRhdGVzIGFuIGV4aXN0aW5nIGFwcG9pbnRtZW50LgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBUaXRsZQogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLCAgICAgICAgICMgKG9wdGlvbmFsKSBEZXNjcmlwdGlvbgogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICA9PiAnU3RyYXViaW5nJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBMb2NhdGlvbgogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEFsbERheSAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWZhdWx0IDAKICAgICAgICBUZWFtICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgPT4gWyAxLCAzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgaWYgc3VwcGxpZWQKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZmxhZyB0aGUgYXBwb2ludG1lbnQgYXMgcmVjdXJyaW5nIChwYXJlbnQgb25seSEpCgogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgICA9PiAnRGFpbHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIFJlY3VycmluZykgUG9zc2libGUgIkRhaWx5IiwgIldlZWtseSIsICJNb250aGx5IiwgIlllYXJseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgQ3VzdG9tIFJlY3VycmluZykgUmVjdXJyZW5jZSBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbVdlZWtseTogMS1Nb24sIDItVHVlLC4uLiwgNy1TdW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tTW9udGhseTogMS1KYW4sIDItRmViLC4uLiwgMTItRGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgSG93IG1hbnkgQXBwb2ludG1lbnRzIHRvIGNyZWF0ZQogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBSZXBlYXRpbmcgaW50ZXJ2YWwgKGRlZmF1bHQgMSkKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVW50aWwgZGF0ZQogICAgICAgIE5vdGlmaWNhdGlvblRpbWUgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICA9PiAncmVsYXRpdmUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJzEyJywgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5vdGlmaWNhdGlvbiBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICMgKG9wdGlvbmFsKSBUaWNrZXQgYXBwb2ludG1lbnQgcnVsZSBJRCAoZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBGdXR1cmVUYXNrSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgSUQgb2YgZnV0dXJlIHRhc2sKICAgICAgICBBcHBvaW50bWVudFRpY2tldCA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRGF0YSBmb3IgdGlja2V0IGNyZWF0aW9uCiAgICAgICAgICAgIFRpbWUgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIHRpbWUgdG8gZXhlY3V0ZSB0aGUgdGlja2V0IGNyZWF0IGV2ZW50CiAgICAgICAgICAgIFRlbXBsYXRlID0+ICdDdXN0b20nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIHRpY2tldCBwb2ludCBvZiB0aW1lCiAgICAgICAgICAgIEN1c3RvbSA9PiAncmVsYXRpdmUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFR5cGUgb2YgdGhlIGN1c3RvbSB0ZW1wbGF0ZSB0aWNrZXQgcG9pbnQgb2YgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAicmVsYXRpdmUiLCAiZGF0ZXRpbWUiCiAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlVW5pdENvdW50ID0+ICcxMicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgY291bnQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXQgPT4gJ21pbnV0ZXMnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIHVuaXQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcgICwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiBleGVjdXRlIGZvciBjdXN0b20gdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJiZWZvcmVzdGFydCIsICJhZnRlcnN0YXJ0IiwgImJlZm9yZWVuZCIsICJhZnRlcmVuZCIKICAgICAgICAgICAgQ3VzdG9tRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGRhdGUgdGltZSBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBxdWV1ZQogICAgICAgICAgICBDdXN0b21lcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgY3VzdG9tZXIgaWQKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICd0ZXN0QHRlc3QuY29tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgU2VsZWN0ZWRDdXN0b21lclVzZXIgPT4gJ3Rlc3QnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgU2VsZWN0ZWQgY3VzdG9tZXIgdXNlcgogICAgICAgICAgICBVc2VySUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgdXNlciBpZAogICAgICAgICAgICBPd25lcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgb3duZXIgaWQKICAgICAgICAgICAgTG9jayA9PiAndW5sb2NrJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGxvY2sgc3RhdGUKICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHByaW9yaXR5CiAgICAgICAgICAgIFN0YXRlSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBzdGF0ZQogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc2VydmljZQogICAgICAgICAgICBTTEFJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc2VydmljZSBsZXZlbCBhZ3JlZW1lbnQKICAgICAgICAgICAgVHlwZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHR5cGUgaWQKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTmFtZSB2YWx1ZSBjb21iaW5hdGlvbnMgZm9yIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGROYW1lMSA9PiBWYWx1ZTEsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGROYW1lMiA9PiBWYWx1ZTIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7CgpFdmVudHM6CiAgICBBcHBvaW50bWVudFVwZGF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIENhbGVuZGFySUQgVGl0bGUgU3RhcnRUaW1lIEVuZFRpbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBwb3NzaWJsZSBub3RpZmljYXRpb24gcGFyYW1zCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBpZiBSZWN1cnJpbmcgaXMgcHJvdmlkZWQsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGJlIHByZXNlbnQKICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gKSB7CgogICAgICAgIG15IEBSZWN1cnJlbmNlVHlwZXMgPSAoCiAgICAgICAgICAgICJEYWlseSIsICAgICAgICJXZWVrbHkiLCAgICAgICAiTW9udGhseSIsICAgICAgICJZZWFybHkiLAogICAgICAgICAgICAiQ3VzdG9tRGFpbHkiLCAiQ3VzdG9tV2Vla2x5IiwgIkN1c3RvbU1vbnRobHkiLCAiQ3VzdG9tWWVhcmx5IgogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRQYXJhbXtSZWN1cnJlbmNlVHlwZX0KICAgICAgICAgICAgfHwgIWdyZXAgeyAkXyBlcSAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IH0gQFJlY3VycmVuY2VUeXBlcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZVR5cGUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21ZZWFybHknCiAgICAgICAgICAgICkKICAgICAgICAgICAgJiYgISRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZUZyZXF1ZW5jeSBuZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfSB8fD0gMTsKCiAgICAjIENoZWNrIFN0YXJ0VGltZS4KICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICB9LAogICAgKTsKICAgIGlmICggISRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQ2hlY2sgRW5kVGltZS4KICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgIH0sCiAgICApOwogICAgaWYgKCAhJEVuZFRpbWVPYmplY3QgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbmRUaW1lIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNoZWNrIGlmIGFycmF5IHJlZnMKICAgIG15ICVBcnJheXM7CiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoVGVhbUlEIFJlc291cmNlSUQgUmVjdXJyZW5jZUZyZXF1ZW5jeSkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IC8vIFtdIH0gKSB7CiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG5vdCBBUlJBWVJFRiEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQEFycmF5ID0gQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IH07CgogICAgICAgICAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICAgICAgICAgIEBBcnJheSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQEFycmF5OwoKICAgICAgICAgICAgJEFycmF5c3skUGFyYW1ldGVyfSA9IGpvaW4oICcsJywgQEFycmF5ICkgaWYgQEFycmF5OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG51bWJlcnMKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhSZWN1cnJpbmcgUmVjdXJyZW5jZUNvdW50IFJlY3VycmVuY2VJbnRlcnZhbCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgIUlzSW50ZWdlciggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFJlY3VycmVuY2VVbnRpbAogICAgaWYgKCAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgIyBVc3VhbGx5IGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kID0gMC4gSW4gdGhpcyBjYXNlLCB0YWtlIHRpbWUgZnJvbSBTdGFydFRpbWUuCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSAkU2VsZi0+X1RpbWVDaGVjaygKICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRSZWN1cnJlbmNlVW50aWxPYmplY3QKICAgICAgICAgICAgfHwgJFN0YXJ0VGltZU9iamVjdCA+ICRSZWN1cnJlbmNlVW50aWxPYmplY3QKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VVbnRpbCBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJldmlvdXMgQ2FsZW5kYXJJRAogICAgbXkgJFByZXZpb3VzQ2FsZW5kYXJJRCA9ICRTZWxmLT5fQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHNldCByZWN1cnJlbmNlIGV4Y2x1ZGUgbGlzdAogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gQHsgJFBhcmFte1JlY3VycmVuY2VFeGNsdWRlfSAvLyBbXSB9OwoKICAgICMgZ2V0IFJlY3VycmVuY2VJRAogICAgbXkgJFJlY3VycmVuY2VJRCA9ICRTZWxmLT5fQXBwb2ludG1lbnRHZXRSZWN1cnJlbmNlSUQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgdXNlIGV4Y2x1ZGUgbGlzdCB0byBmbGFnIHRoZSByZWN1cnJpbmcgb2NjdXJyZW5jZSBhcyB1cGRhdGVkCiAgICBpZiAoJFJlY3VycmVuY2VJRCkgewogICAgICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9ICgkUmVjdXJyZW5jZUlEKTsKICAgIH0KCiAgICAjIHJlc2V0IGV4Y2x1ZGUgbGlzdCBpZiByZWN1cnJlbmNlIGlzIHR1cm5lZCBvZmYKICAgIGVsc2lmICggISRQYXJhbXtSZWN1cnJpbmd9ICkgewogICAgICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9ICgpOwogICAgfQoKICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICMgc2VyaWFsaXplIGRhdGEKICAgIG15ICRSZWN1cnJlbmNlRXhjbHVkZSA9IGpvaW4oICcsJywgQFJlY3VycmVuY2VFeGNsdWRlICkgfHwgdW5kZWY7CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVjdXJyZWQgYXBwb2ludG1lbnRzCiAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdEZWxldGUoCiAgICAgICAgUGFyZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICBpZiAoICEkRGVsZXRlU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuYWJsZSB0byBkZWxldGUgcmVjdXJyaW5nIEFwcG9pbnRtZW50ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICAgIyB1cGRhdGUgYXBwb2ludG1lbnQKIyAgICAgbXkgJFNRTCA9ICcKIyAgICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAojICAgICAgICAgU0VUCiMgICAgICAgICAgICAgY2FsZW5kYXJfaWQ9PywgdGl0bGU9PywgZGVzY3JpcHRpb249PywgbG9jYXRpb249Pywgc3RhcnRfdGltZT0/LCBlbmRfdGltZT0/LCBhbGxfZGF5PT8sCiMgICAgICAgICAgICAgdGVhbV9pZD0/LCByZXNvdXJjZV9pZD0/LCByZWN1cnJpbmc9PywgcmVjdXJfdHlwZT0/LCByZWN1cl9mcmVxPT8sIHJlY3VyX2NvdW50PT8sCiMgICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWw9PywgcmVjdXJfdW50aWw9PywgcmVjdXJfZXhjbHVkZT0/LCBub3RpZnlfdGltZT0/LCBub3RpZnlfdGVtcGxhdGU9PywKIyAgICAgICAgICAgICBub3RpZnlfY3VzdG9tPT8sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudD0/LCBub3RpZnlfY3VzdG9tX3VuaXQ9PywKIyAgICAgICAgICAgICBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQ9Pywgbm90aWZ5X2N1c3RvbV9kYXRlPT8sIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkPT8sCiMgICAgICAgICAgICAgY2hhbmdlX3RpbWU9Y3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieT0/CiMgICAgICAgICBXSEVSRSBpZD0/CiMgICAgICc7CgojICAgICAjIHVwZGF0ZSBkYiByZWNvcmQKIyAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiMgICAgICAgICBTUUwgID0+ICRTUUwsCiMgICAgICAgICBCaW5kID0+IFsKIyAgICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFySUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1RpdGxlfSwgICAgICAgICAgIFwkUGFyYW17RGVzY3JpcHRpb259LCBcJFBhcmFte0xvY2F0aW9ufSwKIyAgICAgICAgICAgICBcJFBhcmFte1N0YXJ0VGltZX0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte0VuZFRpbWV9LCAgICAgICAgIFwkUGFyYW17QWxsRGF5fSwgICAgICBcJEFycmF5c3tUZWFtSUR9LAojICAgICAgICAgICAgIFwkQXJyYXlze1Jlc291cmNlSUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyaW5nfSwgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlVHlwZX0sCiMgICAgICAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCBcJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0sCiMgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LCAgICAgICAgICAgICAgICAgICAgICAgXCRSZWN1cnJlbmNlRXhjbHVkZSwgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkRhdGV9LAojICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKIyAgICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiMgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiMgICAgICAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte0FwcG9pbnRtZW50SUR9LAojICAgICAgICAgXSwKIyAgICAgKTsKICAgIG15ICRTUUwgPSAnCiAgICAgICAgVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgU0VUCiAgICAgICAgICAgIGNhbGVuZGFyX2lkID0gPywgdGl0bGUgPSA/LCBkZXNjcmlwdGlvbiA9ID8sIGxvY2F0aW9uID0gPywgc3RhcnRfdGltZSA9ID8sIGVuZF90aW1lID0gPywgYWxsX2RheSA9ID8sCiAgICAgICAgICAgIHRlYW1faWQgPSA/LCByZXNvdXJjZV9pZCA9ID8sIHJlY3VycmluZyA9ID8sIHJlY3VyX3R5cGUgPSA/LCByZWN1cl9mcmVxID0gPywgcmVjdXJfY291bnQgPSA/LAogICAgICAgICAgICByZWN1cl9pbnRlcnZhbCA9ID8sIHJlY3VyX3VudGlsID0gPywgcmVjdXJfZXhjbHVkZSA9ID8sIG5vdGlmeV90aW1lID0gPywgbm90aWZ5X3RlbXBsYXRlID0gPywKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbSA9ID8sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCA9ID8sIG5vdGlmeV9jdXN0b21fdW5pdCA9ID8sCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fdW5pdF9wb2ludCA9ID8sIG5vdGlmeV9jdXN0b21fZGF0ZSA9ID8sIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkID0gPywKICAgICAgICAgICAgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPywgZnV0dXJlX3Rhc2tfaWQgPSA/CiAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAnOwoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFySUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1RpdGxlfSwgICAgICAgICAgIFwkUGFyYW17RGVzY3JpcHRpb259LCBcJFBhcmFte0xvY2F0aW9ufSwKICAgICAgICAgICAgXCRQYXJhbXtTdGFydFRpbWV9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfSwgICAgICAgICBcJFBhcmFte0FsbERheX0sICAgICAgXCRBcnJheXN7VGVhbUlEfSwKICAgICAgICAgICAgXCRBcnJheXN7UmVzb3VyY2VJRH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJpbmd9LCAgICAgICBcJFBhcmFte1JlY3VycmVuY2VUeXBlfSwKICAgICAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCBcJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0sCiAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwgICAgICAgICAgICAgICAgICAgICAgIFwkUmVjdXJyZW5jZUV4Y2x1ZGUsICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219LAogICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICBcJFBhcmFte1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwgICAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17RnV0dXJlVGFza0lEfSwgXCRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBdLAogICAgKTsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgIyBhZGQgcmVjdXJyZWQgYXBwb2ludG1lbnRzIGFnYWluCiAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBBcHBvaW50bWVudCA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIG15ICREQk9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDdXJyZW50RGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgIG15ICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRDsKCiAgICAjIFNldCBmdXR1cmUgdGFzayBpZCB0byBOVUxMIGFuZCBkZWxldGUgZnV0dXJlIHRhc2sgaWYgbm8gaWQgcHJvdmlkZWQsIGVsc2UgdXBkYXRlIGV4aXN0aW5nIGZ1dHVyZSB0YXNrCiAgICBpZiAoICEkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGVtcGxhdGV9ICkgewoKICAgICAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIERhdGUgVGVtcGxhdGUgQ3VzdG9tIEN1c3RvbVJlbGF0aXZlVW5pdENvdW50CiAgICAgICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXQgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSBDdXN0b21EYXRlVGltZQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPnskUG9zc2libGVQYXJhbX0gPSB1bmRlZjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtGdXR1cmVUYXNrSUR9ICYmICEkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGVtcGxhdGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17RnV0dXJlVGFza0lEfQogICAgICAgICk7CiAgICAgICAgJFBhcmFte0Z1dHVyZVRhc2tJRH0gPSB1bmRlZjsKICAgIH0KCiAgICAjIEZ1dHVyZVRhc2sgaXMgdG8gYmUgKHJlKWNyZWF0ZWQKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSApIHsKCiAgICAgICAgIyBDb2xsZWN0IGRhdGEgZm9yIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGZ1dHVyZSB0YXNrCiAgICAgICAgbXkgJUZ1dHVyZVRhc2tEYXRhID0gKAogICAgICAgICAgICBUeXBlID0+ICdBcHBvaW50bWVudFRpY2tldCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGZvciByZWN1cnJpbmcgYW5kIGlmIGV4ZWN1dGlvbiB0aW1lIGlzIGluIGZ1dHVyZQogICAgICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gKSB7CiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkU2VsZi0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUHJldmlvdXNDYWxlbmRhcklELAogICAgICAgICAgICAgICAgUGFyZW50SUQgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICB1bnNoaWZ0IEBBcHBvaW50bWVudExpc3QsIFwlUGFyZW50QXBwb2ludG1lbnQ7CgogICAgICAgICAgICBBUFBPSU5UTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZSA9ICRTZWxmLT5BcHBvaW50bWVudFRvVGlja2V0RXhlY3V0aW9uVGltZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICMgd2hlbiB0aGUgYXBwb2ludG1lbnQgd2FzIGp1c3QgdXBkYXRlZCBpbiBkYXRhYmFzZSwgbWF5YmUgdGhlIGRhdGEgaXMgc3RpbGwgaW5jb3JyZWN0IGhlcmUKICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gPT0gJFBhcmFte0FwcG9pbnRtZW50SUR9ID8gJFBhcmFte1N0YXJ0VGltZX0gOiAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSA9PSAkUGFyYW17QXBwb2ludG1lbnRJRH0gPyAkUGFyYW17RW5kVGltZX0gICA6ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Db21wYXJlKCBEYXRlVGltZU9iamVjdCA9PiAkQ3VycmVudERhdGVUaW1lT2JqZWN0ICkgPiAwICkgewogICAgICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tEYXRhe0V4ZWN1dGlvblRpbWV9ICAgICAgICAgPSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lOwogICAgICAgICAgICAgICAgICAgIGxhc3QgQVBQT0lOVE1FTlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEID0gJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57QXBwb2ludG1lbnRJRH07CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBTaW5nbGUgYXBwb2ludG1lbnQsIGNoZWNraW5nIGlmIGl0cyBleGVjdXRpb24gdGltZSBpcyBpbiB0aGUgZnV0dXJlCiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWUgPSAkU2VsZi0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntUaW1lfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPkNvbXBhcmUoIERhdGVUaW1lT2JqZWN0ID0+ICRDdXJyZW50RGF0ZVRpbWVPYmplY3QgKSApIHsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ID0gJFBhcmFte0FwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEICAgICAgICAgICAgICAgPSAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrRGF0YXtFeGVjdXRpb25UaW1lfSAgICAgICAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICAkRnV0dXJlVGFza0RhdGF7VGFza0lEfSA9ICRQYXJhbXtGdXR1cmVUYXNrSUR9OwoKICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBhcHBvaW50bWVudCB3aXRoIGV4ZWN1dGlvbiB0aW1lIGluIHRoZSBmdXR1cmUsIHVwZGF0ZSBmdXR1cmUgdGFzawogICAgICAgICAgICBpZiAoICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrVXBkYXRlKCVGdXR1cmVUYXNrRGF0YSk7CiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZ1dHVyZSB0YXNrICRGdXR1cmVUYXNrRGF0YXtUYXNrSUR9IG9mIHR5cGUgYXBwb2ludG1lbnQgdGlja2V0IGZvciBhcHBvaW50bWVudCAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfSBjb3VsZCBub3QgYmUgdXBkYXRlZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAjIERlbGV0ZSBleGlzdGluZyBmdXR1cmUgdGFzayBzaW5jZSB1cGRhdGVkIGV4ZWN1dGlvbiB0aW1lIGlzIG5vdCBpbiB0aGUgZnV0dXJlCiAgICAgICAgICAgICAgICAkUGFyYW17RnV0dXJlVGFza0lEfSA9IHVuZGVmOwogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2tEYXRhe1Rhc2tJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIE5vIGZ1dHVyZSB0YXNrIGlkIHByZXNlbnQsIGNyZWF0ZSBmdXR1cmUgdGFzayBpZiBleGVjdXRpb24gdGltZSBpcyBpbiB0aGUgZnV0dXJlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RnV0dXJlVGFza0lEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tBZGQoJUZ1dHVyZVRhc2tEYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBpZHMgZnJvbSBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMgYW5kIHVwZGF0ZSBpdCB3aGVyZSBpdCBiZWxvbmdzIGFmdGVyd2FyZHMKICAgIG15ICREZWxldGVGdXR1cmVUYXNrSURTUUwgPSAiCiAgICAgICAgVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgU0VUIGZ1dHVyZV90YXNrX2lkID0gTlVMTAogICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgIE9SIHBhcmVudF9pZCA9ID8KICAgICI7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSwgXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJERlbGV0ZUZ1dHVyZVRhc2tJRFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgaWYgKCRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCkgewogICAgICAgIG15ICRVcGRhdGVGdXR1cmVUYXNrSURTUUwgPSAiCiAgICAgICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICBTRVQgZnV0dXJlX3Rhc2tfaWQgPSA/CiAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICI7CiAgICAgICAgbXkgQEJpbmQgPSAoIFwkUGFyYW17RnV0dXJlVGFza0lEfSwgXCRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCApOwoKICAgICAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJFVwZGF0ZUZ1dHVyZVRhc2tJRFNRTCwKICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgKTsKICAgIH0KCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgIG15IEBDYWxlbmRhcklEcyA9ICggJFBhcmFte0NhbGVuZGFySUR9ICk7CiAgICBwdXNoIEBDYWxlbmRhcklEcywgJFByZXZpb3VzQ2FsZW5kYXJJRCBpZiAkUHJldmlvdXNDYWxlbmRhcklEIG5lICRQYXJhbXtDYWxlbmRhcklEfTsKICAgIGZvciBteSAkQ2FsZW5kYXJJRCAoQENhbGVuZGFySURzKSB7CiAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRDYWxlbmRhcklELAogICAgICAgICk7CiAgICB9CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBmaXJlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudFVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnREZWxldGUoKQoKZGVsZXRlcyBhbiBleGlzdGluZyBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgQXBwb2ludG1lbnRJRCAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7CgpFdmVudHM6CiAgICBBcHBvaW50bWVudERlbGV0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGdldCBDYWxlbmRhcklECiAgICBteSAkQ2FsZW5kYXJJRCA9ICRTZWxmLT5fQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHVzZXIncyBwZXJtaXNzaW9ucyBmb3IgdGhpcyBjYWxlbmRhcgogICAgbXkgJFBlcm1pc3Npb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJQZXJtaXNzaW9uR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgQFJlcXVpcmVkUGVybWlzc2lvbnMgPSAoICdjcmVhdGUnLCAncncnICk7CgogICAgaWYgKCAhZ3JlcCB7ICRQZXJtaXNzaW9uIGVxICRfIH0gQFJlcXVpcmVkUGVybWlzc2lvbnMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVc2VyKCRQYXJhbXtVc2VySUR9KSBoYXMgbm8gcGVybWlzc2lvbiB0byBkZWxldGUgQXBwb2ludG1lbnQoJFBhcmFte0FwcG9pbnRtZW50SUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzYXZlIGV4Y2x1c2lvbiBpbmZvIHRvIHBhcmVudCBhcHBvaW50bWVudAogICAgaWYgKCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ICYmICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9ICkgewogICAgICAgICRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdFeGNsdWRlKAogICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJEFwcG9pbnRtZW50e1BhcmVudElEfSwKICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgbXkgJERlbGV0ZVJlY3VycmluZ1N1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlKAogICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVJlY3VycmluZ1N1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnRzIGNvdWxkblwndCBiZSBkZWxldGVkIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgZGVsZXRlIGZ1dHVyZSB0YXNrIGlmIHByZXNlbnQKICAgICMgVE9ETyBIYW5kbGUgZGVsZXRpb24gb2YgYSByZWN1cnJpbmcgY2hpbGQgZXZlbnQgYW5kIHNoaWZ0IGZ1dHVyZSB0YXNrCiAgICBpZiAoICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9ICkgewogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgVGFza0lEID0+ICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGdXR1cmUgdGFzayBBcHBvaW50bWVudFRpY2tldCBjb3VsblwndCBiZSBkZWxldGVkIScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgIyBkZWxldGUgYXBwb2ludG1lbnQKICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBpZCA9ID8KICAgICc7CgogICAgIyBkZWxldGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBGaXJlIGV2ZW50LgogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnREZWxldGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJENhbGVuZGFySUQsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRDYWxlbmRhcklELAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFwcG9pbnRtZW50RGVsZXRlT2NjdXJyZW5jZSgpCgpkZWxldGVzIGEgc2luZ2xlIHJlY3VycmluZyBhcHBvaW50bWVudCBvY2N1cnJlbmNlLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UoCiAgICAgICAgVW5pcXVlSUQgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsICAgICMgKHJlcXVpcmVkKQogICAgICAgIFJlY3VycmVuY2VJRCA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVbmlxdWVJRCBDYWxlbmRhcklEIFJlY3VycmVuY2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICBXSEVSRSB1bmlxdWVfaWQgPSA/IEFORCBjYWxlbmRhcl9pZCA9ID8gQU5EIHJlY3VyX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtSZWN1cnJlbmNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJUFwcG9pbnRtZW50OwoKICAgICMgZ2V0IGFkZGl0aW9uYWwgaW5mbwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiBpZiAhJUFwcG9pbnRtZW50OwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgID0+ICdERUxFVEUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGNhY2hlIG9iamVjdAogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEdldFVuaXF1ZUlEKCkKClJldHVybnMgVW5pcXVlSUQgY29udGFpbmluZyBhcHBvaW50bWVudCBzdGFydCB0aW1lLCByYW5kb20gaGFzaCBhbmQgc3lzdGVtIEM8RlFETj4uCgogICAgbXkgJFVuaXF1ZUlEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5HZXRVbmlxdWVJRCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgogICAgJFVuaXF1ZUlEID0gJzIwMTYwMTAxVDAwMDAwMC1COTkwOURAbG9jYWxob3N0JzsKCj1jdXQKCnN1YiBHZXRVbmlxdWVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBTdGFydFRpbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2FsY3VsYXRlIGEgaGFzaAogICAgbXkgJFJhbmRvbVN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKCBMZW5ndGggPT4gMzIgKTsKICAgIG15ICRTdHJpbmcgICAgICAgPSAiJFBhcmFte0NhbGVuZGFySUR9LSRSYW5kb21TdHJpbmctJFBhcmFte1VzZXJJRH0iOwogICAgbXkgJERpZ2VzdCAgICAgICA9IHVucGFjayggJ04nLCBEaWdlc3Q6Ok1ENS0+bmV3KCktPmFkZCgkU3RyaW5nKS0+ZGlnZXN0KCkgKTsKICAgIG15ICREaWdlc3RIZXggICAgPSBzcHJpbnRmKCAnJXgnLCAkRGlnZXN0ICk7CiAgICBteSAkSGFzaCAgICAgICAgID0gdWMoIHNwcmludGYoICIlLjZzIiwgJERpZ2VzdEhleCApICk7CgogICAgIyBQcmVwYXJlIHN0YXJ0IHRpbWVzdGFtcCBmb3IgVW5pcXVlSUQuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRTdGFydFRpbWVPYmplY3Q7CiAgICBteSAkU3RhcnRUaW1lU3RyZyA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAkU3RhcnRUaW1lU3RyZyA9fiBzL1stOl0vL2c7CiAgICAkU3RhcnRUaW1lU3RyZyA9fiBzL1xzL1QvOwoKICAgICMgZ2V0IHN5c3RlbSBGUUROCiAgICBteSAkRlFETiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRlFETicpOwoKICAgICMgcmV0dXJuIFVuaXF1ZUlECiAgICByZXR1cm4gIiRTdGFydFRpbWVTdHJnLSRIYXNoXEAkRlFETiI7Cn0KCj1oZWFkMiBBcHBvaW50bWVudFVwY29taW5nR2V0KCkKCkdldCBhcHBvaW50bWVudCBkYXRhIGZvciB1cGNvbWluZyBhcHBvaW50bWVudCBzdGFydCBvciBlbmQuCgogICAgbXkgQFVwY29taW5nQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwY29taW5nR2V0KAogICAgICAgIFRpbWVzdGFtcCA9PiAnMjAxNi0wOC0wMiAwMzo1OTowMCcsICMgZ2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHJlbGF0ZWQgbm90aWZpY2F0aW9uIHRpbWVzdGFtcAogICAgKTsKClJldHVybnMgYXBwb2ludG1lbnQgZGF0YSBvZiBBcHBvaW50bWVudEdldCgpLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VXBjb21pbmdHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjdXJyZW50IHRpbWVzdGFtcAogICAgbXkgJEN1cnJlbnRUaW1lc3RhbXA7CgogICAgIyBjcmVhdGUgbmVlZGVkIHNxbCBxdWVyeSBiYXNlZCBvbiB0aGUgY3VycmVudCBvciBhIGdpdmVuIHRpbWVzdGFtcAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50ICc7CgogICAgaWYgKCAkUGFyYW17VGltZXN0YW1wfSApIHsKICAgICAgICAkQ3VycmVudFRpbWVzdGFtcCA9ICRQYXJhbXtUaW1lc3RhbXB9OwogICAgICAgICRTUUwgLj0gIldIRVJFIG5vdGlmeV90aW1lID0gPyAiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEN1cnJlbnRUaW1lc3RhbXAgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9TdHJpbmcoKTsKICAgICAgICAkU1FMIC49ICJXSEVSRSBub3RpZnlfdGltZSA+PSA/ICI7CiAgICB9CgogICAgJFNRTCAuPSAnT1JERVIgQlkgbm90aWZ5X3RpbWUgQVNDJzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkQ3VycmVudFRpbWVzdGFtcCBdLAogICAgKTsKCiAgICBteSBAUmVzdWx0UmF3OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlVXBjb21pbmdBcHBvaW50bWVudDsKCiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gPSAkUm93WzBdOwogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e1BhcmVudElEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVXBjb21pbmdBcHBvaW50bWVudHtDYWxlbmRhcklEfSAgICA9ICRSb3dbMl07CiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7VW5pcXVlSUR9ICAgICAgPSAkUm93WzNdOwoKICAgICAgICBwdXNoIEBSZXN1bHRSYXcsIFwlVXBjb21pbmdBcHBvaW50bWVudDsKICAgIH0KCiAgICBteSBAUmVzdWx0czsKCiAgICBBUFBPSU5UTUVOVERBVEE6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50RGF0YSAoQFJlc3VsdFJhdykgewoKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UREFUQSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEFwcG9pbnRtZW50RGF0YSk7CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgISRBcHBvaW50bWVudERhdGEtPntDYWxlbmRhcklEfTsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UREFUQSBpZiAhJEFwcG9pbnRtZW50RGF0YS0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoICV7JEFwcG9pbnRtZW50RGF0YX0gKTsKCiAgICAgICAgcHVzaCBAUmVzdWx0cywgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICByZXR1cm4gQFJlc3VsdHM7Cn0KCj1oZWFkMiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCkKCkRlbGV0ZSBhbGwgY2FsZW5kYXIgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgZnV0dXJlIHRhc2sgZGVsZXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBzY2hlZHVsZXIgZGIgb2JqZWN0CiAgICBteSAkU2NoZWR1bGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbHJlYWR5IHN0b3JlZCBmdXR1cmUgdGFza3MKICAgIG15IEBGdXR1cmVUYXNrTGlzdCA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyQXBwb2ludG1lbnQnLAogICAgKTsKCiAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxARnV0dXJlVGFza0xpc3QgKSApIHsKCiAgICAgICAgRlVUVVJFVEFTSzoKICAgICAgICBmb3IgbXkgJEZ1dHVyZVRhc2sgKEBGdXR1cmVUYXNrTGlzdCkgewoKICAgICAgICAgICAgbmV4dCBGVVRVUkVUQVNLIGlmICEkRnV0dXJlVGFzazsKICAgICAgICAgICAgbmV4dCBGVVRVUkVUQVNLIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRnV0dXJlVGFzayk7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGVsZXRlIGZ1dHVyZSB0YXNrIHdpdGggaWQgJEZ1dHVyZVRhc2stPntUYXNrSUR9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpCgpVcGRhdGUgT1RPQk8gZGFlbW9uIGZ1dHVyZSB0YXNrIGxpc3QgZm9yIHVwY29taW5nIGFwcG9pbnRtZW50cy4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIGZ1dHVyZSB0YXNrIHVwZGF0ZSB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhcHBvaW50bWVudCBkYXRhIGZvciB1cGNvbWluZyBhcHBvaW50bWVudHMKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRTZWxmLT5BcHBvaW50bWVudFVwY29taW5nR2V0KCk7CgogICAgIyBjaGVjayBmb3Igbm8gdXBjb21pbmcgYXBwb2ludG1lbnRzCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXBjb21pbmdBcHBvaW50bWVudHMgKSApIHsKCiAgICAgICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBnZXQgYSBsb2NhbCBzY2hlZHVsZXIgZGIgb2JqZWN0CiAgICBteSAkU2NoZWR1bGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbHJlYWR5IHN0b3JlZCBmdXR1cmUgdGFza3MKICAgIG15IEBGdXR1cmVUYXNrTGlzdCA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyQXBwb2ludG1lbnQnLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBpbnZhbGlkIHRhc2sgY291bnQgKGp1c3Qgb25lIHRhc2sgbWF4IGFsbG93ZWQpCiAgICBpZiAoIHNjYWxhciBARnV0dXJlVGFza0xpc3QgPiAxICkgewoKICAgICAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgZGVsZXRlIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcyEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgaXQgaXMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgZnV0dXJlIHRhc2sgbGlzdAogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxARnV0dXJlVGFza0xpc3QgKSApIHsKICAgICAgICBteSAkVXBkYXRlTmVlZGVkID0gMDsKCiAgICAgICAgRlVUVVJFVEFTSzoKICAgICAgICBmb3IgbXkgJEZ1dHVyZVRhc2sgKEBGdXR1cmVUYXNrTGlzdCkgewoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgIUlzSGFzaFJlZldpdGhEYXRhKCRGdXR1cmVUYXNrKQogICAgICAgICAgICAgICAgfHwgISRGdXR1cmVUYXNrLT57VGFza0lEfQogICAgICAgICAgICAgICAgfHwgISRGdXR1cmVUYXNrLT57RXhlY3V0aW9uVGltZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFVwZGF0ZU5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEZVVFVSRVRBU0s7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSBzdG9yZWQgZnV0dXJlIHRhc2sKICAgICAgICAgICAgbXkgJUZ1dHVyZVRhc2tEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza0dldCgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkRnV0dXJlVGFzay0+e1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVGdXR1cmVUYXNrRGF0YSApICkgewogICAgICAgICAgICAgICAgJFVwZGF0ZU5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEZVVFVSRVRBU0s7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IGRhdGUgdGltZSBvYmplY3RzIG9mIHN0b3JlZCBhbmQgdXBjb21pbmcgdGltZXMgdG8gY29tcGFyZS4KICAgICAgICAgICAgbXkgJEZ1dHVyZVRhc2tUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57Tm90aWZ5VGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkVXBjb21pbmdBcHBvaW50bWVudFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIERvIG5vdGhpbmcgaWYgdGhlIHVwY29taW5nIG5vdGlmaWNhdGlvbiB0aW1lIGVxdWFscyB0aGUgc3RvcmVkIHZhbHVlLgogICAgICAgICAgICBpZiAoICRVcGNvbWluZ0FwcG9pbnRtZW50VGltZU9iamVjdCAhPSAkRnV0dXJlVGFza1RpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkVXBkYXRlTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgRlVUVVJFVEFTSzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRVcGRhdGVOZWVkZWQpIHsKCiAgICAgICAgICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNjaGVkdWxlIG5ldyBmdXR1cmUgdGFza3MgZm9yIG5vdGlmaWNhdGlvbiBhY3Rpb25zCiAgICBteSAkVGFza0lEID0gJFNjaGVkdWxlck9iamVjdC0+VGFza0FkZCgKICAgICAgICBFeGVjdXRpb25UaW1lID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50c1swXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJywKICAgICAgICBUeXBlICAgICAgICAgID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICAgICAgTm90aWZ5VGltZSA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkVGFza0lEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzY2hlZHVsZSBmdXR1cmUgdGFzayBmb3IgQXBwb2ludG1lbnRJRCAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntBcHBvaW50bWVudElEfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgpCgpQcmVwYXJlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBkYXRhLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgcHJlcGFyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBfQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVzZXQgbm90aWZpY2F0aW9uIGRhdGEgaWYgbmVlZGVkCiAgICBpZiAoICEkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gKSB7CgogICAgICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAoCiAgICAgICAgICAgIHF3KAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSBOb3RpZmljYXRpb25UZW1wbGF0ZSBOb3RpZmljYXRpb25DdXN0b20gTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQKICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBwb3NzaWJsZSBub3RpZmljYXRpb24gcGFyYW1zCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSBOb3RpZmljYXRpb25DdXN0b20gTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gJyc7CiAgICB9CgogICAgIyBzcGVjaWFsIGNoZWNrIGZvciByZWxhdGl2ZSB1bml0IGNvdW50IGFzIGl0IGNhbiBiZSB6ZXJvCiAgICAjIChlbXB0eSBhbmQgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgdHJlYXRlZCBhcyB6ZXJvIHRvIGF2b2lkIGVycm9ycykKICAgIGlmICgKICAgICAgICAhSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSApCiAgICAgICAgfHwgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IDw9IDAKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ID0gMDsKICAgIH0KCiAgICAjIHNldCBlbXB0eSBkYXRldGltZSBzdHJpbmdzIHRvIHVuZGVmCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKHF3KE5vdGlmaWNhdGlvbkRhdGUgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUpKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19IHx8PSB1bmRlZjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfTsKCiAgICAjCiAgICAjIHRlbXBsYXRlIFN0YXJ0CiAgICAjCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSBlcSAnU3RhcnQnICkgewoKICAgICAgICAjIHNldHVwIHRoZSBhcHBvaW50bWVudCBzdGFydCBkYXRlIGFzIG5vdGlmaWNhdGlvbiBkYXRlCiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkUGFyYW17RGF0YX0tPntTdGFydFRpbWV9OwogICAgfQoKICAgICMKICAgICMgdGVtcGxhdGUgdGltZSBiZWZvcmUgc3RhcnQKICAgICMKICAgIGVsc2lmICgKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gbmUgJ0N1c3RvbScKICAgICAgICAmJiBJc051bWJlciggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICkKICAgICAgICAmJiAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gPiAwCiAgICAgICAgKQogICAgewoKICAgICAgICByZXR1cm4gaWYgIUlzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gKTsKCiAgICAgICAgIyBvZmZzZXQgdGVtcGxhdGUgKGJlZm9yZSBzdGFydCBkYXRldGltZSkgdXNlZAogICAgICAgIG15ICRPZmZzZXQgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgICAgICMgR2V0IGRhdGUgdGltZSBvYmplY3Qgb2YgYXBwb2ludG1lbnQgc3RhcnQgdGltZS4KICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFN1YnRyYWN0IG9mZnNldCBpbiBzZWNvbmRzIGZvciBuZXcgbm90aWZpY2F0aW9uIGRhdGUgdGltZS4KICAgICAgICAkU3RhcnRUaW1lT2JqZWN0LT5TdWJ0cmFjdCgKICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFN0YXJ0VGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgIH0KCiAgICAjCiAgICAjIHRlbXBsYXRlIEN1c3RvbQogICAgIwogICAgZWxzZSB7CgogICAgICAgICMgQ29tcHV0ZSBkYXRlIG9mIGN1c3RvbSByZWxhdGl2ZSBpbnB1dC4KICAgICAgICBpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKCiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0Q291bnQgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH07CiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0ICAgICAgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdFBvaW50ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX07CgogICAgICAgICAgICAjIHNldHVwIHRoZSBjb3VudCB0byBjb21wdXRlIGZvciB0aGUgb2Zmc2V0CiAgICAgICAgICAgIG15ICVVbml0T2Zmc2V0Q29tcHV0ZSA9ICgKICAgICAgICAgICAgICAgIG1pbnV0ZXMgPT4gNjAsCiAgICAgICAgICAgICAgICBob3VycyAgID0+IDM2MDAsCiAgICAgICAgICAgICAgICBkYXlzICAgID0+IDg2NDAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdDsKCiAgICAgICAgICAgICMgQ29tcHV0ZSBmcm9tIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyc3RhcnQnICkgewogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcHV0ZSBmcm9tIGVuZCB0aW1lLgogICAgICAgICAgICBlbHNpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJlbmQnICkgewogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIE5vdCBzdXBwb3J0ZWQgcG9pbnQgb2YgdGltZS4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGJlIHVzZWQKICAgICAgICAgICAgbXkgJE9mZnNldCA9ICggJEN1c3RvbVVuaXRDb3VudCAqICRVbml0T2Zmc2V0Q29tcHV0ZXskQ3VzdG9tVW5pdH0gKTsKCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbmV3bHkgY29tcHV0ZWQgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZwogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnICkgewogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgICAgICBTZWNvbmRzID0+ICRPZmZzZXQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkTm90aWZpY2F0aW9uTG9jYWxUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gZGF0ZS90aW1lIGlucHV0LgogICAgICAgIGVsc2lmICggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewoKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAjIHZhbGlkYXRpb24KICAgICAgICAgICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgZ2l2ZW4gZGF0ZSB0aW1lIHZhbHVlcyBhcyBub3RpZmljYXRpb24gZGF0ZXRpbWUgc3RyaW5nIChpLmUuIDIwMTYtMDYtMjggMDI6MDA6MDApCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gdW5kZWY7CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ID0gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAo9aGVhZDIgQXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoKQoKY29tcHV0ZXMgZXhlY3V0aW9uIHRpbWUgZm9yIGZ1dHVyZSB0YXNrcyBvZiB0eXBlIEFwcG9pbnRtZW50VG9UaWNrZXQgYmFzZWQgb24gc3RhcnQgdGltZSBhbmQgb2Zmc2V0IHBhcmFtcwoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VG9UaWNrZXRFeGVjdXRpb25UaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVzZXQgdGlja2V0IGRhdGEgaWYgbmVlZGVkCiAgICBpZiAoICEkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX0gKSB7CgogICAgICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAoCiAgICAgICAgICAgIHF3KAogICAgICAgICAgICAgICAgVGlja2V0RGF0ZSBUaWNrZXRUZW1wbGF0ZSBUaWNrZXRDdXN0b20gVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQKICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lIFRpY2tldEN1c3RvbURhdGVUaW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgICMgY29tcHV0ZSBleGVjdXRpb24gdGltZSBmb3IgdGFzawogICAgIyBwcmVwYXJlIHBvc3NpYmxlIHRpY2tldCBwYXJhbXMKICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAoCiAgICAgICAgcXcoCiAgICAgICAgICAgIFRpY2tldFRlbXBsYXRlIFRpY2tldEN1c3RvbSBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQKICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19IHx8PSAnJzsKICAgIH0KCiAgICAjIHNwZWNpYWwgY2hlY2sgZm9yIHJlbGF0aXZlIHVuaXQgY291bnQgYXMgaXQgY2FuIGJlIHplcm8KICAgICMgKGVtcHR5IGFuZCBuZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSB0cmVhdGVkIGFzIHplcm8gdG8gYXZvaWQgZXJyb3JzKQogICAgaWYgKAogICAgICAgICFJc051bWJlciggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ICkKICAgICAgICB8fCAkUGFyYW17RGF0YX0tPntUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gPD0gMAogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gPSAwOwogICAgfQoKICAgICMgc2V0IGVtcHR5IGRhdGV0aW1lIHN0cmluZ3MgdG8gdW5kZWYKICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAocXcoVGlja2V0RGF0ZSBUaWNrZXRDdXN0b21EYXRlVGltZSkpIHsKICAgICAgICAkUGFyYW17RGF0YX0tPnskUG9zc2libGVQYXJhbX0gfHw9IHVuZGVmOwogICAgfQoKICAgIHJldHVybiBpZiAhJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9OwoKICAgICMKICAgICMgdGVtcGxhdGUgU3RhcnQKICAgICMKICAgIGlmICggJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9IGVxICdTdGFydCcgKSB7CgogICAgICAgICMgc2V0dXAgdGhlIGFwcG9pbnRtZW50IHN0YXJ0IGRhdGUgYXMgdGlja2V0IGRhdGUKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9ICRQYXJhbXtTdGFydFRpbWV9OwogICAgfQoKICAgICMKICAgICMgdGVtcGxhdGUgdGltZSBiZWZvcmUgc3RhcnQKICAgICMKICAgIGVsc2lmICgKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX0gbmUgJ0N1c3RvbScKICAgICAgICAmJiBJc051bWJlciggJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9ICkKICAgICAgICAmJiAkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX0gPiAwCiAgICAgICAgKQogICAgewoKICAgICAgICByZXR1cm4gaWYgIUlzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX0gKTsKCiAgICAgICAgIyBvZmZzZXQgdGVtcGxhdGUgKGJlZm9yZSBzdGFydCBkYXRldGltZSkgdXNlZAogICAgICAgIG15ICRPZmZzZXQgPSAkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX07CgogICAgICAgICMgR2V0IGRhdGUgdGltZSBvYmplY3Qgb2YgYXBwb2ludG1lbnQgc3RhcnQgdGltZS4KICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTdWJ0cmFjdCBvZmZzZXQgaW4gc2Vjb25kcyBmb3IgbmV3IG5vdGlmaWNhdGlvbiBkYXRlIHRpbWUuCiAgICAgICAgJFN0YXJ0VGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgIFNlY29uZHMgPT4gJE9mZnNldCwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIwogICAgIyB0ZW1wbGF0ZSBDdXN0b20KICAgICMKICAgIGVsc2UgewoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gcmVsYXRpdmUgaW5wdXQuCiAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntUaWNrZXRDdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CgogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdENvdW50ID0gJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdCAgICAgID0gJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRQb2ludCA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9OwoKICAgICAgICAgICAgIyBzZXR1cCB0aGUgY291bnQgdG8gY29tcHV0ZSBmb3IgdGhlIG9mZnNldAogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRUaWNrZXRMb2NhbFRpbWVPYmplY3Q7CgogICAgICAgICAgICAjIENvbXB1dGUgZnJvbSBzdGFydCB0aW1lLgogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcnN0YXJ0JyApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRMb2NhbFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDb21wdXRlIGZyb20gZW5kIHRpbWUuCiAgICAgICAgICAgIGVsc2lmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3JlZW5kJyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcmVuZCcgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0TG9jYWxUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIE5vdCBzdXBwb3J0ZWQgcG9pbnQgb2YgdGltZS4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGJlIHVzZWQKICAgICAgICAgICAgbXkgJE9mZnNldCA9ICggJEN1c3RvbVVuaXRDb3VudCAqICRVbml0T2Zmc2V0Q29tcHV0ZXskQ3VzdG9tVW5pdH0gKTsKCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbmV3bHkgY29tcHV0ZWQgdGlja2V0IGRhdGV0aW1lIHN0cmluZwogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnICkgewogICAgICAgICAgICAgICAgJFRpY2tldExvY2FsVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9ID0gJFRpY2tldExvY2FsVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRUaWNrZXRMb2NhbFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgICAgICBTZWNvbmRzID0+ICRPZmZzZXQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX0gPSAkVGlja2V0TG9jYWxUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gZGF0ZS90aW1lIGlucHV0LgogICAgICAgIGVsc2lmICggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewoKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAjIHZhbGlkYXRpb24KICAgICAgICAgICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgZ2l2ZW4gZGF0ZSB0aW1lIHZhbHVlcyBhcyB0aWNrZXQgZGF0ZXRpbWUgc3RyaW5nIChpLmUuIDIwMTYtMDYtMjggMDI6MDA6MDApCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9ID0gJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tRGF0ZVRpbWV9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9ID0gdW5kZWY7CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tRGF0ZVRpbWV9ID0gdW5kZWY7CiAgICB9CiAgICByZXR1cm4gJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX07Cgp9CgojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCj1oZWFkMiBBcHBvaW50bWVudE5vdGlmaWNhdGlvbigpCgpXaWxsIGJlIHRyaWdnZXJlZCBieSB0aGUgT1RPQk8gZGFlbW9uIHRvIGZpcmUgZXZlbnRzIGZvciBhcHBvaW50bWVudHMsCnRoYXQgcmVhY2hlcyBpdCdzIHJlbWluZGVyIChub3RpZmljYXRpb24pIHRpbWUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgbm90aWZ5IGFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50Tm90aWZpY2F0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhOb3RpZnlUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHJlbGF0ZWQgbm90aWZpY2F0aW9uIHRpbWVzdGFtcAogICAgbXkgQFVwY29taW5nQXBwb2ludG1lbnRzID0gJFNlbGYtPkFwcG9pbnRtZW50VXBjb21pbmdHZXQoCiAgICAgICAgVGltZXN0YW1wID0+ICRQYXJhbXtOb3RpZnlUaW1lfSwKICAgICk7CgogICAgcmV0dXJuIGlmICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXBjb21pbmdBcHBvaW50bWVudHMgKTsKCiAgICAjIHNsZWVwIGF0IGxlYXN0IDEgc2Vjb25kIHRvIG1ha2Ugc3VyZSB0aGUgdGltZXN0YW1wIGRvZXNuJ3QKICAgICMgZXF1YWxzIHRoZSBsYXN0IG9uZSBmb3IgdXBkYXRlIHVwY29taW5nIGZ1dHVyZSB0YXNrcwogICAgc2xlZXAgMTsKCiAgICBVUENPTUlOR0FQUE9JTlRNRU5UOgogICAgZm9yIG15ICRVcGNvbWluZ0FwcG9pbnRtZW50IChAVXBjb21pbmdBcHBvaW50bWVudHMpIHsKCiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICEkVXBjb21pbmdBcHBvaW50bWVudDsKICAgICAgICBuZXh0IFVQQ09NSU5HQVBQT0lOVE1FTlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRVcGNvbWluZ0FwcG9pbnRtZW50KTsKICAgICAgICBuZXh0IFVQQ09NSU5HQVBQT0lOVE1FTlQgaWYgISRVcGNvbWluZ0FwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CgogICAgICAgICMgZmlyZSBldmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFVwY29taW5nQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFVwY29taW5nQXBwb2ludG1lbnQtPntDYWxlZGFySUR9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCBBcHBvaW50bWVudCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntFbmRUaW1lfSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUV4Y2x1ZGV9IC8vIFtdIH07CgogICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgQFJlY3VycmVuY2VFeGNsdWRlID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgIyByZXNldCB0aGUgcGFyYW1ldGVyIGZvciBvY2N1cnJlbmNlcwogICAgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VFeGNsdWRlfSA9IHVuZGVmOwoKICAgIG15ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICBteSAkT3JpZ2luYWxFbmRUaW1lT2JqZWN0ICAgPSAkRW5kVGltZU9iamVjdC0+Q2xvbmUoKTsKICAgIG15ICRTdGVwICAgICAgICAgICAgICAgICAgICA9IDA7CgogICAgIyB1bnRpbCAuLi4KICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIFVOVElMX1RJTUU6CiAgICAgICAgd2hpbGUgKCAkU3RhcnRUaW1lT2JqZWN0IDw9ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgKSB7CiAgICAgICAgICAgICRTdGVwICs9ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgcmVjdXJyaW5nIHRpbWVzCiAgICAgICAgICAgICRTdGFydFRpbWVPYmplY3QgPSAkU2VsZi0+X0NhbGN1bGF0ZVJlY3VycmVuY2VUaW1lKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+ICRQYXJhbXtBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICBTdGVwICAgICAgICAgPT4gJFN0ZXAsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJE9yaWdpbmFsU3RhcnRUaW1lT2JqZWN0LAogICAgICAgICAgICAgICAgQ3VycmVudFRpbWUgID0+ICRTdGFydFRpbWVPYmplY3QsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBsYXN0IFVOVElMX1RJTUUgaWYgISRTdGFydFRpbWVPYmplY3Q7CiAgICAgICAgICAgIGxhc3QgVU5USUxfVElNRSBpZiAkU3RhcnRUaW1lT2JqZWN0ID4gJFJlY3VycmVuY2VVbnRpbE9iamVjdDsKCiAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0ID0gJFN0YXJ0VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgIFNlY29uZHMgPT4KICAgICAgICAgICAgICAgICAgICAkT3JpZ2luYWxFbmRUaW1lT2JqZWN0LT5EZWx0YSggRGF0ZVRpbWVPYmplY3QgPT4gJE9yaWdpbmFsU3RhcnRUaW1lT2JqZWN0ICktPntBYnNvbHV0ZVNlY29uZHN9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lICAgPSAkRW5kVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICAgICAgICAgICMgQnVnZml4OiBvbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBwZXJsIHZlcnNpb24gc3lzdGVtIG1pZ2h0IGNhbGN1bGF0ZSB0aW1lem9uZSBkaWZmZXJlbmNlLgogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkU2VsZi0+X1RpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZXhjbHVkZWQgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIG5leHQgVU5USUxfVElNRSBpZiBncmVwIHsgJFN0YXJ0VGltZSBlcSAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAgICAgICAgICRTZWxmLT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtBcHBvaW50bWVudH0gfSwKICAgICAgICAgICAgICAgIFBhcmVudElEICAgICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICBSZWN1cnJlbmNlSUQgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBmb3IgLi4uIHRpbWUocykKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VDb3VudH0gKSB7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciAoIDEgLi4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VDb3VudH0gLSAxICkgewogICAgICAgICAgICAkU3RlcCArPSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIHJlY3VycmluZyB0aW1lcwogICAgICAgICAgICAkU3RhcnRUaW1lT2JqZWN0ID0gJFNlbGYtPl9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiAkUGFyYW17QXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgU3RlcCAgICAgICAgID0+ICRTdGVwLAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCwKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICA9PiAkU3RhcnRUaW1lT2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAhJFN0YXJ0VGltZU9iamVjdDsKCiAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0ID0gJFN0YXJ0VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgIFNlY29uZHMgPT4KICAgICAgICAgICAgICAgICAgICAkT3JpZ2luYWxFbmRUaW1lT2JqZWN0LT5EZWx0YSggRGF0ZVRpbWVPYmplY3QgPT4gJE9yaWdpbmFsU3RhcnRUaW1lT2JqZWN0ICktPntBYnNvbHV0ZVNlY29uZHN9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lICAgPSAkRW5kVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICAgICAgICAgICMgQnVnZml4OiBvbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBwZXJsIHZlcnNpb24gc3lzdGVtIG1pZ2h0IGNhbGN1bGF0ZSB0aW1lem9uZSBkaWZmZXJlbmNlLgogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkU2VsZi0+X1RpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZXhjbHVkZWQgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgZ3JlcCB7ICRTdGFydFRpbWUgZXEgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17QXBwb2ludG1lbnR9IH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRQYXJhbXtQYXJlbnRJRH0gKTsKICAgIG15IEBBcHBvaW50bWVudExpc3QgICA9ICRTZWxmLT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyZW50QXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgUGFyZW50SUQgICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBpZiBwcmVzZW50CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRMaXN0KSB7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnQtPntGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEFwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGdXR1cmUgdGFzayBBcHBvaW50bWVudFRpY2tldCBjb3VsblwndCBiZSBkZWxldGVkIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgIyBkZWxldGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgbXkgJFNRTCA9ICcKICAgICAgICBERUxFVEUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFIHBhcmVudF9pZCA9ID8KICAgICc7CgogICAgIyBkZWxldGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17UGFyZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nRXhjbHVkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQgUmVjdXJyZW5jZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgbXkgJERCT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIHJlY3VyX2V4Y2x1ZGUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1BhcmVudElEfSBdLAogICAgKTsKCiAgICAjIGdldCBleGlzdGluZyBleGNsdXNpb25zCiAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBzcGxpdCggLywvLCAkUm93WzBdICkgaWYgJFJvd1swXTsKICAgIH0KICAgIHB1c2ggQFJlY3VycmVuY2VFeGNsdWRlLCAkUGFyYW17UmVjdXJyZW5jZUlEfTsKICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IHNvcnQgQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICMgam9pbiBpbnRvIHN0cmluZwogICAgbXkgJFJlY3VycmVuY2VFeGNsdWRlOwogICAgaWYgKEBSZWN1cnJlbmNlRXhjbHVkZSkgewogICAgICAgICRSZWN1cnJlbmNlRXhjbHVkZSA9IGpvaW4oICcsJywgQFJlY3VycmVuY2VFeGNsdWRlICk7CiAgICB9CgogICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50IFNFVCByZWN1cl9leGNsdWRlID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFJlY3VycmVuY2VFeGNsdWRlLCBcJFBhcmFte1BhcmVudElEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudEdldENhbGVuZGFySUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNxbCBxdWVyeQogICAgbXkgJFNRTCAgPSAnU0VMRUNUIGNhbGVuZGFyX2lkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQgPSA/JzsKICAgIG15IEBCaW5kID0gKCBcJFBhcmFte0FwcG9pbnRtZW50SUR9ICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHN0YXJ0IHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkQ2FsZW5kYXJJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDYWxlbmRhcklEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJENhbGVuZGFySUQ7Cn0KCnN1YiBfQXBwb2ludG1lbnRHZXRSZWN1cnJlbmNlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNxbCBxdWVyeQogICAgbXkgJFNRTCAgPSAnU0VMRUNUIHJlY3VyX2lkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQgPSA/JzsKICAgIG15IEBCaW5kID0gKCBcJFBhcmFte0FwcG9pbnRtZW50SUR9ICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHN0YXJ0IHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkUmVjdXJyZW5jZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJlY3VycmVuY2VJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRSZWN1cnJlbmNlSUQ7Cn0KCnN1YiBfQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50IFN0ZXAgT3JpZ2luYWxUaW1lIEN1cnJlbnRUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJE9yaWdpbmFsVGltZU9iamVjdCA9ICRQYXJhbXtPcmlnaW5hbFRpbWV9OwoKICAgICMgV2Ugd2lsbCBtb2RpZnkgdGhpcyBvYmplY3QgdGhyb3VnaG91dCB0aGUgZnVuY3Rpb24uCiAgICBteSAkQ3VycmVudFRpbWVPYmplY3QgPSAkUGFyYW17Q3VycmVudFRpbWV9OwoKICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnRGFpbHknICkgewoKICAgICAgICAjIEFkZCBvbmUgZGF5LgogICAgICAgICRDdXJyZW50VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBEYXlzID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JyApIHsKCiAgICAgICAgIyBBZGQgNyBkYXlzLgogICAgICAgICRDdXJyZW50VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBEYXlzID0+IDcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScgKSB7CiAgICAgICAgbXkgJFRlbXBUaW1lT2JqZWN0ID0gJE9yaWdpbmFsVGltZU9iamVjdC0+Q2xvbmUoKTsKCiAgICAgICAgIyBSZW1lbWJlciBzdGFydCBkYXkuCiAgICAgICAgbXkgJFN0YXJ0RGF5ID0gJFRlbXBUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX07CgogICAgICAgICMgQWRkIG1vbnRocyBiYXNlZCBvbiBjdXJyZW50IHN0ZXAuCiAgICAgICAgJFRlbXBUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgIE1vbnRocyA9PiAkUGFyYW17U3RlcH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgZW5kIGRheS4KICAgICAgICBteSAkRW5kRGF5ID0gJFRlbXBUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX07CgogICAgICAgICMgQ2hlY2sgaWYgbW9udGggZG9lc24ndCBoYXZlIGVub3VnaCBkYXlzIChmb3IgZXhhbXBsZTogSmFudWFyeSAzMSArIDEgbW9udGggPSBNYXJjaCAxKS4KICAgICAgICBpZiAoICRTdGFydERheSAhPSAkRW5kRGF5ICkgewogICAgICAgICAgICAkVGVtcFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgRGF5cyA9PiAkRW5kRGF5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJFRlbXBUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknICkgewogICAgICAgIG15ICRUZW1wVGltZU9iamVjdCA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkNsb25lKCk7CgogICAgICAgICMgUmVtZW1iZXIgc3RhcnQgZGF5LgogICAgICAgIG15ICRTdGFydERheSA9ICRUZW1wVGltZU9iamVjdC0+R2V0KCktPntEYXl9OwoKICAgICAgICAjIEFkZCB5ZWFycyBiYXNlZCBvbiBjdXJyZW50IHN0ZXAuCiAgICAgICAgJFRlbXBUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgIFllYXJzID0+ICRQYXJhbXtTdGVwfSwKICAgICAgICApOwoKICAgICAgICAjIEdldCBlbmQgZGF5LgogICAgICAgIG15ICRFbmREYXkgPSAkVGVtcFRpbWVPYmplY3QtPkdldCgpLT57RGF5fTsKCiAgICAgICAgIyBDaGVjayBpZiBtb250aCBkb2Vzbid0IGhhdmUgZW5vdWdoIGRheXMgKGZvciBleGFtcGxlOiBKYW51YXJ5IDMxICsgMSBtb250aCA9IE1hcmNoIDEpLgogICAgICAgIGlmICggJFN0YXJ0RGF5ICE9ICRFbmREYXkgKSB7CiAgICAgICAgICAgICRUZW1wVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICBEYXlzID0+ICRFbmREYXksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QgPSAkVGVtcFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbURhaWx5JyApIHsKCiAgICAgICAgIyBBZGQgbnVtYmVyIG9mIGRheXMuCiAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgIERheXMgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JyApIHsKCiAgICAgICAgIyB0aGlzIGJsb2NrIGNvdmVycyBmb2xsb3dpbmcgdXNlIGNhc2U6CiAgICAgICAgIyBlYWNoIG4tdGggTW9uZGF5IGFuZCBGcmlkYXkKCiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICAjIGxvb3AgdXAgdG8gNypuIHRpbWVzICg3IGRheXMgaW4gd2VlayAqIGZyZXF1ZW5jeSkKICAgICAgICBMT09QOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMDsgJENvdW50ZXIgPCA3ICogJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07ICRDb3VudGVyKysgKSB7CgogICAgICAgICAgICAjIEFkZCBvbmUgZGF5LgogICAgICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgIERheXMgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRDV0RpZmYgPSAkU2VsZi0+X0NXRGlmZigKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICA9PiAkQ3VycmVudFRpbWVPYmplY3QsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJE9yaWdpbmFsVGltZU9iamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgTE9PUCBpZiAkQ1dEaWZmICUgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICBteSAkV2Vla0RheSA9ICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntEYXlPZldlZWt9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiBTeXN0ZW1UaW1lIG1hdGNoIHJlcXVpcmVtZW50cwogICAgICAgICAgICBpZiAoIGdyZXAgeyAkV2Vla0RheSA9PSAkXyB9IEB7ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRnJlcXVlbmN5fSB9ICkgewogICAgICAgICAgICAgICAgJEZvdW5kID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CgogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JyApIHsKCiAgICAgICAgIyBPY2N1cnMgZXZlcnkgMm5kIG1vbnRoIG9uIDV0aCwgMTB0aCBhbmQgMTV0aCBkYXkKICAgICAgICBteSAkRm91bmQ7CgogICAgICAgICMgbG9vcCB0aHJvdWdoIGVhY2ggZGF5IChtYXggb25lIHllYXIpLCBhbmQgY2hlY2sgaWYgZGF5IG1hdGNoZXMuCiAgICAgICAgREFZOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMDsgJENvdW50ZXIgPCAzMSAqIDM2NjsgJENvdW50ZXIrKyApIHsKCiAgICAgICAgICAgICMgQWRkIG9uZSBkYXkuCiAgICAgICAgICAgICRDdXJyZW50VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTa2lwIG1vbnRoIGlmIG5lZWRlZAogICAgICAgICAgICBuZXh0IERBWQogICAgICAgICAgICAgICAgaWYgKCAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57TW9udGh9IC0gJE9yaWdpbmFsVGltZU9iamVjdC0+R2V0KCktPntNb250aH0gKQogICAgICAgICAgICAgICAgJSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgbmV4dCBkYXkgaWYgdGhpcyBkYXkgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgICAgbmV4dCBEQVkKICAgICAgICAgICAgICAgIGlmICFncmVwIHsgJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX0gPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgIGxhc3QgREFZOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWYgISRGb3VuZDsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKCiAgICAgICAgIyB0aGlzIGJsb2NrIGNvdmVycyBmb2xsb3dpbmcgdXNlIGNhc2U6CiAgICAgICAgIyBPY2N1cnMgZWFjaCAzdGggeWVhciwgSmFudWFyeSAxOHRoIGFuZCBNYXJjaCAxOHRoCiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsT2JqZWN0OwogICAgICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkTmV4dERheU9iamVjdCA9ICRDdXJyZW50VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAkTmV4dERheU9iamVjdC0+QWRkKAogICAgICAgICAgICBEYXlzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgTU9OVEg6CiAgICAgICAgZm9yICggbXkgJENvdW50ZXIgPSAxOzsgJENvdW50ZXIrKyApIHsKICAgICAgICAgICAgbXkgJFRlbXBUaW1lT2JqZWN0ID0gJE9yaWdpbmFsVGltZU9iamVjdC0+Q2xvbmUoKTsKCiAgICAgICAgICAgICMgcmVtZW1iZXIgc3RhcnQgZGF5CiAgICAgICAgICAgIG15ICRTdGFydERheSA9ICRUZW1wVGltZU9iamVjdC0+R2V0KCktPntEYXl9OwoKICAgICAgICAgICAgJFRlbXBUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICBNb250aHMgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBlbmQgZGF5CiAgICAgICAgICAgIG15ICRFbmREYXkgPSAkVGVtcFRpbWVPYmplY3QtPkdldCgpLT57RGF5fTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgbW9udGggZG9lc24ndCBoYXZlIGVub3VnaCBkYXlzIChmb3IgZXhhbXBsZTogamFudWFyeSAzMSArIDEgbW9udGggPSBtYXJjaCAwMSkKICAgICAgICAgICAgaWYgKCAkU3RhcnREYXkgIT0gJEVuZERheSApIHsKICAgICAgICAgICAgICAgICRUZW1wVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgRGF5cyA9PiAkRW5kRGF5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJFRlbXBUaW1lT2JqZWN0LT5DbG9uZSgpOwoKICAgICAgICAgICAgIyBza2lwIHRoaXMgdGltZSwgc2luY2UgaXQgd2FzIGFscmVhZHkgY2hlY2tlZAogICAgICAgICAgICBuZXh0IE1PTlRIIGlmICRDdXJyZW50VGltZU9iamVjdCA8ICROZXh0RGF5T2JqZWN0OwoKICAgICAgICAgICAgIyBjaGVjayBsb29wIGNvbmRpdGlvbnMgKGFjY29yZGluZyB0byBVbnRpbCAvICkKICAgICAgICAgICAgaWYgKCRSZWN1cnJlbmNlVW50aWxPYmplY3QpIHsKICAgICAgICAgICAgICAgIGxhc3QgTU9OVEggaWYgJEN1cnJlbnRUaW1lT2JqZWN0ID4gJFJlY3VycmVuY2VVbnRpbE9iamVjdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxhc3QgTU9OVEgKICAgICAgICAgICAgICAgICAgICBpZiAkQ291bnRlcgogICAgICAgICAgICAgICAgICAgID4gMTIgKiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfSAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIHllYXIgaXMgT0sKICAgICAgICAgICAgbmV4dCBNT05USAogICAgICAgICAgICAgICAgaWYgKCAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57WWVhcn0gLSAkT3JpZ2luYWxUaW1lT2JqZWN0LT5HZXQoKS0+e1llYXJ9ICkKICAgICAgICAgICAgICAgICUgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIG5leHQgbW9udGggaWYgdGhpcyBtb250aCBzaG91bGQgYmUgc2tpcHBlZAogICAgICAgICAgICBuZXh0IE1PTlRICiAgICAgICAgICAgICAgICBpZiAhZ3JlcCB7ICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntNb250aH0gPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgIGxhc3QgTU9OVEg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQ3VycmVudFRpbWVPYmplY3Q7Cn0KCj1oZWFkMiBfVGltZUNoZWNrKCkKCkNoZWNrIGlmIFRpbWUgYW5kIE9yaWdpbmFsVGltZSBoYXZlIHNhbWUgaG91ciwgbWludXRlIGFuZCBzZWNvbmQgdmFsdWUsIGFuZCByZXR1cm4gdGltZXN0YW1wIHdpdGgKdmFsdWVzIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgYXMgaW4gVGltZS4KCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgT3JpZ2luYWxUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFRpbWUgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMjowMCcsICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpSZXR1cm5zOgogICAgJFJlc3VsdCA9ICcyMDE2LTAyLTAxIDAwOjAxOjAwJzsKCj1jdXQKCnN1YiBfVGltZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KE9yaWdpbmFsVGltZSBUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFJlc3VsdCA9ICcnOwoKICAgICRQYXJhbXtPcmlnaW5hbFRpbWV9ID1+IC8oLio/KVxzKC4qPykkLzsKICAgIG15ICRPcmlnaW5hbERhdGUgPSAkMTsKICAgIG15ICRPcmlnaW5hbFRpbWUgPSAkMjsKCiAgICAkUGFyYW17VGltZX0gPX4gLyguKj8pXHMoLio/KSQvOwogICAgbXkgJERhdGUgPSAkMTsKCiAgICAkUmVzdWx0ID0gIiREYXRlICRPcmlnaW5hbFRpbWUiOwogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1oZWFkMiBfQ1dEaWZmKCkKClJldHVybnMgaG93IG1hbnkgY2FsZW5kYXIgd2Vla3MgaGFzIHBhc3NlZCBiZXR3ZWVuIHR3byB1bml4IHRpbWVzLgoKICAgIG15ICRDV0RpZmYgPSAkU2VsZi0+X0NXRGlmZigKICAgICAgICBDdXJyZW50VGltZSAgPT4gJEN1cnJlbnRUaW1lT2JqZWN0LCAgICAgKHJlcXVpcmVkKSBEYXRlIHRpbWUgb2JqZWN0IHdpdGggY3VycmVudCB0aW1lCiAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFRpbWVPYmplY3QsICAgIChyZXF1aXJlZCkgRGF0ZSB0aW1lIG9iamVjdCB3aXRoIG9yaWdpbmFsIHRpbWUKICAgICk7CgpyZXR1cm5zOgogICAgJENXRGlmZiA9IDU7Cgo9Y3V0CgpzdWIgX0NXRGlmZiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhDdXJyZW50VGltZSBPcmlnaW5hbFRpbWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3JpZ2luYWxUaW1lT2JqZWN0ID0gJFBhcmFte09yaWdpbmFsVGltZX07CiAgICBteSAkQ3VycmVudFRpbWVPYmplY3QgID0gJFBhcmFte0N1cnJlbnRUaW1lfTsKCiAgICBteSAkU3RhcnRZZWFyID0gJE9yaWdpbmFsVGltZU9iamVjdC0+R2V0KCktPntZZWFyfTsKICAgIG15ICRFbmRZZWFyICAgPSAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57WWVhcn07CgogICAgbXkgJFJlc3VsdCA9ICRDdXJyZW50VGltZU9iamVjdC0+e0NQQU5EYXRlVGltZU9iamVjdH0tPndlZWtfbnVtYmVyKCkKICAgICAgICAtICRPcmlnaW5hbFRpbWVPYmplY3QtPntDUEFORGF0ZVRpbWVPYmplY3R9LT53ZWVrX251bWJlcigpOwoKICAgICMgSWYgZGF0ZSBpcyBlbmQgb2YgdGhlIHllYXIgYW5kIGRhdGUgQ1cgc3RhcnRzIHdpdGggMSwgd2UgbmVlZCB0byBpbmNsdWRlIGFkZGl0aW9uYWwgeWVhci4KICAgIGlmICggJFJlc3VsdCA8IDAgJiYgJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX0gPT0gMzEgJiYgJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e01vbnRofSA9PSAxMiApIHsKICAgICAgICAkRW5kWWVhcisrOwogICAgfQoKICAgIGZvciBteSAkWWVhciAoICRTdGFydFllYXIgLi4gJEVuZFllYXIgLSAxICkgewogICAgICAgIG15ICRDVyAgPSAwOwogICAgICAgIG15ICREYXkgPSAzMTsKCiAgICAgICAgd2hpbGUgKCAkQ1cgPCA1MCApIHsKCiAgICAgICAgICAgICMgVG8gZ2V0IGhvdyBtYW55IENXJ3MgYXJlIGluIHRoaXMgeWVhciwgd2Ugc2V0IHRlbXBvcmFyeSBkYXRlIHRvIDMxLWRlYy4KICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gIiRZZWFyLTEyLSREYXkgMjM6NTk6MDAiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDVyA9ICREYXRlVGltZU9iamVjdC0+e0NQQU5EYXRlVGltZU9iamVjdH0tPndlZWtfbnVtYmVyKCk7CiAgICAgICAgICAgICREYXktLTsKICAgICAgICB9CgogICAgICAgICRSZXN1bHQgKz0gJENXOwogICAgfQoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9ZW5kIEludGVybmFsOgoKPWN1dAoKMTsK</File>
        <File Location="Custom/Kernel/System/Daemon/SchedulerDB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBjMTRjYTU1YThiMWQzZDY4NmU4MDNjMTM5ODgxM2I4M2QyMjA5MWU1IC0gS2VybmVsL1N5c3RlbS9EYWVtb24vU2NoZWR1bGVyREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNSU1FOjpCYXNlNjQ7CnVzZSBUaW1lOjpIaVJlczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDcm9uRXZlbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0FnZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0b3JhYmxlJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQiAtIFNjaGVkdWxlciBkYXRhYmFzZSBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKSW5jbHVkZXMgYWxsIHNjaGVkdWxlciByZWxhdGVkIGRhdGFiYXNlIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhIHNjaGVkdWxlciBkYXRhYmFzZSBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIG15ICRTY2hlZHVsZXJEQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFRhc2tBZGQoKQoKYWRkIGEgbmV3IHRhc2sgdG8gc2NoZWR1bGVyIHRhc2sgbGlzdAoKICAgIG15ICRUYXNrSUQgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tBZGQoCiAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywgICAgICMgZS4gZy4gR2VuZXJpY0ludGVyZmFjZSwgVGVzdAogICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnYW55IG5hbWUnLCAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgQXR0ZW1wdHMgICAgICAgICAgICAgICAgID0+IDUsICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgKGRlZmF1bHQgMSkKICAgICAgICBNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXMgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoZGVmYXVsdCAwKSwgbnVtYmVyIG9mIHRhc2tzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB3aXRoIHRoZSBzYW1lIHR5cGUgKGFuZCBuYW1lIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBwcm92aWRlZCkgdGhhdCBjYW4gZXhpc3RzIGF0IHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB0aW1lLCB2YWx1ZSBvZiAwIG1lYW5zIHVubGltaXRlZAogICAgICAgIERhdGEgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRhdGEgcGF5bG9hZAogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgKTsKClJldHVybnM6CgogICAgbXkgJFRhc2tJRCA9IDEyMzsgICMgZmFsc2UgaW4gY2FzZSBvZiBhbiBlcnJvciBvciAtMSBpbiBjYXNlIG9mIHJlYWNoIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcwoKPWN1dAoKc3ViIFRhc2tBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KFR5cGUgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRLZXkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSAmJiAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSA9fiBte1xBIFxkKyBcen1tc3ggKSB7CgogICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIGFsbCB3b3JrZXIgdGFza3MgZm9yIHRoZSBzcGVjaWZpZWQgdGFzayB0eXBlCiAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+VGFza0xpc3QoCiAgICAgICAgICAgIFR5cGUgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICk7CgogICAgICAgIG15IEBGaWx0ZXJlZExpc3QgPSBATGlzdDsKCiAgICAgICAgaWYgKCAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgdGFza3MgdGhhdCBkb2VzIG5vdCBtYXRjaCBzcGVjaWZpZWQgdGFzayBuYW1lCiAgICAgICAgICAgIEBGaWx0ZXJlZExpc3QgPSBncmVwIHsgJF8tPntOYW1lfSBlcSAkUGFyYW17TmFtZX0gfSBATGlzdDsKICAgICAgICB9CgogICAgICAgICMgY29tcGFyZSB0aGUgbnVtYmVyIG9mIHRhc2sgd2l0aCB0aGUgbWF4aW11bSBwYXJhbGxlbCBsaW1pdAogICAgICAgIHJldHVybiAtMSBpZiBzY2FsYXIgQEZpbHRlcmVkTGlzdCA+PSAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IG9mIGF0dGVtcHRzIHBhcmFtZXRlcgogICAgJFBhcmFte0F0dGVtcHRzfSB8fD0gMTsKCiAgICAjIHNlcmlhbGl6ZSBkYXRhIGFzIHN0cmluZwogICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKS0+U2VyaWFsaXplKAogICAgICAgIERhdGEgPT4gJFBhcmFte0RhdGF9LAogICAgKTsKCiAgICAjIGVuY29kZSB0YXNrIGRhdGEKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCREYXRhKTsKICAgICREYXRhID0gZW5jb2RlX2Jhc2U2NCgkRGF0YSk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15ICRJZGVudGlmaWVyOwogICAgVFJZOgogICAgZm9yIG15ICRUcnkgKCAxIC4uIDEwICkgewoKICAgICAgICAjIGNhbGN1bGF0ZSBhIHRhc2sgaWRlbnRpZmllcgogICAgICAgICRJZGVudGlmaWVyID0gJFNlbGYtPl9HZXRJZGVudGlmaWVyKCk7CgogICAgICAgICMgaW5zZXJ0IHRoZSB0YXNrIChpbml0aWFsbHkgbG9ja2VkIHdpdGggbG9ja19rZXkgPSAxIHNvIGl0IHdpbGwgbm90IGJlIHRha2VuIGJ5IGFueSB3b3JrZXIKICAgICAgICAjICAgYXQgdGhpcyBtb21lbnQpCiAgICAgICAgbGFzdCBUUlkgaWYgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHNjaGVkdWxlcl90YXNrCiAgICAgICAgICAgICAgICAgICAgKGlkZW50LCBuYW1lLCB0YXNrX3R5cGUsIHRhc2tfZGF0YSwgYXR0ZW1wdHMsIGxvY2tfa2V5LCBjcmVhdGVfdGltZSkKICAgICAgICAgICAgICAgIFZBTFVFUwogICAgICAgICAgICAgICAgICAgICg/LCA/LCA/LCA/LCA/LCAxLCBjdXJyZW50X3RpbWVzdGFtcCknLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkSWRlbnRpZmllciwKICAgICAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgICAgICBcJFBhcmFte1R5cGV9LAogICAgICAgICAgICAgICAgXCREYXRhLAogICAgICAgICAgICAgICAgXCRQYXJhbXtBdHRlbXB0c30sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0YXNrIGlkCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGlkIEZST00gc2NoZWR1bGVyX3Rhc2sgV0hFUkUgaWRlbnQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRJZGVudGlmaWVyIF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHRhc2sgaWQKICAgIG15ICRUYXNrSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGFza0lEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHVubG9jayB0aGUgdGFzaywgZm9yIG5vdyBvbiB0aGUgdGFzayBjYW4gYmUgdGFrZW4gYnkgYW55IHdvcmtlcgogICAgJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgU0VUIGxvY2tfa2V5ID0gMAogICAgICAgICAgICBXSEVSRSBsb2NrX2tleSA9IDEgQU5EIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkVGFza0lELAogICAgICAgIF0sCiAgICApOwoKICAgICMgZGVsZXRlIHRhc2sgbGlzdCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICdTY2hlZHVsZXJEQicsCiAgICAgICAgS2V5ICA9PiAnVGFza0xpc3RVbmxvY2tlZCcsCiAgICApOwoKICAgIHJldHVybiAkVGFza0lEOwp9Cgo9aGVhZDIgVGFza0dldCgpCgpnZXQgc2NoZWR1bGVyIHRhc2sKCiAgICBteSAlVGFzayA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0dldCgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJVRhc2sgPSAoCiAgICAgICAgVGFza0lEICAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdhbnkgbmFtZScsCiAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgIERhdGEgICAgICAgICAgID0+ICREYXRhUmVmLAogICAgICAgIEF0dGVtcHRzICAgICAgID0+IDEwLAogICAgICAgIExvY2tLZXkgICAgICAgID0+ICdYWVonLAogICAgICAgIExvY2tUaW1lICAgICAgID0+ICcyMDExLTAyLTA4IDE1OjA4OjAxJywKICAgICAgICBMb2NrVXBkYXRlVGltZSA9PiAnMjAxMS0wMi0wOCAxNTowODowMScsCiAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzIwMTEtMDItMDggMTU6MDg6MDAnLAogICAgKTsKCj1jdXQKCnN1YiBUYXNrR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUYXNrSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHRhc2sgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIG5hbWUsIHRhc2tfdHlwZSwgdGFza19kYXRhLCBhdHRlbXB0cywgbG9ja19rZXksIGxvY2tfdGltZSwgbG9ja191cGRhdGVfdGltZSwKICAgICAgICAgICAgICAgIGNyZWF0ZV90aW1lCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgICMgZ2V0IHN0b3JhYmxlIG9iamVjdAogICAgbXkgJFN0b3JhYmxlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0b3JhYmxlJyk7CgogICAgbXkgJVRhc2s7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgZGVjb2RlIHRhc2sgZGF0YQogICAgICAgIG15ICREZWNvZGVkRGF0YSA9IGRlY29kZV9iYXNlNjQoICREYXRhWzJdICk7CgogICAgICAgICMgZGVzZXJpYWxpemUgZGF0YQogICAgICAgIG15ICREYXRhUGFyYW0gPSAkU3RvcmFibGVPYmplY3QtPkRlc2VyaWFsaXplKCBEYXRhID0+ICREZWNvZGVkRGF0YSApOwoKICAgICAgICBpZiAoICEkRGF0YVBhcmFtICkgewoKICAgICAgICAgICAgIyBlcnJvciBsb2cKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1Rhc2sgZGF0YSBpcyBub3QgaW4gYSBjb3JyZWN0IHN0b3JhYmxlIGZvcm1hdCEgVGFza0lEOiAnIC4gJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbW92ZSBkYW1hZ2VkIHRhc2sKICAgICAgICAgICAgJFNlbGYtPlRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAlVGFzayA9ICgKICAgICAgICAgICAgVGFza0lEICAgICAgICAgPT4gJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICREYXRhWzBdLAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAkRGF0YVsxXSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gJERhdGFQYXJhbSB8fCB7fSwKICAgICAgICAgICAgQXR0ZW1wdHMgICAgICAgPT4gJERhdGFbM10sCiAgICAgICAgICAgIExvY2tLZXkgICAgICAgID0+ICREYXRhWzRdIC8vIDAsCiAgICAgICAgICAgIExvY2tUaW1lICAgICAgID0+ICREYXRhWzVdIC8vICcnLAogICAgICAgICAgICBMb2NrVXBkYXRlVGltZSA9PiAkRGF0YVs2XSAvLyAnJywKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJERhdGFbN10sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJVRhc2s7Cn0KCj1oZWFkMiBUYXNrRGVsZXRlKCkKCmRlbGV0ZSBhIHRhc2sgZnJvbSBzY2hlZHVsZXIgdGFzayBsaXN0CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tEZWxldGUoCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVGFza0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGFza0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGFza0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgdGFzayBmcm9tIHRoZSBsaXN0CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gc2NoZWR1bGVyX3Rhc2sgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgICMgZGVsZXRlIHRhc2sgbGlzdCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICdTY2hlZHVsZXJEQicsCiAgICAgICAgS2V5ICA9PiAnVGFza0xpc3RVbmxvY2tlZCcsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGFza0xpc3QoKQoKZ2V0IHRoZSBsaXN0IG9mIHNjaGVkdWxlciB0YXNrcwoKICAgIG15IEBMaXN0ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdzb21lIHR5cGUnLCAgIyBvcHRpb25hbAogICAgKTsKClJldHVybnM6CgogICAgQExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgICAgICAgICBOYW1lICAgPT4gJ2FueSBuYW1lJywKICAgICAgICAgICAgVHlwZSAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgVGFza0lEID0+IDQ1NiwKICAgICAgICAgICAgTmFtZSAgID0+ICdhbnkgb3RoZXIgbmFtZScsCiAgICAgICAgICAgIFR5cGUgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgfSwKICAgICAgICAjIC4uLgogICAgKTsKCj1jdXQKCnN1YiBUYXNrTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBuYW1lLCB0YXNrX3R5cGUgRlJPTSBzY2hlZHVsZXJfdGFzayc7CiAgICBteSBAQmluZDsKCiAgICAjIGFkZCB0eXBlCiAgICBpZiAoICRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkU1FMIC49ICcgV0hFUkUgdGFza190eXBlID0gPyc7CiAgICAgICAgQEJpbmQgPSAoIFwkUGFyYW17VHlwZX0gKTsKICAgIH0KCiAgICAkU1FMIC49ICcgT1JERVIgQlkgaWQgQVNDJzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgVGFza0lEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgICA9PiAkUm93WzFdLAogICAgICAgICAgICBUeXBlICAgPT4gJFJvd1syXSwKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiBATGlzdDsKfQoKPWhlYWQyIFRhc2tMaXN0VW5sb2NrZWQoKQoKZ2V0IGEgbGlzdCBvZiB1bmxvY2tlZCB0YXNrcwoKICAgIG15IEBUYXNrTGlzdCA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0xpc3RVbmxvY2tlZCgpOwoKUmV0dXJuczoKCiAgICBAVGFza0xpc3QgPSAoIDQ1NiwgNzg5LCAzOTUgKTsKCj1jdXQKCnN1YiBUYXNrTGlzdFVubG9ja2VkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2FjaGUgb2JqZWN0CiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIHJlYWQgY2FjaGUKICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTY2hlZHVsZXJEQicsCiAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJ1Rhc2tMaXN0VW5sb2NrZWQnLAogICAgICAgIENhY2hlSW5NZW1vcnkgID0+IDAsCiAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMSwKICAgICk7CiAgICByZXR1cm4gQHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBzY2hlZHVsZXJfdGFzayBXSEVSRSBsb2NrX2tleSA9IDAgT1JERVIgQlkgaWQgQVNDJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQExpc3QsICRSb3dbMF07CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTY2hlZHVsZXJEQicsCiAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJ1Rhc2tMaXN0VW5sb2NrZWQnLAogICAgICAgIFRUTCAgICAgICAgICAgID0+IDEwLAogICAgICAgIFZhbHVlICAgICAgICAgID0+IFxATGlzdCwKICAgICAgICBDYWNoZUluTWVtb3J5ICA9PiAwLAogICAgICAgIENhY2hlSW5CYWNrZW5kID0+IDEsCiAgICApOwoKICAgIHJldHVybiBATGlzdDsKfQoKPWhlYWQyIFRhc2tMb2NrKCkKCmxvY2tzIHRhc2sgdG8gYSBzcGVjaWZpYyBQSUQKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0xvY2soCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICAgICBOb2RlSUQgPT4gMSwgICAgIyB0aGUgaWQgb24gdGhlIG5vZGUgaW4gYSBjbHVzdGVyIGVudmlyb25tZW50CiAgICAgICAgUElEICAgID0+IDQ1NiwgICMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHdvcmtlciB0aGF0IGlzIGxvY2tpbmcgdGhlIHRhc2sKICAgICk7Cgo9Y3V0CgpzdWIgVGFza0xvY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KFRhc2tJRCBOb2RlSUQgUElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbG9jayBrZXkKICAgIG15ICRMb2NrS2V5Tm9kZUlEID0gc3ByaW50ZiAnJTAzZCcsICRQYXJhbXtOb2RlSUR9OwogICAgbXkgJExvY2tLZXlQSUQgICAgPSBzcHJpbnRmICclMDhkJywgJFBhcmFte1BJRH07CiAgICBteSAkTG9ja0tleSAgICAgICA9ICcxJyAuICRMb2NrS2V5Tm9kZUlEIC4gJExvY2tLZXlQSUQ7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBsb2NrZWQgdGFzawogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGxvY2tfa2V5IEZST00gc2NoZWR1bGVyX3Rhc2sgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJExvY2tLZXlGcm9tREJCZWZvcmUgPSAnJzsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTG9ja0tleUZyb21EQkJlZm9yZSA9ICREYXRhWzBdIHx8ICcnOwogICAgfQoKICAgIHJldHVybiAxIGlmICRMb2NrS2V5RnJvbURCQmVmb3JlIGVxICRMb2NrS2V5OwoKICAgICMgbG9jayB0aGUgdGFzayBpbiBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICBTRVQgbG9ja19rZXkgPSA/LCBsb2NrX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgbG9ja191cGRhdGVfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gMCBBTkQgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRMb2NrS2V5LAogICAgICAgICAgICBcJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgbG9ja2VkIHRhc2sKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBsb2NrX2tleSwgYXR0ZW1wdHMgRlJPTSBzY2hlZHVsZXJfdGFzayBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTG9ja0tleUZyb21EQiA9ICcnOwogICAgbXkgJEF0dGVtcHRzICAgICAgPSAwOwogICAgd2hpbGUgKCBteSBARGF0YSA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMb2NrS2V5RnJvbURCID0gJERhdGFbMF07CiAgICAgICAgJEF0dGVtcHRzICAgICAgPSAkRGF0YVsxXTsKICAgIH0KCiAgICByZXR1cm4gaWYgJExvY2tLZXlGcm9tREIgbmUgJExvY2tLZXk7CgogICAgIyByZW1vdmUgdGFzayBpZiBhdHRlbXB0cyBpcyAwCiAgICBpZiAoICEkQXR0ZW1wdHMgKSB7CiAgICAgICAgJFNlbGYtPlRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgJEF0dGVtcHRzLS07CgogICAgICAgICMgZGVjcmVtZW50IG51bWJlciBvZiBhdHRlbXB0cwogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgICAgIFNFVCBhdHRlbXB0cyA9ID8KICAgICAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gPyBBTkQgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJEF0dGVtcHRzLAogICAgICAgICAgICAgICAgXCRMb2NrS2V5LAogICAgICAgICAgICAgICAgXCRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgbGlzdCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICdTY2hlZHVsZXJEQicsCiAgICAgICAgS2V5ICA9PiAnVGFza0xpc3RVbmxvY2tlZCcsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGFza0NsZWFudXAoKQoKZGVsZXRlcyBvYnNvbGV0ZSB3b3JrZXIgdGFza3MKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0NsZWFudXAoKTsKCj1jdXQKCnN1YiBUYXNrQ2xlYW51cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBMaXN0ID0gJFNlbGYtPlRhc2tMaXN0KCk7CgogICAgVEFTS0lURU06CiAgICBmb3IgbXkgJFRhc2tJdGVtIChATGlzdCkgewoKICAgICAgICBteSAlVGFzayA9ICRTZWxmLT5UYXNrR2V0KAogICAgICAgICAgICBUYXNrSUQgPT4gJFRhc2tJdGVtLT57VGFza0lEfSwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgaWYgdGFzayBkb2VzIG5vdCBoYXZlIGEgbG9jayBrZXkKICAgICAgICBuZXh0IFRBU0tJVEVNIGlmICEkVGFza3tMb2NrS2V5fTsKCiAgICAgICAgIyBza2lwIGlmIHRoZSBsb2NrIGtleSBpcyBpbnZhbGlkCiAgICAgICAgbmV4dCBUQVNLSVRFTSBpZiAkVGFza3tMb2NrS2V5fSA8IDE7CgogICAgICAgICMgZ2V0IHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpOwoKICAgICAgICAjIGdldCBleHBpcmF0aW9uIHRpbWUuIDcgZGF5cyBhZ28gc3lzdGVtIHRpbWUKICAgICAgICBteSAkRXhwaXJlZFRpbWUgPSAkU3lzdGVtVGltZSAtICggNjAgKiA2MCAqIDI0ICogNyApOwoKICAgICAgICBteSAkTG9ja1RpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVGFza3tMb2NrVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExvY2tUaW1lID0gJExvY2tUaW1lID8gJExvY2tUaW1lLT5Ub0Vwb2NoKCkgOiAwOwoKICAgICAgICAjIHNraXAgaWYgdGFzayBpcyBub3QgZXhwaXJlZAogICAgICAgIG5leHQgVEFTS0lURU0gaWYgJExvY2tUaW1lID4gJEV4cGlyZWRUaW1lOwoKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5UYXNrRGVsZXRlKAogICAgICAgICAgICBUYXNrSUQgPT4gJFRhc2t7VGFza0lEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBkZWxldGUgdGFzayAkVGFza3tOYW1lfS0kVGFza3tUeXBlfSAoJFRhc2t7VGFza0lEfSlcbiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGFza1N1bW1hcnkoKQoKZ2V0IGEgc3VtbWFyeSBvZiB0aGUgdGFza3MgZnJvbSB0aGUgd29ya2VyIHRhc2sgdGFibGUgZGl2aWRlZCBpbnRvIGhhbmRsZWQgYW5kIHVuaGFuZGxlZAoKICAgIG15IEBTdW1tYXJ5ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrU3VtbWFyeSgpOwoKPWN1dAoKc3ViIFRhc2tTdW1tYXJ5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgIHJldHVybiAoKSBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCwgbmFtZSwgdGFza190eXBlLCBsb2NrX2tleSwgbG9ja190aW1lLCBjcmVhdGVfdGltZQogICAgICAgICAgICBGUk9NIHNjaGVkdWxlcl90YXNrCiAgICAgICAgICAgIE9SREVSIEJZIGlkIEFTQycsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBMaXN0LCB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgVHlwZSAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBMb2NrS2V5ICAgID0+ICRSb3dbM10gLy8gMCwKICAgICAgICAgICAgTG9ja1RpbWUgICA9PiAkUm93WzRdIC8vICcnLAogICAgICAgICAgICBDcmVhdGVUaW1lID0+ICRSb3dbNV0sCiAgICAgICAgfTsKICAgIH0KCiAgICBteSBASGFuZGxlZFRhc2tzOwogICAgbXkgQFVuaGFuZGxlZFRhc2tzOwoKICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvRXBvY2goKTsKCiAgICBUQVNLOgogICAgZm9yIG15ICRUYXNrIChATGlzdCkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoZSB0YXNrIGlzIHVubG9ja2VkIG9yIGxvY2sga2V5IGlzIG5vdCB2YWxpZCAodW5oYW5kbGVkIHRhc2tzKQogICAgICAgIGlmICggJFRhc2stPntMb2NrS2V5fSA8IDEgKSB7CiAgICAgICAgICAgIHB1c2ggQFVuaGFuZGxlZFRhc2tzLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRUYXNrLT57TmFtZX0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgID0+ICRUYXNrLT57VHlwZX0sCiAgICAgICAgICAgICAgICBDcmVhdGVUaW1lID0+ICRUYXNrLT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBOb2RlSUQgYW5kIFByb2Nlc3NJRCBmcm9tIHRoZSBsb2NrIGtleQogICAgICAgICAgICBteSAoICROb2RlSUQsICRQcm9jZXNzSUQgKSA9ICRUYXNrLT57TG9ja0tleX0gPX4gbXtcQSAxIChcZHszfSkgKFxkezh9KSBcen1tc3g7CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSBkdXJhdGlvbiBmcm9tIGxvY2sgdGltZQogICAgICAgICAgICBteSAkQ3VycmVudER1cmF0aW9uOwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFRhc2stPntMb2NrVGltZX0gKSB7CiAgICAgICAgICAgICAgICBteSAkTG9ja1N5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVGFzay0+e0xvY2tUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMb2NrU3lzdGVtVGltZSA9ICRMb2NrU3lzdGVtVGltZSA/ICRMb2NrU3lzdGVtVGltZS0+VG9FcG9jaCgpIDogMDsKCiAgICAgICAgICAgICAgICAkQ3VycmVudER1cmF0aW9uID0gJFNlbGYtPl9TZWNvbmRzMlN0cmluZyggJFN5c3RlbVRpbWUgLSAkTG9ja1N5c3RlbVRpbWUgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBASGFuZGxlZFRhc2tzLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJFRhc2stPntOYW1lfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAkVGFzay0+e1R5cGV9LAogICAgICAgICAgICAgICAgTm9kZUlEICAgICAgICAgID0+ICROb2RlSUQsCiAgICAgICAgICAgICAgICBQcm9jZXNzSUQgICAgICAgPT4gJFByb2Nlc3NJRCwKICAgICAgICAgICAgICAgIExvY2tUaW1lICAgICAgICA9PiAkVGFzay0+e0xvY2tUaW1lfSwKICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICA9PiAkVGFzay0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgQ3VycmVudER1cmF0aW9uID0+ICRDdXJyZW50RHVyYXRpb24KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgICB7CiAgICAgICAgICAgIEhlYWRlciA9PiAnVW5oYW5kbGVkIFdvcmtlciBUYXNrczonLAogICAgICAgICAgICBDb2x1bW4gPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDcmVhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnQ3JlYXRlIFRpbWUnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcQFVuaGFuZGxlZFRhc2tzLAogICAgICAgICAgICBOb0RhdGFNZXNzYWdlID0+ICdUaGVyZSBhcmUgY3VycmVudGx5IG5vIHRhc2tzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgSGVhZGVyID0+ICdIYW5kbGVkIFdvcmtlciBUYXNrczonLAogICAgICAgICAgICBDb2x1bW4gPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOb2RlSUQnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdOSUQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcm9jZXNzSUQnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdQSUQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDdXJyZW50RHVyYXRpb24nLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdEdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFxASGFuZGxlZFRhc2tzLAogICAgICAgICAgICBOb0RhdGFNZXNzYWdlID0+ICdUaGVyZSBhcmUgY3VycmVudGx5IG5vIHRhc2tzIGJlaW5nIGV4ZWN1dGVkLicsCiAgICAgICAgfSwKICAgICk7Cn0KCj1oZWFkMiBUYXNrTG9ja1VwZGF0ZSgpCgpzZXRzIHRoZSB0YXNrIGxvY2sgdXBkYXRlIHRpbWUgYXMgY3VycmVudCB0aW1lIGZvciB0aGUgc3BlY2lmaWVkIHRhc2tzCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tMb2NrVXBkYXRlKAogICAgICAgIFRhc2tJRHMgPT4gWzEyMywgNDU2XSwKICAgICk7Cgo9Y3V0CgpzdWIgVGFza0xvY2tVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17VGFza0lEc30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRhc2tJRHMgaXMgbWlzc2luZyBvciBpbnZhbGlkISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJFRhc2tJRHMgPSBqb2luICcsJywgbWFwIHsgJERCT2JqZWN0LT5RdW90ZSggJF8sICdJbnRlZ2VyJyApIH0gQHsgJFBhcmFte1Rhc2tJRHN9IH07CgogICAgcmV0dXJuIDEgaWYgISRUYXNrSURzOwoKICAgICMgc2V0IGxvY2sgdXBkYXRlIHRpbWUgaW4gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgU0VUIGxvY2tfdXBkYXRlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcAogICAgICAgICAgICBXSEVSRSBpZCBJTiAoICRUYXNrSURzICkiLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFRhc2tVbmxvY2tFeHBpcmVkKCkKCnJlbW92ZSBsb2NrIHN0YXR1cyBmb3Igd29ya2luZyB0YXNrcyB0aGF0IGhhcyBub3QgYmVlbiB1cGRhdGVkIGl0cyBsb2NrIHVwZGF0ZSB0aW1lIGZvciBtb3JlIHRoYW4gNSBtaW51dGVzCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tVbmxvY2tFeHBpcmVkKCk7Cgo9Y3V0CgpzdWIgVGFza1VubG9ja0V4cGlyZWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlIChnZXQgYWxsIHdvcmtlciB0YXNrcyB3aXRoIGEgbG9jayBrZXkgZGlmZmVyZW50IHRoYW4gMCkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCwgbmFtZSwgbG9ja191cGRhdGVfdGltZQogICAgICAgICAgICBGUk9NIHNjaGVkdWxlcl90YXNrCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5IDw+IDAKICAgICAgICAgICAgICAgIEFORCBsb2NrX2tleSA8PiAxCiAgICAgICAgICAgIE9SREVSIEJZIGlkIEFTQycsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gdGltZQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvRXBvY2goKTsKCiAgICAgICAgIyBjb252ZXJ0IGxvY2sgdXBkYXRlIHRpbWUgc3RhbXAgdG8gYSBzeXN0ZW0gdGltZQogICAgICAgIG15ICRMb2NrVXBkYXRlVGltZSA9IDA7CgogICAgICAgIGlmICggJFJvd1syXSApIHsKICAgICAgICAgICAgJExvY2tVcGRhdGVUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFJvd1syXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMb2NrVXBkYXRlVGltZSA9ICRMb2NrVXBkYXRlVGltZSA/ICRMb2NrVXBkYXRlVGltZS0+VG9FcG9jaCgpIDogMDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJMb2NrIFVwZGF0ZSBUaW1lIG1pc3NpbmcgZm9yIHRhc2sgJFJvd1sxXSEgKCRSb3dbMF0pIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2tpcCB0YXNrIGlmIGl0IGhhcyBiZWVuIGxvY2tlZCB1cGRhdGUgdGltZSBpcyBpbiB3aXRoaW4gdGhlIGxhc3QgNSBtaW51dGVzCiAgICAgICAgbmV4dCBST1cgaWYgJFN5c3RlbVRpbWUgLSAkTG9ja1VwZGF0ZVRpbWUgPCAoIDYwICogNSApOwoKICAgICAgICBwdXNoIEBMaXN0LCB7CiAgICAgICAgICAgIFRhc2tJRCAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIExvY2tUaW1lID0+ICRSb3dbMl0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHN0b3AgaWYgdGhlcmUgYXJlIG5vIHRhc2tzIHRvIHVubG9jawogICAgcmV0dXJuIDEgaWYgIUBMaXN0OwoKICAgIGZvciBteSAkVGFzayAoQExpc3QpIHsKCiAgICAgICAgIyB1bmxvY2sgYWxsIHRoZSB0YXNrIHRoYXQgaGFzIGJlZW4gbG9ja2VkIGZvciBtb3JlIHRoYW4gMSBtaW51dGUKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICAgICAgU0VUIGxvY2tfa2V5ID0gMCwgbG9ja190aW1lID0gTlVMTCwgbG9ja191cGRhdGVfdGltZSA9IE5VTEwKICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRhc2stPntUYXNrSUR9LCBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGdXR1cmVUYXNrQWRkKCkKCmFkZCBhIG5ldyB0YXNrIHRvIHNjaGVkdWxlciBmdXR1cmUgdGFzayBsaXN0CgogICAgbXkgJFRhc2tJRCA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza0FkZCgKICAgICAgICBFeGVjdXRpb25UaW1lICAgICAgICAgICAgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsICAjIGUuIGcuIEdlbmVyaWNJbnRlcmZhY2UsIFRlc3QKICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgPT4gJ2FueSBuYW1lJywgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIEF0dGVtcHRzICAgICAgICAgICAgICAgICA9PiA1LCAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIChkZWZhdWx0IDEpCiAgICAgICAgTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzID0+IDIsICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgKGRlZmF1bHQgMCksIG51bWJlciBvZiB0YXNrcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgd2l0aCB0aGUgc2FtZSB0eXBlIChhbmQgbmFtZSBpZiBwcm92aWRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRoYXQgY2FuIGV4aXN0cyBhdCB0aGUgc2FtZSB0aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgdmFsdWUgb2YgMCBtZWFucyB1bmxpbWl0ZWQKICAgICAgICBEYXRhID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkYXRhIHBheWxvYWQKICAgICAgICAgICAgLi4uCiAgICAgICAgfSwKICAgICk7CgpSZXR1cm5zOgoKICAgIG15ICRUYXNrSUQgPSAxMjM7ICAjIG9yIGZhbHNlIGluIGNhc2Ugb2YgYW4gZXJyb3IKCj1jdXQKCnN1YiBGdXR1cmVUYXNrQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkS2V5IChxdyhFeGVjdXRpb25UaW1lIFR5cGUgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRLZXkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBFeGVjdXRpb25UaW1lCgogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RXhlY3V0aW9uVGltZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFN5c3RlbVRpbWUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFeGVjdXRpb25UaW1lIGlzIGludmFsaWQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CiAgICAkU3lzdGVtVGltZSA9ICRTeXN0ZW1UaW1lLT5Ub0Vwb2NoKCk7CgogICAgaWYgKCAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSAmJiAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSA9fiBte1xBIFxkKyBcen1tc3ggKSB7CgogICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIGFsbCBmdXR1cmUgdGFza3MgZm9yIHRoZSBzcGVjaWZpZWQgdGFzayB0eXBlCiAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+RnV0dXJlVGFza0xpc3QoCiAgICAgICAgICAgIFR5cGUgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICk7CgogICAgICAgIG15IEBGaWx0ZXJlZExpc3QgPSBATGlzdDsKICAgICAgICBpZiAoICRQYXJhbXtOYW1lfSAmJiBATGlzdCApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCB0YXNrcyB0aGF0IGRvZXMgbm90IG1hdGNoIHNwZWNpZmllZCB0YXNrIG5hbWUKICAgICAgICAgICAgQEZpbHRlcmVkTGlzdCA9IGdyZXAgeyAoICRfLT57TmFtZX0gfHwgJycgKSBlcSAkUGFyYW17TmFtZX0gfSBATGlzdDsKICAgICAgICB9CgogICAgICAgICMgY29tcGFyZSB0aGUgbnVtYmVyIG9mIHRhc2sgd2l0aCB0aGUgbWF4aW11bSBwYXJhbGxlbCBsaW1pdAogICAgICAgIHJldHVybiAtMSBpZiBzY2FsYXIgQEZpbHRlcmVkTGlzdCA+PSAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IG9mIGF0dGVtcHRzIHBhcmFtZXRlcgogICAgJFBhcmFte0F0dGVtcHRzfSB8fD0gMTsKCiAgICAjIHNlcmlhbGl6ZSBkYXRhIGFzIHN0cmluZwogICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKS0+U2VyaWFsaXplKAogICAgICAgIERhdGEgPT4gJFBhcmFte0RhdGF9LAogICAgKTsKCiAgICAjIGVuY29kZSB0YXNrIGRhdGEKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCREYXRhKTsKICAgICREYXRhID0gZW5jb2RlX2Jhc2U2NCgkRGF0YSk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15ICRJZGVudGlmaWVyOwogICAgVFJZOgogICAgZm9yIG15ICRUcnkgKCAxIC4uIDEwICkgewoKICAgICAgICAjIGNhbGN1bGF0ZSBhIHRhc2sgaWRlbnRpZmllcgogICAgICAgICRJZGVudGlmaWVyID0gJFNlbGYtPl9HZXRJZGVudGlmaWVyKCk7CgogICAgICAgICMgaW5zZXJ0IHRoZSBmdXR1cmUgdGFzayAoaW5pdGlhbGx5IGxvY2tlZCB3aXRoIGxvY2tfa2V5ID0gMSBzbyBpdCB3aWxsIG5vdCBiZSB0YWtlbiBieSBhbnkKICAgICAgICAjICAgIG1vdmVkIGludG8gd29ya2VyIHRhc2sgbGlzdCBhdCB0aGlzIG1vbWVudCkKICAgICAgICBsYXN0IFRSWSBpZiAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gc2NoZWR1bGVyX2Z1dHVyZV90YXNrCiAgICAgICAgICAgICAgICAgICAgKGlkZW50LCBleGVjdXRpb25fdGltZSwgbmFtZSwgdGFza190eXBlLCB0YXNrX2RhdGEsIGF0dGVtcHRzLCBsb2NrX2tleSwgY3JlYXRlX3RpbWUpCiAgICAgICAgICAgICAgICBWQUxVRVMKICAgICAgICAgICAgICAgICAgICAoPywgPywgPywgPywgPywgPywgMSwgY3VycmVudF90aW1lc3RhbXApJywKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJElkZW50aWZpZXIsCiAgICAgICAgICAgICAgICBcJFBhcmFte0V4ZWN1dGlvblRpbWV9LAogICAgICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17VHlwZX0sCiAgICAgICAgICAgICAgICBcJERhdGEsCiAgICAgICAgICAgICAgICBcJFBhcmFte0F0dGVtcHRzfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRhc2sgaWQKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgaWQgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sgV0hFUkUgaWRlbnQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRJZGVudGlmaWVyIF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHRhc2sgaWQKICAgIG15ICRUYXNrSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGFza0lEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHVubG9jayB0aGUgdGFzaywgZm9yIG5vdyBvbiB0aGUgdGFzayBjYW4gYmUgbW92ZWQgdG8gdGhlIHdvcmtlciB0YXNrIGxpc3QKICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl9mdXR1cmVfdGFzawogICAgICAgICAgICBTRVQgbG9ja19rZXkgPSAwCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gMSBBTkQgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRUYXNrSUQsCiAgICAgICAgXSwKICAgICk7CgogICAgIyBkZWxldGUgZnV0dXJlIHRhc2sgbGlzdCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICdTY2hlZHVsZXJEQicsCiAgICAgICAgS2V5ICA9PiAnRnV0dXJlVGFza0xpc3RVbmxvY2tlZCcsICAgICMgVE9ETyBGSVhNRQogICAgKTsKCiAgICByZXR1cm4gJFRhc2tJRDsKfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0Cgo9aGVhZDIgRnV0dXJlVGFza1VwZGF0ZSgpCgp1cGRhdGVzIGFuIGV4aXN0aW5nIHRhc2sgaW4gdGhlIHNjaGVkdWxlciBmdXR1cmUgdGFzayBsaXN0CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tVcGRhdGUoCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICAgICBFeGVjdXRpb25UaW1lID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgLi4uCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgRnV0dXJlVGFza1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoVGFza0lEIEV4ZWN1dGlvblRpbWUgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRLZXkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBFeGVjdXRpb25UaW1lCgogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RXhlY3V0aW9uVGltZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFN5c3RlbVRpbWUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFeGVjdXRpb25UaW1lIGlzIGludmFsaWQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CiAgICAkU3lzdGVtVGltZSA9ICRTeXN0ZW1UaW1lLT5Ub0Vwb2NoKCk7CgogICAgaWYgKCAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSAmJiAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSA9fiBte1xBIFxkKyBcen1tc3ggKSB7CgogICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIGFsbCBmdXR1cmUgdGFza3MgZm9yIHRoZSBzcGVjaWZpZWQgdGFzayB0eXBlCiAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+RnV0dXJlVGFza0xpc3QoCiAgICAgICAgICAgIFR5cGUgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICk7CgogICAgICAgIG15IEBGaWx0ZXJlZExpc3QgPSBATGlzdDsKICAgICAgICBpZiAoICRQYXJhbXtOYW1lfSAmJiBATGlzdCApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCB0YXNrcyB0aGF0IGRvZXMgbm90IG1hdGNoIHNwZWNpZmllZCB0YXNrIG5hbWUKICAgICAgICAgICAgQEZpbHRlcmVkTGlzdCA9IGdyZXAgeyAoICRfLT57TmFtZX0gfHwgJycgKSBlcSAkUGFyYW17TmFtZX0gfSBATGlzdDsKICAgICAgICB9CgogICAgICAgICMgY29tcGFyZSB0aGUgbnVtYmVyIG9mIHRhc2sgd2l0aCB0aGUgbWF4aW11bSBwYXJhbGxlbCBsaW1pdAogICAgICAgIHJldHVybiAtMSBpZiBzY2FsYXIgQEZpbHRlcmVkTGlzdCA+PSAkUGFyYW17TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IG9mIGF0dGVtcHRzIHBhcmFtZXRlcgogICAgJFBhcmFte0F0dGVtcHRzfSB8fD0gMTsKCiAgICAjIHNlcmlhbGl6ZSBkYXRhIGFzIHN0cmluZwogICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKS0+U2VyaWFsaXplKAogICAgICAgIERhdGEgPT4gJFBhcmFte0RhdGF9LAogICAgKTsKCiAgICAjIGVuY29kZSB0YXNrIGRhdGEKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCREYXRhKTsKICAgICREYXRhID0gZW5jb2RlX2Jhc2U2NCgkRGF0YSk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIFRSWToKICAgIGZvciBteSAkVHJ5ICggMSAuLiAxMCApIHsKCiAgICAgICAgIyBpbnNlcnQgdGhlIGZ1dHVyZSB0YXNrIChpbml0aWFsbHkgbG9ja2VkIHdpdGggbG9ja19rZXkgPSAxIHNvIGl0IHdpbGwgbm90IGJlIHRha2VuIGJ5IGFueQogICAgICAgICMgICAgbW92ZWQgaW50byB3b3JrZXIgdGFzayBsaXN0IGF0IHRoaXMgbW9tZW50KQogICAgICAgIGxhc3QgVFJZIGlmICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX2Z1dHVyZV90YXNrCiAgICAgICAgICAgICAgICBTRVQgZXhlY3V0aW9uX3RpbWUgPSA/LCB0YXNrX2RhdGEgPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkUGFyYW17RXhlY3V0aW9uVGltZX0sCiAgICAgICAgICAgICAgICBcJERhdGEsCiAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBsaXN0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgID0+ICdGdXR1cmVUYXNrTGlzdFVubG9ja2VkJywgICAgIyBUT0RPIEZJWE1FCiAgICApOwoKICAgIHJldHVybiAxOwp9CgojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCj1oZWFkMiBGdXR1cmVUYXNrR2V0KCkKCmdldCBzY2hlZHVsZXIgZnV0dXJlIHRhc2sKCiAgICBteSAlVGFzayA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza0dldCgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJVRhc2sgPSAoCiAgICAgICAgVGFza0lEICAgICAgICA9PiAxMjMsCiAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnYW55IG5hbWUnLAogICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgIERhdGEgICAgICAgICAgPT4gJERhdGFSZWYsCiAgICAgICAgQXR0ZW1wdHMgICAgICA9PiAxMCwKICAgICAgICBMb2NrS2V5ICAgICAgID0+ICdYWVonLAogICAgICAgIExvY2tUaW1lICAgICAgPT4gJzIwMTEtMDItMDggMTU6MDg6MDEnLAogICAgICAgIENyZWF0ZVRpbWUgICAgPT4gJzIwMTEtMDItMDggMTU6MDg6MDAnLAogICAgKTsKCj1jdXQKCnN1YiBGdXR1cmVUYXNrR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUYXNrSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHRhc2sgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgZXhlY3V0aW9uX3RpbWUsIG5hbWUsIHRhc2tfdHlwZSwgdGFza19kYXRhLCBhdHRlbXB0cywgbG9ja19rZXksIGxvY2tfdGltZSwgY3JlYXRlX3RpbWUKICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgICMgZ2V0IHN0b3JhYmxlIG9iamVjdAogICAgbXkgJFN0b3JhYmxlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0b3JhYmxlJyk7CgogICAgbXkgJVRhc2s7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgZGVjb2RlIHRhc2sgZGF0YQogICAgICAgIG15ICREZWNvZGVkRGF0YSA9IGRlY29kZV9iYXNlNjQoICREYXRhWzNdICk7CgogICAgICAgICMgZGVzZXJpYWxpemUgZGF0YQogICAgICAgIG15ICREYXRhUGFyYW0gPSAkU3RvcmFibGVPYmplY3QtPkRlc2VyaWFsaXplKCBEYXRhID0+ICREZWNvZGVkRGF0YSApOwoKICAgICAgICBpZiAoICEkRGF0YVBhcmFtICkgewoKICAgICAgICAgICAgIyBlcnJvciBsb2cKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Z1dHVyZSB0YXNrIGRhdGEgaXMgbm90IGluIGEgY29ycmVjdCBzdG9yYWJsZSBmb3JtYXQhIFRhc2tJRDogJyAuICRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZW1vdmUgZGFtYWdlZCBmdXR1cmUgdGFzawogICAgICAgICAgICAkU2VsZi0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICVUYXNrID0gKAogICAgICAgICAgICBUYXNrSUQgICAgICAgID0+ICRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICBFeGVjdXRpb25UaW1lID0+ICREYXRhWzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICREYXRhWzJdLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+ICREYXRhUGFyYW0gfHwge30sCiAgICAgICAgICAgIEF0dGVtcHRzICAgICAgPT4gJERhdGFbNF0sCiAgICAgICAgICAgIExvY2tLZXkgICAgICAgPT4gJERhdGFbNV0gLy8gMCwKICAgICAgICAgICAgTG9ja1RpbWUgICAgICA9PiAkRGF0YVs2XSAvLyAnJywKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICA9PiAkRGF0YVs3XSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlVGFzazsKfQoKPWhlYWQyIEZ1dHVyZVRhc2tEZWxldGUoKQoKZGVsZXRlIGEgdGFzayBmcm9tIHNjaGVkdWxlciBmdXR1cmUgdGFzayBsaXN0CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgRnV0dXJlVGFza0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGFza0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGFza0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgdGFzayBmcm9tIHRoZSBmdXR1cmUgbGlzdAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHNjaGVkdWxlcl9mdXR1cmVfdGFzayBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgZnV0dXJlIHRhc2sgbGlzdCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICdTY2hlZHVsZXJEQicsCiAgICAgICAgS2V5ICA9PiAnRnV0dXJlVGFza0xpc3RVbmxvY2tlZCcsICAgICMgVE9ETyBGSVhNRQogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZ1dHVyZVRhc2tMaXN0KCkKCmdldCB0aGUgbGlzdCBvZiBzY2hlZHVsZXIgZnV0dXJlIHRhc2tzCgogICAgbXkgQExpc3QgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ3NvbWUgdHlwZScsICAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJuczoKCiAgICBATGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIFRhc2tJRCAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBFeGVjdXRpb25UaW1lID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnYW55IG5hbWUnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgVGFza0lEICAgICAgICA9PiA0NTYsCiAgICAgICAgICAgIEV4ZWN1dGlvblRpbWUgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdhbnkgb3RoZXIgbmFtZScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgIH0sCiAgICAgICAgIyAuLi4KICAgICk7Cgo9Y3V0CgpzdWIgRnV0dXJlVGFza0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCwgZXhlY3V0aW9uX3RpbWUsIG5hbWUsIHRhc2tfdHlwZSBGUk9NIHNjaGVkdWxlcl9mdXR1cmVfdGFzayc7CiAgICBteSBAQmluZDsKCiAgICAjIGFkZCB0eXBlCiAgICBpZiAoICRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkU1FMIC49ICcgV0hFUkUgdGFza190eXBlID0gPyc7CiAgICAgICAgQEJpbmQgPSAoIFwkUGFyYW17VHlwZX0gKTsKICAgIH0KCiAgICAkU1FMIC49ICcgT1JERVIgQlkgaWQgQVNDJzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgVGFza0lEICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBFeGVjdXRpb25UaW1lID0+ICRSb3dbMV0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAkUm93WzNdLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aGVhZDIgRnV0dXJlVGFza1RvRXhlY3V0ZSgpCgptb3ZlcyBhbGwgZnV0dXJlIHRhc2tzIHdpdGggcmVhY2hlZCBleGVjdXRpb24gdGltZSB0byB0aGUgdGFzayB0YWJsZSB0byBleGVjdXRlCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tUb0V4ZWN1dGUoCiAgICAgICAgTm9kZUlEID0+IDEsICAgICMgdGhlIElEIG9mIHRoZSBub2RlIGluIGEgY2x1c3RlciBlbnZpcm9ubWVudAogICAgICAgIFBJRCAgICA9PiA0NTYsICAjIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBkYWVtb24gdGhhdCBpcyBtb3ZpbmcgdGhlIHRhc2tzIHRvIGV4ZWN1dGlvbgogICAgKTsKCj1jdXQKCnN1YiBGdXR1cmVUYXNrVG9FeGVjdXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkS2V5IChxdyhOb2RlSUQgUElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbG9jayBrZXkKICAgIG15ICRMb2NrS2V5Tm9kZUlEID0gc3ByaW50ZiAnJTAzZCcsICRQYXJhbXtOb2RlSUR9OwogICAgbXkgJExvY2tLZXlQSUQgICAgPSBzcHJpbnRmICclMDhkJywgJFBhcmFte1BJRH07CiAgICBteSAkTG9ja0tleSAgICAgICA9ICcxJyAuICRMb2NrS2V5Tm9kZUlEIC4gJExvY2tLZXlQSUQ7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZQogICAgbXkgJEN1cnJlbnRUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CgogICAgIyBsb2NrIHRoZSB0YXNrIGluIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl9mdXR1cmVfdGFzawogICAgICAgICAgICBTRVQgbG9ja19rZXkgPSA/LCBsb2NrX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcAogICAgICAgICAgICBXSEVSRSBsb2NrX2tleSA9IDAgQU5EIGV4ZWN1dGlvbl90aW1lIDw9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJExvY2tLZXksCiAgICAgICAgICAgIFwkQ3VycmVudFRpbWUsCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgYWxsIGxvY2tlZCBmdXR1cmUgdGFza3MKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCwgbmFtZSwgdGFza190eXBlLCB0YXNrX2RhdGEsIGF0dGVtcHRzCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX2Z1dHVyZV90YXNrCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gPwogICAgICAgICAgICBPUkRFUiBCWSBleGVjdXRpb25fdGltZSBBU0MnLAogICAgICAgIEJpbmQgPT4gWyBcJExvY2tLZXkgXSwKICAgICk7CgogICAgIyBnZXQgc3RvcmFibGUgb2JqZWN0CiAgICBteSAkU3RvcmFibGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBGdXR1cmVUYXNrTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIGRlY29kZSB0YXNrIGRhdGEKICAgICAgICBteSAkRGVjb2RlZERhdGEgPSBkZWNvZGVfYmFzZTY0KCAkUm93WzNdICk7CgogICAgICAgICMgZGVzZXJpYWxpemUgZGF0YQogICAgICAgIG15ICREYXRhUGFyYW0gPSAkU3RvcmFibGVPYmplY3QtPkRlc2VyaWFsaXplKCBEYXRhID0+ICREZWNvZGVkRGF0YSApOwoKICAgICAgICBpZiAoICEkRGF0YVBhcmFtICkgewoKICAgICAgICAgICAgIyBlcnJvciBsb2cKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Z1dHVyZSB0YXNrIGRhdGEgaXMgbm90IGluIGEgY29ycmVjdCBzdG9yYWJsZSBmb3JtYXQhIFRhc2tJRDogJyAuICRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZW1vdmUgZGFtYWdlZCBmdXR1cmUgdGFzawogICAgICAgICAgICAkU2VsZi0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICVUYXNrID0gKAogICAgICAgICAgICBUYXNrSUQgICA9PiAkUm93WzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBUeXBlICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBEYXRhICAgICA9PiAkRGF0YVBhcmFtIHx8IHt9LAogICAgICAgICAgICBBdHRlbXB0cyA9PiAkUm93WzRdLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQEZ1dHVyZVRhc2tMaXN0LCBcJVRhc2s7CiAgICB9CgogICAgIyBtb3ZlIHRhc2tzIHRvIHRoZSBleGVjdXRpb24gdGFzayBsaXN0CiAgICBmb3IgbXkgJEZ1dHVyZVRhc2sgKEBGdXR1cmVUYXNrTGlzdCkgewoKICAgICAgICBteSAlVGFzayA9ICV7JEZ1dHVyZVRhc2t9OwoKICAgICAgICBkZWxldGUgJFRhc2t7VGFza0lEfTsKCiAgICAgICAgIyBhZGQgdGFzayB0byB0aGUgbGlzdAogICAgICAgICRTZWxmLT5UYXNrQWRkKCVUYXNrKTsKCiAgICAgICAgIyByZW1vdmUgZnV0dXJlIHRhc2sKICAgICAgICAkU2VsZi0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgVGFza0lEID0+ICRGdXR1cmVUYXNrLT57VGFza0lEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRnV0dXJlVGFza1N1bW1hcnkoKQoKZ2V0IGEgc3VtbWFyeSBvZiB0aGUgdGFza3MgZnJvbSB0aGUgZnV0dXJlIHRhc2sgdGFibGUKCiAgICBteSBAU3VtbWFyeSA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza1N1bW1hcnkoKTsKCj1jdXQKCnN1YiBGdXR1cmVUYXNrU3VtbWFyeSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBMaXN0ID0gJFNlbGYtPkZ1dHVyZVRhc2tMaXN0KCk7CgogICAgcmV0dXJuICgKICAgICAgICB7CiAgICAgICAgICAgIEhlYWRlciA9PiAnVGFza3MgdG8gYmUgZXhlY3V0ZWQgaW4gZnV0dXJlOicsCiAgICAgICAgICAgIENvbHVtbiA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiA0MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0V4ZWN1dGlvblRpbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdUbyBFeGVjdXRlIEF0JywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXEBMaXN0LAogICAgICAgICAgICBOb0RhdGFNZXNzYWdlID0+ICdUaGVyZSBhcmUgY3VycmVudGx5IG5vIHRhc2tzIHRvIGJlIGV4ZWN1dGVkIGluIGZ1dHVyZS4nLAogICAgICAgIH0sCiAgICApOwp9Cgo9aGVhZDIgQ3JvblRhc2tUb0V4ZWN1dGUoKQoKY3JlYXRlcyBjcm9uIHRhc2tzIHRoYXQgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSBjdXJyZW50IHRpbWUgaW50byB0aGUgdGFzayB0YWJsZSB0byBleGVjdXRlCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkNyb25UYXNrVG9FeGVjdXRlKAogICAgICAgIE5vZGVJRCA9PiAxLCAgICAjIHRoZSBJRCBvZiB0aGUgbm9kZSBpbiBhIGNsdXN0ZXIgZW52aXJvbm1lbnQKICAgICAgICBQSUQgICAgPT4gNDU2LCAgIyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgZGFlbW9uIHRoYXQgaXMgY3JlYXRpbmcgdGhlIHRhc2tzIHRvIGV4ZWN1dGlvbgogICAgKTsKCj1jdXQKCnN1YiBDcm9uVGFza1RvRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoTm9kZUlEIFBJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRLZXkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3JvbiBjb25maWcKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrJykgfHwge307CgogICAgIyBkbyBub3RoaW5nIGlmIHRoZXJlIGFyZSBubyBjcm9uIHRhc2tzIGRlZmluaXRpb25zIGluIFN5c0NvbmZpZwogICAgcmV0dXJuIDEgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCRDb25maWcpOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ3JvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcpOwoKICAgIG15ICVVc2VkVGFza05hbWVzOwoKICAgIENST05KT0JLRVk6CiAgICBmb3IgbXkgJENyb25qb2JLZXkgKCBzb3J0IGtleXMgJXskQ29uZmlnfSApIHsKCiAgICAgICAgbmV4dCBDUk9OSk9CS0VZIGlmICEkQ3JvbmpvYktleTsKCiAgICAgICAgIyBleHRyYWN0IGNvbmZpZwogICAgICAgIG15ICRKb2JDb25maWcgPSAkQ29uZmlnLT57JENyb25qb2JLZXl9OwoKICAgICAgICBuZXh0IENST05KT0JLRVkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRKb2JDb25maWcpOwoKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTW9kdWxlIFRhc2tOYW1lIEZ1bmN0aW9uKSkgewogICAgICAgICAgICBpZiAoICEkSm9iQ29uZmlnLT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb25maWcgb3B0aW9uIERhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrIyMjJENyb25qb2JLZXkgaXMgaW52YWxpZC4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBOZWVkICckTmVlZGVkJyBwYXJhbWV0ZXIhIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBDUk9OSk9CS0VZOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRVc2VkVGFza05hbWVzeyAkSm9iQ29uZmlnLT57VGFza05hbWV9IH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb25maWcgb3B0aW9uIERhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrIyMjJENyb25qb2JLZXkgaXMgaW52YWxpZC4iCiAgICAgICAgICAgICAgICAgICAgLiAiIFRhc2tOYW1lIHBhcmFtZXRlciAnJEpvYkNvbmZpZy0+e1Rhc2tOYW1lfScgaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgdGFzayEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDUk9OSk9CS0VZOwogICAgICAgIH0KCiAgICAgICAgIyBjYWxjdWxhdGUgbGFzdCBjcm9uIHRpbWUKICAgICAgICBteSAkUHJldmlvdXNFdmVudFRpbWVzdGFtcCA9ICRDcm9uRXZlbnRPYmplY3QtPlByZXZpb3VzRXZlbnRHZXQoCiAgICAgICAgICAgIFNjaGVkdWxlID0+ICRKb2JDb25maWctPntTY2hlZHVsZX0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDUk9OSk9CS0VZIGlmICEkUHJldmlvdXNFdmVudFRpbWVzdGFtcDsKCiAgICAgICAgIyBleGVjdXRlIHJlY3VycmVudCB0YXNrcwogICAgICAgICRTZWxmLT5SZWN1cnJlbnRUYXNrRXhlY3V0ZSgKICAgICAgICAgICAgTm9kZUlEICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtOb2RlSUR9LAogICAgICAgICAgICBQSUQgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1BJRH0sCiAgICAgICAgICAgIFRhc2tOYW1lICAgICAgICAgICAgICAgICA9PiAkSm9iQ29uZmlnLT57VGFza05hbWV9LAogICAgICAgICAgICBUYXNrVHlwZSAgICAgICAgICAgICAgICAgPT4gJ0Nyb24nLAogICAgICAgICAgICBQcmV2aW91c0V2ZW50VGltZXN0YW1wICAgPT4gJFByZXZpb3VzRXZlbnRUaW1lc3RhbXAsCiAgICAgICAgICAgIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcyA9PiAkSm9iQ29uZmlnLT57TWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzfSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIE1vZHVsZSAgID0+ICRKb2JDb25maWctPntNb2R1bGV9ICAgfHwgJycsCiAgICAgICAgICAgICAgICBGdW5jdGlvbiA9PiAkSm9iQ29uZmlnLT57RnVuY3Rpb259IHx8ICcnLAogICAgICAgICAgICAgICAgUGFyYW1zICAgPT4gJEpvYkNvbmZpZy0+e1BhcmFtc30gICB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRVc2VkVGFza05hbWVzeyAkSm9iQ29uZmlnLT57VGFza05hbWV9IH0gPSAxOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ3JvblRhc2tDbGVhbnVwKCkKCnJlbW92ZXMgcmVjdXJyZW50IHRhc2tzIHRoYXQgZG8gbm90IGhhdmUgYSBtYXRjaGluZyBjcm9uIHRhc2tzIGRlZmluaXRpb24gaW4gU3lzQ29uZmlnLgoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5Dcm9uVGFza0NsZWFudXAoKTsKCj1jdXQKCnN1YiBDcm9uVGFza0NsZWFudXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjcm9uIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2snKSB8fCB7fTsKCiAgICAjIGRvIG5vdGhpbmcgaWYgdGhlcmUgYXJlIG5vIGNyb24gdGFza3MgZGVmaW5pdGlvbnMgaW4gU3lzQ29uZmlnCiAgICByZXR1cm4gMSB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJENvbmZpZyk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDcm9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3JvbkV2ZW50Jyk7CgogICAgbXkgJUNyb25Kb2JMb29rdXA7CgogICAgQ1JPTkpPQktFWToKICAgIGZvciBteSAkQ3JvbmpvYktleSAoIHNvcnQga2V5cyAleyRDb25maWd9ICkgewoKICAgICAgICBuZXh0IENST05KT0JLRVkgaWYgISRDcm9uam9iS2V5OwoKICAgICAgICAjIGV4dHJhY3QgY29uZmlnCiAgICAgICAgbXkgJEpvYkNvbmZpZyA9ICRDb25maWctPnskQ3JvbmpvYktleX07CgogICAgICAgIG5leHQgQ1JPTkpPQktFWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEpvYkNvbmZpZyk7CgogICAgICAgIG5leHQgQ1JPTkpPQktFWSBpZiAoICEkSm9iQ29uZmlnLT57TW9kdWxlfSApOwoKICAgICAgICBuZXh0IENST05KT0JLRVkgaWYgKCAkSm9iQ29uZmlnLT57TW9kdWxlfSAmJiAhJEpvYkNvbmZpZy0+e0Z1bmN0aW9ufSApOwoKICAgICAgICAjIGNhbGN1bGF0ZSBsYXN0IGNyb24gdGltZQogICAgICAgIG15ICRQcmV2aW91c0V2ZW50VGltZXN0YW1wID0gJENyb25FdmVudE9iamVjdC0+UHJldmlvdXNFdmVudEdldCgKICAgICAgICAgICAgU2NoZWR1bGUgPT4gJEpvYkNvbmZpZy0+e1NjaGVkdWxlfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IENST05KT0JLRVkgaWYgISRQcmV2aW91c0V2ZW50VGltZXN0YW1wOwoKICAgICAgICAkQ3JvbkpvYkxvb2t1cHsgJEpvYkNvbmZpZy0+e1Rhc2tOYW1lfSB9ID0gMTsKICAgIH0KCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxsIGdlbmVyaWMgYWdlbnQgcmVjdXJyZW50IHRhc2tzCiAgICBteSBAVGFza0xpc3QgPSAkU2VsZi0+UmVjdXJyZW50VGFza0xpc3QoCiAgICAgICAgVHlwZSA9PiAnQ3JvbicsCiAgICApOwoKICAgIFRBU0s6CiAgICBmb3IgbXkgJFRhc2sgKEBUYXNrTGlzdCkgewoKICAgICAgICAjIHNraXAgaWYgdGFzayBoYXMgYW4gYWN0aXZlIGdlbmVyaWMgYWdlbnQgam9iIGluIHRoZSBEQgogICAgICAgIG5leHQgVEFTSyBpZiAkQ3JvbkpvYkxvb2t1cHsgJFRhc2stPntOYW1lfSB9OwoKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5SZWN1cnJlbnRUYXNrRGVsZXRlKAogICAgICAgICAgICBUYXNrSUQgPT4gJFRhc2stPntUYXNrSUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGFzayAkVGFzay0+e05hbWV9LSRUYXNrLT57VHlwZX0gKCRUYXNrLT57VGFza0lEfSkgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDcm9uVGFza1N1bW1hcnkoKQoKZ2V0IGEgc3VtbWFyeSBvZiB0aGUgY3JvbiB0YXNrcyBmcm9tIHRoZSByZWN1cnJlbnQgdGFzayB0YWJsZQoKICAgIG15IEBTdW1tYXJ5ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5Dcm9uVGFza1N1bW1hcnkoKTsKCj1jdXQKCnN1YiBDcm9uVGFza1N1bW1hcnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjcm9uIGpvYnMgZnJvbSB0aGUgU3lzQ29uZmlnCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzaycpIHx8IHt9OwoKICAgIG15ICVUYXNrTG9va3VwOwoKICAgIEpPQk5BTUU6CiAgICBmb3IgbXkgJEpvYk5hbWUgKCBzb3J0IGtleXMgJXskQ29uZmlnfSApIHsKCiAgICAgICAgbXkgJEpvYkNvbmZpZyA9ICRDb25maWctPnskSm9iTmFtZX07CgogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJEpvYkNvbmZpZzsKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRKb2JDb25maWctPntTY2hlZHVsZX07CgogICAgICAgICRUYXNrTG9va3VweyRKb2JOYW1lfSA9ICRKb2JDb25maWctPntTY2hlZHVsZX07CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5SZWN1cnJlbnRUYXNrU3VtbWFyeSgKICAgICAgICBUeXBlICAgICAgICA9PiAnQ3JvbicsCiAgICAgICAgRGlzcGxheVR5cGUgPT4gJ2Nyb24nLAogICAgICAgIFRhc2tMb29rdXAgID0+IFwlVGFza0xvb2t1cCwKICAgICk7Cn0KCj1oZWFkMiBHZW5lcmljQWdlbnRUYXNrVG9FeGVjdXRlKCkKCmNyZWF0ZXMgZ2VuZXJpYyBhZ2VudCB0YXNrcyB0aGF0IG5lZWRzIHRvIGJlIHJ1biBpbiB0aGUgY3VycmVudCB0aW1lIGludG8gdGhlIHRhc2sgdGFibGUgdG8gZXhlY3V0ZQoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5HZW5lcmljQWdlbnRUYXNrVG9FeGVjdXRlKAogICAgICAgIE5vZGVJRCA9PiAxLCAgICAjIHRoZSBJRCBvZiB0aGUgbm9kZSBpbiBhIGNsdXN0ZXIgZW52aXJvbm1lbnQKICAgICAgICBQSUQgICAgPT4gNDU2LCAgIyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgZGFlbW9uIHRoYXQgaXMgY3JlYXRpbmcgdGhlIHRhc2tzIHRvIGV4ZWN1dGlvbgogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmljQWdlbnRUYXNrVG9FeGVjdXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkS2V5IChxdyhOb2RlSUQgUElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBnZW5lcmljIGFnZW50IG9iamVjdAogICAgbXkgJEdlbmVyaWNBZ2VudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljQWdlbnQnKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgZ2VuZXJpYyBhZ2VudCBqb2JzCiAgICBteSAlSm9iTGlzdCA9ICRHZW5lcmljQWdlbnRPYmplY3QtPkpvYkxpc3QoKTsKCiAgICAjIGRvIG5vdGhpbmcgaWYgdGhlcmUgYXJlIG5vIGdlbmVyaWMgYWdlbnQgam9icwogICAgcmV0dXJuIDEgaWYgISVKb2JMaXN0OwoKICAgICMgZ2V0IENST04gZXZlbnQgb2JqZWN0cwogICAgbXkgJENyb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDcm9uRXZlbnQnKTsKCiAgICBKT0JOQU1FOgogICAgZm9yIG15ICRKb2JOYW1lICggc29ydCBrZXlzICVKb2JMaXN0ICkgewoKICAgICAgICAjIGdldCBqb2IKICAgICAgICBteSAlSm9iID0gJEdlbmVyaWNBZ2VudE9iamVjdC0+Sm9iR2V0KAogICAgICAgICAgICBOYW1lID0+ICRKb2JOYW1lLAogICAgICAgICk7CgogICAgICAgICMgc2tpcCBpZiBqb2IgaXMgaW52YWxpZAogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJEpvYntWYWxpZH07CgogICAgICAgICMgZ2V0IHJlcXVpcmVkIHBhcmFtcwogICAgICAgIG15ICRTY2hlZHVsZUNoZWNrID0gMTsKICAgICAgICBmb3IgbXkgJEtleSAocXcoIFNjaGVkdWxlRGF5cyBTY2hlZHVsZU1pbnV0ZXMgU2NoZWR1bGVIb3VycyApKSB7CiAgICAgICAgICAgIGlmICggISRKb2J7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2NoZWR1bGVDaGVjayA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2tpcCBpZiBqb2IgaXMgbm90IHRpbWUgYmFzZWQKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRTY2hlZHVsZUNoZWNrOwoKICAgICAgICAjIGdldCBDUk9OIHRhYiBmb3IgR2VuZXJpYyBBZ2VudCBTY2hlZHVsZQogICAgICAgIG15ICRTY2hlZHVsZSA9ICRDcm9uRXZlbnRPYmplY3QtPkdlbmVyaWNBZ2VudFNjaGVkdWxlMkNyb25UYWIoJUpvYik7CgogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJFNjaGVkdWxlOwoKICAgICAgICAjIGdldCB0aGUgbGFzdCB0aW1lIHRoZSBHZW5lcmljQWdlbnQgam9iIHNob3VsZCBiZSBleGVjdXRlZCwgdGhpcyByZXR1cm5zIGV2ZW4gVEhJUyBtaW51dGUKICAgICAgICBteSAkUHJldmlvdXNFdmVudFRpbWVzdGFtcCA9ICRDcm9uRXZlbnRPYmplY3QtPlByZXZpb3VzRXZlbnRHZXQoCiAgICAgICAgICAgIFNjaGVkdWxlID0+ICRTY2hlZHVsZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRQcmV2aW91c0V2ZW50VGltZXN0YW1wOwoKICAgICAgICAjIGV4ZWN1dGUgcmVjdXJyZW50IHRhc2tzCiAgICAgICAgJFNlbGYtPlJlY3VycmVudFRhc2tFeGVjdXRlKAogICAgICAgICAgICBOb2RlSUQgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte05vZGVJRH0sCiAgICAgICAgICAgIFBJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17UElEfSwKICAgICAgICAgICAgVGFza05hbWUgICAgICAgICAgICAgICAgID0+ICRKb2JOYW1lLAogICAgICAgICAgICBUYXNrVHlwZSAgICAgICAgICAgICAgICAgPT4gJ0dlbmVyaWNBZ2VudCcsCiAgICAgICAgICAgIFByZXZpb3VzRXZlbnRUaW1lc3RhbXAgICA9PiAkUHJldmlvdXNFdmVudFRpbWVzdGFtcCwKICAgICAgICAgICAgTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgICAgICA9PiBcJUpvYiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgR2VuZXJpY0FnZW50VGFza0NsZWFudXAoKQoKcmVtb3ZlcyByZWN1cnJlbnQgdGFza3MgdGhhdCBkb2VzIG5vdCBoYXZlIGEgbWF0Y2hpbmcgZ2VuZXJpYyBhZ2VudCBqb2IKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+R2VuZXJpY0FnZW50VGFza0NsZWFudXAoKTsKCj1jdXQKCnN1YiBHZW5lcmljQWdlbnRUYXNrQ2xlYW51cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGdlbmVyaWMgYWdlbnQgb2JqZWN0CiAgICBteSAkR2VuZXJpY0FnZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNBZ2VudCcpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBnZW5lcmljIGFnZW50IGpvYnMKICAgIG15ICVKb2JMaXN0ID0gJEdlbmVyaWNBZ2VudE9iamVjdC0+Sm9iTGlzdCgpOwoKICAgICMgZG8gbm90aGluZyBpZiB0aGVyZSBhcmUgbm8gZ2VuZXJpYyBhZ2VudCBqb2JzCiAgICByZXR1cm4gMSBpZiAhJUpvYkxpc3Q7CgogICAgbXkgJUdlbmVyaWNBZ2VudEpvYkxvb2t1cDsKCiAgICAjIGdldCBDUk9OIGV2ZW50IG9iamVjdHMKICAgIG15ICRDcm9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3JvbkV2ZW50Jyk7CgogICAgSk9CTkFNRToKICAgIGZvciBteSAkSm9iTmFtZSAoIHNvcnQga2V5cyAlSm9iTGlzdCApIHsKCiAgICAgICAgIyBnZXQgam9iCiAgICAgICAgbXkgJUpvYiA9ICRHZW5lcmljQWdlbnRPYmplY3QtPkpvYkdldCgKICAgICAgICAgICAgTmFtZSA9PiAkSm9iTmFtZSwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgaWYgam9iIGlzIGludmFsaWQKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRKb2J7VmFsaWR9OwoKICAgICAgICAjIGdldCByZXF1aXJlZCBwYXJhbXMKICAgICAgICBteSAkU2NoZWR1bGVDaGVjayA9IDE7CiAgICAgICAgZm9yIG15ICRLZXkgKHF3KCBTY2hlZHVsZURheXMgU2NoZWR1bGVNaW51dGVzIFNjaGVkdWxlSG91cnMgKSkgewogICAgICAgICAgICBpZiAoICEkSm9ieyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNjaGVkdWxlQ2hlY2sgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNraXAgaWYgam9iIGlzIG5vdCB0aW1lIGJhc2VkCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkU2NoZWR1bGVDaGVjazsKCiAgICAgICAgIyBnZXQgQ1JPTiB0YWIgZm9yIEdlbmVyaWMgQWdlbnQgU2NoZWR1bGUKICAgICAgICBteSAkU2NoZWR1bGUgPSAkQ3JvbkV2ZW50T2JqZWN0LT5HZW5lcmljQWdlbnRTY2hlZHVsZTJDcm9uVGFiKCVKb2IpOwoKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRTY2hlZHVsZTsKCiAgICAgICAgJEdlbmVyaWNBZ2VudEpvYkxvb2t1cHskSm9iTmFtZX0gPSAxOwogICAgfQoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbGwgZ2VuZXJpYyBhZ2VudCByZWN1cnJlbnQgdGFza3MKICAgIG15IEBUYXNrTGlzdCA9ICRTZWxmLT5SZWN1cnJlbnRUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdHZW5lcmljQWdlbnQnLAogICAgKTsKCiAgICBUQVNLOgogICAgZm9yIG15ICRUYXNrIChAVGFza0xpc3QpIHsKCiAgICAgICAgIyBza2lwIGlmIHRhc2sgaGFzIGFuIGFjdGl2ZSBnZW5lcmljIGFnZW50IGpvYiBpbiB0aGUgREIKICAgICAgICBuZXh0IFRBU0sgaWYgJEdlbmVyaWNBZ2VudEpvYkxvb2t1cHsgJFRhc2stPntOYW1lfSB9OwoKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5SZWN1cnJlbnRUYXNrRGVsZXRlKAogICAgICAgICAgICBUYXNrSUQgPT4gJFRhc2stPntUYXNrSUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGFzayAkVGFzay0+e05hbWV9LSRUYXNrLT57VHlwZX0gKCRUYXNrLT57VGFza0lEfSkgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBHZW5lcmljQWdlbnRUYXNrU3VtbWFyeSgpCgpnZXQgYSBzdW1tYXJ5IG9mIHRoZSBnZW5lcmljIGFnZW50IHRhc2tzIGZyb20gdGhlIHJlY3VycmVudCB0YXNrIHRhYmxlCgogICAgbXkgQFN1bW1hcnkgPSAkU2NoZWR1bGVyREJPYmplY3QtPkdlbmVyaWNBZ2VudFRhc2tTdW1tYXJ5KCk7Cgo9Y3V0CgpzdWIgR2VuZXJpY0FnZW50VGFza1N1bW1hcnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBnZW5lcmljIGFnZW50IG9iamVjdAogICAgbXkgJEdlbmVyaWNBZ2VudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljQWdlbnQnKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgZ2VuZXJpYyBhZ2VudCBqb2JzIGZyb20gdGhlIERCCiAgICBteSAlSm9iTGlzdCA9ICRHZW5lcmljQWdlbnRPYmplY3QtPkpvYkxpc3QoKTsKCiAgICAjIGdldCBjcm9uIGV2ZW50IG9iamVjdAogICAgbXkgJENyb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDcm9uRXZlbnQnKTsKCiAgICBteSAlVGFza0xvb2t1cDsKCiAgICBKT0JOQU1FOgogICAgZm9yIG15ICRKb2JOYW1lICggc29ydCBrZXlzICVKb2JMaXN0ICkgewoKICAgICAgICAjIGdldCBqb2IKICAgICAgICBteSAlSm9iQ29uZmlnID0gJEdlbmVyaWNBZ2VudE9iamVjdC0+Sm9iR2V0KAogICAgICAgICAgICBOYW1lID0+ICRKb2JOYW1lLAogICAgICAgICk7CgogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJUpvYkNvbmZpZzsKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRKb2JDb25maWd7VmFsaWR9OwoKICAgICAgICAjIGdldCByZXF1aXJlZCBwYXJhbXMKICAgICAgICBteSAkU2NoZWR1bGVDaGVjayA9IDE7CiAgICAgICAgZm9yIG15ICRLZXkgKHF3KCBTY2hlZHVsZURheXMgU2NoZWR1bGVNaW51dGVzIFNjaGVkdWxlSG91cnMgKSkgewogICAgICAgICAgICBpZiAoICEkSm9iQ29uZmlneyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNjaGVkdWxlQ2hlY2sgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNraXAgaWYgam9iIGlzIG5vdCB0aW1lIGJhc2VkCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkU2NoZWR1bGVDaGVjazsKCiAgICAgICAgIyBnZXQgQ1JPTiB0YWIgZm9yIEdlbmVyaWMgQWdlbnQgU2NoZWR1bGUKICAgICAgICBteSAkU2NoZWR1bGUgPSAkQ3JvbkV2ZW50T2JqZWN0LT5HZW5lcmljQWdlbnRTY2hlZHVsZTJDcm9uVGFiKCVKb2JDb25maWcpOwoKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRTY2hlZHVsZTsKCiAgICAgICAgJFRhc2tMb29rdXB7JEpvYk5hbWV9ID0gJFNjaGVkdWxlOwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+UmVjdXJyZW50VGFza1N1bW1hcnkoCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ0dlbmVyaWNBZ2VudCcsCiAgICAgICAgRGlzcGxheVR5cGUgPT4gJ2dlbmVyaWMgYWdlbnQnLAogICAgICAgIFRhc2tMb29rdXAgID0+IFwlVGFza0xvb2t1cCwKICAgICk7Cn0KCj1oZWFkMiBSZWN1cnJlbnRUYXNrR2V0KCkKCmdldCBzY2hlZHVsZXIgcmVjdXJyZW50IHRhc2sKCiAgICBteSAlVGFzayA9ICRTY2hlZHVsZXJEQk9iamVjdC0+UmVjdXJyZW50VGFza0dldCgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJVRhc2sgPSAoCiAgICAgICAgVGFza0lEICAgICAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdhbnkgbmFtZScsCiAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgIExhc3RFeGVjdXRpb25UaW1lID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICBMb2NrS2V5ICAgICAgICAgICA9PiAnWFlaJywKICAgICAgICBMb2NrVGltZSAgICAgICAgICA9PiAnMjAxNS0wMS0wMiAwMDowMDowMCcKICAgICAgICBDcmVhdGVUaW1lICAgICAgICA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcKICAgICAgICBDaGFuZ2VUaW1lICAgICAgICA9PiAnMjAxNS0wMS0wMiAwMDowMDowMCcKICAgICk7Cgo9Y3V0CgpzdWIgUmVjdXJyZW50VGFza0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGFza0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGFza0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCB0YXNrIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIG5hbWUsIHRhc2tfdHlwZSwgbGFzdF9leGVjdXRpb25fdGltZSwgbG9ja19rZXksIGxvY2tfdGltZSwgY3JlYXRlX3RpbWUsIGNoYW5nZV90aW1lCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGFza0lEfSBdLAogICAgKTsKCiAgICBteSAlVGFzazsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgJVRhc2sgPSAoCiAgICAgICAgICAgIFRhc2tJRCAgICAgICAgICAgID0+ICRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAkRGF0YVswXSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJERhdGFbMV0sCiAgICAgICAgICAgIExhc3RFeGVjdXRpb25UaW1lID0+ICREYXRhWzJdLAogICAgICAgICAgICBMb2NrS2V5ICAgICAgICAgICA9PiAkRGF0YVszXSAvLyAwLAogICAgICAgICAgICBMb2NrVGltZSAgICAgICAgICA9PiAkRGF0YVs0XSAvLyAnJywKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgPT4gJERhdGFbNV0sCiAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgID0+ICREYXRhWzZdCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJVRhc2s7Cn0KCj1oZWFkMiBSZWN1cnJlbnRUYXNrTGlzdCgpCgpnZXQgdGhlIGxpc3Qgb2Ygc2NoZWR1bGVyIHJlY3VycmVudCB0YXNrcwoKICAgIG15IEBMaXN0ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5SZWN1cnJlbnRUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdzb21lIHR5cGUnLCAgIyBvcHRpb25hbAogICAgKTsKClJldHVybnM6CgogICAgQExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBUYXNrSUQgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdhbnkgbmFtZScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywKICAgICAgICAgICAgTGFzdEV4ZWN1dGlvblRpbWUgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBMb2NrS2V5ICAgICAgICAgICA9PiAnWFlaJywKICAgICAgICAgICAgTG9ja1RpbWUgICAgICAgICAgPT4gJzIwMTUtMDEtMDIgMDA6MDA6MDAnCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJwogICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICA9PiAnMjAxNS0wMS0wMiAwMDowMDowMCcKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgVGFza0lEICAgICAgICAgICAgPT4gNDU2LAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnYW55IG90aGVyIG5hbWUnLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgICAgIExhc3RFeGVjdXRpb25UaW1lID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTG9ja0tleSAgICAgICAgICAgPT4gJ1hZWicsCiAgICAgICAgICAgIExvY2tUaW1lICAgICAgICAgID0+ICcyMDE1LTAxLTAyIDAwOjAwOjAwJwogICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcKICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgPT4gJzIwMTUtMDEtMDIgMDA6MDA6MDAnCiAgICAgICAgfSwKICAgICAgICAjIC4uLgogICAgKTsKCj1jdXQKCnN1YiBSZWN1cnJlbnRUYXNrTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBuYW1lLCB0YXNrX3R5cGUsIGxhc3RfZXhlY3V0aW9uX3RpbWUsIGxvY2tfa2V5LCBsb2NrX3RpbWUsIGNyZWF0ZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfdGltZQogICAgICAgIEZST00gc2NoZWR1bGVyX3JlY3VycmVudF90YXNrJzsKICAgIG15IEBCaW5kOwoKICAgICMgYWRkIHR5cGUKICAgIGlmICggJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB0YXNrX3R5cGUgPSA/JzsKICAgICAgICBAQmluZCA9ICggXCRQYXJhbXtUeXBlfSApOwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBpZCBBU0MnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgcHVzaCBATGlzdCwgewogICAgICAgICAgICBUYXNrSUQgICAgICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBMYXN0RXhlY3V0aW9uVGltZSA9PiAkUm93WzNdLAogICAgICAgICAgICBMb2NrS2V5ICAgICAgICAgICA9PiAkUm93WzRdIC8vIDAsCiAgICAgICAgICAgIExvY2tUaW1lICAgICAgICAgID0+ICRSb3dbNV0gLy8gJycsCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgID0+ICRSb3dbNl0sCiAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgID0+ICRSb3dbN10sCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gQExpc3Q7Cn0KCj1oZWFkMiBSZWN1cnJlbnRUYXNrRGVsZXRlKCkKCmRlbGV0ZSBhIHRhc2sgZnJvbSBzY2hlZHVsZXIgcmVjdXJyZW50IHRhc2sgbGlzdAoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5SZWN1cnJlbnRUYXNrRGVsZXRlKAogICAgICAgIFRhc2tJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFJlY3VycmVudFRhc2tEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1Rhc2tJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRhc2tJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRhc2sgdG8gZGVsZXRlIGNhY2hlCiAgICBteSAlVGFzayA9ICRTZWxmLT5SZWN1cnJlbnRUYXNrR2V0KAogICAgICAgIFRhc2tJRCA9PiAkUGFyYW17VGFza0lEfSwKICAgICk7CgogICAgIyBkZWxldGUgdGFzayBmcm9tIHRoZSByZWN1cnJlbnQgdGFzayBsaXN0CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gc2NoZWR1bGVyX3JlY3VycmVudF90YXNrIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGFza0lEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZSBpZiB0YXNrIGV4aXRzIGJlZm9yZSB0aGUgZGVsZXRlCiAgICBpZiAoJVRhc2spIHsKCiAgICAgICAgbXkgJENhY2hlS2V5ID0gIiRUYXNre05hbWV9OjokVGFza3tUeXBlfSI7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NjaGVkdWxlckRCUmVjdXJyZW50VGFza0V4ZWN1dGUnLAogICAgICAgICAgICBLZXkgID0+ICckQ2FjaGVLZXknLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBSZWN1cnJlbnRUYXNrRXhlY3V0ZSgpCgpleGVjdXRlcyByZWN1cnJlbnQgdGFza3MgbGlrZSBjcm9uIG9yIGdlbmVyaWMgYWdlbnQgdGFza3MKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+UmVjdXJyZW50VGFza0V4ZWN1dGUoCiAgICAgICAgTm9kZUlEICAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAjIHRoZSBJRCBvZiB0aGUgbm9kZSBpbiBhIGNsdXN0ZXIgZW52aXJvbm1lbnQKICAgICAgICBQSUQgICAgICAgICAgICAgICAgICAgICAgPT4gNDU2LCAgICAgICAgICAgICAgICMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGRhZW1vbiB0aGF0IGlzIGNyZWF0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIHRoZSB0YXNrcyB0byBleGVjdXRpb24KICAgICAgICBUYXNrTmFtZSAgICAgICAgICAgICAgICAgPT4gJ1VuaXF1ZVRhc2tOYW1lJywKICAgICAgICBUYXNrVHlwZSAgICAgICAgICAgICAgICAgPT4gJ0Nyb24nLAogICAgICAgIFByZXZpb3VzRXZlbnRUaW1lc3RhbXAgICA9PiAxNDMzMjEyMzQzLAogICAgICAgIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcyA9PiAxLCAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoZGVmYXVsdCAwKSBudW1iZXIgb2YgdGFza3Mgd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgc2FtZSBuYW1lIGFuZCB0eXBlIHRoYXQgY2FuIGJlIGluIGV4ZWN1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICB0YWJsZSBhdCB0aGUgc2FtZSB0aW1lLCB2YWx1ZSBvZiAwIG1lYW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIHVubGltaXRlZAogICAgICAgIERhdGEgICAgICAgICAgICAgICAgICAgPT4geyAgICAgICAgICAgICAgICAgICAgIyBkYXRhIHBheWxvYWQKICAgICAgICAgICAgLi4uCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgUmVjdXJyZW50VGFza0V4ZWN1dGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KE5vZGVJRCBQSUQgVGFza05hbWUgVGFza1R5cGUgUHJldmlvdXNFdmVudFRpbWVzdGFtcCBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBteSAkQ2FjaGVLZXkgPSAiJFBhcmFte1Rhc2tOYW1lfTo6JFBhcmFte1Rhc2tUeXBlfSI7CgogICAgIyByZWFkIGNhY2hlCiAgICBteSAkQ2FjaGUgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnU2NoZWR1bGVyREJSZWN1cnJlbnRUYXNrRXhlY3V0ZScsCiAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJENhY2hlS2V5LAogICAgICAgIENhY2hlSW5NZW1vcnkgID0+IDAsCiAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJENhY2hlICYmICRDYWNoZSBlcSAkUGFyYW17UHJldmlvdXNFdmVudFRpbWVzdGFtcH07CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15ICRMYXN0RXhlY3V0aW9uVGltZVN0YW1wOwoKICAgICMgZ2V0IGVudHJ5IGlkIGFuZCBsYXN0IGV4ZWN1dGlvbiB0aW1lIGZyb20gZGF0YWJhc2UKICAgIG15ICRFbnRyeUlEOwogICAgVFJZOgogICAgZm9yIG15ICRUcnkgKCAxIC4uIDEwICkgewoKICAgICAgICAjIGluc2VydCBlbnRyeSBpZiBub3QgZXhpc3RzCiAgICAgICAgaWYgKCAkVHJ5IG5lIDEgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgdGFza190eXBlLCBsYXN0X2V4ZWN1dGlvbl90aW1lLCBsb2NrX2tleSwgY3JlYXRlX3RpbWUsIGNoYW5nZV90aW1lKQogICAgICAgICAgICAgICAgICAgIFZBTFVFUwogICAgICAgICAgICAgICAgICAgICAgICAoPywgPywgPywgMCwgY3VycmVudF90aW1lc3RhbXAsIGN1cnJlbnRfdGltZXN0YW1wKSIsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tOYW1lfSwKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tUeXBlfSwKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1ByZXZpb3VzRXZlbnRUaW1lc3RhbXB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGVudHJ5IGlkCiAgICAgICAgbmV4dCBUUlkgaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICIKICAgICAgICAgICAgICAgIFNFTEVDVCBpZCwgbGFzdF9leGVjdXRpb25fdGltZQogICAgICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgICAgIFdIRVJFIHRhc2tfdHlwZSA9ID8gQU5EIG5hbWUgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tUeXBlfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17VGFza05hbWV9LAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIGVudHJ5IGlkCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRFbnRyeUlEICAgICAgICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAgICAgJExhc3RFeGVjdXRpb25UaW1lU3RhbXAgPSAkUm93WzFdOwogICAgICAgIH0KCiAgICAgICAgbGFzdCBUUlkgaWYgJEVudHJ5SUQ7CiAgICB9CgogICAgcmV0dXJuIGlmICEkRW50cnlJRDsKCiAgICBpZiAoICRMYXN0RXhlY3V0aW9uVGltZVN0YW1wIGVxICRQYXJhbXtQcmV2aW91c0V2ZW50VGltZXN0YW1wfSApIHsKCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1NjaGVkdWxlckRCUmVjdXJyZW50VGFza0V4ZWN1dGUnLAogICAgICAgICAgICBLZXkgICAgICAgICAgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFRUTCAgICAgICAgICAgID0+IDYwICogNSwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gJFBhcmFte1ByZXZpb3VzRXZlbnRUaW1lc3RhbXB9LAogICAgICAgICAgICBDYWNoZUluTWVtb3J5ICA9PiAwLAogICAgICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBsb2NrIGtleQogICAgbXkgJExvY2tLZXlOb2RlSUQgPSBzcHJpbnRmICclMDNkJywgJFBhcmFte05vZGVJRH07CiAgICBteSAkTG9ja0tleVBJRCAgICA9IHNwcmludGYgJyUwOGQnLCAkUGFyYW17UElEfTsKICAgIG15ICRMb2NrS2V5ICAgICAgID0gJzEnIC4gJExvY2tLZXlOb2RlSUQgLiAkTG9ja0tleVBJRDsKCiAgICAjIGxvY2sgdGhlIGVudHJ5IGluIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICBTRVQgbG9ja19rZXkgPSA/LCBsb2NrX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcAogICAgICAgICAgICBXSEVSRSBsb2NrX2tleSA9IDAgQU5EIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkTG9ja0tleSwKICAgICAgICAgICAgXCRFbnRyeUlELAogICAgICAgIF0sCiAgICApOwoKICAgICMgZ2V0IGxvY2tlZCBlbnRyeQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBsb2NrX2tleSBGUk9NIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzayBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJEVudHJ5SUQgXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTG9ja0tleUZyb21EQiA9ICcnOwogICAgd2hpbGUgKCBteSBARGF0YSA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMb2NrS2V5RnJvbURCID0gJERhdGFbMF07CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJExvY2tLZXlGcm9tREIgbmUgJExvY2tLZXk7CgogICAgIyBzZXQgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTY2hlZHVsZXJEQlJlY3VycmVudFRhc2tFeGVjdXRlJywKICAgICAgICBLZXkgICAgICAgICAgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVFRMICAgICAgICAgICAgPT4gNjAgKiA1LAogICAgICAgIFZhbHVlICAgICAgICAgID0+ICRQYXJhbXtQcmV2aW91c0V2ZW50VGltZXN0YW1wfSwKICAgICAgICBDYWNoZUluTWVtb3J5ICA9PiAwLAogICAgICAgIENhY2hlSW5CYWNrZW5kID0+IDEsCiAgICApOwoKICAgICMgYWRkIHRoZSB0YXNrCiAgICBteSAkVGFza0lEID0gJFNlbGYtPlRhc2tBZGQoCiAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUYXNrVHlwZX0sCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUYXNrTmFtZX0sCiAgICAgICAgQXR0ZW1wdHMgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzID0+ICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9LAogICAgICAgIERhdGEgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgICMgdW5sb2NrIHRoZSB0YXNrCiAgICBpZiAoIElzUG9zaXRpdmVJbnRlZ2VyKCRUYXNrSUQpICkgewogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgICAgICBTRVQgbG9ja19rZXkgPSAwLCBsb2NrX3RpbWUgPSBOVUxMLCBsYXN0X2V4ZWN1dGlvbl90aW1lID0gPywgbGFzdF93b3JrZXJfdGFza19pZCA9ID8sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcAogICAgICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSA/IEFORCBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkUGFyYW17UHJldmlvdXNFdmVudFRpbWVzdGFtcH0sCiAgICAgICAgICAgICAgICBcJFRhc2tJRCwKICAgICAgICAgICAgICAgIFwkTG9ja0tleSwKICAgICAgICAgICAgICAgIFwkRW50cnlJRCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgICAgIFNFVCBsb2NrX2tleSA9IDAsIGxvY2tfdGltZSA9IE5VTEwsIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAKICAgICAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gPyBBTkQgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJExvY2tLZXksCiAgICAgICAgICAgICAgICBcJEVudHJ5SUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAkVGFza0lEOwoKICAgICMgZXJyb3IgaGFuZGxpbmcKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBjcmVhdGUgbmV3IHNjaGVkdWxlciByZWN1cnJlbnQgdGFzayAkUGFyYW17VGFza05hbWV9ISIsCiAgICApOwoKICAgIHJldHVybjsKfQoKPWhlYWQyIFJlY3VycmVudFRhc2tTdW1tYXJ5KCkKCmdldCBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyB0YXNrcyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrIHR5cGUKCiAgICBteSBAU3VtbWFyeSA9ICRTY2hlZHVsZXJEQk9iamVjdC0+UmVjdXJyZW50VGFza1N1bW1hcnkoCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdzb21lX3R5cGUnLAogICAgICAgIERpc3BsYXlUeXBlICA9PiAnc29tZSB0eXBlJywKICAgICAgICBUYXNrTG9va3VwICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IHRhc2tzIHdpdGggbmFtZXMgaW4gdGhpcyB0YWJsZSB3aWxsIGJlIHNob3duCiAgICAgICAgICAgIFRhc2tOYW1lMSA9PiAnKiAqICogKiAqJywgICAgICAgICAgICMgICB0aGUgdmFsdWUgb2YgdGhlIGl0ZW1zIGluIHRoaXMgdGFibGUgaXMgYSBjcm9udGFiCiAgICAgICAgICAgIFRhc2tOYW1lMyA9PiAnKi8xIDMsNCAqICogKiAwJywgICAgICMgICBmb3JtYXQgc2NoZWR1bGUKICAgICAgICB9CiAgICApOwoKPWN1dAoKc3ViIFJlY3VycmVudFRhc2tTdW1tYXJ5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIERpc3BsYXlUeXBlIFRhc2tMb29rdXApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gKCk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtUYXNrTG9va3VwfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUYXNrTG9va3VwIGlzIGludmFsaWQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gKCk7CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgIHJldHVybiAoKSBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCwgbmFtZSwgdGFza190eXBlLCBsYXN0X2V4ZWN1dGlvbl90aW1lLCBsYXN0X3dvcmtlcl9zdGF0dXMsIGxhc3Rfd29ya2VyX3J1bm5pbmdfdGltZQogICAgICAgICAgICBGUk9NIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICBXSEVSRSB0YXNrX3R5cGUgPSA/CiAgICAgICAgICAgIE9SREVSIEJZIGlkIEFTQycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VHlwZX0gXSwKICAgICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDcm9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3JvbkV2ZW50Jyk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHNraXAgdGFza3MgdGhhdCBhcmUgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIFRhc2tMb29rdXAgdGFibGUKICAgICAgICBteSAkU2NoZWR1bGUgPSAkUGFyYW17VGFza0xvb2t1cH0tPnsgJFJvd1sxXSB9OwoKICAgICAgICBuZXh0IFJPVyBpZiAhJFNjaGVkdWxlOwoKICAgICAgICAjIGNhbGN1bGF0ZSBuZXh0IGNyb24gZXZlbnQgdGltZQogICAgICAgIG15ICROZXh0RXhlY3V0aW9uVGltZSA9ICRDcm9uRXZlbnRPYmplY3QtPk5leHRFdmVudEdldCgKICAgICAgICAgICAgU2NoZWR1bGUgPT4gJFNjaGVkdWxlLAogICAgICAgICk7CgogICAgICAgIG15ICRMYXN0V29ya2VyU3RhdHVzOwogICAgICAgIGlmICggZGVmaW5lZCAkUm93WzRdICkgewogICAgICAgICAgICAkTGFzdFdvcmtlclN0YXR1cyA9ICRSb3dbNF0gPyAnU3VjY2VzcycgOiAnRmFpbCc7CiAgICAgICAgfQoKICAgICAgICBteSAkTGFzdFdvcmtlclJ1bm5pbmdUaW1lOwogICAgICAgIGlmICggZGVmaW5lZCAkUm93WzVdICkgewogICAgICAgICAgICAkTGFzdFdvcmtlclJ1bm5pbmdUaW1lID0gJFNlbGYtPl9TZWNvbmRzMlN0cmluZyggJFJvd1s1XSApOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBATGlzdCwgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIExhc3RFeGVjdXRpb25UaW1lICAgICA9PiAkUm93WzNdICAgICAgICAgICAgICAgIC8vICcnLAogICAgICAgICAgICBOZXh0RXhlY3V0aW9uVGltZSAgICAgPT4gJE5leHRFeGVjdXRpb25UaW1lICAgICAvLyAnJywKICAgICAgICAgICAgTGFzdFdvcmtlclN0YXR1cyAgICAgID0+ICRMYXN0V29ya2VyU3RhdHVzICAgICAgLy8gJ04vQScsCiAgICAgICAgICAgIExhc3RXb3JrZXJSdW5uaW5nVGltZSA9PiAkTGFzdFdvcmtlclJ1bm5pbmdUaW1lIC8vICdOL0EnLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgICB7CiAgICAgICAgICAgIEhlYWRlciA9PiAiUmVjdXJyZW50ICRQYXJhbXtEaXNwbGF5VHlwZX0gdGFza3M6IiwKICAgICAgICAgICAgQ29sdW1uID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDQwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTGFzdEV4ZWN1dGlvblRpbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdMYXN0IEV4ZWN1dGlvbicsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdMYXN0V29ya2VyU3RhdHVzJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnTGFzdCBTdGF0dXMnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDEyLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTGFzdFdvcmtlclJ1bm5pbmdUaW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnTGFzdCBEdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMTgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXh0RXhlY3V0aW9uVGltZScsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ05leHQgRXhlY3V0aW9uJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXEBMaXN0LAogICAgICAgICAgICBOb0RhdGFNZXNzYWdlID0+ICJUaGVyZSBhcmUgY3VycmVudGx5IG5vICRQYXJhbXtEaXNwbGF5VHlwZX0gcmVjdXJyaW5nIHRhc2tzIGNvbmZpZ3VyZWQuIiwKICAgICAgICB9LAogICAgKTsKfQoKPWhlYWQyIFJlY3VycmVudFRhc2tXb3JrZXJJbmZvU2V0KCkKCnNldHMgbGFzdCB3b3JrZXIgaW5mb3JtYXRpb24gKHN1Y2Nlc3Mgc3RhdHVzIGFuZCBydW5uaW5nIHRpbWUpIHRvIGEgcmVjdXJyZW50IHRhc2sKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+UmVjdXJyZW50VGFza1dvcmtlckluZm9TZXQoCiAgICAgICAgTGFzdFdvcmtlclRhc2tJRCAgICAgID0+IDEyMywgICAgICAgICMgdGhlIHRhc2sgSUQgZnJvbSB0aGUgd29ya2VyIHRhYmxlIHRoYXQgaXMgcGVyZm9ybWluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgIHJlY3VycmluZyB0YXNrCiAgICAgICAgTGFzdFdvcmtlclN0YXRpcyAgICAgID0+IDEsICAgICAgICAgICMgb3B0aW9uYWwgMSBvciAwLCBkZWZhdWx0cyB0byAwLCAxIG1lYW5zIHN1Y2Nlc3MKICAgICAgICBMYXN0V29ya2VyUnVubmluZ1RpbWUgPT4gMTIzLCAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gMCwgdGhlIG51bWJlciBpbiBzZWNvbmRzIGEgd29ya2VyIHRvb2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgIHRvIGNvbXBsZXRlIHRoZSB0YXNrCiAgICApOwoKPWN1dAoKc3ViIFJlY3VycmVudFRhc2tXb3JrZXJJbmZvU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtMYXN0V29ya2VyVGFza0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgTGFzdFdvcmtlclRhc2tJRCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkTGFzdFdvcmtlclN0YXR1cyAgICAgID0gJFBhcmFte0xhc3RXb3JrZXJTdGF0dXN9ID8gMSA6IDA7CiAgICBteSAkTGFzdFdvcmtlclJ1bm5pbmdUaW1lID0gJFBhcmFte0xhc3RXb3JrZXJSdW5uaW5nVGltZX0gLy8gMDsKCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgIFNFVCBsYXN0X3dvcmtlcl9zdGF0dXMgPSA/LCBsYXN0X3dvcmtlcl9ydW5uaW5nX3RpbWUgPSA/LCBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgIFdIRVJFIGxhc3Rfd29ya2VyX3Rhc2tfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRMYXN0V29ya2VyU3RhdHVzLAogICAgICAgICAgICBcJExhc3RXb3JrZXJSdW5uaW5nVGltZSwKICAgICAgICAgICAgXCRQYXJhbXtMYXN0V29ya2VyVGFza0lEfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFJlY3VycmVudFRhc2tVbmxvY2tFeHBpcmVkKCkKCnJlbW92ZSBsb2NrIHN0YXR1cyBmb3IgcmVjdXJyaW5nIHRhc2tzIHRoYXQgaGFzIGJlZW4gbG9ja2VkIGZvciBtb3JlIHRoYW4gMSBtaW51dGVzCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlJlY3VycmVudFRhc2tVbmxvY2tFeHBpcmVkKAogICAgICAgIFR5cGUgPT4gJ3NvbWVfdHlwZScsCiAgICApOwoKPWN1dAoKc3ViIFJlY3VycmVudFRhc2tVbmxvY2tFeHBpcmVkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVHlwZSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlIChnZXQgYWxsIHJlY3VycmVudCB0YXNrcyBmb3IgdGhlIGdpdmVuIHR5cGUgd2l0aCBhIGxvY2sga2V5IGRpZmZlcmVudCB0aGFuIDApCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIG5hbWUsIGxvY2tfdGltZQogICAgICAgICAgICBGUk9NIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICBXSEVSRSB0YXNrX3R5cGUgPSA/CiAgICAgICAgICAgICAgICBBTkQgbG9ja19rZXkgPD4gMAogICAgICAgICAgICBPUkRFUiBCWSBpZCBBU0MnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1R5cGV9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gdGltZQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvRXBvY2goKTsKCiAgICAgICAgIyBjb252ZXJ0IGxvY2sgdGltZSBzdGFtcCB0byBhIHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJExvY2tUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFJvd1syXSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRMb2NrVGltZSA9ICRMb2NrVGltZSA/ICRMb2NrVGltZS0+VG9FcG9jaCgpIDogMDsKCiAgICAgICAgIyBza2lwIHRhc2sgaWYgaXQgaGFzIGJlZW4gbG9ja2VkIHdpdGhpbiB0aGUgbGFzdCBtaW51dGUKICAgICAgICBuZXh0IFJPVyBpZiAkU3lzdGVtVGltZSAtICRMb2NrVGltZSA8IDYwOwoKICAgICAgICBwdXNoIEBMaXN0LCB7CiAgICAgICAgICAgIFRhc2tJRCAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIExvY2tUaW1lID0+ICRSb3dbMl0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHN0b3AgaWYgdGhlcmUgYXJlIG5vIHRhc2tzIHRvIHVubG9jawogICAgcmV0dXJuIDEgaWYgIUBMaXN0OwoKICAgIGZvciBteSAkVGFzayAoQExpc3QpIHsKCiAgICAgICAgIyB1bmxvY2sgYWxsIHRoZSB0YXNrIHRoYXQgaGFzIGJlZW4gbG9ja2VkIGZvciBtb3JlIHRoYW4gMSBtaW51dGUKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgICAgIFNFVCBsb2NrX2tleSA9IDAsIGxvY2tfdGltZSA9IE5VTEwsIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAKICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRhc2stPntUYXNrSUR9LCBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMSBQUklWQVRFIElOVEVSRkFDRQoKPWhlYWQyIF9TZWNvbmRzMlN0cmluZygpCgpjb252ZXJ0IGFuIGFtb3VudCBvZiBzZWNvbmRzIHRvIGEgbW9yZSBodW1hbiByZWFkYWJsZSBmb3JtYXQsIGUuZy4gPCAxIFNlY29uZCwgNSBNaW51dGVzCgogICAgbXkgJFN0cmluZyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+X1NlY29uZHMyU3RyaW5nKC4yKTsKCnJldHVybnMKCiAgICAkU3RyaW5nID0gJzwgMSBTZWNvbmQnOwoKb3IKCiAgICBteSAkU3RyaW5nID0gJFNjaGVkdWxlckRCT2JqZWN0LT5fU2Vjb25kczJTdHJpbmcoOCk7CgpyZXR1cm5zCgogICAgJFN0cmluZyA9ICc4IFNlY29uZChzKSc7CgpvcgoKICAgIG15ICRTdHJpbmcgPSAkU2NoZWR1bGVyREJPYmplY3QtPl9TZWNvbmRzMlN0cmluZyg2Mik7CgpyZXR1cm5zCgogICAgJFN0cmluZyA9ICcxIE1pbnV0ZShzKSc7CgpvcgoKICAgIG15ICRTdHJpbmcgPSAkU2NoZWR1bGVyREJPYmplY3QtPl9TZWNvbmRzMlN0cmluZygzNjEwKTsKCnJldHVybnMKCiAgICAkU3RyaW5nID0gJzEgSG91cihzKSc7CgpvcgoKICAgIG15ICRTdHJpbmcgPSAkU2NoZWR1bGVyREJPYmplY3QtPl9TZWNvbmRzMlN0cmluZyg4Nl82NDApOwoKcmV0dXJucwoKICAgICRTdHJpbmcgPSAnMSBEYXkocyknOwoKPWN1dAoKc3ViIF9TZWNvbmRzMlN0cmluZyB7CiAgICBteSAoICRTZWxmLCAkU2Vjb25kcyApID0gQF87CgogICAgcmV0dXJuICc8IDEgU2Vjb25kJyBpZiAkU2Vjb25kcyA8IDE7CgogICAgaWYgKCAkU2Vjb25kcyA+PSAyNCAqIDYwICogNjAgKSB7CiAgICAgICAgcmV0dXJuIHNwcmludGYgJyUuMWYgRGF5KHMpJywgJFNlY29uZHMgLyAoIDI0ICogNjAgKiA2MCApOwogICAgfQogICAgZWxzaWYgKCAkU2Vjb25kcyA+PSA2MCAqIDYwICkgewogICAgICAgIHJldHVybiBzcHJpbnRmICclLjFmIEhvdXIocyknLCAkU2Vjb25kcyAvICggNjAgKiA2MCApOwogICAgfQogICAgZWxzaWYgKCAkU2Vjb25kcyA+PSA2MCApIHsKICAgICAgICByZXR1cm4gc3ByaW50ZiAnJS4xZiBNaW51dGUocyknLCAkU2Vjb25kcyAvICg2MCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gc3ByaW50ZiAnJS4xZiBTZWNvbmQocyknLCAkU2Vjb25kczsKICAgIH0KfQoKPWhlYWQyIF9HZXRJZGVudGlmaWVyKCkKCmNhbGN1bGF0ZSBhIHRhc2sgaWRlbnRpZmllci4KCiAgICBteSAkSWRlbnRpZmllciA9ICRTY2hlZHVsZXJEQk9iamVjdC0+X0dldElkZW50aWZpZXIoKTsKCnJldHVybnMKCiAgICAkSWRlbnRpZmllciA9IDEyMzQ0NTY3ODk7Cgo9Y3V0CgpzdWIgX0dldElkZW50aWZpZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAoICRTZWNvbmRzLCAkTWljcm9zZWNvbmRzICkgPSBUaW1lOjpIaVJlczo6Z2V0dGltZW9mZGF5KCk7CiAgICBteSAkUHJvY2Vzc0lEID0gJCQ7CgogICAgbXkgJElkZW50aWZpZXIgPSAkUHJvY2Vzc0lEIC4gJE1pY3Jvc2Vjb25kczsKCiAgICBteSAkUmFuZG9tU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoICAgICA9PiAxOCAtIGxlbmd0aCAkSWRlbnRpZmllciwKICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5IF0sICAgICAgICAgICAgICAgICMgbnVtZXJpYwogICAgKTsKCiAgICAkSWRlbnRpZmllciAuPSAkUmFuZG9tU3RyaW5nOwoKICAgIHJldHVybiAkSWRlbnRpZmllcjsKfQoKMTsK</File>
        <File Location="Kernel/Config/Files/XML/AppointmentToTicket.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhcHBvaW50bWVudCBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpBZ2VudEFwcG9pbnRtZW50RWRpdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjIiIFRyYW5zbGF0YWJsZT0iMSI+MiAtIEVuYWJsZWQgYW5kIHJlcXVpcmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCMjI1ByaW9yaXR5IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OkFnZW50QXBwb2ludG1lbnRFZGl0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUHJpb3JpdHkiIFZhbHVlUmVnZXg9IiI+MyBub3JtYWw8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjU2VydmljZU1hbmRhdG9yeSIgVXNlclByZWZlcmVuY2VzR3JvdXA9IkFkdmFuY2VkIiBVc2VyTW9kaWZpY2F0aW9uUG9zc2libGU9IjEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiBzZXJ2aWNlIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpBZ2VudEFwcG9pbnRtZW50RWRpdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjU0xBTWFuZGF0b3J5IiBVc2VyUHJlZmVyZW5jZXNHcm91cD0iQWR2YW5jZWQiIFVzZXJNb2RpZmljYXRpb25Qb3NzaWJsZT0iMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIFNMQSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6QWdlbnRBcHBvaW50bWVudEVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCMjI1N0YXRlRGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OkFnZW50QXBwb2ludG1lbnRFZGl0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iU3RhdGUiIFZhbHVlUmVnZXg9IiI+b3BlbjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQjIyNTdGF0ZVR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyB0aGUgbmV4dCBwb3NzaWJsZSB0aWNrZXQgc3RhdGVzLCBhZnRlciB0aGUgY3JlYXRpb24gb2YgYSBuZXcgdGlja2V0IGZyb20gYSBjYWxlbmRhciBhcHBvaW50bWVudCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRDYWxlbmRhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+cGVuZGluZyBhdXRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5jbG9zZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyMjIzAwOS1BcHBvaW50bWVudFRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFKQVguanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuRGF0YS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJEeW5hbWljRmllbGRTY3JlZW5zIyMjQXBwb2ludG1lbnRUaWNrZXRzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgY29uZmlndXJhdGlvbiBkZWZpbmVzIGFsbCBwb3NzaWJsZSBzY3JlZW5zIHRvIGVuYWJsZSBvciBkaXNhYmxlIGR5bmFtaWMgZmllbGRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkR5bmFtaWNGaWVsZFNjcmVlbnM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQjIyNEeW5hbWljRmllbGQiPkFnZW50QXBwb2ludG1lbnRFZGl0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cg==</File>
        <File Location="Kernel/Language/de_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXInfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB0aWNrZXQgY3JlYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIG5leHQgc3RhdGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgc2VydmljZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBTTEEhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgdHlwZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBwcmlvcml0eSEnfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRlcm1pbmVzIHRoZSBuZXh0IHBvc3NpYmxlIHRpY2tldCBzdGF0ZXMsIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyB0aWNrZXQgZnJvbSBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIGZvciBuZXcgdGlja2V0cyBpbiB0aGUgQWdlbnRBcHBvaW50bWVudEVkaXQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICcrJXMgbW9yZScsCiAgICAnQWxsIG9jY3VycmVuY2VzJywKICAgICdBbGwtZGF5JywKICAgICdBcHBvaW50bWVudCcsCiAgICAnQXByJywKICAgICdBcHJpbCcsCiAgICAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLicsCiAgICAnQXVnJywKICAgICdBdWd1c3QnLAogICAgJ0Nsb3NlIHRoaXMgZGlhbG9nJywKICAgICdEYXknLAogICAgJ0RlYycsCiAgICAnRGVjZW1iZXInLAogICAgJ0R1cGxpY2F0ZWQgZW50cnknLAogICAgJ0ZlYicsCiAgICAnRmVicnVhcnknLAogICAgJ0ZpcnN0IHNlbGVjdCBhIGN1c3RvbWVyIHVzZXIsIHRoZW4gc2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicsCiAgICAnRnInLAogICAgJ0ZyaScsCiAgICAnRnJpZGF5JywKICAgICdJdCBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gdGhlIGZpZWxkLCBwbGVhc2UgdHJ5IGFnYWluLicsCiAgICAnSmFuJywKICAgICdKYW51YXJ5JywKICAgICdKdWwnLAogICAgJ0p1bHknLAogICAgJ0p1bXAnLAogICAgJ0p1bicsCiAgICAnSnVuZScsCiAgICAnSnVzdCB0aGlzIG9jY3VycmVuY2UnLAogICAgJ0xvYWRpbmcuLi4nLAogICAgJ01hcicsCiAgICAnTWFyY2gnLAogICAgJ01heScsCiAgICAnTWF5X2xvbmcnLAogICAgJ01vJywKICAgICdNb24nLAogICAgJ01vbmRheScsCiAgICAnTW9udGgnLAogICAgJ05hbWUnLAogICAgJ05leHQnLAogICAgJ05vdicsCiAgICAnTm92ZW1iZXInLAogICAgJ09LJywKICAgICdPY3QnLAogICAgJ09jdG9iZXInLAogICAgJ1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nLAogICAgJ1ByZXNzIEN0cmwrQyAoQ21kK0MpIHRvIGNvcHkgdG8gY2xpcGJvYXJkJywKICAgICdQcmV2aW91cycsCiAgICAnUmVzb3VyY2VzJywKICAgICdSZXN0b3JlIGRlZmF1bHQgc2V0dGluZ3MnLAogICAgJ1NhJywKICAgICdTYXQnLAogICAgJ1NhdHVyZGF5JywKICAgICdTYXZlJywKICAgICdTZWxlY3QgYSBjdXN0b21lciBJRCB0byBhc3NpZ24gdG8gdGhpcyB0aWNrZXQuJywKICAgICdTZXAnLAogICAgJ1NlcHRlbWJlcicsCiAgICAnU2V0dGluZ3MnLAogICAgJ1N1JywKICAgICdTdW4nLAogICAgJ1N1bmRheScsCiAgICAnVGgnLAogICAgJ1RoaXMgYWRkcmVzcyBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgYWRkcmVzcyBsaXN0LicsCiAgICAnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCcsCiAgICAnVGh1JywKICAgICdUaHVyc2RheScsCiAgICAnVGltZWxpbmUgRGF5JywKICAgICdUaW1lbGluZSBNb250aCcsCiAgICAnVGltZWxpbmUgV2VlaycsCiAgICAnVG9kYXknLAogICAgJ1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnLAogICAgJ1R1JywKICAgICdUdWUnLAogICAgJ1R1ZXNkYXknLAogICAgJ1dlJywKICAgICdXZWQnLAogICAgJ1dlZG5lc2RheScsCiAgICAnV2VlaycsCiAgICAnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/JywKICAgICdtb3JlJywKICAgICdub25lJywKICAgICk7Cgp9CgoxOwo=</File>
        <File Location="Kernel/Language/hu_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Omh1X0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAnSmVneWzDqXRyZWhvesOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcnRpY2xlIGlzIHZpc2libGUgZm9yIGN1c3RvbWVyJ30gPSAnQSBiZWplZ3l6w6lzIGzDoXRoYXTDsyBheiDDvGd5ZsOpbG5layc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHRpY2tldCBjcmVhdGlvbid9ID0gJ05pbmNzIGplZ3lsw6l0cmVob3rDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgY8OpbCBtZXrFkW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnfSA9ICdOZW0gc2lrZXLDvGx0IHbDqWdyZWhhanRhbmkgYXogZWxsZW7FkXJ6w6lzdCBhIGvDtnZldGtlesWRIMOhbGxhcG90IG1lesWRbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBzZXJ2aWNlISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgc3pvbGfDoWx0YXTDoXMgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIFNMQSEnfSA9ICdOZW0gc2lrZXLDvGx0IHbDqWdyZWhhanRhbmkgYXogZWxsZW7FkXJ6w6lzdCBheiBTTEEgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHR5cGUhJ30gPSAnTmVtIHNpa2Vyw7xsdCB2w6lncmVoYWp0YW5pIGF6IGVsbGVuxZFyesOpc3QgYSB0w61wdXMgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHByaW9yaXR5ISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgcHJpb3JpdMOhcyBtZXrFkW4hJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV0ZXJtaW5lcyB0aGUgbmV4dCBwb3NzaWJsZSB0aWNrZXQgc3RhdGVzLCBhZnRlciB0aGUgY3JlYXRpb24gb2YgYSBuZXcgdGlja2V0IGZyb20gYSBjYWxlbmRhciBhcHBvaW50bWVudCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIGvDtnZldGtlesWRIGxlaGV0c8OpZ2VzIGplZ3nDoWxsYXBvdG9rYXQgZWd5IG5hcHTDoXJpZMWRcG9udGLDs2wgc3rDoXJtYXrDsyDDumogamVneSBsw6l0cmVob3rDoXNhIHV0w6FuIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIGZvciBuZXcgdGlja2V0cyBpbiB0aGUgQWdlbnRBcHBvaW50bWVudEVkaXQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYXogw7pqIGplZ3llayBhbGFww6lydGVsbWV6ZXR0IGvDtnZldGtlesWRIMOhbGxhcG90w6F0IGF6IGlkxZFwb250IHN6ZXJrZXN6dMOpc8OpbsOpbCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdCZcOhbGzDrXRqYSBheiDDumogamVneWVrIGFsYXDDqXJ0ZWxtZXpldHQgcHJpb3JpdMOhc8OhdCBheiBpZMWRcG9udCBzemVya2VzenTDqXPDqW7DqWwgYXogw7xneWludMOpesWRaSBmZWzDvGxldGVuLic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJyslcyBtb3JlJywKICAgICdBbGwgb2NjdXJyZW5jZXMnLAogICAgJ0FsbC1kYXknLAogICAgJ0FwcG9pbnRtZW50JywKICAgICdBcHInLAogICAgJ0FwcmlsJywKICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJywKICAgICdBdWcnLAogICAgJ0F1Z3VzdCcsCiAgICAnQ2xvc2UgdGhpcyBkaWFsb2cnLAogICAgJ0RheScsCiAgICAnRGVjJywKICAgICdEZWNlbWJlcicsCiAgICAnRHVwbGljYXRlZCBlbnRyeScsCiAgICAnRmViJywKICAgICdGZWJydWFyeScsCiAgICAnRmlyc3Qgc2VsZWN0IGEgY3VzdG9tZXIgdXNlciwgdGhlbiBzZWxlY3QgYSBjdXN0b21lciBJRCB0byBhc3NpZ24gdG8gdGhpcyB0aWNrZXQuJywKICAgICdGcicsCiAgICAnRnJpJywKICAgICdGcmlkYXknLAogICAgJ0l0IGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZmllbGQsIHBsZWFzZSB0cnkgYWdhaW4uJywKICAgICdKYW4nLAogICAgJ0phbnVhcnknLAogICAgJ0p1bCcsCiAgICAnSnVseScsCiAgICAnSnVtcCcsCiAgICAnSnVuJywKICAgICdKdW5lJywKICAgICdKdXN0IHRoaXMgb2NjdXJyZW5jZScsCiAgICAnTG9hZGluZy4uLicsCiAgICAnTWFyJywKICAgICdNYXJjaCcsCiAgICAnTWF5JywKICAgICdNYXlfbG9uZycsCiAgICAnTW8nLAogICAgJ01vbicsCiAgICAnTW9uZGF5JywKICAgICdNb250aCcsCiAgICAnTmFtZScsCiAgICAnTmV4dCcsCiAgICAnTm92JywKICAgICdOb3ZlbWJlcicsCiAgICAnT0snLAogICAgJ09jdCcsCiAgICAnT2N0b2JlcicsCiAgICAnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLicsCiAgICAnUHJlc3MgQ3RybCtDIChDbWQrQykgdG8gY29weSB0byBjbGlwYm9hcmQnLAogICAgJ1ByZXZpb3VzJywKICAgICdSZXNvdXJjZXMnLAogICAgJ1Jlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncycsCiAgICAnU2EnLAogICAgJ1NhdCcsCiAgICAnU2F0dXJkYXknLAogICAgJ1NhdmUnLAogICAgJ1NlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nLAogICAgJ1NlcCcsCiAgICAnU2VwdGVtYmVyJywKICAgICdTZXR0aW5ncycsCiAgICAnU3UnLAogICAgJ1N1bicsCiAgICAnU3VuZGF5JywKICAgICdUaCcsCiAgICAnVGhpcyBhZGRyZXNzIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhZGRyZXNzIGxpc3QuJywKICAgICdUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50JywKICAgICdUaHUnLAogICAgJ1RodXJzZGF5JywKICAgICdUaW1lbGluZSBEYXknLAogICAgJ1RpbWVsaW5lIE1vbnRoJywKICAgICdUaW1lbGluZSBXZWVrJywKICAgICdUb2RheScsCiAgICAnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycycsCiAgICAnVHUnLAogICAgJ1R1ZScsCiAgICAnVHVlc2RheScsCiAgICAnV2UnLAogICAgJ1dlZCcsCiAgICAnV2VkbmVzZGF5JywKICAgICdXZWVrJywKICAgICdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nLAogICAgJ21vcmUnLAogICAgJ25vbmUnLAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="Kernel/System/Daemon/DaemonModules/SchedulerTaskWorker/AppointmentTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjQgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkFwcG9pbnRtZW50VGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpCYXNlVGFza1dvcmtlcik7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6RGFlbW9uTW9kdWxlczo6U2NoZWR1bGVyVGFza1dvcmtlcjo6QXBwb2ludG1lbnRUaWNrZXQgLSBTY2hlZHVsZXIgZGFlbW9uIHRhc2sgaGFuZGxlciBtb2R1bGUgZm9yIEFwcG9pbnRtZW50VGlja2V0Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgdGFzayBoYW5kbGVyIGV4ZWN1dGVzIGFwcG9pbnRtZW50IHRpY2tldCBqb2JzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRhc2tIYW5kbGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tR2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpTY2hlZHVsZXJUYXNrV29ya2VyOjpBcHBvaW50bWVudFRpY2tldCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEZWJ1Z30gICAgICA9ICRQYXJhbXtEZWJ1Z307CiAgICAkU2VsZi0+e1dvcmtlck5hbWV9ID0gJ1dvcmtlcjogQXBwb2ludG1lbnRUaWNrZXQnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgpwZXJmb3JtcyB0aGUgc2VsZWN0ZWQgdGFzay4KCiAgICBteSAkUmVzdWx0ID0gJFRhc2tIYW5kbGVyT2JqZWN0LT5SdW4oCiAgICAgICAgVGFza0lEICAgPT4gMTIzLAogICAgICAgIFRhc2tOYW1lID0+ICdzb21lIG5hbWUnLCAgICAjIG9wdGlvbmFsCiAgICAgICAgRGF0YSAgICAgPT4geyAgICAgICAgICAgICAgICMgYXBwb2ludG1lbnQgaWQgYXMgZ290IGZyb20gS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudDo6QXBwb2ludG1lbnRHZXQoKQogICAgICAgICAgICBOb3RpZnlUaW1lID0+ICcyMDE2LTA4LTAyIDAzOjU5OjAwJywKICAgICAgICB9LAogICAgKTsKClJldHVybnM6CgogICAgJFJlc3VsdCA9IDE7ICMgb3IgZmFpbCBpbiBjYXNlIG9mIGFuIGVycm9yCgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB0YXNrIHBhcmFtcwogICAgbXkgJENoZWNrUmVzdWx0ID0gJFNlbGYtPl9DaGVja1Rhc2tQYXJhbXMoCiAgICAgICAgJVBhcmFtLAogICAgICAgIE5lZWRlZERhdGFBdHRyaWJ1dGVzID0+CiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdBcHBvaW50bWVudFRpY2tldCcsICdBcHBvaW50bWVudElEJwogICAgICAgICAgICBdLAogICAgKTsKCiAgICAjIHN0b3AgZXhlY3V0aW9uIGlmIGFuIGVycm9yIGluIHBhcmFtcyBpcyBkZXRlY3RlZAogICAgcmV0dXJuIGlmICEkQ2hlY2tSZXN1bHQ7CgogICAgbXkgJERCT2JqZWN0ICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0Jyk7CgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICBwcmludCAiICAgICRTZWxmLT57V29ya2VyTmFtZX0gZXhlY3V0ZXMgdGFzazogJFBhcmFte1Rhc2tOYW1lfVxuIjsKICAgIH0KCiAgICAjIGZldGNoaW5nIGN1c3RvbWVyIHVzZXIgZnJvbSBzZWxlY3RlZGN1c3RvbWVydXNlcgogICAgbXkgJUN1c3RvbWVyVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSwKICAgICk7CgogICAgIyBjcmVhdGUgdGhlIGFwcG9pbnRtZW50IHRpY2tldAogICAgbXkgJFRpY2tldElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRDcmVhdGUoCiAgICAgICAgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT4lKiwKICAgICAgICBDdXN0b21lclVzZXIgPT4gJUN1c3RvbWVyVXNlciA/ICRDdXN0b21lclVzZXJ7VXNlckxvZ2lufSA6ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSwKICAgICk7CgogICAgaWYgKCAhJFRpY2tldElEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHRyaWdnZXIgdGlja2V0IGFwcG9pbnRtZW50IGZvciBBcHBvaW50bWVudElEICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0CiAgICBteSBARHluYW1pY0ZpZWxkQ29uZmlnczsKICAgIG15ICVEeW5hbWljRmllbGRzOwogICAgaWYgKCAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntEeW5hbWljRmllbGRzfSApIHsKCiAgICAgICAgIyBGZXRjaCBkeW5hbWljIGZpZWxkIGNvbmZpZ3MKICAgICAgICBpZiAoIGRlZmluZWQgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWdzUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgICAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIEBEeW5hbWljRmllbGRDb25maWdzID0gZGVmaW5lZCAkRHluYW1pY0ZpZWxkQ29uZmlnc1JlZiA/IEB7JER5bmFtaWNGaWVsZENvbmZpZ3NSZWZ9IDogKCk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAlRHluYW1pY0ZpZWxkcyA9ICV7ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0R5bmFtaWNGaWVsZHN9IH07CiAgICAgICAgRFlOQU1JQ0ZJRUxEVElDS0VUOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnIChARHluYW1pY0ZpZWxkQ29uZmlncykgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRFRJQ0tFVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEVElDS0VUIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntEeW5hbWljRmllbGRzfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJpbmcgZnJvbSBkYXRhCiAgICBteSAkQXJ0aWNsZUZyb207CiAgICBteSBAQ3VzdG9tZXJVc2VycyA9IHNwbGl0KCAnLCcsICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbWVyVXNlcn0gKTsKICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyIChAQ3VzdG9tZXJVc2VycykgewogICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgKTsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyU3RyaW5nCiAgICAgICAgICAgID0gJUN1c3RvbWVyVXNlckRhdGEgPyAiXCIkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRmlyc3RuYW1lfSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTGFzdG5hbWV9XCIgPCRDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH0+IiA6ICRDdXN0b21lclVzZXI7CiAgICAgICAgaWYgKCRBcnRpY2xlRnJvbSkgewogICAgICAgICAgICAkQXJ0aWNsZUZyb20gLj0gIiwgJEN1c3RvbWVyVXNlclN0cmluZyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZUZyb20gPSAiJEN1c3RvbWVyVXNlclN0cmluZyI7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBcnRpY2xlT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0ludGVybmFsJyApOwogICAgbXkgJEFydGljbGVJRCAgICAgICAgICAgID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnc3lzdGVtJywKICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyfSB8fCAwLAogICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICRBcnRpY2xlRnJvbSwKICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1N1YmplY3R9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKCBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q29udGVudH0gKSwKICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICA9PiAndGV4dC9odG1sJywKICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAndXRmLTgnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1VzZXJJRH0sCiAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJ01pc2MnLAogICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICdBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGlja2V0IGZyb20gYXBwb2ludG1lbnQnLAogICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgID0+ICggJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvUmVzcG9uc2VGb3JXZWJUaWNrZXRzJykgKQogICAgICAgID8gJ2F1dG8gcmVwbHknCiAgICAgICAgOiAnJywKICAgICAgICBPcmlnSGVhZGVyID0+IHsKICAgICAgICAgICAgRnJvbSAgICA9PiAkQXJ0aWNsZUZyb20sCiAgICAgICAgICAgIFRvICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VXNlcklEfSwKICAgICAgICAgICAgU3ViamVjdCA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTdWJqZWN0fSwKICAgICAgICAgICAgQm9keSAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDb250ZW50fSwKICAgICAgICB9LAogICAgICAgIFF1ZXVlID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1F1ZXVlSUR9LAogICAgKTsKCiAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGNyZWF0ZSBhcnRpY2xlIGZvciB0aWNrZXQgJFRpY2tldElEIGZyb20gYXBwb2ludG1lbnQgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0hIiwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgIGlmICggJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57RHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgRFlOQU1JQ0ZJRUxEQVJUSUNMRToKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoQER5bmFtaWNGaWVsZENvbmZpZ3MpIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTERBUlRJQ0xFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTERBUlRJQ0xFIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZHN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0R5bmFtaWNGaWVsZHN9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWV0VGlja2V0fS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICVBcHBvaW50bWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBsaW5rIHRoZSB0aWNrZXRzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBpZCBmcm9tIGFwcG9pbnRtZW50CiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRVcGRhdGUoCiAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgICAgIEZ1dHVyZVRhc2tJRCA9PiB1bmRlZiwKICAgICk7CgogICAgIyBDaGVjayBpZiBhcHBvaW50bWVudCBpcyByZWN1cnJpbmcgYW5kIGlmIHNvLCBjcmVhdGUgbmV4dCBmdXR1cmUgdGFzayBmb3IgYXBwb2ludG1lbnQgd2hpY2ggaXMgaW4gdGhlIGZ1dHVyZSBhbmQgY2xvc2VzdCB0byBub3cKICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmluZ30gfHwgJEFwcG9pbnRtZW50e1BhcmVudElEfSApIHsKCiAgICAgICAgIyBHZXQgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUGFyZW50SUQgICA9PiAkQXBwb2ludG1lbnR7UGFyZW50SUR9IHx8ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICApOwoKICAgICAgICAjIFB1c2ggcGFyZW50IGludG8gbGlzdCBzaW5jZSBBcHBvaW50bWVudExpc3Qgd2l0aCBmaWx0ZXIgUGFyZW50SUQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcGFyZW50IGl0c2VsZgogICAgICAgIG15ICVQYXJlbnRBcHBvaW50bWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gKCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ID8gJEFwcG9pbnRtZW50e1BhcmVudElEfSA6ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBBcHBvaW50bWVudHMsIFwlUGFyZW50QXBwb2ludG1lbnQ7CgogICAgICAgIG15ICRDdXJyZW50VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE5leHRBcHBvaW50bWVudDsKICAgICAgICBteSAkVGltZURpZmY7CiAgICAgICAgbXkgJEV4ZWN1dGlvblRpbWU7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudFJlZiAoQEFwcG9pbnRtZW50cykgewoKICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VGVtcGxhdGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b219LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkQXBwb2ludG1lbnRSZWYtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJEFwcG9pbnRtZW50UmVmLT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+Q29tcGFyZSggRGF0ZVRpbWVPYmplY3QgPT4gJEN1cnJlbnRUaW1lT2JqZWN0ICkgPiAwICkgewogICAgICAgICAgICAgICAgbXkgJERlbHRhUmVzdWx0ID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+RGVsdGEoIERhdGVUaW1lT2JqZWN0ID0+ICRDdXJyZW50VGltZU9iamVjdCApOwogICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkVGltZURpZmYgKSB7CiAgICAgICAgICAgICAgICAgICAgJE5leHRBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudFJlZjsKICAgICAgICAgICAgICAgICAgICAkVGltZURpZmYgICAgICAgID0gJERlbHRhUmVzdWx0LT57QWJzb2x1dGVTZWNvbmRzfTsKICAgICAgICAgICAgICAgICAgICAkRXhlY3V0aW9uVGltZSAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJERlbHRhUmVzdWx0LT57QWJzb2x1dGVTZWNvbmRzfSA8ICRUaW1lRGlmZiApIHsKICAgICAgICAgICAgICAgICAgICAkTmV4dEFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50UmVmOwogICAgICAgICAgICAgICAgICAgICRUaW1lRGlmZiAgICAgICAgPSAkRGVsdGFSZXN1bHQtPntBYnNvbHV0ZVNlY29uZHN9OwogICAgICAgICAgICAgICAgICAgICRFeGVjdXRpb25UaW1lICAgPSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJE5leHRBcHBvaW50bWVudCkgewoKICAgICAgICAgICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgaW4gZGIKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICROZXh0QXBwb2ludG1lbnQtPiUqLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50VGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAkVGlja2V0SUQ7Cn0KCjE7Cg==</File>
        <File Location="scripts/test/AppointmentToTicket/AppointmentToTicket.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjQgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6UmVnaXN0ZXJEcml2ZXI7Cgp1c2UgdmFycyBxdygkU2VsZik7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgRG8gbm90IGNoZWNrIGVtYWlscy4KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgR2V0IG5lY2Vzc2FyeSBvYmplY3RzLgpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkQXJ0aWNsZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7Cm15ICRMaW5rT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7Cm15ICRTY2hlZHVsZXJEQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyk7Cm15ICRUYXNrSGFuZGxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkFwcG9pbnRtZW50VGlja2V0Jyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKJFNlbGYtPklzKAogICAgcmVmICRTY2hlZHVsZXJEQk9iamVjdCwKICAgICdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicsCiAgICAiS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREItPm5ldygpIiwKKTsKCiMgQ3JlYXRlIGNhbGVuZGFyCm15ICRDYWxlbmRhck5hbWUgPSAnVGVzdF8nIC4gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKbXkgJUNhbGVuZGFyICAgICA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICBDYWxlbmRhck5hbWUgPT4gJENhbGVuZGFyTmFtZSwKICAgIEdyb3VwSUQgICAgICA9PiAxLAogICAgQ29sb3IgICAgICAgID0+ICcjRkY3NzAwJywKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKbXkgJFN0YXJ0VGltZU9iaiA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJwopOwokU3RhcnRUaW1lT2JqLT5BZGQoCiAgICBEYXlzID0+IDEsCik7Cm15ICRFbmRUaW1lT2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCik7CiRFbmRUaW1lT2JqLT5BZGQoCiAgICBEYXlzICA9PiAxLAogICAgSG91cnMgPT4gMSwKKTsKCiMgQ3JlYXRlIFRlc3QgQ3VzdG9tZXIgVXNlcgpteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwoKIyBDcmVhdGUgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmVUYXNrCm15ICRSYW5kb21JRCAgICAgICAgICA9ICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7Cm15ICVBcHBvaW50bWVudFRpY2tldCA9ICgKICAgIFRpbWUgICAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICBDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICIiLAogICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgIEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFF1ZXVlSUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIE93bmVySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIExvY2sgICAgICAgICAgICAgICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eUlEICAgICAgICAgICAgICAgID0+IDMsCiAgICBTdGF0ZUlEICAgICAgICAgICAgICAgICAgID0+IDQsCiAgICBTZXJ2aWNlSUQgICAgICAgICAgICAgICAgID0+IHVuZGVmLAogICAgU0xBSUQgICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlELAogICAgQ29udGVudCAgICAgICAgICAgICAgICAgICA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+IHVuZGVmLAogICAgQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciA9PiB1bmRlZiwKKTsKbXkgJFNpbmdsZUFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlELAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldCwKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldHtDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXR7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CgpteSAlU2luZ2xlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgQXBwb2ludG1lbnRJRCA9PiAkU2luZ2xlQXBwb2ludG1lbnRJRCwKKTsKCm15ICVGdXR1cmVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRTaW5nbGVBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9LAopOwoKIyBUcmlnZ2VyIEZ1dHVyZSBUYXNrIEV4ZWN1dGlvbgokVGFza0hhbmRsZXJPYmplY3QtPlJ1bigKICAgIFRhc2tJRCAgID0+ICRGdXR1cmVUYXNre1Rhc2tJRH0sCiAgICBUYXNrTmFtZSA9PiAkRnV0dXJlVGFza3tOYW1lfSwKICAgIERhdGEgICAgID0+ICRGdXR1cmVUYXNre0RhdGF9LAopOwoKIyBDaGVjayBpZiB0aWNrZXQgd2FzIGNyZWF0ZWQgLT4gdmlhIGxpbmsgb2JqZWN0Cm15ICRMaW5rTGlzdCA9ICRMaW5rT2JqZWN0LT5MaW5rTGlzdCgKICAgIE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgS2V5ICAgID0+ICRTaW5nbGVBcHBvaW50bWVudElELAogICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBrZXlzICV7JExpbmtMaXN0fSwKICAgIDEsCiAgICAiVGhlIG51bWJlciBvZiBjcmVhdGVkIGxpbmtzIGZvciB0aGUgYXBwb2ludG1lbnQgaXMgbm90IGNvcnJlY3QiLAopOwoKIyBGZXRjaCBUaWNrZXQKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICgga2V5cyAkTGlua0xpc3QtPntUaWNrZXR9LT57Tm9ybWFsfS0+e1NvdXJjZX0tPiUqIClbMF0sCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPklzTm90KAogICAgc2NhbGFyIGtleXMgJVRpY2tldCwKICAgIDAsCiAgICAiVGlja2V0IHdhcyBub3QgY3JlYXRlZCIsCik7CgojIEZldGNoIEFydGljbGUKbXkgQEFydGljbGVMaXN0ID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFydGljbGVMaXN0LAogICAgMSwKICAgICJUaGUgbnVtYmVyIG9mIGNyZWF0ZWQgYXJ0aWNsZXMgZm9yIHRoZSB0aWNrZXQgaXMgbm90IGNvcnJlY3QiLAopOwoKbXkgJUFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRBcnRpY2xlTGlzdFswXSB9ICktPkFydGljbGVHZXQoICV7ICRBcnRpY2xlTGlzdFswXSB9ICk7CiRTZWxmLT5Jc05vdCgKICAgIHNjYWxhciBrZXlzICVBcnRpY2xlLAogICAgMCwKICAgICJBcnRpY2xlIHdhcyBub3QgY3JlYXRlZCIsCik7CgojIENyZWF0ZSBSZWN1cnJpbmcgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmUgVGFzayBvbiBQYXJlbnQgQXBwb2ludG1lbnQKbXkgJFJhbmRvbUlEUmVjdXJyaW5nICAgICAgICAgID0gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKbXkgJUFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5nID0gKAogICAgVGltZSAgICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgIEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gIiIsCiAgICBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICBDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICBDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+IHVuZGVmLAogICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgQ3VzdG9tZXJJRCAgICAgICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgU2VsZWN0ZWRDdXN0b21lclVzZXIgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgT3duZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgTG9jayAgICAgICAgICAgICAgICAgICAgICA9PiAndW5sb2NrJywKICAgIFByaW9yaXR5SUQgICAgICAgICAgICAgICAgPT4gMywKICAgIFN0YXRlSUQgICAgICAgICAgICAgICAgICAgPT4gNCwKICAgIFNlcnZpY2VJRCAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBTTEFJRCAgICAgICAgICAgICAgICAgICAgID0+IHVuZGVmLAogICAgVHlwZUlEICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlEUmVjdXJyaW5nLAogICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSURSZWN1cnJpbmcsCiAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgID0+ICdTb21lRGVzY3JpcHRpb25fJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+IHVuZGVmLAopOwpteSAkUmVjdXJyaW5nQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlY3VycmluZyAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIFJlY3VycmVuY2VEYXlzICAgICAgICAgICAgICAgICAgPT4gIiIsCiAgICBSZWN1cnJlbmNlTW9udGhzICAgICAgICAgICAgICAgID0+ICIiLAogICAgUmVjdXJyZW5jZU1vbnRoRGF5cyAgICAgICAgICAgICA9PiAiIiwKICAgIFJlY3VycmVuY2VUeXBlICAgICAgICAgICAgICAgICAgPT4gIldlZWtseSIsCiAgICBSZWN1cnJlbmNlQ3VzdG9tVHlwZSAgICAgICAgICAgID0+ICJDdXN0b21EYWlseSIsCiAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgICAgICAgICAgID0+IDEsCiAgICBEYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDQsCiAgICBNb250aERheXMgICAgICAgICAgICAgICAgICAgICAgID0+IDMwLAogICAgTW9udGhzICAgICAgICAgICAgICAgICAgICAgICAgICA9PiA2LAogICAgUmVjdXJyZW5jZUxpbWl0ICAgICAgICAgICAgICAgICA9PiAyLAogICAgUmVjdXJyZW5jZVVudGlsRGF5ICAgICAgICAgICAgICA9PiAzLAogICAgUmVjdXJyZW5jZVVudGlsTW9udGggICAgICAgICAgICA9PiA3LAogICAgUmVjdXJyZW5jZVVudGlsWWVhciAgICAgICAgICAgICA9PiAyMDIyLAogICAgUmVjdXJyZW5jZUNvdW50ICAgICAgICAgICAgICAgICA9PiA0LAogICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSURSZWN1cnJpbmcsCiAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lRGVzY3JpcHRpb25fJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFN0YXJ0VGltZU9iai0+VG9TdHJpbmcoKSwKICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBBcHBvaW50bWVudFRpY2tldCAgICAgICAgICAgICAgID0+IFwlQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmcsCiAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tUZW1wbGF0ZX0sCiAgICBUaWNrZXRDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tDdXN0b219LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmd7Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne0N1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAopOwokS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgpOwoKbXkgJVJlY3VycmluZ0FwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQsCik7CgpteSAlRnV0dXJlVGFza1JlY3VycmluZyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza0dldCgKICAgIFRhc2tJRCA9PiAkUmVjdXJyaW5nQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSwKKTsKCm15ICRTdGFydFRpbWVQYXN0T2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAopOwokU3RhcnRUaW1lUGFzdE9iai0+U3VidHJhY3QoCiAgICBEYXlzID0+IDQsCik7CgpteSAkRW5kVGltZVBhc3RPYmogPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICBEYXlzICA9PiAzLAogICAgSG91cnMgPT4gMjMsCik7CgojIFNoaWZ0IEFwcG9pbnRtZW50IHRvIHRoZSBwYXN0IGFuZCBjaGVjayBpZiBGdXR1cmVUYXNrIHdhcyBzaGlmdGVkIHRvIHRoZSBjb3JyZWN0IENoaWxkIEFwcG9pbnRtZW50Cm15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICVSZWN1cnJpbmdBcHBvaW50bWVudCwKICAgIEFwcG9pbnRtZW50VGlja2V0ID0+ICRGdXR1cmVUYXNrUmVjdXJyaW5ne0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LAogICAgU3RhcnRUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZVBhc3RPYmotPlRvU3RyaW5nKCksCiAgICBFbmRUaW1lICAgICAgICAgICA9PiAkRW5kVGltZVBhc3RPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBDaGVjayBpZiBGdXR1cmVUYXNrIHdhcyBzaGlmdGVkIGNvcnJlY3RseQpteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFBhcmVudElEICAgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgIDMsCiAgICAiTnVtYmVyIG9mIGNoaWxkIGFwcG9pbnRtZW50cyBpcyBub3QgY29ycmVjdCIsCik7CgokU2VsZi0+SXNOb3QoCiAgICAkQXBwb2ludG1lbnRMaXN0WzBdLT57RnV0dXJlVGFza0lEfSwKICAgIHVuZGVmLAogICAgIkZ1dHVyZSB0YXNrIHdhcyBub3Qgc2hpZnRlZCBjb3JyZWN0bHkiLAopOwoKIyBDcmVhdGUgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmVUYXNrLCBzaGlmdCBpdCBhbmQgY2hlY2sgRnV0dXJlVGFzayBFeGVjdXRpb24gVGltZQpteSAkU2luZ2xlQXBwb2ludG1lbnRJRDIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlELAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldCwKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldHtDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXR7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CgpteSAlU2luZ2xlQXBwb2ludG1lbnQyID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFNpbmdsZUFwcG9pbnRtZW50SUQyLAopOwpteSAlRnV0dXJlVGFzazIgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tHZXQoCiAgICBUYXNrSUQgPT4gJFNpbmdsZUFwcG9pbnRtZW50MntGdXR1cmVUYXNrSUR9LAopOwokU3RhcnRUaW1lT2JqLT5BZGQoCiAgICBEYXlzID0+IDEKKTsKJEVuZFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMSwKKTsKCiMgVXBkYXRlIEFwcG9pbnRtZW50CiRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICVTaW5nbGVBcHBvaW50bWVudDIsCiAgICBBcHBvaW50bWVudFRpY2tldCA9PiAkRnV0dXJlVGFzazJ7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0sCiAgICBTdGFydFRpbWUgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKbXkgJVNpbmdsZUFwcG9pbnRtZW50MlVwZGF0ZWQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgQXBwb2ludG1lbnRJRCA9PiAkU2luZ2xlQXBwb2ludG1lbnRJRDIsCik7CgokU2VsZi0+SXMoCiAgICAkU3VjY2VzcywKICAgIDEsCiAgICAiQXBwb2ludG1lbnQgdXBkYXRlIHdhcyBub3Qgc3VjY2Vzc2Z1bCIsCik7CgpteSAlRnV0dXJlVGFzazJVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRTaW5nbGVBcHBvaW50bWVudDJVcGRhdGVke0Z1dHVyZVRhc2tJRH0sCik7CgokU2VsZi0+SXMoCiAgICAkRnV0dXJlVGFzazJVcGRhdGVke0V4ZWN1dGlvblRpbWV9LAogICAgJFN0YXJ0VGltZU9iai0+VG9TdHJpbmcoKSwKICAgICJGdXR1cmUgdGFzayB3YXMgbm90IHVwZGF0ZWQgY29ycmVjdGx5IiwKKTsKCiMgQ3JlYXRlIFJlY3VycmluZyBBcHBvaW50bWVudCB3aXRoIEZ1dHVyZSBUYXNrIG9uIFBhcmVudCBBcHBvaW50bWVudApteSAkUmVjdXJyaW5nQXBwb2ludG1lbnRJRDIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlEUmVjdXJyaW5nLAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldFJlY3VycmluZywKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmd7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CiRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCk7CgpteSAlUmVjdXJyaW5nQXBwb2ludG1lbnQyID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQyLAopOwoKbXkgJUZ1dHVyZVRhc2tSZWN1cnJpbmcyID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRSZWN1cnJpbmdBcHBvaW50bWVudDJ7RnV0dXJlVGFza0lEfSwKKTsKCiRTdGFydFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMQopOwokRW5kVGltZU9iai0+QWRkKAogICAgRGF5cyA9PiAxLAopOwoKIyBVcGRhdGUgQXBwb2ludG1lbnQKJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgJVJlY3VycmluZ0FwcG9pbnRtZW50MiwKICAgIEFwcG9pbnRtZW50VGlja2V0ID0+ICRGdXR1cmVUYXNrUmVjdXJyaW5nMntEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fSwKICAgIFN0YXJ0VGltZSAgICAgICAgID0+ICRTdGFydFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBFbmRUaW1lICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgokU2VsZi0+SXMoCiAgICAkU3VjY2VzcywKICAgIDEsCiAgICAiQXBwb2ludG1lbnQgdXBkYXRlIHdhcyBub3Qgc3VjY2Vzc2Z1bCIsCik7CgpteSAlRnV0dXJlVGFza1JlY3VycmluZzJVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRSZWN1cnJpbmdBcHBvaW50bWVudDJ7RnV0dXJlVGFza0lEfSwKKTsKCiRTZWxmLT5JcygKICAgICRGdXR1cmVUYXNrUmVjdXJyaW5nMlVwZGF0ZWR7RXhlY3V0aW9uVGltZX0sCiAgICAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgIkZ1dHVyZSB0YXNrIHdhcyBub3QgdXBkYXRlZCBjb3JyZWN0bHkiLAopOwoKJFNlbGYtPkRvbmVUZXN0aW5nKCk7Cg==</File>
        <File Location="scripts/test/Daemon/SchedulerDBFutureTaskUpdate.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjQgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6UmVnaXN0ZXJEcml2ZXI7Cgp1c2UgdmFycyBxdygkU2VsZik7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgRG8gbm90IGNoZWNrIGVtYWlscy4KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgR2V0IG5lY2Vzc2FyeSBvYmplY3RzLgpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkU2NoZWR1bGVyREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpOwokU2VsZi0+SXMoCiAgICByZWYgJFNjaGVkdWxlckRCT2JqZWN0LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJywKICAgICJLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQi0+bmV3KCkiLAopOwoKIyBDcmVhdGUgY2FsZW5kYXIKbXkgJENhbGVuZGFyTmFtZSA9ICdUZXN0XycgLiAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwpteSAlQ2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXJOYW1lLAogICAgR3JvdXBJRCAgICAgID0+IDEsCiAgICBDb2xvciAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgpteSAkU3RhcnRUaW1lT2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCik7CiRTdGFydFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMSwKKTsKbXkgJEVuZFRpbWVPYmogPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKKTsKJEVuZFRpbWVPYmotPkFkZCgKICAgIERheXMgID0+IDEsCiAgICBIb3VycyA9PiAxLAopOwoKIyBDcmVhdGUgYXBwb2ludG1lbnQKbXkgJFJhbmRvbUlEICAgICAgPSAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwpteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICBDYWxlbmRhcklEICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSUQsCiAgICBEZXNjcmlwdGlvbiA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICBTdGFydFRpbWUgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKIyBDcmVhdGUgdGVzdCBjdXN0b21lciB1c2VyCm15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyT2JqZWN0LT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCk7CgojIENyZWF0ZSBpbml0aWFsIGZ1dHVyZSB0YXNrCm15ICRGdXR1cmVUYXNrSUQgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tBZGQoCiAgICBFeGVjdXRpb25UaW1lID0+ICRTdGFydFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBUeXBlICAgICAgICAgID0+ICdBcHBvaW50bWVudFRpY2tldCcsCiAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICBBcHBvaW50bWVudFRpY2tldCA9PiB7CiAgICAgICAgICAgIFRpbWUgICAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgU2VsZWN0ZWRDdXN0b21lclVzZXIgICAgICA9PiAndGVzdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTG9jayAgICAgICAgICAgICAgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICBTdGF0ZUlEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgfQopOwoKIyBDaGVjayBpZiB0YXNrIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CiRTZWxmLT5Jc05vdCgKICAgICRGdXR1cmVUYXNrSUQsCiAgICB1bmRlZiwKICAgICJGdXR1cmUgdGFzayBpZCBpcyB1bmRlZiIsCik7CiRTZWxmLT5Jc05vdCgKICAgICRGdXR1cmVUYXNrSUQsCiAgICAtMSwKICAgICJGdXR1cmUgdGFzayBjb3VsZCBub3QgYmUgY3JlYXRlZCwgUmVzdWx0OiAkRnV0dXJlVGFza0lEIiwKKTsKCm15ICVGdXR1cmVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRGdXR1cmVUYXNrSUQsCik7CgojIFVwZGF0ZSBleGVjdXRpb24gdGltZQpteSAkRXhlY3V0aW9uVGltZU5ldyA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJwopOwokRXhlY3V0aW9uVGltZU5ldy0+QWRkKAogICAgRGF5cyAgPT4gMiwKICAgIEhvdXJzID0+IDEsCik7Cm15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrVXBkYXRlKAogICAgVGFza0lEICAgICAgICA9PiAkRnV0dXJlVGFza0lELAogICAgRXhlY3V0aW9uVGltZSA9PiAkRXhlY3V0aW9uVGltZU5ldy0+VG9TdHJpbmcoKSwKICAgIERhdGEgICAgICAgICAgPT4gewogICAgICAgIEFwcG9pbnRtZW50SUQgICAgID0+ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+JSosCiAgICAgICAgICAgIFRpdGxlICAgPT4gJ1NvbWVUaXRsZTJfJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgU3ViamVjdCA9PiAnU29tZVRpdGxlMl8nIC4gJFJhbmRvbUlELAogICAgICAgICAgICBCb2R5ICAgID0+ICdTb21lRGVzY3JpcHRpb24yXycgLiAkUmFuZG9tSUQsCiAgICAgICAgfQogICAgfSwKKTsKCiRTZWxmLT5JcygKICAgICRTdWNjZXNzLAogICAgMSwKICAgICJGdXR1cmUgdGFzayBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkiLAopOwoKbXkgJUZ1dHVyZVRhc2tVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRGdXR1cmVUYXNrSUQsCik7CgokU2VsZi0+SXMoCiAgICAkRnV0dXJlVGFza1VwZGF0ZWR7RXhlY3V0aW9uVGltZX0sCiAgICAkRXhlY3V0aW9uVGltZU5ldy0+VG9TdHJpbmcoKSwKICAgICJVcGRhdGUgb2YgZnV0dXJlIHRhc2sgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCBkaWQgbm90IGNoYW5nZSB0aGUgZXhlY3V0aW9uIHRpbWUiLAopOwoKJFNlbGYtPklzKAogICAgJEZ1dHVyZVRhc2tVcGRhdGVke0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VGl0bGV9LAogICAgJ1NvbWVUaXRsZTJfJyAuICRSYW5kb21JRCwKICAgICJVcGRhdGUgb2YgZnV0dXJlIHRhc2sgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCBkaWQgbm90IGNoYW5nZSB0aGUgdGlja2V0IHRpdGxlIiwKKTsKCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KCiRTZWxmLT5Eb25lVGVzdGluZygpOwo=</File>
        <File Location="var/packagesetup/AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAxOSBSb3RoZXIgT1NTIEdtYkgsIGh0dHA6Ly9vdHJzLmNoLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6QXBwb2ludG1lbnRUb1RpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCkFwcG9pbnRtZW50VG9UaWNrZXQucG0gLSBjb2RlIHRvIGV4ZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCd2YXI6OnBhY2thZ2VzZXR1cDo6QXBwb2ludG1lbnRUb1RpY2tldCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGFsd2F5cyBkaXNjYXJkIHRoZSBjb25maWcgb2JqZWN0IGJlZm9yZSBwYWNrYWdlIGNvZGUgaXMgZXhlY3V0ZWQsCiAgICAjIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCBuZXdseSwgc28gdGhhdCBpdAogICAgIyB3aWxsIHVzZSB0aGUgcmVjZW50bHkgd3JpdHRlbiBuZXcgY29uZmlnIGZyb20gdGhlIHBhY2thZ2UKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICBPYmplY3RzID0+IFsnS2VybmVsOjpDb25maWcnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBERUxFVEUgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICBXSEVSRSB0YXNrX3R5cGUgPSAnQXBwb2ludG1lbnRUaWNrZXQnCiAgICAiOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJFNRTCwKICAgICk7CiAgICAKICAgIHJldHVybiAxOwp9Cg==</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.AppointmentCalendar.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNSBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gYzE0Y2E1NWE4YjFkM2Q2ODZlODAzYzEzOTg4MTNiODNkMjIwOTFlNSAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLmpzCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgovKmdsb2JhbCBDbGlwYm9hcmQgKi8KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CgovKioKICogQG5hbWVzcGFjZSBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICogQG1lbWJlcm9mIENvcmUuQWdlbnQKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgZnVuY3Rpb25zLgogKi8KQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vIEFwcG9pbnRtZW50IGRheXMgY2FjaGUgYW5kIHJlYWR5IGZsYWcKICAgIHZhciBBcHBvaW50bWVudERheXNDYWNoZSwKICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IGZhbHNlLAogICAgICAgIEFKQVhDb3VudGVyID0gMCwKICAgICAgICBDdXJyZW50VmlldywKICAgICAgICBDYWxlbmRhclNvdXJjZXMgPSB7fTsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplcyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgY29udHJvbC4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ2FsZW5kYXJDb25maWcgPSBDb3JlLkNvbmZpZy5HZXQoJ0NhbGVuZGFyQ29uZmlnJyksCiAgICAgICAgICAgIFJlc291cmNlQ29uZmlnLAogICAgICAgICAgICAkQ2FsZW5kYXJPYmogPSAkKCcjY2FsZW5kYXInKSwKICAgICAgICAgICAgJERhdGVwaWNrZXJPYmosCiAgICAgICAgICAgIENsaXBib2FyZEpTLAogICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQgPSBbXTsKCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT0gJ0FnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldycpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghQ2FsZW5kYXJDb25maWcpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJERhdGVwaWNrZXJPYmogPSAkKCc8ZGl2IC8+JykKICAgICAgICAgICAgLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXInKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0hpZGRlbicpCiAgICAgICAgICAgIC5pbnNlcnRBZnRlcigkQ2FsZW5kYXJPYmopLAoKICAgICAgICBDbGlwYm9hcmRKUyA9IG5ldyBDbGlwYm9hcmQoJy5Db3B5VG9DbGlwYm9hcmQnKTsKCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnVGVhbUlEJykpIHsKICAgICAgICAgICAgUmVzb3VyY2VDb25maWcgPSB7CiAgICAgICAgICAgICAgICB1cmw6IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRUZWFtTGlzdCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnTGlzdFJlc291cmNlcycsCiAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiBDb3JlLkNvbmZpZy5HZXQoJ1RlYW1JRCcpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLyBJbml0aWFsaXplIGNhbGVuZGFyCiAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcih7CiAgICAgICAgICAgIGhlYWRlcjogewogICAgICAgICAgICAgICAgbGVmdDogJ21vbnRoLGFnZW5kYVdlZWssYWdlbmRhRGF5IHRpbWVsaW5lTW9udGgsdGltZWxpbmVXZWVrLHRpbWVsaW5lRGF5JywKICAgICAgICAgICAgICAgIGNlbnRlcjogJ3RpdGxlJywKICAgICAgICAgICAgICAgIHJpZ2h0OiAnanVtcCx0b2RheSBwcmV2LG5leHQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGN1c3RvbUJ1dHRvbnM6IHsKICAgICAgICAgICAgICAgIGp1bXA6IHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVtcCcpLAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2hvd0RhdGVwaWNrZXIoJENhbGVuZGFyT2JqLCAkRGF0ZXBpY2tlck9iaiwgJCh0aGlzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWZhdWx0VmlldzogQ29yZS5Db25maWcuR2V0KCdEZWZhdWx0VmlldycpLAogICAgICAgICAgICBhbGxEYXlUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQWxsLWRheScpLAogICAgICAgICAgICBpc1JUTDogQ29yZS5Db25maWcuR2V0KCdJc1JUTExhbmd1YWdlJyksCiAgICAgICAgICAgIGNvbHVtbkZvcm1hdDogJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICB0aW1lRm9ybWF0OiAnSEg6bW0nLAogICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6ICdISDptbScsCiAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgIHdlZWtOdW1iZXJzOiB0cnVlLAogICAgICAgICAgICB3ZWVrTnVtYmVyVGl0bGU6ICcjJywKICAgICAgICAgICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiAnSVNPJywKICAgICAgICAgICAgZXZlbnRMaW1pdDogdHJ1ZSwKICAgICAgICAgICAgZXZlbnRMaW1pdFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdtb3JlJyksCiAgICAgICAgICAgIGhlaWdodDogNjAwLAogICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgZmlyc3REYXk6IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSwKICAgICAgICAgICAgbW9udGhOYW1lczogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0phbnVhcnknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGZWJydWFyeScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01hcmNoJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXByaWwnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXlfbG9uZycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bmUnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdWx5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXVndXN0JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VwdGVtYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2N0b2JlcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vdmVtYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRGVjZW1iZXInKQogICAgICAgICAgICBdLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKYW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGZWInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcHInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdWwnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBdWcnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXAnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPY3QnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOb3YnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZWMnKQogICAgICAgICAgICBdLAogICAgICAgICAgICBkYXlOYW1lczogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1bmRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01vbmRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1ZXNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXZWRuZXNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaHVyc2RheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyaWRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdHVyZGF5JykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgZGF5TmFtZXNTaG9ydDogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1bicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01vbicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1ZScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlZCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RodScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyaScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdCcpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGJ1dHRvblRleHQ6IHsKICAgICAgICAgICAgICAgIHRvZGF5OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVG9kYXknKSwKICAgICAgICAgICAgICAgIG1vbnRoOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTW9udGgnKSwKICAgICAgICAgICAgICAgIHdlZWs6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXZWVrJyksCiAgICAgICAgICAgICAgICBkYXk6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEYXknKSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lTW9udGg6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaW1lbGluZSBNb250aCcpLAogICAgICAgICAgICAgICAgdGltZWxpbmVXZWVrOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGltZWxpbmUgV2VlaycpLAogICAgICAgICAgICAgICAgdGltZWxpbmVEYXk6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaW1lbGluZSBEYXknKSwKICAgICAgICAgICAgICAgIGp1bXA6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW1wJyksCiAgICAgICAgICAgICAgICBwcmV2RGF0ZXBpY2tlcjogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1ByZXZpb3VzJyksCiAgICAgICAgICAgICAgICBuZXh0RGF0ZXBpY2tlcjogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05leHQnKQogICAgICAgICAgICB9LAogICAgICAgICAgICBzY2hlZHVsZXJMaWNlbnNlS2V5OiAnR1BMLU15LVByb2plY3QtSXMtT3Blbi1Tb3VyY2UnLAogICAgICAgICAgICBzbG90RHVyYXRpb246ICcwMDozMDowMCcsCiAgICAgICAgICAgIGZvcmNlRXZlbnREdXJhdGlvbjogdHJ1ZSwKICAgICAgICAgICAgbm93SW5kaWNhdG9yOiB0cnVlLAogICAgICAgICAgICB0aW1lem9uZTogJ2xvY2FsJywKICAgICAgICAgICAgcmVzb3VyY2VBcmVhV2lkdGg6ICcyMSUnLAogICAgICAgICAgICB2aWV3czogewogICAgICAgICAgICAgICAgbW9udGg6IHsKICAgICAgICAgICAgICAgICAgICB0aXRsZUZvcm1hdDogJ01NTU0gWVlZWScsCiAgICAgICAgICAgICAgICAgICAgY29sdW1uRm9ybWF0OiAnZGRkZCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhZ2VuZGFEYXk6IHsKICAgICAgICAgICAgICAgICAgICB0aXRsZUZvcm1hdDogJ0QgTU1NIFlZWVknLAogICAgICAgICAgICAgICAgICAgIHJlc291cmNlczogZmFsc2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0aW1lbGluZU1vbnRoOiB7CiAgICAgICAgICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMjQ6MDA6MDAnLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoczogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc2xvdExhYmVsRm9ybWF0OiBbCiAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0aW1lbGluZVdlZWs6IHsKICAgICAgICAgICAgICAgICAgICBzbG90RHVyYXRpb246ICcwMjowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgd2VlazogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc2xvdExhYmVsRm9ybWF0OiBbCiAgICAgICAgICAgICAgICAgICAgICAgICdkZGQsIEQgTU1NJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0hIJwogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0aW1lbGluZURheTogewogICAgICAgICAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAwOjMwOjAwJywKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICBkYXlzOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSEg6bW0nCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBsb2FkaW5nOiBmdW5jdGlvbihJc0xvYWRpbmcpIHsKICAgICAgICAgICAgICAgIGlmIChJc0xvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAkKCcuQ2FsZW5kYXJXaWRnZXQnKS5hZGRDbGFzcygnTG9hZGluZycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKCcuQ2FsZW5kYXJXaWRnZXQnKS5yZW1vdmVDbGFzcygnTG9hZGluZycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB2aWV3UmVuZGVyOiBmdW5jdGlvbihWaWV3KSB7CgogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIG9uIGEgdGltZWxpbmUgdmlldy4KICAgICAgICAgICAgICAgIGlmIChWaWV3Lm5hbWUgPT09ICd0aW1lbGluZVdlZWsnIHx8IFZpZXcubmFtZSA9PT0gJ3RpbWVsaW5lRGF5JykgewoKICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2FsZW5kYXIgd2VlayBudW1iZXIgdG8gdGltZWxpbmUgdmlldyB0aXRsZXMuCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2FsZW5kYXJPYmouZmluZCgnLmZjLXRvb2xiYXIgPiBkaXYgPiBoMicpLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2ZjLXdlZWstbnVtYmVyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGV4dChWaWV3LnN0YXJ0LmZvcm1hdCgnICNXJykpCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CgogICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcmVzdG9yZSBzZXR0aW5ncyBidXR0b24uCiAgICAgICAgICAgICAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nc0luaXQoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB2aWV3IHNlbGVjdGlvbgogICAgICAgICAgICAgICAgaWYgKEN1cnJlbnRWaWV3ICE9PSB1bmRlZmluZWQgJiYgQ3VycmVudFZpZXcgIT09IFZpZXcubmFtZSkgewogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBDb3JlLkNvbmZpZy5HZXQoJ092ZXJ2aWV3U2NyZWVuJykgPyBDb3JlLkNvbmZpZy5HZXQoJ092ZXJ2aWV3U2NyZWVuJykgOiAnQ2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmlldzogVmlldy5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ3VycmVudFZpZXcgPSBWaWV3Lm5hbWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlbGVjdDogZnVuY3Rpb24oU3RhcnQsIEVuZCwgSlNFdmVudCwgVmlldywgUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBTdGFydCwKICAgICAgICAgICAgICAgICAgICBFbmQ6IEVuZCwKICAgICAgICAgICAgICAgICAgICBKU0V2ZW50OiBKU0V2ZW50LAogICAgICAgICAgICAgICAgICAgIFZpZXc6IFZpZXcsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IFJlc291cmNlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coRGF0YSk7CiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKCd1bnNlbGVjdCcpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudENsaWNrOiBmdW5jdGlvbihDYWxFdmVudCwgSlNFdmVudCkgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6IENhbEV2ZW50LnN0YXJ0LAogICAgICAgICAgICAgICAgICAgIEVuZDogQ2FsRXZlbnQuZW5kLAogICAgICAgICAgICAgICAgICAgIENhbEV2ZW50OiBDYWxFdmVudAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKERhdGEpOwogICAgICAgICAgICAgICAgSlNFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnREcm9wOiBmdW5jdGlvbihDYWxFdmVudCwgRGVsdGEsIFJldmVydEZ1bmMpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIENhbEV2ZW50OiBDYWxFdmVudCwKICAgICAgICAgICAgICAgICAgICBQcmV2aW91c0FwcG9pbnRtZW50OiBDdXJyZW50QXBwb2ludG1lbnQsCiAgICAgICAgICAgICAgICAgICAgRGVsdGE6IERlbHRhLAogICAgICAgICAgICAgICAgICAgIFJldmVydEZ1bmM6IFJldmVydEZ1bmMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBVcGRhdGVBcHBvaW50bWVudChEYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRSZXNpemU6IGZ1bmN0aW9uKENhbEV2ZW50LCBEZWx0YSwgUmV2ZXJ0RnVuYykgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50LAogICAgICAgICAgICAgICAgICAgIFByZXZpb3VzQXBwb2ludG1lbnQ6IEN1cnJlbnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBEZWx0YTogRGVsdGEsCiAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0RnVuYzogUmV2ZXJ0RnVuYwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFVwZGF0ZUFwcG9pbnRtZW50KERhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudFJlbmRlcjogZnVuY3Rpb24oQ2FsRXZlbnQsICRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgJEljb25Db250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgJEljb247CgogICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LmFsbERheQogICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnJlY3VycmluZwogICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnBhcmVudElkCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQubm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBjb250YWluZXIgYW5kIGljb24gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICRJY29uQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdJY29ucycpOwogICAgICAgICAgICAgICAgICAgICRJY29uID0gJCgnPGkgLz4nKS5hZGRDbGFzcygnZmEnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhcHBvaW50bWVudCB3aXRoIGFwcHJvcHJpYXRlIGljb24ocykKICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtc3VuLW8nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnJlY3VycmluZykgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLXJlcGVhdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1saW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5ub3RpZmljYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1iZWxsJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1jaGFyLScgKyBDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldEFwcG9pbnRtZW50Q29uZmlnJylbQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlXS5NYXJrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIFByZXBlbmQgY29udGFpbmVyIHRvIHRoZSBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmZpbmQoJy5mYy1jb250ZW50JykKICAgICAgICAgICAgICAgICAgICAgICAgLnByZXBlbmQoJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudFJlc2l6ZVN0YXJ0OiBmdW5jdGlvbihDYWxFdmVudCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnN0YXJ0ID0gQ2FsRXZlbnQuc3RhcnQ7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuZW5kID0gQ2FsRXZlbnQuZW5kOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudERyYWdTdGFydDogZnVuY3Rpb24oQ2FsRXZlbnQpIHsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5zdGFydCA9IENhbEV2ZW50LnN0YXJ0OwogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LmVuZCA9IENhbEV2ZW50LmVuZDsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5yZXNvdXJjZUlkcyA9IENhbEV2ZW50LnJlc291cmNlSWRzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudE1vdXNlb3ZlcjogZnVuY3Rpb24oQ2FsRXZlbnQsIEpTRXZlbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkVG9vbHRpcE9iaiwKICAgICAgICAgICAgICAgICAgICBQb3NYID0gMCwKICAgICAgICAgICAgICAgICAgICBQb3NZID0gMCwKICAgICAgICAgICAgICAgICAgICBUb29sdGlwSFRNTCA9IENvcmUuVGVtcGxhdGUuUmVuZGVyKCdBZ2VudC9BcHBvaW50bWVudENhbGVuZGFyL0FwcG9pbnRtZW50VG9vbHRpcCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ1BsdWdpbkxpc3QnOiBDb3JlLkNvbmZpZy5HZXQoJ1BsdWdpbkxpc3QnKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbEV2ZW50JzogQ2FsRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICdUb29sdGlwVGVtcGxhdGVSZXNvdXJjZSc6IENvcmUuQ29uZmlnLkdldCgnVG9vbHRpcFRlbXBsYXRlUmVzb3VyY2UnKSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAnVGlja2V0QXBwb2ludG1lbnRDb25maWcnOiBDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldEFwcG9pbnRtZW50Q29uZmlnJykKICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVMZWZ0ID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpICsgJCh3aW5kb3cpLndpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWaXNpYmxlVG9wID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkgKyAkKHdpbmRvdykuaGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgTGFzdFhQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICBMYXN0WVBvc2l0aW9uOwoKICAgICAgICAgICAgICAgIGlmICghSlNFdmVudCkgewogICAgICAgICAgICAgICAgICAgIEpTRXZlbnQgPSB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoSlNFdmVudC5wYWdlWCB8fCBKU0V2ZW50LnBhZ2VZKSB7CiAgICAgICAgICAgICAgICAgICAgUG9zWCA9IEpTRXZlbnQucGFnZVg7CiAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEpTRXZlbnQucGFnZVk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEpTRXZlbnQuY2xpZW50WCB8fCBKU0V2ZW50LmNsaWVudFkpIHsKICAgICAgICAgICAgICAgICAgICBQb3NYID0gSlNFdmVudC5jbGllbnRYICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7CiAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEpTRXZlbnQuY2xpZW50WSArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBJbmNyZWFzZSBwb3NpdGlvbnMgc28gdGhlIHRvb2x0aXAgZG8gbm90IG92ZXJsYXAgd2l0aCBtb3VzZSBwb2ludGVyCiAgICAgICAgICAgICAgICBQb3NYICs9IDEwOwogICAgICAgICAgICAgICAgUG9zWSArPSAxMDsKCiAgICAgICAgICAgICAgICBpZiAoVG9vbHRpcEhUTUwubGVuZ3RoID4gMCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdG9vbHRpcCBvYmplY3QKICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iaiA9ICQoVG9vbHRpcEhUTUwpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBQb3NZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogUG9zWAogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJ2JvZHknKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRvcCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBMYXN0WVBvc2l0aW9uID0gUG9zWSArICRUb29sdGlwT2JqLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChMYXN0WVBvc2l0aW9uID4gRG9jdW1lbnRWaXNpYmxlVG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBQb3NZIC0gJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmNzcygndG9wJywgUG9zWSArICdweCcpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIGxlZnQgcG9zaXRpb24gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgTGFzdFhQb3NpdGlvbiA9IFBvc1ggKyAkVG9vbHRpcE9iai53aWR0aCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChMYXN0WFBvc2l0aW9uID4gRG9jdW1lbnRWaXNpYmxlTGVmdCkgewogICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gUG9zWCAtICRUb29sdGlwT2JqLndpZHRoKCkgLSAzMDsKICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCdsZWZ0JywgUG9zWCArICdweCcpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmZhZGVJbignZmFzdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudE1vdXNlb3V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQoJy5BcHBvaW50bWVudFRvb2x0aXAnKS5mYWRlT3V0KCJmYXN0IikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50QWZ0ZXJBbGxSZW5kZXI6IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmlyc3QgZGF5IGluIHRpbWVsaW5lTW9udGggdmlldyBpcyBub3QgU2F0dXJkYXkgb3IgU3VuZGF5LCB0aGUgZmlyc3QgZGl2LmZjLWJnZXZlbnQgc2hvdWxkIGJlIHJlbW92ZWQuCiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBmcm9tIGZ1bGxjYWxlbmRhciBhbmQgaXQgY2FuIGJlIHNvbHZlZCBoZXJlLiBTZWUgYnVnIzE0NzY0LgogICAgICAgICAgICAgICAgaWYgKCEkKCcuZmMtdGltZWxpbmVNb250aC12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDplcSgwKScpLmhhc0NsYXNzKCdmYy1zYXQnKQogICAgICAgICAgICAgICAgICAgICYmICEkKCcuZmMtdGltZWxpbmVNb250aC12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDplcSgwKScpLmhhc0NsYXNzKCdmYy1zdW4nKSkgewogICAgICAgICAgICAgICAgICAgICQoJy5mYy10aW1lbGluZU1vbnRoLXZpZXcgLmZjLWJnZXZlbnQtY29udGFpbmVyIC5mYy1iZ2V2ZW50OmVxKDApJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50czogQ29yZS5Db25maWcuR2V0KCdXb3JraW5nSG91cnNDb25maWcnKSwKICAgICAgICAgICAgcmVzb3VyY2VzOiBSZXNvdXJjZUNvbmZpZywKICAgICAgICAgICAgcmVzb3VyY2VDb2x1bW5zOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWxUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTmFtZScpLAogICAgICAgICAgICAgICAgICAgIGZpZWxkOiAndGl0bGUnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHJlc291cmNlTGFiZWxUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUmVzb3VyY2VzJykKICAgICAgICB9KTsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRlcGlja2VyCiAgICAgICAgJERhdGVwaWNrZXJPYmouZGF0ZXBpY2tlcih7CiAgICAgICAgICAgIHNob3dPbjogJ2J1dHRvbicsCiAgICAgICAgICAgIGJ1dHRvblRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW1wJyksCiAgICAgICAgICAgIGNvbnN0cmFpbklucHV0OiB0cnVlLAogICAgICAgICAgICBwcmV2VGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1ByZXZpb3VzJyksCiAgICAgICAgICAgIG5leHRUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTmV4dCcpLAogICAgICAgICAgICBmaXJzdERheTogQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhcldlZWtEYXlTdGFydCcpLAogICAgICAgICAgICBzaG93TW9udGhBZnRlclllYXI6IDAsCiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKYW51YXJ5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmVicnVhcnknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXJjaCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcmlsJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWF5X2xvbmcnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW5lJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVseScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0F1Z3VzdCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NlcHRlbWJlcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09jdG9iZXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOb3ZlbWJlcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RlY2VtYmVyJykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSmFuJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmViJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWFyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXByJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVuJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVsJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXVnJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VwJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2N0JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm92JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRGVjJykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgZGF5TmFtZXM6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTdW5kYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNb25kYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUdWVzZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnV2VkbmVzZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGh1cnNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGcmlkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTYXR1cmRheScpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTdW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNb24nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUdWUnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXZWQnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaHUnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGcmknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTYXQnKQogICAgICAgICAgICBdLAogICAgICAgICAgICBkYXlOYW1lc01pbjogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTW8nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUdScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGgnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhJykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgaXNSVEw6IENvcmUuQ29uZmlnLkdldCgnSXNSVExMYW5ndWFnZScpLAogICAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24oRGF0ZVRleHQpIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ2dvdG9EYXRlJywgbmV3IERhdGUoRGF0ZVRleHQpKTsKICAgICAgICAgICAgICAgICQoJyNEYXRlcGlja2VyT3ZlcmxheScpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmouaGlkZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBiZWZvcmVTaG93RGF5OiBmdW5jdGlvbihEYXRlT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAoQXBwb2ludG1lbnREYXlzQ2FjaGVSZWZyZXNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tEYXRlKERhdGVPYmplY3QpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RydWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24oWWVhciwgTW9udGgpIHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHZhciBTZXNzaW9uSURDb29raWUgPSBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRENvb2tpZScpLAogICAgICAgICAgICBTZXNzaW9uSUQgPSBTZXNzaW9uSURDb29raWUgPyAnJyA6IENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbklEJyksCiAgICAgICAgICAgIFNlc3Npb25OYW1lID0gQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uTmFtZScpLAogICAgICAgICAgICBDdXN0b21lclBhbmVsU2Vzc2lvbk5hbWUgPSBDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpOwogICAgICAgICQuZWFjaChDYWxlbmRhckNvbmZpZywgZnVuY3Rpb24gKEluZGV4LCBDYWxlbmRhcikgewogICAgICAgICAgICB2YXIgQ2FsZW5kYXJEYXRhID0gewogICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoIiNDaGFsbGVuZ2VUb2tlbiIpLnZhbCgpLAogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudExpc3QnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnTGlzdEFwcG9pbnRtZW50cycsCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEOiBDYWxlbmRhci5DYWxlbmRhcklELAogICAgICAgICAgICAgICAgUmVzb3VyY2VJRDogQ29yZS5Db25maWcuR2V0KCdSZXNvdXJjZUlEJyksCiAgICAgICAgICAgICAgICBUZWFtSUQ6IENvcmUuQ29uZmlnLkdldCgnVGVhbUlEJykKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFTZXNzaW9uSURDb29raWUpIHsKICAgICAgICAgICAgICAgIENhbGVuZGFyRGF0YVtTZXNzaW9uTmFtZV0gPSBTZXNzaW9uSUQ7CiAgICAgICAgICAgICAgICBDYWxlbmRhckRhdGFbQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lXSA9IFNlc3Npb25JRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBDYWxlbmRhclNvdXJjZXNbQ2FsZW5kYXIuQ2FsZW5kYXJJRF0gPSB7CiAgICAgICAgICAgICAgICBpZDogQ2FsZW5kYXIuQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIHVybDogQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgICAgICAgICAgIGRhdGE6IENhbGVuZGFyRGF0YSwKICAgICAgICAgICAgICAgIGNvbG9yOiBDYWxlbmRhci5Db2xvciwKICAgICAgICAgICAgICAgIHRleHRDb2xvcjogQ2FsZW5kYXIuVGV4dENvbG9yLAogICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMiknLAogICAgICAgICAgICAgICAgc3RhcnRQYXJhbTogJ1N0YXJ0VGltZScsCiAgICAgICAgICAgICAgICBlbmRQYXJhbTogJ0VuZFRpbWUnLAoKICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHJlbW92ZUV2ZW50U291cmNlLgogICAgICAgICAgICAgICAgZ29vZ2xlQ2FsZW5kYXJJZDogQ2FsZW5kYXIuQ2FsZW5kYXJJRCwKCiAgICAgICAgICAgICAgICBldmVudERhdGFUcmFuc2Zvcm06IGZ1bmN0aW9uKEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBUaWNrZXRBcHBvaW50bWVudENvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnVGlja2V0QXBwb2ludG1lbnRDb25maWcnKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IEFwcG9pbnRtZW50RGF0YS5BcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZDogQXBwb2ludG1lbnREYXRhLlBhcmVudElELAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogQXBwb2ludG1lbnREYXRhLlN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBBcHBvaW50bWVudERhdGEuU3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IEFwcG9pbnRtZW50RGF0YS5FbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBBcHBvaW50bWVudERhdGEuRW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEFwcG9pbnRtZW50RGF0YS5UaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IEFwcG9pbnRtZW50RGF0YS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IEFwcG9pbnRtZW50RGF0YS5Mb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJJZDogQXBwb2ludG1lbnREYXRhLkNhbGVuZGFySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheTogcGFyc2VJbnQoQXBwb2ludG1lbnREYXRhLkFsbERheSwgMTApID8gdHJ1ZSA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJpbmc6IHBhcnNlSW50KEFwcG9pbnRtZW50RGF0YS5SZWN1cnJpbmcsIDEwKSA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbUlkczogQXBwb2ludG1lbnREYXRhLlRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbU5hbWVzOiBBcHBvaW50bWVudERhdGEuVGVhbU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUlkczogQXBwb2ludG1lbnREYXRhLlJlc291cmNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZXM6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5EYXRhOiBBcHBvaW50bWVudERhdGEuUGx1Z2luRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJOYW1lOiBDYWxlbmRhci5DYWxlbmRhck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQ29sb3I6IENhbGVuZGFyLkNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb246IEFwcG9pbnRtZW50RGF0YS5Ob3RpZmljYXRpb25EYXRlLmxlbmd0aCA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRGF0ZTogQXBwb2ludG1lbnREYXRhLk5vdGlmaWNhdGlvbkRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldEFwcG9pbnRtZW50VHlwZTogQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydEVkaXRhYmxlOiB0eXBlb2YgQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlID09PSAndW5kZWZpbmVkJyA/IHRydWUgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFRpY2tldEFwcG9pbnRtZW50Q29uZmlnW0FwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudFN0YXJ0RGF0ZV0uTm9EcmFnICE9PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogdHlwZW9mIEFwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudEVuZERhdGUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgVGlja2V0QXBwb2ludG1lbnRDb25maWdbQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlXS5Ob0RyYWcgIT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnLkNhbGVuZGFyU3dpdGNoIGlucHV0W3R5cGU9ImNoZWNrYm94Il0nKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ2FsZW5kYXJTd2l0Y2hJbml0KCQodGhpcykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBdXRvIG9wZW4gYXBwb2ludG1lbnQgY3JlYXRlIHNjcmVlbi4KICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpKSB7CiAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKHsKICAgICAgICAgICAgICAgIFN0YXJ0OiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuU3RhcnQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLlN0YXJ0KSA6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICBFbmQ6IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDcmVhdGUnKS5FbmQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLkVuZCkgOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpLAogICAgICAgICAgICAgICAgUGx1Z2luS2V5OiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuUGx1Z2luS2V5ID8gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLlBsdWdpbktleSA6IG51bGwsCiAgICAgICAgICAgICAgICBTZWFyY2g6IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDcmVhdGUnKS5TZWFyY2ggPyBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuU2VhcmNoIDogbnVsbCwKICAgICAgICAgICAgICAgIE9iamVjdElEOiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuT2JqZWN0SUQgPyBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuT2JqZWN0SUQgOiBudWxsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQXV0byBvcGVuIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuCiAgICAgICAgZWxzZSBpZiAoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudElEJykpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coeyBDYWxFdmVudDogeyBpZDogQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudElEJykgfSB9KTsKICAgICAgICB9CgogICAgICAgICQoJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicpCiAgICAgICAgICAgIC5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKQogICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgRW5kOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICBDYWxlbmRhclNldHRpbmdzSW5pdCgpOwoKICAgICAgICBSZXNvdXJjZVNldHRpbmdzSW5pdCgpOwoKICAgICAgICAkKCcjVGVhbScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI0NoYW5nZVRlYW1Gb3JtJykuc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJDYWxlbmRhcnMnKSwgJCgnI0NhbGVuZGFycycpKTsKCiAgICAgICAgQ2xpcGJvYXJkSlMub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgJChFdmVudC50cmlnZ2VyKS5oaWRlKCkKICAgICAgICAgICAgICAgIC5mYWRlSW4oKTsKICAgICAgICAgICAgRXZlbnQuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICB9KTsKCiAgICAgICAgQ2xpcGJvYXJkSlMub24oJ2Vycm9yJywgZnVuY3Rpb24oRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuSW5pdFRvb2x0aXAoJChFdmVudC50cmlnZ2VyKSwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1ByZXNzIEN0cmwrQyAoQ21kK0MpIHRvIGNvcHkgdG8gY2xpcGJvYXJkJykpOwogICAgICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmZvY3VzKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNob3dEYXRlcGlja2VyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJENhbGVuZGFyT2JqIC0gQ2FsZW5kYXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJERhdGVwaWNrZXJPYmogLSBEYXRlcGlja2VyIGNvbnRyb2wgb2JqZWN0LgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRKdW1wQnV0dG9uIC0gRGF0ZXBpY2tlciBidXR0b24gb2JqZWN0LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3cgZGF0ZSBwaWNrZXIgY29udHJvbC4KICAgICAqLwogICAgZnVuY3Rpb24gU2hvd0RhdGVwaWNrZXIoJENhbGVuZGFyT2JqLCAkRGF0ZXBpY2tlck9iaiwgJEp1bXBCdXR0b24pIHsKICAgICAgICB2YXIgQ3VycmVudERhdGUgPSAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKCdnZXREYXRlJyksCiAgICAgICAgICAgIFllYXIgPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVknKSwKICAgICAgICAgICAgTW9udGggPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ00nKTsKCiAgICAgICAgJCgnPGRpdiAvPicpLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXJPdmVybGF5JykKICAgICAgICAgICAgLmFwcGVuZFRvKCQoJ2JvZHknKSkKICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmhpZGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgpOwoKICAgICAgICAkRGF0ZXBpY2tlck9iai5kYXRlcGlja2VyKCdzZXREYXRlJywgQ3VycmVudERhdGUudG9EYXRlKCkpCiAgICAgICAgICAgIC5jc3MoewogICAgICAgICAgICAgICAgbGVmdDogcGFyc2VJbnQoJEp1bXBCdXR0b24ub2Zmc2V0KCkubGVmdCAtICREYXRlcGlja2VyT2JqLm91dGVyV2lkdGgoKSArICRKdW1wQnV0dG9uLm91dGVyV2lkdGgoKSwgMTApLAogICAgICAgICAgICAgICAgdG9wOiBwYXJzZUludCgkSnVtcEJ1dHRvbi5vZmZzZXQoKS50b3AgLSAkRGF0ZXBpY2tlck9iai5vdXRlckhlaWdodCgpICsgJEp1bXBCdXR0b24ub3V0ZXJIZWlnaHQoKSwgMTApCiAgICAgICAgICAgIH0pLmZhZGVJbignZmFzdCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENoZWNrRGF0ZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge0RhdGVPYmplY3R9IERhdGVPYmplY3QgLSBBIEpTIGRhdGUgb2JqZWN0IHRvIGNoZWNrLgogICAgICogQHJldHVybnMge0FycmF5fSBGaXJzdCBlbGVtZW50IGlzIGFsd2F5cyB0cnVlLCBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIENTUwogICAgICogICAgICAgICAgICAgICAgICBjbGFzcywgdGhpcmQgZWxlbWVudCBhIGRlc2NyaXB0aW9uIGZvciB0aGUgZGF0ZS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBDaGVjayBpZiBkYXRlIGhhcyBhbiBhcHBvaW50bWVudC4KICAgICAqLwogICAgZnVuY3Rpb24gQ2hlY2tEYXRlKERhdGVPYmplY3QpIHsKICAgICAgICB2YXIgRGF0ZU1vbWVudCA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChEYXRlT2JqZWN0KSwKICAgICAgICAgICAgRGF5QXBwb2ludG1lbnRzID0gQXBwb2ludG1lbnREYXlzQ2FjaGVbRGF0ZU1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKV0sCiAgICAgICAgICAgIERheUNsYXNzID0gRGF5QXBwb2ludG1lbnRzID8gJ0hpZ2hsaWdodCcgOiAnJywKICAgICAgICAgICAgRGF5RGVzY3JpcHRpb24gPSBEYXlBcHBvaW50bWVudHMgPyBEYXlBcHBvaW50bWVudHMudG9TdHJpbmcoKSA6ICcnOwoKICAgICAgICByZXR1cm4gW3RydWUsIERheUNsYXNzLCBEYXlEZXNjcmlwdGlvbl07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQXBwb2ludG1lbnREYXlzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJERhdGVwaWNrZXJPYmogLSBEYXRlcGlja2VyIGNvbnRyb2wgb2JqZWN0LgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBZZWFyIC0gU2VsZWN0ZWQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gTW9udGggLSBTZWxlY3RlZCBtb250aCAoMS0xMikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2FjaGVzIHRoZSBsaXN0IG9mIGFwcG9pbnRtZW50IGRheXMgZm9yIGxhdGVyIHVzZS4KICAgICAqLwogICAgZnVuY3Rpb24gQXBwb2ludG1lbnREYXlzKCREYXRlcGlja2VyT2JqLCBZZWFyLCBNb250aCkgewogICAgICAgIHZhciBTdGFydFRpbWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoWWVhciArICctJyArIE1vbnRoLCAnWVlZWS1NJykuc3RhcnRPZignbW9udGgnKSwKICAgICAgICAgICAgRW5kVGltZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChZZWFyICsgJy0nICsgTW9udGgsICdZWVlZLU0nKS5hZGQoMSwgJ21vbnRocycpLnN0YXJ0T2YoJ21vbnRoJyksCiAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdBcHBvaW50bWVudERheXMnLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lOiBTdGFydFRpbWUuZm9ybWF0KCdZWVlZLU1NLUREJyksCiAgICAgICAgICAgICAgICBFbmRUaW1lOiBFbmRUaW1lLmZvcm1hdCgnWVlZWS1NTS1ERCcpCiAgICAgICAgICAgIH07CgogICAgICAgICREYXRlcGlja2VyT2JqLmFkZENsYXNzKCdBSkFYTG9hZGluZycpOwogICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gZmFsc2U7CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGUgPSBSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmoucmVtb3ZlQ2xhc3MoJ0FKQVhMb2FkaW5nJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIGRhdGUgcGlja2VyIGJlY2F1c2UgdGhpcyBjYWxsIGlzIGFzeW5jaHJvbm91cwogICAgICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3JlZnJlc2gnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBTaG93V2FpdGluZ0RpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3dzIHdhaXRpbmcgZGlhbG9nLgogICAgICovCiAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZyA9IGZ1bmN0aW9uICgpIHsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICQoJy5Nb2RhbC5EaWFsb2cuUGVyc2lzdGVudCcpLnJlbW92ZUNsYXNzKCdQZXJzaXN0ZW50Jyk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygnPGRpdiBjbGFzcz0iU3BhY2luZyBDZW50ZXIiPjxzcGFuIGNsYXNzPSJBSkFYTG9hZGVyIiB0aXRsZT0iJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2FkaW5nLi4uJykgKyAnIj48L3NwYW4+PC9kaXY+JywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0xvYWRpbmcuLi4nKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBPcGVuRWRpdERpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YSAtIEhhc2ggd2l0aCBhcHBvaW50bWVudCBkYXRhLgogICAgICogQHBhcmFtIHtNb21lbnR9IEFwcG9pbnRtZW50RGF0YS5TdGFydCAtIE1vbWVudCBvYmplY3Qgd2l0aCBzdGFydCBkYXRlL3RpbWUuCiAgICAgKiBAcGFyYW0ge01vbWVudH0gQXBwb2ludG1lbnREYXRhLkVuZCAtIE1vbWVudCBvYmplY3Qgd2l0aCBlbmQgZGF0ZS90aW1lLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAtIENhbGVuZGFyIGV2ZW50IG9iamVjdCAoRnVsbENhbGVuZGFyKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgLSBDYWxlbmRhciByZXNvdXJjZSBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIGFwcG9pbnRtZW50IGRpYWxvZyBhZnRlciBzZWxlY3RpbmcgYSB0aW1lIHBlcmlvZCBvciBhbiBhcHBvaW50bWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2cgPSBmdW5jdGlvbiAoQXBwb2ludG1lbnREYXRhKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBTdWJhY3Rpb246ICdFZGl0TWFzaycsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0WWVhcjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC55ZWFyKCkgOiBudWxsLAogICAgICAgICAgICBTdGFydE1vbnRoOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0Lm1vbnRoKCkgKyAxIDogbnVsbCwKICAgICAgICAgICAgU3RhcnREYXk6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQuZGF0ZSgpIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRIb3VyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0LmhvdXIoKSA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0Lm1pbnV0ZSgpIDogbnVsbCwKICAgICAgICAgICAgRW5kWWVhcjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQueWVhcigpIDogbnVsbCwKICAgICAgICAgICAgRW5kTW9udGg6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLm1vbnRoKCkgKyAxIDogbnVsbCwKICAgICAgICAgICAgRW5kRGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5kYXRlKCkgOiBudWxsLAogICAgICAgICAgICBFbmRIb3VyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5ob3VyKCkgOiBudWxsLAogICAgICAgICAgICBFbmRNaW51dGU6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLm1pbnV0ZSgpIDogbnVsbCwKICAgICAgICAgICAgQWxsRGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gKEFwcG9pbnRtZW50RGF0YS5FbmQuaGFzVGltZSgpID8gJzAnIDogJzEnKSA6IG51bGwsCiAgICAgICAgICAgIFRlYW1JRDogQXBwb2ludG1lbnREYXRhLlJlc291cmNlID8gWyBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UuVGVhbUlEIF0gOiBudWxsLAogICAgICAgICAgICBSZXNvdXJjZUlEOiBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgPyBbIEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZS5pZCBdIDogbnVsbCwKICAgICAgICAgICAgUGx1Z2luS2V5OiBBcHBvaW50bWVudERhdGEuUGx1Z2luS2V5ID8gQXBwb2ludG1lbnREYXRhLlBsdWdpbktleSA6IG51bGwsCiAgICAgICAgICAgIFNlYXJjaDogQXBwb2ludG1lbnREYXRhLlNlYXJjaCA/IEFwcG9pbnRtZW50RGF0YS5TZWFyY2ggOiBudWxsLAogICAgICAgICAgICBPYmplY3RJRDogQXBwb2ludG1lbnREYXRhLk9iamVjdElEID8gQXBwb2ludG1lbnREYXRhLk9iamVjdElEIDogbnVsbAogICAgICAgIH07CgogICAgICAgIC8vIE1ha2UgZW5kIHRpbWUgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnRzIGluY2x1c2l2ZQogICAgICAgIGlmIChEYXRhLkFsbERheSAmJiBEYXRhLkFsbERheSA9PT0gJzEnKSB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5FbmQuc3VidHJhY3QoMSwgJ2RheScpOwogICAgICAgICAgICBEYXRhLkVuZFllYXIgPSBBcHBvaW50bWVudERhdGEuRW5kLnllYXIoKTsKICAgICAgICAgICAgRGF0YS5FbmRNb250aCA9IEFwcG9pbnRtZW50RGF0YS5FbmQubW9udGgoKSArIDE7CiAgICAgICAgICAgIERhdGEuRW5kRGF5ID0gQXBwb2ludG1lbnREYXRhLkVuZC5kYXRlKCk7CiAgICAgICAgICAgIERhdGEuRW5kSG91ciA9IEFwcG9pbnRtZW50RGF0YS5FbmQuaG91cigpOwogICAgICAgICAgICBEYXRhLkVuZE1pbnV0ZSA9IEFwcG9pbnRtZW50RGF0YS5FbmQubWludXRlKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBFZGl0RGlhbG9nKCkgewogICAgICAgICAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoSFRNTCkgewovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgLy8gQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50JyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUw6IEhUTUwsCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgTW9kYWw6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlT25DbGlja091dHNpZGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBDbG9zZU9uRXNjYXBlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzEwcHgnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25zOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93QXV0b0dyb3c6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbnQ6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwoKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCgpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdodG1sJwogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVwZWF0aW5nIGV2ZW50CiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAmJiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICBUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgIEhUTUw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nKSwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAvLyBDbG9zZU9uQ2xpY2tPdXRzaWRlOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogZmFsc2UsCi8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBbGwgb2NjdXJyZW5jZXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5IENhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkFwcG9pbnRtZW50SUQgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQ7Ci8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVkaXREaWFsb2coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXREaWFsb2coZmFsc2UpOwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdXN0IHRoaXMgb2NjdXJyZW5jZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ0NhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogRWRpdERpYWxvZwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Nsb3NlIHRoaXMgZGlhbG9nJykKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEVkaXREaWFsb2coKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgVXBkYXRlQXBwb2ludG1lbnQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEgLSBIYXNoIHdpdGggYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgLSBDYWxlbmRhciBldmVudCBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgYXBwb2ludG1lbnQgd2l0aCBzdXBwbGllZCBkYXRhLgogICAgICovCiAgICBmdW5jdGlvbiBVcGRhdGVBcHBvaW50bWVudChBcHBvaW50bWVudERhdGEpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogJ0VkaXRBcHBvaW50bWVudCcsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCwKICAgICAgICAgICAgU3RhcnRZZWFyOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQueWVhcigpLAogICAgICAgICAgICBTdGFydE1vbnRoOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubW9udGgoKSArIDEsCiAgICAgICAgICAgIFN0YXJ0RGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQuZGF0ZSgpLAogICAgICAgICAgICBTdGFydEhvdXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5ob3VyKCksCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubWludXRlKCksCiAgICAgICAgICAgIEVuZFllYXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpLAogICAgICAgICAgICBFbmRNb250aDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMSwKICAgICAgICAgICAgRW5kRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKSwKICAgICAgICAgICAgRW5kSG91cjogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCksCiAgICAgICAgICAgIEVuZE1pbnV0ZTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKSwKICAgICAgICAgICAgQWxsRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmhhc1RpbWUoKSA/ICcwJyA6ICcxJywKICAgICAgICAgICAgUmVjdXJyaW5nOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVjdXJyaW5nID8gJzEnIDogJzAnLAogICAgICAgICAgICBUZWFtSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC50ZWFtSWRzID8gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnRlYW1JZHMgOiB1bmRlZmluZWQsCiAgICAgICAgICAgIFJlc291cmNlSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA6CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZCA/IFsgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWQgXSA6IHVuZGVmaW5lZAogICAgICAgIH07CgogICAgICAgIC8vIEFzc2lnbmVkIHJlc291cmNlIGRpZG4ndCBjaGFuZ2UKICAgICAgICBpZiAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkCiAgICAgICAgICAgICYmIEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnJlc291cmNlSWRzCiAgICAgICAgICAgICYmICQuaW5BcnJheSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkLAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHMKICAgICAgICAgICAgKSAhPT0gLTEKICAgICAgICApIHsKICAgICAgICAgICAgRGF0YS5SZXNvdXJjZUlEID0gQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBVcGRhdGUoKSB7Ci8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVmZXRjaEV2ZW50cycpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5SZXZlcnRGdW5jKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGlhbG9nCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICAkKCcuRGlhbG9nOnZpc2libGUnKS5yZW1vdmVDbGFzcygnUGVyc2lzdGVudCcpOwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gTWFrZSBlbmQgdGltZSBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgaW5jbHVzaXZlCiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgIERhdGEuRW5kWWVhciA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpOwogICAgICAgICAgICBEYXRhLkVuZE1vbnRoID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMTsKICAgICAgICAgICAgRGF0YS5FbmREYXkgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKTsKICAgICAgICAgICAgRGF0YS5FbmRIb3VyID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTWludXRlID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlcGVhdGluZyBldmVudAogICAgICAgIGlmIChBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICBUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgIEhUTUw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nKSwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBbGwgb2NjdXJyZW5jZXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5IENhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkFwcG9pbnRtZW50SUQgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlJlY3VycmluZyA9ICcxJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuVXBkYXRlRGVsdGEgPSBBcHBvaW50bWVudERhdGEuRGVsdGEuYXNTZWNvbmRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0LmRpZmYoQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQuc3RhcnQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LmVuZCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnQm90aCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5zdGFydC5kaWZmKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnU3RhcnRUaW1lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZURlbHRhID0gRGF0YS5VcGRhdGVEZWx0YSAqIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LmVuZCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnRW5kVGltZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1c3QgdGhpcyBvY2N1cnJlbmNlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnQ2FsbEZvckFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Nsb3NlIHRoaXMgZGlhbG9nJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlJldmVydEZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVXBkYXRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENhbGVuZGFyU3dpdGNoSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgY2FsZW5kYXIgY2hlY2tib3ggYmVoYXZpb3IgYW5kIGxvYWRzIG11bHRpcGxlIGNhbGVuZGFycyB0byB0aGUKICAgICAqICAgICAgRnVsbENhbGVuZGFyIGNvbnRyb2wuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhbGVuZGFyU3dpdGNoSW5pdCgkQ2FsZW5kYXJTd2l0Y2gpIHsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbmFibGVkIHNvdXJjZXMKICAgICAgICBpZiAoJENhbGVuZGFyU3dpdGNoLnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ2FkZEV2ZW50U291cmNlJywgQ2FsZW5kYXJTb3VyY2VzWyRDYWxlbmRhclN3aXRjaC5kYXRhKCdpZCcpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWdpc3RlciBjaGFuZ2UgZXZlbnQgaGFuZGxlcgogICAgICAgICRDYWxlbmRhclN3aXRjaC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICgkKCcuQ2FsZW5kYXJTd2l0Y2ggaW5wdXQ6Y2hlY2tlZCcpLmxlbmd0aCA+IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJMaW1pdCcpKSB7CiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJTd2l0Y2gucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dBbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycycpLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLicpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIENhbGVuZGFyU3dpdGNoU291cmNlKCRDYWxlbmRhclN3aXRjaCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclN3aXRjaFNvdXJjZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgZW5hYmxlcy9kaXNhYmxlcyBjYWxlbmRhciBzb3VyY2UgaW4gRnVsbENhbGVuZGFyIGNvbnRyb2wgYW5kIHN0b3JlcwogICAgICogICAgICBzZWxlY3Rpb24gdG8gdXNlciBwcmVmZXJlbmNlcy4KICAgICAqLwogICAgZnVuY3Rpb24gQ2FsZW5kYXJTd2l0Y2hTb3VyY2UoJENhbGVuZGFyU3dpdGNoKSB7CiAgICAgICAgdmFyIENhbGVuZGFyU2VsZWN0aW9uID0gW107CgogICAgICAgIC8vIFNob3cvaGlkZSB0aGUgY2FsZW5kYXIgYXBwb2ludG1lbnRzCiAgICAgICAgaWYgKCRDYWxlbmRhclN3aXRjaC5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdhZGRFdmVudFNvdXJjZScsIENhbGVuZGFyU291cmNlc1skQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVtb3ZlRXZlbnRTb3VyY2UnLCAkQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBHZXQgYWxsIGNoZWNrZWQgY2FsZW5kYXJzCiAgICAgICAgJC5lYWNoKCQoJy5DYWxlbmRhclN3aXRjaCBpbnB1dDpjaGVja2VkJyksIGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICBDYWxlbmRhclNlbGVjdGlvbi5wdXNoKCQoRWxlbWVudCkuZGF0YSgnaWQnKSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFN0b3JlIHNlbGVjdGlvbiBpbiB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgICAgICAgICAgICAgIENhbGVuZGFyU2VsZWN0aW9uOiBKU09OLnN0cmluZ2lmeShDYWxlbmRhclNlbGVjdGlvbikKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBMb2NhdGlvbkxpbmtJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJExvY2F0aW9uT2JqIC0gbG9jYXRpb24gZmllbGQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJExvY2F0aW9uTGlua3MgLSBsb2NhdGlvbiBsaW5rcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBsb2NhdGlvbiBsaW5rIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5Mb2NhdGlvbkxpbmtJbml0ID0gZnVuY3Rpb24gKCRMb2NhdGlvbk9iaiwgJExvY2F0aW9uTGlua3MpIHsKICAgICAgICB2YXIgTG9jYXRpb25WYWx1ZSA9ICRMb2NhdGlvbk9iai52YWwoKSB8fCAkTG9jYXRpb25PYmoudGV4dCgpOwoKICAgICAgICAkTG9jYXRpb25MaW5rcy5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICB2YXIgJExpbmtPYmogPSAkKEVsZW1lbnQpLAogICAgICAgICAgICAgICAgQmFzZVVSTCAgPSAkTGlua09iai5kYXRhKCdiYXNlVXJsJyk7CgogICAgICAgICAgICAvLyBVcGRhdGUgbGluayBVUkwgYW5kIHNob3cgaXQgaWYgbG9jYXRpb24gaXMgc2V0CiAgICAgICAgICAgIGlmIChMb2NhdGlvblZhbHVlLmxlbmd0aCA+IDAgJiYgTG9jYXRpb25WYWx1ZSAhPT0gJy0nKSB7CiAgICAgICAgICAgICAgICAkTGlua09iai5hdHRyKCdocmVmJywgQmFzZVVSTCArIGVuY29kZVVSSUNvbXBvbmVudChMb2NhdGlvblZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAuZmFkZUluKCdmYXN0Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaGlkZSB0aGUgbGluawogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMaW5rT2JqLmZhZGVPdXQoJ2Zhc3QnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBSZWdpc3RlciBrZXkgdXAgZXZlbnQgaGFuZGxlcgogICAgICAgICRMb2NhdGlvbk9iai5vZmYoJ2tleXVwLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbigna2V5dXAuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBUYXJnZXROUy5Mb2NhdGlvbkxpbmtJbml0KCRMb2NhdGlvbk9iaiwgJExvY2F0aW9uTGlua3MpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgQWxsRGF5SW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRBbGxEYXkgLSBhbGwgZGF5IGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYWxsIGRheSBjaGVja2JveCBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCA9IGZ1bmN0aW9uICgkQWxsRGF5KSB7CiAgICAgICAgaWYgKCQoJyNTdGFydE1vbnRoOmRpc2FibGVkJykubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTaG93L2hpZGUgdGhlIHN0YXJ0IGhvdXIvbWludXRlIGFuZCBjb21wbGV0ZSBlbmQgdGltZQogICAgICAgIGlmICgkQWxsRGF5LnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjU3RhcnRIb3VyLCNTdGFydE1pbnV0ZSwjRW5kSG91ciwjRW5kTWludXRlJykudmFsKCcwJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpCiAgICAgICAgICAgICAgICAucHJvcCgncmVhZG9ubHknLCB0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjU3RhcnRIb3VyLCNTdGFydE1pbnV0ZSwjRW5kSG91ciwjRW5kTWludXRlJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKQogICAgICAgICAgICAgICAgLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICAkQWxsRGF5Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCgkQWxsRGF5KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIFJlY3VycmluZ0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBGaWVsZHMgLSBBcnJheSB3aXRoIHJlZmVyZW5jZXMgdG8gcmVjdXJyaW5nIGZpZWxkcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmluZyAtIGZpZWxkIHdpdGggcmVjdXJyaW5nIGZsYWcuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVHlwZSAtIGRyb3AgZG93biB3aXRoIHJlY3VycmVuY2UgdHlwZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUgLSBSZWN1cnJlbmNlIHBhdHRlcm4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2IC0gQ3VzdG9tIHR5cGUgZHJvcC1kb3duCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0IC0gaW50ZXJ2YWwgdGV4dAogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiAtIGNvbnRhaW5zIHdlZWsgZGF5cyB0YWJsZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgLSBjb250YWlucyBtb250aCBkYXlzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IC0gY29udGFpbnMgbW9udGhzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYgLSBsYXllciB3aXRoIHJlY3VycmVuY2UgbGltaXQgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0IC0gZHJvcCBkb3duIHdpdGggcmVjdXJyZW5jZSBsaW1pdCBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdiAtIGxheWVyIHdpdGggcmVjY3VyZW5jZSBjb3VudCBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdiAtIGxheWVyIHdpdGggcmVjY3VyZW5jZSB1bnRpbCBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkgLSBzZWxlY3QgZmllbGQgZm9yIHJlY2N1cmVuY2UgdW50aWwgZGF5LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHJlY3VycmVuY2UgZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5SZWN1cnJpbmdJbml0ID0gZnVuY3Rpb24gKEZpZWxkcykgewoKICAgICAgICBmdW5jdGlvbiBSZWNJbml0KEZpZWxkcykgewogICAgICAgICAgICB2YXIgRGF5cyA9IFtdLAogICAgICAgICAgICAgICAgTW9udGhEYXlzID0gW10sCiAgICAgICAgICAgICAgICBNb250aHMgPSBbXSwKICAgICAgICAgICAgICAgIEluZGV4OwoKICAgICAgICAgICAgaWYgKCQoJ2lucHV0I0RheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIERheXMgPSAkKCdpbnB1dCNEYXlzJykudmFsKCkuc3BsaXQoJywnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJCgnaW5wdXQjTW9udGhEYXlzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBNb250aERheXMgPSAkKCdpbnB1dCNNb250aERheXMnKS52YWwoKS5zcGxpdCgnLCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkKCdpbnB1dCNNb250aERheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIE1vbnRocyA9ICQoJ2lucHV0I01vbnRocycpLnZhbCgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IERheXMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoRGF5c1tJbmRleF0gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b25bdmFsdWU9IiArIERheXNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBNb250aERheXMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9udGhEYXlzW0luZGV4XSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9IiArIE1vbnRoRGF5c1tJbmRleF0gKyAiXSIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IE1vbnRocy5sZW5ndGg7IEluZGV4KyspIHsKICAgICAgICAgICAgICAgIGlmIChNb250aHNbSW5kZXhdICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPSIgKyBNb250aHNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoRmllbGRzLiRSZWN1cnJlbmNlVHlwZS52YWwoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmluZy52YWwoMCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwoKICAgICAgICAgICAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUudmFsKCkgPT0gJ0N1c3RvbScpIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgxKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tRGFpbHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5UZXh0RGF5JykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21XZWVrbHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dFdlZWsnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS52YWwoKT09IkN1c3RvbU1vbnRobHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dE1vbnRoJykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21ZZWFybHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dFllYXInKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LnNob3coKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5yZW1vdmVDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkuYWRkQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwoKICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdik7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgxKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN1bWUgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LnJlbW92ZUNsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJyk7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5SZWN1cnJpbmdJbml0KEZpZWxkcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVHlwZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFJlY0luaXQoRmllbGRzKTsKICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgTm90aWZpY2F0aW9uSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEZpZWxkcyAtIEFycmF5IHdpdGggcmVmZXJlbmNlcyB0byByZW1pbmRlciBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiROb3RpZmljYXRpb24gLSBkcm9wIGRvd24gd2l0aCBzeXN0ZW0gbm90aWZpY2F0aW9uIHNlbGVjdGlvbi4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdiAtIGN1c3RvbSBzZWxlY3Rpb24gb2Ygc3lzdGVtIG5vdGlmaWNhdGlvbiBkYXRlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIHJlbWluZGVyIHNlY3Rpb24gYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQgPSBmdW5jdGlvbiAoRmllbGRzKSB7CiAgICAgICAgdmFyIE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdiA9IEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2LmF0dHIoJ2lkJyk7CgogICAgICAgIGlmIChGaWVsZHMuJE5vdGlmaWNhdGlvblRlbXBsYXRlLnZhbCgpICE9PSAnQ3VzdG9tJykgewoKICAgICAgICAgICAgLy8gaGlkZSB0aGUgY3VzdG9tIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5oaWRlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy8gY3VzdG9tIGZpZWxkIGlzIG5lZWRlZAogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5zaG93KCk7CgogICAgICAgICAgICAvLyBpbml0aWFsaXplIG1vZGVybiBmaWVsZHMgb24gY3VzdG9tIHNlbGVjdGlvbgogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkluaXRTZWxlY3QoJCgnc2VsZWN0Lk1vZGVybml6ZScpKTsKICAgICAgICB9CgogICAgICAgIC8vIGRpc2FibGUgZW5hYmxlIHRoZSBkaWZmZXJlbnQgY3VzdG9tIGZpZWxkcwogICAgICAgIGlmIChGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcpKSB7CgogICAgICAgICAgICAvLyBlbmFibGUgcmVsYXRpdmUgZGF0ZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnZhbCgxKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKS5wcm9wKCdyZWFkb25seScsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGN1c3RvbSBkYXRlIHRpbWUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC52YWwoJycpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhci5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91ci5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy8gZW5hYmxlIHRoZSBjdXN0b20gZGF0ZSB0aW1lIGlucHV0CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC52YWwoMSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSByZWxhdGl2ZSBkYXRlIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQudmFsKCcnKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5wcm9wKCdyZWFkb25seScsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vIFRPRE86IFdvcmthcm91bmQgZm9yIElucHV0RmllbGRzIGJ1ZyBpbiB0aGUgZnJhbWV3b3JrIChkaXNhYmxlZCBhdHRyaWJ1dGUgbm90IGNoZWNrZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24pCiAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5EZWFjdGl2YXRlKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdikpOwogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2KSk7CgogICAgICAgIC8vIFJlZ2lzdGVyIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25UZW1wbGF0ZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGhhbmRsZSByYWRpbyBidXR0b25zCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gcHJvY2VzcyBjaGFuZ2VzCiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGhhbmRsZSByYWRpbyBidXR0b25zCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gcHJvY2VzcyBjaGFuZ2VzCiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKICAgIH0KCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIC8qKgogICAgICogQG5hbWUgVGlja2V0SW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEZpZWxkcyAtIEFycmF5IHdpdGggcmVmZXJlbmNlcyB0byB0aWNrZXQgY3JlYXRpb24gZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kVGlja2V0IC0gZHJvcCBkb3duIHdpdGggc3lzdGVtIG5vdGlmaWNhdGlvbiBzZWxlY3Rpb24uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRUaWNrZXRDdXN0b21TdHJpbmdEaXYgLSBjdXN0b20gc2VsZWN0aW9uIG9mIHN5c3RlbSB0aWNrZXQgZGF0ZQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSB0aWNrZXQgY3JlYXRpb24gc2VjdGlvbiBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuVGlja2V0SW5pdCA9IGZ1bmN0aW9uIChGaWVsZHMpIHsKCiAgICAgICAgaWYgKEZpZWxkcy4kVGlja2V0VGVtcGxhdGUudmFsKCkgPT09ICcwJykgewoKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gZGl2Om5vdCguSGlkZGVuKScpLmhpZGUoKTsKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwnKS5oaWRlKCk7CgogICAgICAgICAgICAvLyBSZW1vdmUgbWFuZGF0b3J5IGFuZCB2YWxpZGF0ZSBjbGFzc2VzCiAgICAgICAgICAgICQoJy5UaWNrZXRUZW1wbGF0ZVNlbGVjdGlvbiB+IGRpdiA+IC5WYWxpZGF0ZV9SZXF1aXJlZCcpLmFkZENsYXNzKCdWYWxpZGF0ZV9JZl9BY3RpdmUnKS5yZW1vdmVDbGFzcygnVmFsaWRhdGVfUmVxdWlyZWQnKTsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gZGl2Om5vdCguSGlkZGVuKScpLnNob3coKTsKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwnKS5zaG93KCk7CgogICAgICAgICAgICBpZiAoRmllbGRzLiRUaWNrZXRUZW1wbGF0ZS52YWwoKSAhPT0gJ0N1c3RvbScpIHsKCiAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBjdXN0b20gZmllbGRzCiAgICAgICAgICAgICAgICAkKCcuVGlja2V0VGVtcGxhdGVTZWxlY3Rpb24gfiBkaXYuQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lJykuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwuQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lJykuaGlkZSgpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWRkIG1hbmRhdG9yeSBhbmQgdmFsaWRhdGUgY2xhc3NlcwogICAgICAgICAgICAkKCcuVGlja2V0VGVtcGxhdGVTZWxlY3Rpb24gfiBkaXYgPiAuVmFsaWRhdGVfSWZfQWN0aXZlJykuYWRkQ2xhc3MoJ1ZhbGlkYXRlX1JlcXVpcmVkJykucmVtb3ZlQ2xhc3MoJ1ZhbGlkYXRlX0lmX0FjdGl2ZScpOwoKICAgICAgICAgICAgLy8gQmluZCBldmVudCB0byBjdXN0b21lciByYWRpbyBidXR0b24uCiAgICAgICAgICAgICQoJy5DdXN0b21lclRpY2tldFJhZGlvJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5wcm9wKCdjaGVja2VkJykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgQ3VzdG9tZXJLZXkgPSAkKCcjQ3VzdG9tZXJLZXlfJyArJCh0aGlzKS52YWwoKSkudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLlJlbG9hZEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAvLyBCaW5kIGV2ZW50IHRvIGN1c3RvbWVyIHJlbW92ZSBidXR0b24uCiAgICAgICAgICAgICQoJy5DdXN0b21lclRpY2tldFJlbW92ZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guUmVtb3ZlQ3VzdG9tZXJUaWNrZXQoJCh0aGlzKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBjdXN0b21lciB1c2VyIHNlYXJjaCBmaWVsZAogICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlLkluaXQoKTsKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBtb2Rlcm4gZmllbGRzIG9uIGN1c3RvbSBzZWxlY3Rpb24KICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5Jbml0U2VsZWN0KCQoJ3NlbGVjdC5Nb2Rlcm5pemUnKSk7CgogICAgICAgICAgICAvLyBpbml0IHNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgJCgnLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcykucHJvcCgnY2hlY2tlZCcpKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IEN1c3RvbWVyS2V5ID0gJCgnI0N1c3RvbWVyS2V5XycgKyQodGhpcykudmFsKCkpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZWxvYWRDdXN0b21lckluZm8oQ3VzdG9tZXJLZXkpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLy8gZGlzYWJsZSBlbmFibGUgdGhlIGRpZmZlcmVudCBjdXN0b20gZmllbGRzCiAgICAgICAgaWYgKEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJykpIHsKCiAgICAgICAgICAgIC8vIGVuYWJsZSByZWxhdGl2ZSBkYXRlIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQudmFsKDEpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgY3VzdG9tIGRhdGUgdGltZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnZhbCgnJyk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVEYXkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVZZWFyLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVIb3VyLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAvLyBlbmFibGUgdGhlIGN1c3RvbSBkYXRlIHRpbWUgaW5wdXQKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnZhbCgxKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZURheS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbURhdGVUaW1lWWVhci5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUhvdXIucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGUucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHJlbGF0aXZlIGRhdGUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dC52YWwoJycpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLnByb3AoJ3JlYWRvbmx5JywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICBGaWVsZHMuJFRpY2tldFRlbXBsYXRlLm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gaGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBwcm9jZXNzIGNoYW5nZXMKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbURhdGVUaW1lSW5wdXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gaGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBwcm9jZXNzIGNoYW5nZXMKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBCaW5kIGZvcm0gdXBkYXRlIGV2ZW50IHRvIGZpZWxkcwogICAgICAgIHZhciBBSkFYVXBkYXRlRmllbGRzID0gWydUeXBlSUQnLCAnRGVzdCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCddLAogICAgICAgICAgICBNb2RpZmllZEZpZWxkczsKICAgICAgICAkLmVhY2goQUpBWFVwZGF0ZUZpZWxkcywgZnVuY3Rpb24oSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgIE1vZGlmaWVkRmllbGRzID0gQ29yZS5EYXRhLkNvcHlPYmplY3QoQUpBWFVwZGF0ZUZpZWxkcykuY29uY2F0KENvcmUuQ29uZmlnLkdldCgnRHluYW1pY0ZpZWxkTmFtZXMnKSk7CiAgICAgICAgICAgIE1vZGlmaWVkRmllbGRzLnNwbGljZShJbmRleCwgMSk7CgogICAgICAgICAgICBGaWVsZFVwZGF0ZShWYWx1ZSwgTW9kaWZpZWRGaWVsZHMpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEZpZWxkVXBkYXRlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5UaWNrZXRQaG9uZS5Jbml0CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBWYWx1ZSAtIEZpZWxkSUQKICAgICAqIEBwYXJhbSB7QXJyYXl9IE1vZGlmaWVkRmllbGRzIC0gRmllbGRzCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ3JlYXRlIG9uIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZpZWxkVXBkYXRlIChWYWx1ZSwgTW9kaWZpZWRGaWVsZHMpIHsKICAgICAgICAkKCcjJyArIFZhbHVlKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpLCAnQUpBWFVwZGF0ZScsIFZhbHVlLCBNb2RpZmllZEZpZWxkcyk7CiAgICAgICAgfSk7CgogICAgfQovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgLyoqCiAgICAgKiBAbmFtZSBUZWFtSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgdGVhbXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgcmVzb3VyY2VzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtVmFsdWVPYmogLSBmaWVsZCB3aXRoIHJlYWQgb25seSB2YWx1ZXMgZm9yIHRlYW0uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlVmFsdWVPYmogLSBmaWVsZCB3aXRoIHJlYWQgb25seSB2YWx1ZXMgZm9yIHJlc291cmNlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0ZWFtIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuVGVhbUluaXQgPSBmdW5jdGlvbiAoJFRlYW1JRE9iaiwgJFJlc291cmNlSURPYmosICRUZWFtVmFsdWVPYmosICRSZXNvdXJjZVZhbHVlT2JqKSB7CiAgICAgICAgJFRlYW1JRE9iai5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1RlYW1Vc2VyTGlzdCcsCiAgICAgICAgICAgICAgICBUZWFtSUQ6ICRUZWFtSURPYmoudmFsKCkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIHRydWUpOwoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFNlbGVjdGVkSUQgPSAkUmVzb3VyY2VJRE9iai52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuVGVhbVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXNwb25zZS5UZWFtVXNlckxpc3QsIGZ1bmN0aW9uIChJbmRleCwgVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBOZXdPcHRpb24gPSBuZXcgT3B0aW9uKFZhbHVlLCBJbmRleCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG9wdGlvbiB0ZXh0LCBiZWNhdXNlIG9mIHdyb25nIGh0bWwgcXVvdGluZyBvZiB0ZXh0IGNvbnRlbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoVGhpcyBpcyBuZWVkZWQgZm9yIElFLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld09wdGlvbi5pbm5lckhUTUwgPSBDb3JlLkFwcC5Fc2NhcGVIVE1MKFZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNlbGVjdGVkSUQgJiYgU2VsZWN0ZWRJRC5pbmRleE9mKEluZGV4KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3T3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRE9iai5hcHBlbmQoTmV3T3B0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGN1c3RvbSByZWRyYXcgZXZlbnQgZm9yIElucHV0RmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gQ29sbGFwc2VWYWx1ZXMoJFZhbHVlT2JqLCBWYWx1ZXMpIHsKICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJycpOwogICAgICAgICAgICAkLmVhY2goVmFsdWVzLCBmdW5jdGlvbiAoSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgQ291bnQgPSBWYWx1ZXMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBJbmRleCA9ICQoJy5EaWFsb2cnKS5jc3MoJ3otaW5kZXgnKTsKCiAgICAgICAgICAgICAgICBpZiAoSW5kZXggPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJFZhbHVlT2JqLmh0bWwoKSArIFZhbHVlICsgJzxicj4nKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWVzLnNwbGljZSgtQ291bnQsIDIpOwogICAgICAgICAgICAgICAgICAgICQoJzxhIC8+JykuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdEaWFsb2dUb29sdGlwTGluaycpCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCcrJXMgbW9yZScsIENvdW50LTIpKQogICAgICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJFRvb2x0aXBPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcEhUTUwgPSAnPHA+JyArIFZhbHVlcy5qb2luKCc8YnI+JykgKyAnPC9wPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWaXNpYmxlTGVmdCA9ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSArICQod2luZG93KS53aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZVRvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgJCh3aW5kb3cpLmhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RYUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFlQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBleGlzdGluZyB0b29sdGlwcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZ1Rvb2x0aXAnKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRXZlbnQucGFnZVggfHwgRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gRXZlbnQucGFnZVg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEV2ZW50LnBhZ2VZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFdmVudC5jbGllbnRYIHx8IEV2ZW50LmNsaWVudFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gRXZlbnQuY2xpZW50WCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZICs9IDU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUb29sdGlwSW5kZXggIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcEluZGV4ID0gcGFyc2VJbnQoVG9vbHRpcEluZGV4LCAxMCkgKyA1MDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvb2x0aXBJbmRleCA9IDQwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRvb2x0aXAgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iaiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdBcHBvaW50bWVudFRvb2x0aXAgRGlhbG9nVG9vbHRpcCBIaWRkZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFBvc1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IFBvc1gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5odG1sKFRvb2x0aXBIVE1MKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoJ3otaW5kZXgnLCBUb29sdGlwSW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygnd2lkdGgnLCAnYXV0bycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCdib2R5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRvcCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFlQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZVRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBQb3NZIC0gJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIGxlZnQgcG9zaXRpb24gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFhQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZUxlZnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gUG9zWCAtICRUb29sdGlwT2JqLndpZHRoKCkgLSAzMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdG9vbHRpcCBvbiBhbnkgb3V0c2lkZSBjbGljawogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkNsb3NlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQoRXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuRGlhbG9nVG9vbHRpcExpbmsnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJFZhbHVlT2JqKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29sbGFwc2UgcmVhZCBvbmx5IHZhbHVlcwogICAgICAgIGlmICgkVGVhbVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkVGVhbVZhbHVlT2JqLCAkVGVhbVZhbHVlT2JqLmh0bWwoKS5zcGxpdCgnPGJyPicpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRSZXNvdXJjZVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkUmVzb3VyY2VWYWx1ZU9iaiwgJFJlc291cmNlVmFsdWVPYmouaHRtbCgpLnNwbGl0KCc8YnI+JykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGNhbGVuZGFyIHNldHRpbmdzIGJlaGF2aW9yLgogICAgICovCiAgICBmdW5jdGlvbiBDYWxlbmRhclNldHRpbmdzSW5pdCgpIHsKICAgICAgICB2YXIgJENhbGVuZGFyU2V0dGluZ3NPYmogPSAkKCcjQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbicpLAogICAgICAgICAgICBDYWxlbmRhclNldHRpbmdzRGlhbG9nSFRNTDsKCiAgICAgICAgaWYgKCEkQ2FsZW5kYXJTZXR0aW5nc09iai5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0hUTUwgPSBDb3JlLlRlbXBsYXRlLlJlbmRlcignQWdlbnQvQXBwb2ludG1lbnRDYWxlbmRhci9DYWxlbmRhclNldHRpbmdzRGlhbG9nJywgewogICAgICAgICAgICAnU2hvd25BcHBvaW50bWVudHNTdHJnJzogQ29yZS5Db25maWcuR2V0KCdTaG93bkFwcG9pbnRtZW50c1N0cmcnKQogICAgICAgIH0pOwoKICAgICAgICAvLyBDYWxlbmRhciBzZXR0aW5ncyBidXR0b24KICAgICAgICAkQ2FsZW5kYXJTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhDYWxlbmRhclNldHRpbmdzRGlhbG9nSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkU2hvd25BcHBvaW50bWVudHMgPSAkKCcjU2hvd25BcHBvaW50bWVudHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVydmlld1NjcmVlbjogQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpID8gQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpIDogJ0NhbGVuZGFyT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93bkFwcG9pbnRtZW50czogJFNob3duQXBwb2ludG1lbnRzLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249QWdlbnRBcHBvaW50bWVudCcgKyAoQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpID8gQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpIDogJ0NhbGVuZGFyT3ZlcnZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU2hvdyBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhclNldHRpbmdzU2hvdycpKSB7CiAgICAgICAgICAgICRDYWxlbmRhclNldHRpbmdzT2JqLnRyaWdnZXIoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgUmVzb3VyY2VTZXR0aW5nc0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyByZXNvdXJjZSBzZXR0aW5ncyBiZWhhdmlvci4KICAgICAqLwogICAgZnVuY3Rpb24gUmVzb3VyY2VTZXR0aW5nc0luaXQoKSB7CiAgICAgICAgdmFyICRSZXNvdXJjZVNldHRpbmdzT2JqID0gJCgnI1Jlc291cmNlU2V0dGluZ3NCdXR0b24nKSwKICAgICAgICAgICAgUmVzb3VyY2VTZXR0aW5nc0RpYWxvZ0hUTUw7CgogICAgICAgIGlmICghJFJlc291cmNlU2V0dGluZ3NPYmoubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFJlc291cmNlU2V0dGluZ3NEaWFsb2dIVE1MID0gQ29yZS5UZW1wbGF0ZS5SZW5kZXIoJ0FnZW50L0FwcG9pbnRtZW50Q2FsZW5kYXIvUmVzb3VyY2VTZXR0aW5nc0RpYWxvZycsIENvcmUuQ29uZmlnLkdldCgnU2hvd25SZXNvdXJjZVNldHRpbmdzJykpOwoKICAgICAgICAvLyBSZXNvdXJjZSBzZXR0aW5ncyBidXR0b24KICAgICAgICAkUmVzb3VyY2VTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhSZXNvdXJjZVNldHRpbmdzRGlhbG9nSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkTGlzdENvbnRhaW5lciA9ICQoJy5BbGxvY2F0aW9uTGlzdENvbnRhaW5lcicpLmZpbmQoJy5Bc3NpZ25lZEZpZWxkcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3duUmVzb3VyY2VzID0gW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiAkKCcjVGVhbScpLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJExpc3RDb250YWluZXIpICYmICRMaXN0Q29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCgkTGlzdENvbnRhaW5lci5maW5kKCdsaScpLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25SZXNvdXJjZXMucHVzaCgkKHRoaXMpLmF0dHIoJ2RhdGEtZmllbGRuYW1lJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5TaG93blJlc291cmNlcyA9IEpTT04uc3RyaW5naWZ5KFNob3duUmVzb3VyY2VzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLlNldEFsbG9jYXRpb25MaXN0KCk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXRpYWxpemUgcmVzdG9yZSBzZXR0aW5ncyBidXR0b24uCiAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nc0luaXQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBSZXNvdXJjZVNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEFkZHMgcmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzIGJ1dHRvbiAodHJhc2ggY2FuKSB0byB2aWV3IGFuZCBpbml0aWFsaXplcyBpdHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3NJbml0KCkgewogICAgICAgIHZhciAkUmVzdG9yZVNldHRpbmdzT2JqOwoKICAgICAgICAvLyBTa2lwIGlmIGJ1dHRvbiBpcyBub3QgbmVlZGVkIG9yIHdlIGFscmVhZHkgaGF2ZSBvbmUuCiAgICAgICAgaWYgKAogICAgICAgICAgICAhQ29yZS5Db25maWcuR2V0KCdSZXN0b3JlRGVmYXVsdFNldHRpbmdzJykKICAgICAgICAgICAgfHwgJCgnI1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3MnKS5sZW5ndGggPiAwCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSB0aGUgYnV0dG9uLgogICAgICAgICRSZXN0b3JlU2V0dGluZ3NPYmogPSAkKCc8YSAvPicpLmF0dHIoJ2lkJywgJ1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3MnKQogICAgICAgICAgICAuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1Jlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncycpKQogICAgICAgICAgICAuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLXRyYXNoJykpOwoKICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGNvbHVtbiBoZWFkZXIuCiAgICAgICAgJCgndHIuZmMtc3VwZXIgKyB0ciAuZmMtY2VsbC1jb250ZW50JykuYXBwZW5kKCRSZXN0b3JlU2V0dGluZ3NPYmopOwoKICAgICAgICAvLyBSZWdpc3RlciBjbGljayBoYW5kbGVyLgogICAgICAgICRSZXN0b3JlU2V0dGluZ3NPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzOiAnU2hvd25SZXNvdXJjZXMnLAogICAgICAgICAgICAgICAgICAgIFRlYW1JRDogJCgnI1RlYW0nKS52YWwoKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBUb2dnbGVBSkFYTG9hZGVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCAtIE9iamVjdCByZWZlcmVuY2Ugb2YgdGhlIGZpZWxkIHdoaWNoIGlzIHVwZGF0ZWQKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gU2hvdyAtIFNob3cgb3IgaGlkZSB0aGUgQUpBWCBsb2FkZXIgaW1hZ2UKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93cyBhbmQgaGlkZXMgYW4gYWpheCBsb2FkZXIgZm9yIGV2ZXJ5IGVsZW1lbnQgd2hpY2ggaXMgdXBkYXRlcyB2aWEgYWpheC4KICAgICAqLwogICAgZnVuY3Rpb24gVG9nZ2xlQUpBWExvYWRlcigkRWxlbWVudCwgU2hvdykgewogICAgICAgIHZhciAkTG9hZGVyID0gJCgnI0FKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSksCiAgICAgICAgICAgIExvYWRlckhUTUwgPSAnPHNwYW4gaWQ9IkFKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSArICciIGNsYXNzPSJBSkFYTG9hZGVyIj48L3NwYW4+JzsKCiAgICAgICAgLy8gRWxlbWVudCBub3QgcHJlc2VudAogICAgICAgIGlmICghJEVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNob3cgb3IgaGlkZSB0aGUgbG9hZGVyCiAgICAgICAgaWYgKFNob3cpIHsKICAgICAgICAgICAgaWYgKCEkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQuYWZ0ZXIoTG9hZGVySFRNTCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkTG9hZGVyLnNob3coKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJExvYWRlci5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBQbHVnaW5Jbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFBsdWdpbkZpZWxkcyAtIGZpZWxkcyB3aXRoIGRpZmZlcmVudCBwbHVnaW4gc2VhcmNoZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgcGx1Z2luIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuUGx1Z2luSW5pdCA9IGZ1bmN0aW9uICgkUGx1Z2luRmllbGRzKSB7CgogICAgICAgIGZ1bmN0aW9uIEluaXRSZW1vdmVCdXR0b25zKCkgewogICAgICAgICAgICAkKCcuUmVtb3ZlQnV0dG9uJykub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJFJlbW92ZU9iaiA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ID0gJFJlbW92ZU9iai5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgICAgIFBsdWdpbkRhdGEgPSBKU09OLnBhcnNlKCRQbHVnaW5EYXRhT2JqLnZhbCgpKSwKICAgICAgICAgICAgICAgICAgICBMaW5rSUQgPSAkUmVtb3ZlT2JqLmRhdGEoJ2xpbmtJZCcpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgJFBhcmVudCA9ICRSZW1vdmVPYmoucGFyZW50KCk7CgogICAgICAgICAgICAgICAgUGx1Z2luRGF0YS5zcGxpY2UoUGx1Z2luRGF0YS5pbmRleE9mKExpbmtJRCksIDEpOwogICAgICAgICAgICAgICAgJFBsdWdpbkRhdGFPYmoudmFsKEpTT04uc3RyaW5naWZ5KFBsdWdpbkRhdGEpKTsKCiAgICAgICAgICAgICAgICAkUGFyZW50LnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBBZGRMaW5rKFBsdWdpbktleSwgUGx1Z2luVVJMLCBMaW5rSUQsIExpbmtOYW1lKSB7CiAgICAgICAgICAgIHZhciAkUGx1Z2luQ29udGFpbmVyT2JqID0gJCgnI1BsdWdpbkNvbnRhaW5lcl8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGx1Z2luS2V5KSksCiAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgUGx1Z2luRGF0YSA9IEpTT04ucGFyc2UoJFBsdWdpbkRhdGFPYmoudmFsKCkpLAogICAgICAgICAgICAgICAgJEV4aXN0aW5nTGlua3MgPSAkUGx1Z2luQ29udGFpbmVyT2JqLmZpbmQoJy5MaW5rXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihMaW5rSUQpKSwKICAgICAgICAgICAgICAgICRMaW5rQ29udGFpbmVyT2JqID0gJCgnPGRpdiAvPicpLAogICAgICAgICAgICAgICAgJFVSTE9iaiA9ICQoJzxhIC8+JyksCiAgICAgICAgICAgICAgICAkUmVtb3ZlT2JqID0gJCgnPGEgLz4nKSwKICAgICAgICAgICAgICAgIExpbmtVUkwgPSBQbHVnaW5VUkwucmVwbGFjZSgnJXMnLCBMaW5rSUQpOwoKICAgICAgICAgICAgaWYgKCRFeGlzdGluZ0xpbmtzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUGx1Z2luRGF0YS5wdXNoKExpbmtJRCk7CiAgICAgICAgICAgICRQbHVnaW5EYXRhT2JqLnZhbChKU09OLnN0cmluZ2lmeShQbHVnaW5EYXRhKSk7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hZGRDbGFzcygnTGlua18nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTGlua0lEKSk7CgogICAgICAgICAgICAkVVJMT2JqLmF0dHIoJ2hyZWYnLCBMaW5rVVJMKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKQogICAgICAgICAgICAgICAgLnRleHQoTGlua05hbWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJExpbmtDb250YWluZXJPYmopOwoKICAgICAgICAgICAgJFJlbW92ZU9iai5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdSZW1vdmVCdXR0b24nKQogICAgICAgICAgICAgICAgLmRhdGEoJ3BsdWdpbktleScsIFBsdWdpbktleSkKICAgICAgICAgICAgICAgIC5kYXRhKCdsaW5rSWQnLCBMaW5rSUQpCiAgICAgICAgICAgICAgICAuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLW1pbnVzLXNxdWFyZS1vJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkTGlua0NvbnRhaW5lck9iaik7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hcHBlbmRUbygkUGx1Z2luQ29udGFpbmVyT2JqKTsKICAgICAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgICAgICB9CgogICAgICAgICRQbHVnaW5GaWVsZHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkRWxlbWVudCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPSAkRWxlbWVudC5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgIFBsdWdpblVSTCA9ICRFbGVtZW50LmRhdGEoJ3BsdWdpblVybCcpOwoKICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGluaXRpYWxpemVkIGZpZWxkcwogICAgICAgICAgICBpZiAoJEVsZW1lbnQuaGFzQ2xhc3MoJ3VpLWF1dG9jb21wbGV0ZS1pbnB1dCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkRWxlbWVudCwgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBSkFYTnVtYmVyID0gKytBSkFYQ291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRQbHVnaW5TZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5OiBQbHVnaW5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0gKyAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiAyMAogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAnQXV0b0NvbXBsZXRlWEhSJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBmcm9tIHRoZSBsYXRlc3QgYWpheCByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFKQVhDb3VudGVyICE9PSBDdXJyZW50QUpBWE51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5WYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogIHRoaXMuS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJykudHJpZ2dlcignc2VsZWN0LkF1dG9jb21wbGV0ZScpOwogICAgICAgICAgICAgICAgQWRkTGluayhQbHVnaW5LZXksIFBsdWdpblVSTCwgVUkuaXRlbS5rZXksIFVJLml0ZW0ubGFiZWwpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwgUGx1Z2luS2V5KTsKICAgICAgICB9KTsKCiAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEVkaXRBcHBvaW50bWVudAogICAgICogQHBhcmFtIHtPYmplY3R9IERhdGEgLSBIYXNoIHdpdGggY2FsbCBhbmQgYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BcHBvaW50bWVudElEIC0gQXBwb2ludG1lbnQgSUQuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQWN0aW9uIC0gRWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3ViYWN0aW9uIC0gRWRpdCBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuVGl0bGUgLSBBcHBvaW50bWVudCB0aXRsZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5EZXNjcmlwdGlvbiAtIEFwcG9pbnRtZW50IGRlc2NyaXB0aW9uLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkxvY2F0aW9uIC0gQXBwb2ludG1lbnQgbG9jYXRpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRZZWFyIC0gQXBwb2ludG1lbnQgc3RhcnQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1vbnRoIC0gQXBwb2ludG1lbnQgc3RhcnQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnREYXkgLSBBcHBvaW50bWVudCBzdGFydCBkYXkuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRIb3VyIC0gQXBwb2ludG1lbnQgc3RhcnQgaG91ci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1pbnV0ZSAtIEFwcG9pbnRtZW50IHN0YXJ0IG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRZZWFyIC0gQXBwb2ludG1lbnQgZW5kIHllYXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTW9udGggLSBBcHBvaW50bWVudCBlbmQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kRGF5IC0gQXBwb2ludG1lbnQgZW5kIGRheS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRIb3VyIC0gQXBwb2ludG1lbnQgZW5kIGhvdXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTWludXRlIC0gQXBwb2ludG1lbnQgZW5kIG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BbGxEYXkgLSBJcyBhcHBvaW50bWVudCBhbiBhbGwtZGF5IGFwcG9pbnRtZW50ICgwfDEpPwogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIHN1Ym1pdHMgYW4gZWRpdCBhcHBvaW50bWVudCBjYWxsIHRvIHRoZSBiYWNrZW5kIGFuZCByZWZyZXNoZXMgdGhlIHZpZXcuCiAgICAgICovCiAgICBUYXJnZXROUy5FZGl0QXBwb2ludG1lbnQgPSBmdW5jdGlvbiAoRGF0YSkgewogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3JykgewogICAgICAgICAgICAkKCcuT3ZlcnZpZXdDb250cm9sJykuYWRkQ2xhc3MoJ0xvYWRpbmcnKTsKICAgICAgICB9CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ3JlZmV0Y2hFdmVudHMnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRpYWxvZwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2FkIHBhZ2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoUmVzcG9uc2UuRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgZnVuY3Rpb25hbGl0aWVzIGZvciBBZ2VudEFwcG9pbnRtZW50QWdlbnRPdmVydmlldyBzY3JlZW4uCiAgICAgKi8KICAgIFRhcmdldE5TLkFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3Jyk7CgogICAgICAgICQoJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5PcGVuRWRpdERpYWxvZyh7CiAgICAgICAgICAgICAgICBTdGFydDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KENvbmZpZy5TdGFydCkuYWRkKDEsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KENvbmZpZy5TdGFydCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgICAgICAkKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKSwKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPSAkTWFzdGVyQWN0aW9uTGluay5kYXRhKCdhcHBvaW50bWVudElkJyk7CgogICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuT3BlbkVkaXREaWFsb2coewogICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IHsKICAgICAgICAgICAgICAgICAgICBpZDogQXBwb2ludG1lbnRJRAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGZ1bmN0aW9uYWxpdGllcyBmb3IgQWdlbnRBcHBvaW50bWVudEVkaXQgc2NyZWVuLgogICAgICovCiAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuSW5pdCgpOwogICAgICAgIFRhcmdldE5TLkxvY2F0aW9uTGlua0luaXQoJCgnI0xvY2F0aW9uJyksICQoJy5Mb2NhdGlvbkxpbmsnKSk7CiAgICAgICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCgkKCcjQWxsRGF5JykpOwogICAgICAgIFRhcmdldE5TLlJlY3VycmluZ0luaXQoewogICAgICAgICAgICAkUmVjdXJyaW5nOiAkKCcjUmVjdXJyaW5nJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlVHlwZTogJCgnI1JlY3VycmVuY2VUeXBlJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZTogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdjogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0OiAkKCcjUmVjdXJyZW5jZUludGVydmFsVGV4dCcpLAogICAgICAgICAgICAkUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdjogJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2OiAkKCcjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlTGltaXREaXY6ICQoJyNSZWN1cnJlbmNlTGltaXREaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VMaW1pdDogJCgnI1JlY3VycmVuY2VMaW1pdCcpLAogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsRGl2OiAkKCcjUmVjdXJyZW5jZVVudGlsRGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxEYXk6ICQoJyNSZWN1cnJlbmNlVW50aWxEYXknKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDb3VudERpdjogJCgnI1JlY3VycmVuY2VDb3VudERpdicpCiAgICAgICAgfSk7CiAgICAgICAgVGFyZ2V0TlMuTm90aWZpY2F0aW9uSW5pdCh7CiAgICAgICAgICAgICROb3RpZmljYXRpb25UZW1wbGF0ZTogJCgnI05vdGlmaWNhdGlvblRlbXBsYXRlJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXY6ICQoJyNOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0JyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50JyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWU6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0OiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCcpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXk6ICQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheScpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcjogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcicpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyOiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlJykKICAgICAgICB9KTsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIFRhcmdldE5TLlRpY2tldEluaXQoewogICAgICAgICAgICAkVGlja2V0VGVtcGxhdGU6ICQoJyNUaWNrZXRUZW1wbGF0ZScpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tU3RyaW5nRGl2OiAkKCcjVGlja2V0Q3VzdG9tU3RyaW5nRGl2JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21DcmVhdGlvbkRpdjogJCgnI1RpY2tldEN1c3RvbUNyZWF0aW9uRGl2JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0OiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCcpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQ6ICQoJyNUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCcpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0OiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lOiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dDogJCgnI1RpY2tldEN1c3RvbURhdGVUaW1lSW5wdXQnKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lRGF5OiAkKCcjVGlja2V0Q3VzdG9tRGF0ZVRpbWVEYXknKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lTW9udGg6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoJyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21EYXRlVGltZVllYXI6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZVllYXInKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lSG91cjogJCgnI1RpY2tldEN1c3RvbURhdGVUaW1lSG91cicpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGU6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZU1pbnV0ZScpCiAgICAgICAgfSk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgIFRhcmdldE5TLlRlYW1Jbml0KCQoJyNUZWFtSUQnKSwgJCgnI1Jlc291cmNlSUQnKSwgJCgnbGFiZWxbZm9yPSJUZWFtSUQiXSArIGRpdi5GaWVsZCBwLlJlYWRPbmx5VmFsdWUnKSwgJCgnbGFiZWxbZm9yPSJSZXNvdXJjZUlEIl0gKyBkaXYuRmllbGQgcC5SZWFkT25seVZhbHVlJykpOwoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhclBlcm1pc3Npb25MZXZlbCcpID4gMSkgewogICAgICAgICAgICBUYXJnZXROUy5QbHVnaW5Jbml0KCQoJy5QbHVnaW5GaWVsZCcpLCAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSk7CiAgICAgICAgfQoKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuU2V0U3VibWl0RnVuY3Rpb24oJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKSwgZnVuY3Rpb24gKEZvcm0pIHsKICAgICAgICAgICAgdmFyIERhdGEgPSBuZXcgT2JqZWN0KCksCiAgICAgICAgICAgICAgICBEYXlzID0gbmV3IEFycmF5KCksCiAgICAgICAgICAgICAgICBNb250aERheXMgPSBuZXcgQXJyYXkoKSwKICAgICAgICAgICAgICAgIE1vbnRocyA9IG5ldyBBcnJheSgpOwoKICAgICAgICAgICAgLy8gc2VyaWFsaXplIGRheXMKICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIERheXMucHVzaCgkKHRoaXMpLnZhbCgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoImlucHV0I0RheXMiKS52YWwoRGF5cy5qb2luKCkpOwoKICAgICAgICAgICAgLy8gc2VyaWFsaXplIG1vbnRoIGRheXMKICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBNb250aERheXMucHVzaCgkKHRoaXMpLnZhbCgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoImlucHV0I01vbnRoRGF5cyIpLnZhbChNb250aERheXMuam9pbigpKTsKCiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSBtb250aHMKICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIE1vbnRocy5wdXNoKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJCgiaW5wdXQjTW9udGhzIikudmFsKE1vbnRocy5qb2luKCkpOwoKICAgICAgICAgICAgJChGb3JtKS5maW5kKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICAgICAgaWYgKEVsZW1lbnQudHlwZSA9PSAnY2hlY2tib3gnKSB7CiAgICAgICAgICAgICAgICAgICAgRGF0YVtFbGVtZW50LmlkXSA9ICQoRWxlbWVudCkucHJvcCgnY2hlY2tlZCcpID8gJzEnIDogJzAnOwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEVsZW1lbnQubmFtZSA9PSAnQ3VzdG9tZXJTZWxlY3RlZCcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIURhdGFbRWxlbWVudC5uYW1lXSAmJiAkKEVsZW1lbnQpLnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBEYXRhW0VsZW1lbnQubmFtZV0gPSAkKEVsZW1lbnQpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIH0KLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBEYXRhW0VsZW1lbnQuaWRdID0gJChFbGVtZW50KS52YWwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgICAgICBUYXJnZXROUy5FZGl0QXBwb2ludG1lbnQoRGF0YSk7CiAgICAgICAgfSk7CgogICAgICAgICQoIi5CdXR0b25UYWJsZSBidXR0b24iKS5vbigiY2xpY2siLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7CiAgICAgICAgfSk7CgogICAgICAgIC8vIER1cGxpY2F0ZSBhcHBvaW50bWVudAogICAgICAgICQoJyNFZGl0Rm9ybUNvcHknKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gUmVzZXQgQXBwb2ludG1lbnRJRCwgcmVtb3ZlIENvcHkgJiBEZWxldGUgYnV0dG9ucwogICAgICAgICAgICAkKCIjRWRpdEFwcG9pbnRtZW50Rm9ybSBpbnB1dCNBcHBvaW50bWVudElEIikudmFsKCIiKTsKICAgICAgICAgICAgJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKS5zdWJtaXQoKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU2F2ZSB0aGUgYXBwb2ludG1lbnQKICAgICAgICAkKCcjRWRpdEZvcm1TdWJtaXQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKS5zdWJtaXQoKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gRGVsZXRlIHRoZSBhcHBvaW50bWVudAogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0VkaXRBcHBvaW50bWVudElEJykpIHsKICAgICAgICAgICAgJCgnI0VkaXRGb3JtRGVsZXRlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAod2luZG93LmNvbmZpcm0oQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nKSkpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuRWRpdEFwcG9pbnRtZW50KHsKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRDogQ29yZS5Db25maWcuR2V0KCdFZGl0QXBwb2ludG1lbnRJRCcpLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0RlbGV0ZUFwcG9pbnRtZW50JwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIEVkaXQgcGFyZW50IGFwcG9pbnRtZW50CiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnRWRpdFBhcmVudElEJykpIHsKICAgICAgICAgICAgJCgnI0VkaXRQYXJlbnQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCIjQ2hhbGxlbmdlVG9rZW4iKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnRWRpdE1hc2snLAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IENvcmUuQ29uZmlnLkdldCgnRWRpdFBhcmVudElEJykKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoSFRNTCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhIVE1MLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQnKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkFnZW50QXBwb2ludG1lbnRFZGl0KCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnaHRtbCcKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2xvc2UgdGhlIGRpYWxvZwogICAgICAgICQoJyNFZGl0Rm9ybUNhbmNlbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICQoJy5EaWFsb2c6dmlzaWJsZScpLnJlbW92ZUNsYXNzKCdQZXJzaXN0ZW50Jyk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGRhdGVwaWNrZXIgYnV0dG9ucy4KICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhclBlcm1pc3Npb25MZXZlbCcpID4gMikgewogICAgICAgICAgICAkLmVhY2goWydTdGFydCcsICdFbmQnLCAnUmVjdXJyZW5jZVVudGlsJywgJ05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lJ10sIGZ1bmN0aW9uIChJbmRleCwgUHJlZml4KSB7CiAgICAgICAgICAgICAgICBDb3JlLlVJLkRhdGVwaWNrZXIuSW5pdCh7CiAgICAgICAgICAgICAgICAgICAgRGF5OiAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFByZWZpeCkgKyAnRGF5JyksCiAgICAgICAgICAgICAgICAgICAgTW9udGg6ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUHJlZml4KSArICdNb250aCcpLAogICAgICAgICAgICAgICAgICAgIFllYXI6ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUHJlZml4KSArICdZZWFyJyksCiAgICAgICAgICAgICAgICAgICAgSG91cjogJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQcmVmaXgpICsgJ0hvdXInKSwKICAgICAgICAgICAgICAgICAgICBNaW51dGU6ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUHJlZml4KSArICdNaW51dGUnKSwKICAgICAgICAgICAgICAgICAgICBXZWVrRGF5U3RhcnQ6IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhciB8fCB7fSkpOwo=</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.CustomerSearch.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNSBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gYzE0Y2E1NWE4YjFkM2Q2ODZlODAzYzEzOTg4MTNiODNkMjIwOTFlNSAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5qcwovLyAtLQovLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgovLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQovLyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLy8gQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICogQG1lbWJlcm9mIENvcmUuQWdlbnQKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgY3VzdG9tZXIgc2VhcmNoLgogKi8KQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEJhY2t1cERhdGEKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAbWVtYmVyIHtPYmplY3R9CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgU2F2ZXMgQ3VzdG9tZXIgZGF0YSBmb3IgbGF0ZXIgcmVzdG9yZS4KICAgICAqLwogICAgdmFyIEJhY2t1cERhdGEgPSB7CiAgICAgICAgICAgIEN1c3RvbWVySW5mbzogJycsCiAgICAgICAgICAgIEN1c3RvbWVyRW1haWw6ICcnLAogICAgICAgICAgICBDdXN0b21lcktleTogJycKICAgICAgICB9LAogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQG1lbWJlciB7T2JqZWN0fQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIE5lZWRlZCBmb3IgdGhlIGNoYW5nZSBldmVudCBvZiBjdXN0b21lciBmaWVsZHMsIGlmIEFjdGl2ZUF1dG9Db21wbGV0ZSBpcyBmYWxzZSAoZGlzYWJsZWQpLgogICAgICovCiAgICAgICAgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50ID0ge307CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBEaXNhYmxlIHRoZSBzZWxlY3Rpb24gZm9yIHRoZSBjdXN0b21lciBJRCwgaWYgbmVlZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBEZWFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCAoKSB7CiAgICAgICAgaWYoJCgnI1RlbXBsYXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLmxlbmd0aCkgewogICAgICAgICAgICAkKCcjU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5wcm9wKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGaXJzdCBzZWxlY3QgYSBjdXN0b21lciB1c2VyLCB0aGVuIHNlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nKSk7CiAgICAgICAgICAgICQoJyNTZWxlY3Rpb25DdXN0b21lcklEJykuYWRkQ2xhc3MoJ0Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IFZhbHVlIC0gVGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHRvIGJlIHNlbGVjdGVkLgogICAgICogQHBhcmFtIHtTdHJpbmd9IE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHRvIGJlIHNlbGVjdGVkLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEFjdGl2YXRlIHRoZSBjdXN0b21lciBJRCBzZWxlY3Rpb24gYnV0dG9uLCBpZiAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCAoKSB7CiAgICAgICAgaWYgKCQoJyNUZW1wbGF0ZVNlbGVjdGlvbkN1c3RvbWVySUQnKS5sZW5ndGggJiYgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5oYXNDbGFzcygnRGlzYWJsZWQnKSkgewogICAgICAgICAgICAkKCcjU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpCiAgICAgICAgICAgICQoJyNTZWxlY3Rpb25DdXN0b21lcklEJykucHJvcCgndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicpKTsKICAgICAgICAgICAgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5yZW1vdmVDbGFzcygnRGlzYWJsZWQnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgR2V0Q3VzdG9tZXJJbmZvCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ3VzdG9tZXJVc2VySUQKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZS4KICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q3VzdG9tZXJJbmZvKEN1c3RvbWVyVXNlcklEKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0N1c3RvbWVySW5mbycsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRDogQ3VzdG9tZXJVc2VySUQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2lnbmF0dXJlVVJMOwogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBEYXRhLCBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKCiAgICAgICAgICAgICQoJyNDdXN0b21lcklEJykudmFsKFJlc3BvbnNlLkN1c3RvbWVySUQpOwogICAgICAgICAgICAkKCcjU2hvd0N1c3RvbWVySUQnKS5odG1sKFJlc3BvbnNlLkN1c3RvbWVySUQpOwoKICAgICAgICAgICAgLy8gUHVibGlzaCBpbmZvcm1hdGlvbiBmb3Igc3Vic2NyaWJlcnMKICAgICAgICAgICAgQ29yZS5BcHAuUHVibGlzaCgnRXZlbnQuQWdlbnQuQ3VzdG9tZXJTZWFyY2guR2V0Q3VzdG9tZXJJbmZvLkNhbGxiYWNrJywgW1Jlc3BvbnNlLkN1c3RvbWVySURdKTsKCiAgICAgICAgICAgIC8vIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgICAgICAkKCcjQ3VzdG9tZXJJbmZvIC5Db250ZW50JykuaHRtbChSZXNwb25zZS5DdXN0b21lclRhYmxlSFRNTFN0cmluZyk7CgovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0Ci8vICAgICAgICAgICAgIC8vIG9ubHkgZXhlY3V0ZSB0aGlzIHBhcnQsIGlmIGluIEFnZW50VGlja2V0RW1haWwgb3IgQWdlbnRUaWNrZXRQaG9uZQovLyAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJykgewovLyAgICAgICAgICAgICAgICAgdmFyICRGb3JtID0gQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnID8gJCgnI05ld0VtYWlsVGlja2V0JykgOiAkKCcjTmV3UGhvbmVUaWNrZXQnKTsKICAgICAgICAgICAgLy8gb25seSBleGVjdXRlIHRoaXMgcGFydCwgaWYgaW4gQWdlbnRUaWNrZXRFbWFpbCBvciBBZ2VudFRpY2tldFBob25lIG9yIEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UGhvbmUnIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycpIHsKICAgICAgICAgICAgICAgIHZhciAkRm9ybTsKICAgICAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcpIHsKICAgICAgICAgICAgICAgICAgICAkRm9ybSA9ICQoJyNOZXdFbWFpbFRpY2tldCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UGhvbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJEZvcm0gPSAkKCcjTmV3UGhvbmVUaWNrZXQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycpIHsKICAgICAgICAgICAgICAgICAgICAkRm9ybSA9ICQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJyk7CiAgICAgICAgICAgICAgICB9Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICAgICAgICAgICAgICAvLyByZXNldCBzZXJ2aWNlCiAgICAgICAgICAgICAgICAkKCcjU2VydmljZUlEJykuYXR0cignc2VsZWN0ZWRJbmRleCcsIDApOwogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNlcnZpY2VzICh0cmlnZ2VyIFNlcnZpY2VJRCBjaGFuZ2UgZXZlbnQpCiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkRm9ybSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWydEZXN0JywgJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywgJ1NpZ25hdHVyZScsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdDcnlwdEtleUlEJywgJ093bmVyQWxsJywgJ1Jlc3BvbnNpYmxlQWxsJywgJ1RpY2tldEZyZWVUZXh0MScsICdUaWNrZXRGcmVlVGV4dDInLCAnVGlja2V0RnJlZVRleHQzJywgJ1RpY2tldEZyZWVUZXh0NCcsICdUaWNrZXRGcmVlVGV4dDUnLCAnVGlja2V0RnJlZVRleHQ2JywgJ1RpY2tldEZyZWVUZXh0NycsICdUaWNrZXRGcmVlVGV4dDgnLCAnVGlja2V0RnJlZVRleHQ5JywgJ1RpY2tldEZyZWVUZXh0MTAnLCAnVGlja2V0RnJlZVRleHQxMScsICdUaWNrZXRGcmVlVGV4dDEyJywgJ1RpY2tldEZyZWVUZXh0MTMnLCAnVGlja2V0RnJlZVRleHQxNCcsICdUaWNrZXRGcmVlVGV4dDE1JywgJ1RpY2tldEZyZWVUZXh0MTYnXSk7CgogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHNpZ25hdHVyZSBpZiBuZWVkZWQuCiAgICAgICAgICAgICAgICBpZiAoJCgnI0Rlc3QnKS52YWwoKSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyAnQWN0aW9uPScgKyBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICsgJztTdWJhY3Rpb249U2lnbmF0dXJlO0Rlc3Q9JyArICQoJyNEZXN0JykudmFsKCkgKyAnO1NlbGVjdGVkQ3VzdG9tZXJVc2VyPScgKyAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIUNvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbklEQ29va2llJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlVVJMICs9ICc7JyArIENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbk5hbWUnKSArICc9JyArIENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbklEJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICQoJyNTaWduYXR1cmUnKS5hdHRyKCdzcmMnLCBTaWduYXR1cmVVUkwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQcm9jZXNzJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJGaWVsZHNUb1VwZGF0ZScpICE9PSAndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAvLyByZXNldCBzZXJ2aWNlCiAgICAgICAgICAgICAgICAkKCcjU2VydmljZUlEJykuYXR0cignc2VsZWN0ZWRJbmRleCcsIDApOwogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNlcnZpY2VzICh0cmlnZ2VyIFNlcnZpY2VJRCBjaGFuZ2UgZXZlbnQpCiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ3VzdG9tZXJJRCcpLmNsb3Nlc3QoJ2Zvcm0nKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgQ29yZS5Db25maWcuR2V0KCdDdXN0b21lckZpZWxkc1RvVXBkYXRlJykpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgR2V0Q3VzdG9tZXJUaWNrZXRzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ3VzdG9tZXJVc2VySUQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDdXN0b21lcklECiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGN1c3RvbWVyIHRpY2tldHMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldEN1c3RvbWVyVGlja2V0cyhDdXN0b21lclVzZXJJRCwgQ3VzdG9tZXJJRCkgewoKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogJ0N1c3RvbWVyVGlja2V0cycsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEOiBDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJJRDogQ3VzdG9tZXJJRAogICAgICAgIH07CgogICAgICAgIC8vIGNoZWNrIGlmIGN1c3RvbWVyIHRpY2tldHMgc2hvdWxkIGJlIHNob3duCiAgICAgICAgaWYgKHR5cGVvZiBDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyU2VhcmNoJykgIT09ICd1bmRlZmluZWQnICYmICFwYXJzZUludChDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyU2VhcmNoJykuU2hvd0N1c3RvbWVyVGlja2V0cywgMTApKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgQ3VzdG9tZXJIaXN0b3J5RXZlbnRzCiAgICAgICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guR2V0Q3VzdG9tZXJUaWNrZXRzCiAgICAgICAgICogQGZ1bmN0aW9uCiAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgZXZlbnRzIGZvciBDdXN0b21lciBIaXN0b3J5IG92ZXJ2aWV3IHRhYmxlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIEN1c3RvbWVySGlzdG9yeUV2ZW50cygpIHsKICAgICAgICAgICAgJCgnc2VsZWN0W25hbWU9UmVzcG9uc2VJRF0nKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIFVSTDsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICQodGhpcykucGFyZW50cygpLnNlcmlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKFVSTCwgJ1RpY2tldEFjdGlvbicpOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgc2VsZWN0IGJveCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFnYWluIGZyb20gdGhlIHNhbWUgd2luZG93LgogICAgICAgICAgICAgICAgICAgICQodGhpcykudmFsKCcwJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCdzZWxlY3RbbmFtZT1SZXNwb25zZUlEXScpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cyAuTWFzdGVyQWN0aW9uJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgJE1hc3RlckFjdGlvbkxpbmsgPSAkKHRoaXMpLmZpbmQoJ2EuTWFzdGVyQWN0aW9uTGluaycpOwoKICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgTWFzdGVyQWN0aW9uIG9uIE1vZGVybml6ZSBpbnB1dCBmaWVsZHMuCiAgICAgICAgICAgICAgICBpZiAoJChFdmVudC50YXJnZXQpLmhhc0NsYXNzKCdJbnB1dEZpZWxkX1NlYXJjaCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRXZlbnQgbXVzdCBiZSBkb25lIGluIHRoZSBwYXJlbnQgd2luZG93IGJlY2F1c2UgQWdlbnRUaWNrZXRDdXN0b21lciBpcyBpbiBwb3B1cC4KICAgICAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDdXN0b21lcicpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLlBvcHVwLkV4ZWN1dGVJblBhcmVudFdpbmRvdyhmdW5jdGlvbihXaW5kb3dPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93T2JqZWN0LkNvcmUuVUkuUG9wdXAuRmlyZVBvcHVwRXZlbnQoJ1VSTCcsIHsgVVJMOiAkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJykgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5DbG9zZVBvcHVwKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYWN0IGlmIHRoZSBsaW5rIHdhcyBub3QgY2xpY2tlZCBkaXJlY3RseS4KICAgICAgICAgICAgICAgICAgICBpZiAoRXZlbnQudGFyZ2V0ICE9PSAkTWFzdGVyQWN0aW9uTGluay5nZXQoMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICQoIiNTb3J0QnkiKS5vZmYoJ2NoYW5nZScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgU29ydGVkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24gPSAkKHRoaXMpLnZhbCgpLnNwbGl0KCd8Jyk7CgogICAgICAgICAgICAgICAgaWYgKFNlbGVjdGlvbi5sZW5ndGggPT09IDIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBzb3J0ZWQgY3VzdG9tZXIgdGlja2V0cy4KICAgICAgICAgICAgICAgICAgICBTb3J0ZWREYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnQ3VzdG9tZXJUaWNrZXRzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQ6IEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEOiBDdXN0b21lcklELAogICAgICAgICAgICAgICAgICAgICAgICBTb3J0Qnk6IFNlbGVjdGlvblswXSwKICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJCeTogU2VsZWN0aW9uWzFdCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgU29ydGVkRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjQ3VzdG9tZXJUaWNrZXRzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzJykuaHRtbChSZXNwb25zZS5DdXN0b21lclRpY2tldHNIVE1MU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VDdXN0b21lclRpY2tldExpbmtzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBBY3RpdmF0ZSBNb2Rlcm5pemUgZmllbGRzLgogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCk7CiAgICAgICAgICAgIENvcmUuQXBwLlN1YnNjcmliZSgnRXZlbnQuVUkuQWNjb3JkaW9uLk9wZW5FbGVtZW50JywgZnVuY3Rpb24oJEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJEVsZW1lbnQpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgUmVwbGFjZUN1c3RvbWVyVGlja2V0TGlua3MKICAgICAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5HZXRDdXN0b21lclRpY2tldHMKICAgICAgICAgKiBAZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBmYWxzZS4KICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgYW5kIHNob3dzIGN1c3RvbWVyIHRpY2tldCBsaW5rcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBSZXBsYWNlQ3VzdG9tZXJUaWNrZXRMaW5rcygpIHsKICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmZpbmQoJy5BcmlhUm9sZU1haW4nKS5yZW1vdmVBdHRyKCdyb2xlJykucmVtb3ZlQ2xhc3MoJ0FyaWFSb2xlTWFpbicpOwoKICAgICAgICAgICAgLy8gUmVwbGFjZSBvdmVydmlldyBtb2RlIGxpbmtzIChTLCBNLCBMIHZpZXcpLCBwYWdpbmF0aW9uIGxpbmtzIHdpdGggQUpBWAogICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzJykuZmluZCgnLk92ZXJ2aWV3Wm9vbSBhLCAuUGFnaW5hdGlvbiBhLCAuVGFibGVTbWFsbCB0aCBhJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gQ3V0IG91dCBCYXNlVVJMIGFuZCBxdWVyeSBzdHJpbmcgZnJvbSB0aGUgVVJMCiAgICAgICAgICAgICAgICB2YXIgTGluayA9ICQodGhpcykuYXR0cignaHJlZicpLAogICAgICAgICAgICAgICAgICAgIFVSTENvbXBvbmVudHM7CgogICAgICAgICAgICAgICAgVVJMQ29tcG9uZW50cyA9IExpbmsuc3BsaXQoJz8nLCAyKTsKCiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKFVSTENvbXBvbmVudHNbMF0sIFVSTENvbXBvbmVudHNbMV0sIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHNob3cgY3VzdG9tZXIgdGlja2V0cwogICAgICAgICAgICAgICAgICAgIGlmICgkKCcjQ3VzdG9tZXJUaWNrZXRzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5odG1sKFJlc3BvbnNlLkN1c3RvbWVyVGlja2V0c0hUTUxTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlQ3VzdG9tZXJUaWNrZXRMaW5rcygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cyBhLlNwbGl0U2VsZWN0aW9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5UaWNrZXRTcGxpdC5PcGVuU3BsaXRTZWxlY3Rpb24oJCh0aGlzKS5hdHRyKCdocmVmJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBJbml0IGFjY29yZGlvbiBvZiBvdmVydmlldyBhcnRpY2xlIHByZXZpZXcKICAgICAgICAgICAgQ29yZS5VSS5BY2NvcmRpb24uSW5pdCgkKCcuUHJldmlldyA+IHVsJyksICdsaSBoMyBhJywgJy5IaWRkZW5CbG9jaycpOwoKICAgICAgICAgICAgLy8gRXZlbnRzIGZvciBDdXN0b21lciBIaXN0b3J5IHRhYmxlIC0gQWdlbnRUaWNrZXRQaG9uZSwgQWdlbnRUaWNrZXRFbWFpbCBhbmQgQWdlbnRUaWNrZXRDdXN0b21lciBzY3JlZW5zLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQaG9uZScgfHwKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyB8fAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q3VzdG9tZXInIHx8CiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRDaGF0QXBwZW5kJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDdXN0b21lckhpc3RvcnlFdmVudHMoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksIERhdGEsIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAvLyBzaG93IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICAgICAgaWYgKCQoJyNDdXN0b21lclRpY2tldHMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5odG1sKFJlc3BvbnNlLkN1c3RvbWVyVGlja2V0c0hUTUxTdHJpbmcpOwogICAgICAgICAgICAgICAgUmVwbGFjZUN1c3RvbWVyVGlja2V0TGlua3MoKTsKCiAgICAgICAgICAgICAgICAvLyBjbGljayBldmVudCBmb3Igb3BlbmluZyBwb3B1cAogICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cyBhLkFzUG9wdXAnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCQodGhpcykuYXR0cignaHJlZicpLCAnQWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cyBhLlNwbGl0U2VsZWN0aW9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuVGlja2V0U3BsaXQuT3BlblNwbGl0U2VsZWN0aW9uKCQodGhpcykuYXR0cignaHJlZicpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENoZWNrUGhvbmVDdXN0b21lckNvdW50TGltaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbiBBZ2VudFRpY2tldFBob25lLCB0aGlzIGNoZWNrcyBpZiBtb3JlIHRoYW4gb25lIGVudHJ5IGlzIGFsbG93ZWQKICAgICAqICAgICAgaW4gdGhlIGN1c3RvbWVyIGxpc3QgYW5kIGJsb2Nrcy91bmJsb2NrcyB0aGUgYXV0b2NvbXBsZXRlIGZpZWxkIGFzIG5lZWRlZC4KICAgICAqLwogICAgZnVuY3Rpb24gQ2hlY2tQaG9uZUN1c3RvbWVyQ291bnRMaW1pdCgpIHsKCiAgICAgICAgLy8gT25seSBvcGVyYXRlIGluIEFnZW50VGlja2V0UGhvbmUKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0UGhvbmUnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIG11bHRpcGxlIGZyb20gZW50cmllcyBhcmUgYWxsb3dlZAogICAgICAgIGlmIChwYXJzZUludChDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyU2VhcmNoJykuQWxsb3dNdWx0aXBsZUZyb20sIDEwKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoJCgnI1RpY2tldEN1c3RvbWVyQ29udGVudEZyb21DdXN0b21lciBpbnB1dC5DdXN0b21lclRpY2tldFRleHQnKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICQoJyNGcm9tQ3VzdG9tZXInKS52YWwoJycpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkucHJvcCgncmVhZG9ubHknLCB0cnVlKTsKICAgICAgICAgICAgJCgnI0Rlc3QnKS50cmlnZ2VyKCdmb2N1cycpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJCgnI0Zyb21DdXN0b21lcicpLnZhbCgnJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkucHJvcCgncmVhZG9ubHknLCBmYWxzZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEluaXRTaW1wbGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBpbnB1dCBmaWVsZCB3aXRoIGF1dG9jb21wbGV0ZS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplcyB0aGUgbW9kdWxlLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0U2ltcGxlID0gZnVuY3Rpb24gKCRFbGVtZW50KSB7CiAgICAgICAgdmFyIEN1c3RvbWVyU2VhcmNoVHlwZSA9ICRFbGVtZW50LmRhdGEoJ2N1c3RvbWVyLXNlYXJjaC10eXBlJyk7CgogICAgICAgIGlmIChDdXN0b21lclNlYXJjaFR5cGUpIHsKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkRWxlbWVudCwgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1NlYXJjaCcgKyBDdXN0b21lclNlYXJjaFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFRlcm06IFJlcXVlc3QudGVybSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4UmVzdWx0czogQ29yZS5VSS5BdXRvY29tcGxldGUuR2V0Q29uZmlnKCdNYXhSZXN1bHRzRGlzcGxheWVkJykKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKCdBdXRvQ29tcGxldGVYSFInLCBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKFVSTCwgRGF0YSwgZnVuY3Rpb24gKFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgVmFsdWVEYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnJlbW92ZURhdGEoJ0F1dG9Db21wbGV0ZVhIUicpOwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuTGFiZWwgKyAoQ3VzdG9tZXJTZWFyY2hUeXBlID09ICdDdXN0b21lclVzZXInID8gJyAoJyArIHRoaXMuVmFsdWUgKyAnKScgOiAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoVmFsdWVEYXRhKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChFdmVudCwgVUkpIHsKICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbChVSS5pdGVtLnZhbHVlKS50cmlnZ2VyKCdzZWxlY3QuQXV0b2NvbXBsZXRlJyk7CgogICAgICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwgJ0N1c3RvbWVyU2VhcmNoJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCAtIFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBpbnB1dCBmaWVsZCB3aXRoIGF1dG9jb21wbGV0ZS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplcyB0aGUgbW9kdWxlLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCRFbGVtZW50KSB7CiAgICAgICAgdmFyIEF1dG9jb21wbGV0ZUZvY3VzID0gZmFsc2U7CgogICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzIGZvciBBZ2VudFRpY2tldEN1c3RvbWVyCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEN1c3RvbWVyJykgewogICAgICAgICAgICBHZXRDdXN0b21lclRpY2tldHMoJCgnI0N1c3RvbWVyQXV0b0NvbXBsZXRlJykudmFsKCksICQoJyNDdXN0b21lcklEJykudmFsKCkpOwoKICAgICAgICAgICAgJEVsZW1lbnQuYmx1cihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoJEVsZW1lbnQudmFsKCkgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuUmVzZXRDdXN0b21lckluZm8oKTsKICAgICAgICAgICAgICAgICAgICBEZWFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCgpOwogICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5lbXB0eSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIEVuYWJsZSBmcmVlIHNlbGVjdGlvbiBvciBpbnB1dCBvZiBDdXN0b21lcklEIGZpZWxkIG9uIEFnZW50VGlja2V0UHJvY2VzcyBhbmQgQWdlbnRUaWNrZXRDdXN0b21lci4KICAgICAgICBpZiAoKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFByb2Nlc3MnCiAgICAgICAgICAgICYmICFDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJvY2Vzczo6Q3VzdG9tZXJJRFJlYWRPbmx5JykpCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDdXN0b21lcicKICAgICAgICAgICAgJiYgIUNvcmUuQ29uZmlnLkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDdXN0b21lcjo6Q3VzdG9tZXJJRFJlYWRPbmx5JykpCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3JwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICkgewogICAgICAgICAgICAkKCcjQ3VzdG9tZXJBdXRvQ29tcGxldGUnKS5vbignYmx1ciBrZXl1cCcgLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmKCQoJyNDdXN0b21lckF1dG9Db21wbGV0ZScpLnZhbCgpKSB7CiAgICAgICAgICAgICAgICAgICAgQWN0aXZhdGVTZWxlY3Rpb25DdXN0b21lcklEKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBEZWFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzIGZvciBBZ2VudFRpY2tldFBob25lIGFuZCBBZ2VudFRpY2tldEVtYWlsCiAgICAgICAgaWYgKChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UGhvbmUnKSAmJiAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoKSAhPT0gJycpIHsKICAgICAgICAgICAgR2V0Q3VzdG9tZXJUaWNrZXRzKCQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpLnZhbCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIGp1c3Qgc2F2ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY3VzdG9tZXIgaW5mbwogICAgICAgIGlmICgkKCcjQ3VzdG9tZXJJbmZvJykubGVuZ3RoKSB7CiAgICAgICAgICAgIEJhY2t1cERhdGEuQ3VzdG9tZXJJbmZvID0gJCgnI0N1c3RvbWVySW5mbyAuQ29udGVudCcpLmh0bWwoKTsKICAgICAgICB9CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWxlbWVudCkpIHsKICAgICAgICAgICAgLy8gSGlkZSB0b29sdGlwIGluIGF1dG9jb21wbGV0ZSBmaWVsZCwgaWYgdXNlciBhbHJlYWR5IHR5cGVkIHNvbWV0aGluZyB0byBwcmV2ZW50IHRoZSBhdXRvY29tcGxldGUgbGlzdAogICAgICAgICAgICAvLyB0byBiZSBoaWRkZW4gdW5kZXIgdGhlIHRvb2x0aXAuIChPbmx5IG5lZWRlZCBmb3Igc2VydmVyc2lkZSBlcnJvcnMpCiAgICAgICAgICAgICRFbGVtZW50Lm9mZigna2V5dXAuVmFsaWRhdGUnKS5vbigna2V5dXAuVmFsaWRhdGUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgIHZhciBWYWx1ZSA9ICRFbGVtZW50LnZhbCgpOwogICAgICAgICAgICAgICBpZiAoJEVsZW1lbnQuaGFzQ2xhc3MoJ1NlcnZlckVycm9yJykgJiYgVmFsdWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAkKCcjT1RPQk9fVUlfVG9vbHRpcHNfRXJyb3JUb29sdGlwJykuaGlkZSgpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgQ29yZS5BcHAuU3Vic2NyaWJlKCdFdmVudC5DdXN0b21lclVzZXJBZGRyZXNzQm9vay5BZGRUaWNrZXRDdXN0b21lci5DYWxsYmFjay4nICsgJEVsZW1lbnQuYXR0cignaWQnKSwgZnVuY3Rpb24oVXNlckxvZ2luLCBDdXN0b21lclRpY2tldFRleHQpIHsKICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbChDdXN0b21lclRpY2tldFRleHQpOwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuQWRkVGlja2V0Q3VzdG9tZXIoJEVsZW1lbnQuYXR0cignaWQnKSwgQ3VzdG9tZXJUaWNrZXRUZXh0LCBVc2VyTG9naW4pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIENvcmUuVUkuQXV0b2NvbXBsZXRlLkluaXQoJEVsZW1lbnQsIGZ1bmN0aW9uIChSZXF1ZXN0LCBSZXNwb25zZSkgewogICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiBDb3JlLlVJLkF1dG9jb21wbGV0ZS5HZXRDb25maWcoJ01heFJlc3VsdHNEaXNwbGF5ZWQnKQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJEVsZW1lbnQuZGF0YSgnQXV0b0NvbXBsZXRlWEhSJywgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkwsIERhdGEsIGZ1bmN0aW9uIChSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgVmFsdWVEYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQucmVtb3ZlRGF0YSgnQXV0b0NvbXBsZXRlWEhSJyk7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKFJlc3VsdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5MYWJlbCArICIgKCIgKyB0aGlzLlZhbHVlICsgIikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VzdG9tZXIgbGlzdCByZXByZXNlbnRhdGlvbiAoc2VlIEN1c3RvbWVyVXNlckxpc3RGaWVsZHMgZnJvbSBEZWZhdWx0cy5wbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLkxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VzdG9tZXIgdXNlciBpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLlZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlKFZhbHVlRGF0YSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChFdmVudCwgVUkpIHsKICAgICAgICAgICAgICAgIHZhciBDdXN0b21lcktleSA9IFVJLml0ZW0ua2V5LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVmFsdWUgPSBVSS5pdGVtLnZhbHVlOwoKICAgICAgICAgICAgICAgIEJhY2t1cERhdGEuQ3VzdG9tZXJLZXkgPSBDdXN0b21lcktleTsKICAgICAgICAgICAgICAgIEJhY2t1cERhdGEuQ3VzdG9tZXJFbWFpbCA9IEN1c3RvbWVyVmFsdWU7CgogICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKEN1c3RvbWVyVmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcKICAgICAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDb21wb3NlJwogICAgICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEZvcndhcmQnCiAgICAgICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcKICAgICAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbFJlc2VuZCcKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoJycpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRQaG9uZScKICAgICAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRFbWFpbCcKICAgICAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRDb21wb3NlJwogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEZvcndhcmQnCiAgICAgICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcKICAgICAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRFbWFpbFJlc2VuZCcKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycKLy8gRW8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaGlkZGVuIGZpZWxkIFNlbGVjdGVkQ3VzdG9tZXJVc2VyCiAgICAgICAgICAgICAgICAgICAgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKEN1c3RvbWVyS2V5KTsKCiAgICAgICAgICAgICAgICAgICAgQWN0aXZhdGVTZWxlY3Rpb25DdXN0b21lcklEKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZCBmb3IgQWdlbnRUaWNrZXRDdXN0b21lci5wbQogICAgICAgICAgICAgICAgICAgIGlmICgkKCcjQ3VzdG9tZXJVc2VySUQnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlcklEJykudmFsKEN1c3RvbWVyS2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNDdXN0b21lclVzZXJPcHRpb24nKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclVzZXJPcHRpb24nKS52YWwoQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ3VzdG9tZXJVc2VyT3B0aW9uIiBpZD0iQ3VzdG9tZXJVc2VyT3B0aW9uIj4nKS52YWwoQ3VzdG9tZXJLZXkpLmFwcGVuZFRvKCRFbGVtZW50LmNsb3Nlc3QoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgICAgICAgICAgR2V0Q3VzdG9tZXJUaWNrZXRzKEN1c3RvbWVyS2V5KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIGRhdGEgZm9yIGN1c3RvbWVyIGluZm8gdGFibGUKICAgICAgICAgICAgICAgICAgICBHZXRDdXN0b21lckluZm8oQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuQWRkVGlja2V0Q3VzdG9tZXIoJChFdmVudC50YXJnZXQpLmF0dHIoJ2lkJyksIEN1c3RvbWVyVmFsdWUsIEN1c3RvbWVyS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgJ0N1c3RvbWVyU2VhcmNoJyk7CgogICAgICAgICAgICAvLyBSZW1lbWJlciBpZiBhdXRvY29tcGxldGUgaXRlbSB3YXMgZm9jdXNlZCAoYnkga2V5Ym9hcmQgbmF2aWdhdGlvbiBvciBtb3VzZSkuCiAgICAgICAgICAgICRFbGVtZW50Lm9uKCdhdXRvY29tcGxldGVmb2N1cycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgJEVsZW1lbnQuZGF0YSgidWktYXV0b2NvbXBsZXRlIikgPT09ICdvYmplY3QnKSB7CgogICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgaWYgdGhlIGF1dG9jb21wbGV0ZSB3aWRnZXQgaXMgbGVmdCBieSBtb3VzZS4KICAgICAgICAgICAgICAgICQoJEVsZW1lbnQuZGF0YSgidWktYXV0b2NvbXBsZXRlIikubWVudS5lbGVtZW50KS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIEF1dG9jb21wbGV0ZUZvY3VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciBpZiB0aGUgYXV0b2NvbXBsZXRlIHdpZGdldCBpcyBsZWZ0IGJ5IGtleWJvYXJkIG5hdmlnYXRpb24uCiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgYnkgb3ZlcnJpZGUgdGhlIF9tb3ZlIG1ldGhvZCBiZWNhdXNlIHRoZXJlIGlzIG5vIG9wcG9zaXRlIGV2ZW50IG9mIGF1dG9jb21wbGV0ZWZvY3VzLgogICAgICAgICAgICAgICAgJEVsZW1lbnQuZGF0YSgidWktYXV0b2NvbXBsZXRlIikuX21vdmUgPSBmdW5jdGlvbihkaXJlY3Rpb24sIGV2ZW50KSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gobnVsbCwgZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZW51LmlzRmlyc3RJdGVtKCkgJiYgL15wcmV2aW91cy8udGVzdChkaXJlY3Rpb24pIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVudS5pc0xhc3RJdGVtKCkgJiYgL15uZXh0Ly50ZXN0KGRpcmVjdGlvbikKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUodGhpcy50ZXJtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgbW91c2VsZWF2ZSBmb3IgcmVtb3Zpbmcgc2VsZWN0aW9uIG9mIGF1dG9jb21wbGV0ZSB3aWRnZXQuCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5tZW51LmVsZW1lbnQpLnRyaWdnZXIoJ21vdXNlbGVhdmUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9jb21wbGV0ZUZvY3VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubWVudVsgZGlyZWN0aW9uIF0oZXZlbnQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWYgYXV0b2NvbXBsZXRlIHdhcyBmb2N1c2VkLCBidXQgdGhlbiBjbG9zZWQgYnkgYSBibHVyLCBjbGVhciB0aGUgc2VhcmNoIGZpZWxkIHNpbmNlIHRoaXMgdmFsdWUgd2FzCiAgICAgICAgICAgIC8vICAgbmV2ZXIgZXhwbGljaXRseSBjb25maXJtZWQuIERvIHRoaXMgYWxzbyB3aGVuIHVzZXIgZGVjaWRlcyB0byBjbGljayBvdXRzaWRlIHRoZSBhdXRvY29tcGxldGUgbGlzdCwKICAgICAgICAgICAgLy8gICB3aGljaCBjYXVzZXMgdGhlIGxpc3QgdG8gY2xvc2UuIFBsZWFzZSBzZWUgYnVnIzEzNTM3IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgICAkRWxlbWVudC5vbignYXV0b2NvbXBsZXRlY2xvc2UnLCBmdW5jdGlvbihFdmVudCkgewogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIEF1dG9jb21wbGV0ZUZvY3VzCiAgICAgICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5vcmlnaW5hbEV2ZW50ID09PSB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICAgICAgfHwgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQub3JpZ2luYWxFdmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgRXZlbnQub3JpZ2luYWxFdmVudC50eXBlID09ICdibHVyJwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoJycpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEF1dG9jb21wbGV0ZUZvY3VzID0gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0UGhvbmUnCiAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRFbWFpbCcKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldENvbXBvc2UnCiAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRGb3J3YXJkJwogICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsUmVzZW5kJwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnCi8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVsZW1lbnQuYmx1cihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIEZpZWxkVmFsdWUgPSAkKHRoaXMpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChGaWVsZFZhbHVlICE9PSBCYWNrdXBEYXRhLkN1c3RvbWVyRW1haWwgJiYgRmllbGRWYWx1ZSAhPT0gQmFja3VwRGF0YS5DdXN0b21lcktleSkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJVc2VySUQnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJVc2VyT3B0aW9uJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI1Nob3dDdXN0b21lcklEJykuaHRtbCgnJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGN1c3RvbWVyIGluZm8gdGFibGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRDdXN0b21lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lckluZm8gLkNvbnRlbnQnKS5odG1sKEJhY2t1cERhdGEuQ3VzdG9tZXJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lcklEJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFByb2Nlc3MnICYmIHR5cGVvZiBDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyRmllbGRzVG9VcGRhdGUnKSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzZXJ2aWNlcyAodHJpZ2dlciBTZXJ2aWNlSUQgY2hhbmdlIGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0N1c3RvbWVySUQnKS5jbG9zZXN0KCdmb3JtJyksICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcsIENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJGaWVsZHNUb1VwZGF0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZXMgdGhlIGN1c3RvbWVyIGZpZWxkLgogICAgICAgICAgICAgICAgVGFyZ2V0TlMuSW5pdEN1c3RvbWVyRmllbGQoJEVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBPbiB1bmxvYWQgcmVtb3ZlIG9sZCBzZWxlY3RlZCBkYXRhLiBJZiB0aGUgcGFnZSBpcyByZWxvYWRlZCAod2l0aCBGNSkgdGhpcyBkYXRhCiAgICAgICAgLy8gc3RheXMgaW4gdGhlIGZpZWxkIGFuZCBpbnZva2VzIGFuIGFqYXggcmVxdWVzdCBvdGhlcndpc2UuIFdlIG5lZWQgdG8gdXNlIGJlZm9yZXVubG9hZAogICAgICAgIC8vIGhlcmUgaW5zdGVhZCBvZiB1bmxvYWQgYmVjYXVzZSB0aGUgVVJMIG9mIHRoZSB3aW5kb3cgZG9lcyBub3QgY2hhbmdlIG9uIHJlbG9hZCB3aGljaAogICAgICAgIC8vIGRvZXNuJ3QgdHJpZ2dlciBwYWdlaGlkZS4KICAgICAgICAkKHdpbmRvdykub24oJ2JlZm9yZXVubG9hZC5DdXN0b21lclNlYXJjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCcnKTsKICAgICAgICAgICAgcmV0dXJuOyAvLyByZXR1cm4gbm90aGluZyB0byBzdXBwcmVzcyB0aGUgY29uZmlybWF0aW9uIG1lc3NhZ2UKICAgICAgICB9KTsKCiAgICAgICAgQ2hlY2tQaG9uZUN1c3RvbWVyQ291bnRMaW1pdCgpOwogICAgfTsKCiAgICBmdW5jdGlvbiBodG1sRGVjb2RlKFRleHQpewogICAgICAgIHJldHVybiBUZXh0LnJlcGxhY2UoLyZhbXA7L2csICcmJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBBZGRUaWNrZXRDdXN0b21lcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgZmFsc2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRmllbGQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDdXN0b21lclZhbHVlIC0gVGhlIHJlYWRhYmxlIGN1c3RvbWVyIGlkZW50aWZpZXIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ3VzdG9tZXJLZXkgLSBDdXN0b21lciBrZXkgb24gc3lzdGVtLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFNldEFzVGlja2V0Q3VzdG9tZXIgLSAgU2V0IHRoaXMgY3VzdG9tZXIgYXMgbWFpbiB0aWNrZXQgY3VzdG9tZXIuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBhZGRzIGEgbmV3IHRpY2tldCBjdXN0b21lcgogICAgICovCiAgICBUYXJnZXROUy5BZGRUaWNrZXRDdXN0b21lciA9IGZ1bmN0aW9uIChGaWVsZCwgQ3VzdG9tZXJWYWx1ZSwgQ3VzdG9tZXJLZXksIFNldEFzVGlja2V0Q3VzdG9tZXIpIHsKCiAgICAgICAgdmFyICRDbG9uZSA9ICQoJy5DdXN0b21lclRpY2tldFRlbXBsYXRlJyArIEZpZWxkKS5jbG9uZSgpLAogICAgICAgICAgICBDdXN0b21lclRpY2tldENvdW50ZXIgPSAkKCcjQ3VzdG9tZXJUaWNrZXRDb3VudGVyJyArIEZpZWxkKS52YWwoKSwKICAgICAgICAgICAgVGlja2V0Q3VzdG9tZXJJRHMgPSAwLAogICAgICAgICAgICBJc0R1cGxpY2F0ZWQgPSBmYWxzZSwKICAgICAgICAgICAgSXNGb2N1c2VkID0gKCQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuYXR0cignaWQnKSA9PSBGaWVsZCksCiAgICAgICAgICAgIFN1ZmZpeDsKCiAgICAgICAgaWYgKHR5cGVvZiBDdXN0b21lcktleSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgQ3VzdG9tZXJLZXkgPSBodG1sRGVjb2RlKEN1c3RvbWVyS2V5KTsKICAgICAgICB9CgogICAgICAgIGlmIChDdXN0b21lclZhbHVlID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICB2YXIgQ3VycmVudFF1b3RhdGlvbiwKICAgICAgICAgICAgTXVsdGlFbnRyeSA9IFsnJ10sCiAgICAgICAgICAgIFNlZW5BdCAgICAgPSAwLAogICAgICAgICAgICBuICAgICAgICAgID0gMDsKCiAgICAgICAgLy8gZG8gYSBtYW51YWwgc3BsaXQgdGhhdCBrZWVwcyB0cmFjayBvZiBxdW90YXRpb24KICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBDdXN0b21lclZhbHVlLmxlbmd0aDsgaSsrICkgewogICAgICAgICAgICB2YXIgQ2hhciA9IEN1c3RvbWVyVmFsdWUuY2hhckF0KGkpOwoKICAgICAgICAgICAgaWYgKCBDdXJyZW50UXVvdGF0aW9uICkgewogICAgICAgICAgICAgICAgTXVsdGlFbnRyeVtuXSArPSBDaGFyOwogICAgICAgICAgICAgICAgaWYgKCBDaGFyID09PSBDdXJyZW50UXVvdGF0aW9uICkgewogICAgICAgICAgICAgICAgICAgIEN1cnJlbnRRdW90YXRpb24gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIENoYXIgPT09ICciJyB8fCBDaGFyID09PSAiJyIgKSB7CiAgICAgICAgICAgICAgICBNdWx0aUVudHJ5W25dICAgICs9IENoYXI7CiAgICAgICAgICAgICAgICBDdXJyZW50UXVvdGF0aW9uICA9IENoYXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIFNlZW5BdCA9PT0gMSAmJiAoIENoYXIgPT09ICcsJyB8fCBDaGFyID09PSAiOyIgKSApIHsKICAgICAgICAgICAgICAgIG4rKzsKICAgICAgICAgICAgICAgIFNlZW5BdCAgICAgICAgPSAwOwogICAgICAgICAgICAgICAgTXVsdGlFbnRyeVtuXSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCBDaGFyID09PSAnQCcgKSB7CiAgICAgICAgICAgICAgICAgICAgU2VlbkF0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE11bHRpRW50cnlbbl0gKz0gQ2hhcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCBuID4gMCApIHsKICAgICAgICAgICAgZm9yICggdmFyIG0gPSAwOyBtIDw9IG47IG0rKyApIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLkFkZFRpY2tldEN1c3RvbWVyKCBGaWVsZCwgTXVsdGlFbnRyeVttXS50cmltKCkgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgJCgnW2NsYXNzKj1DdXN0b21lclRpY2tldFRleHRdJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCQodGhpcykudmFsKCkgPT09IEN1c3RvbWVyVmFsdWUpIHsKICAgICAgICAgICAgICAgIElzRHVwbGljYXRlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoSXNEdXBsaWNhdGVkKSB7CiAgICAgICAgICAgIFRhcmdldE5TLlNob3dEdXBsaWNhdGVkRGlhbG9nKEZpZWxkKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gZ2V0IG51bWJlciBvZiBob3cgbXVjaCBjdXN0b21lciB0aWNrZXQgYXJlIHByZXNlbnQKICAgICAgICBUaWNrZXRDdXN0b21lcklEcyA9ICQoJy5DdXN0b21lckNvbnRhaW5lciBpbnB1dFt0eXBlPSJyYWRpbyJdJykubGVuZ3RoOwoKICAgICAgICAvLyBpbmNyZW1lbnQgY3VzdG9tZXIgY291bnRlcgogICAgICAgIEN1c3RvbWVyVGlja2V0Q291bnRlcisrOwoKICAgICAgICAvLyBzZXQgc3VmaXgKICAgICAgICBTdWZmaXggPSAnXycgKyBDdXN0b21lclRpY2tldENvdW50ZXI7CgogICAgICAgIC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBjbGFzc2VzCiAgICAgICAgJENsb25lLnJlbW92ZUNsYXNzKCdIaWRkZW4gQ3VzdG9tZXJUaWNrZXRUZW1wbGF0ZScgKyBGaWVsZCk7CgogICAgICAgIC8vIGNvcHkgdmFsdWVzIGFuZCBjaGFuZ2UgaWRzIGFuZCBuYW1lcwogICAgICAgICRDbG9uZS5maW5kKCc6aW5wdXQsIGEnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHZhciBJRCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdpZCcsIElEICsgU3VmZml4KTsKICAgICAgICAgICAgJCh0aGlzKS52YWwoQ3VzdG9tZXJWYWx1ZSk7CiAgICAgICAgICAgIGlmIChJRCAhPT0gJ0N1c3RvbWVyU2VsZWN0ZWQnKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ25hbWUnLCBJRCArIFN1ZmZpeCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBldmVudCBoYW5kbGVyIHRvIHJhZGlvIGJ1dHRvbgogICAgICAgICAgICBpZigkKHRoaXMpLmhhc0NsYXNzKCdDdXN0b21lclRpY2tldFJhZGlvJykpIHsKCiAgICAgICAgICAgICAgICBpZiAoVGlja2V0Q3VzdG9tZXJJRHMgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzZXQgY291bnRlciBhcyB2YWx1ZQogICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoQ3VzdG9tZXJUaWNrZXRDb3VudGVyKTsKCiAgICAgICAgICAgICAgICAvLyBiaW5kIGNoYW5nZSBmdW5jdGlvbiB0byByYWRpbyBidXR0b24gdG8gc2VsZWN0IGN1c3RvbWVyCiAgICAgICAgICAgICAgICAkKHRoaXMpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvdwogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnByb3AoJ2NoZWNrZWQnKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlJlbG9hZEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgY3VzdG9tZXIga2V5IGlmIHByZXNlbnQKICAgICAgICAgICAgaWYoJCh0aGlzKS5oYXNDbGFzcygnQ3VzdG9tZXJLZXknKSkgewogICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhZGQgZXZlbnQgaGFuZGxlciB0byByZW1vdmUgYnV0dG9uCiAgICAgICAgICAgIGlmKCQodGhpcykuaGFzQ2xhc3MoJ1JlbW92ZUJ1dHRvbicpKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBjbGljayBmdW5jdGlvbiB0byByZW1vdmUgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHRoaXMpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcm93CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuUmVtb3ZlQ3VzdG9tZXJUaWNrZXQoJCh0aGlzKSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIEN1c3RvbWVySGlzdG9yeSB0YWJsZSBpZiB0aGVyZSBhcmUgbm8gc2VsZWN0ZWQgY3VzdG9tZXIgdXNlcnMKICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI1RpY2tldEN1c3RvbWVyQ29udGVudCcgKyBGaWVsZCArICcgLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gc2V0IGJ1dHRvbiB2YWx1ZQogICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoQ3VzdG9tZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKCQodGhpcykuaGFzQ2xhc3MoJ01vdmVDdXN0b21lckJ1dHRvbicpKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgTW92ZUN1c3RvbWVyS2V5ID0gJCgnLkN1c3RvbWVyS2V5JywgJCh0aGlzKS5wYXJlbnQoKSkudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVDdXN0b21lclZhbCA9ICQoJy5DdXN0b21lclRpY2tldFRleHQnLCAkKHRoaXMpLnBhcmVudCgpKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0RmllbGQgICAgID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaGFzQ2xhc3MoJ1RvTW92ZScpICA/ICdUb0N1c3RvbWVyJyAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5oYXNDbGFzcygnQ2NNb3ZlJykgID8gJ0NjQ3VzdG9tZXInICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhhc0NsYXNzKCdCY2NNb3ZlJykgPyAnQmNjQ3VzdG9tZXInIDogJyc7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBlbnRyeQogICAgICAgICAgICAgICAgICAgICQoJy5SZW1vdmVCdXR0b24nLCAkKHRoaXMpLnBhcmVudCgpKS5jbGljaygpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGN1c3RvbWVyIHRvIHRoZSB0YXJnZXQgZmllbGQKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZGRUaWNrZXRDdXN0b21lcihUYXJnZXRGaWVsZCwgTW92ZUN1c3RvbWVyVmFsLCBNb3ZlQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvLyBzaG93IGNvbnRhaW5lcgogICAgICAgICQoJyNUaWNrZXRDdXN0b21lckNvbnRlbnQnICsgRmllbGQpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgICAgICAvLyBhcHBlbmQgdG8gY29udGFpbmVyCiAgICAgICAgJCgnI1RpY2tldEN1c3RvbWVyQ29udGVudCcgKyBGaWVsZCkuYXBwZW5kKCRDbG9uZSk7CgogICAgICAgIC8vIHNldCBuZXcgdmFsdWUgZm9yIEN1c3RvbWVyVGlja2V0Q291bnRlcgogICAgICAgICQoJyNDdXN0b21lclRpY2tldENvdW50ZXInICsgRmllbGQpLnZhbChDdXN0b21lclRpY2tldENvdW50ZXIpOwogICAgICAgIGlmICgoQ3VzdG9tZXJLZXkgIT09ICcnICYmIFRpY2tldEN1c3RvbWVySURzID09PSAwICYmIChGaWVsZCA9PT0gJ1RvQ3VzdG9tZXInIHx8IEZpZWxkID09PSAnRnJvbUN1c3RvbWVyJykpIHx8IFNldEFzVGlja2V0Q3VzdG9tZXIpIHsKICAgICAgICAgICAgaWYgKFNldEFzVGlja2V0Q3VzdG9tZXIpIHsKICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclNlbGVjdGVkXycgKyBDdXN0b21lclRpY2tldENvdW50ZXIpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKS50cmlnZ2VyKCdjaGFuZ2UnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICQoJy5DdXN0b21lckNvbnRhaW5lciBpbnB1dFt0eXBlPSJyYWRpbyJdOmZpcnN0JykucHJvcCgnY2hlY2tlZCcsIHRydWUpLnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIHRvIHRoZSBzZWFyY2ggZmllbGQuCiAgICAgICAgJCgnIycgKyBGaWVsZCkudmFsKCcnKTsKCiAgICAgICAgLy8gUmUtZm9jdXMgdGhlIGZpZWxkLCBidXQgb25seSBpZiBpdCB3YXMgcHJldmlvdXNseSBmb2N1c2VkLgogICAgICAgIGlmIChJc0ZvY3VzZWQpIHsKICAgICAgICAgICAgJCgnIycgKyBGaWVsZCkuZm9jdXMoKTsKICAgICAgICB9CgogICAgICAgIENoZWNrUGhvbmVDdXN0b21lckNvdW50TGltaXQoKTsKCiAgICAgICAgLy8gUmVsb2FkIENyeXB0IG9wdGlvbnMgb24gc3BlY2lmaWMgc2NyZWVucy4KICAgICAgICBpZiAoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q29tcG9zZScKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEZvcndhcmQnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnCiAgICAgICAgICAgICkKICAgICAgICAgICAgJiYgJCgnI0NyeXB0S2V5SUQnKS5sZW5ndGgKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnIycgKyBGaWVsZCkuY2xvc2VzdCgnZm9ybScpLCAnQUpBWFVwZGF0ZScsICcnLCBbJ0NyeXB0S2V5SUQnXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IHRoYXQgYXQgbGVhc3Qgb25lIGN1c3RvbWVyIGhhcyBiZWVuIGFkZGVkLAogICAgICAgIC8vIHdlIGNhbiByZW1vdmUgZXZlbnR1YWwgZXJyb3JzIGZyb20gdGhlIGN1c3RvbWVyIGZpZWxkCiAgICAgICAgJCgnI0Zyb21DdXN0b21lciwgI1RvQ3VzdG9tZXInKQogICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ0Vycm9yIFNlcnZlckVycm9yJykKICAgICAgICAgICAgLmNsb3Nlc3QoJy5GaWVsZCcpCiAgICAgICAgICAgIC5wcmV2KCdsYWJlbCcpCiAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnTGFiZWxFcnJvcicpOwogICAgICAgIENvcmUuRm9ybS5FcnJvclRvb2x0aXBzLkhpZGVUb29sdGlwKCk7CgogICAgICAgIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCgpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgUmVtb3ZlQ3VzdG9tZXJUaWNrZXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBPYmplY3QgLSBKUXVlcnkgb2JqZWN0IHVzZWQgYXMgYmFzZSB0byBkZWxldGUgaXQncyBwYXJlbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIGEgY3VzdG9tZXIgdGlja2V0IGVudHJ5LgogICAgICovCiAgICBUYXJnZXROUy5SZW1vdmVDdXN0b21lclRpY2tldCA9IGZ1bmN0aW9uIChPYmplY3QpIHsKICAgICAgICB2YXIgVGlja2V0Q3VzdG9tZXJJRHMgPSAwLAogICAgICAgICRGaWVsZCA9IE9iamVjdC5jbG9zZXN0KCcuRmllbGQnKSwKICAgICAgICAkRm9ybTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q29tcG9zZScKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcKICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtID0gT2JqZWN0LmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgIFRpY2tldEN1c3RvbWVySURzID0gJCgnLkN1c3RvbWVyQ29udGFpbmVyIGlucHV0W3R5cGU9InJhZGlvIl0nKS5sZW5ndGg7CiAgICAgICAgaWYgKFRpY2tldEN1c3RvbWVySURzID09PSAwKSB7CiAgICAgICAgICAgIFRhcmdldE5TLlJlc2V0Q3VzdG9tZXJJbmZvKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWxvYWQgQ3J5cHQgb3B0aW9ucyBvbiBzcGVjaWZpYyBzY3JlZW5zLgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDb21wb3NlJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbFJlc2VuZCcKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAkKCcjQ3J5cHRLZXlJRCcpLmxlbmd0aAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkRm9ybSwgJ0FKQVhVcGRhdGUnLCAnJywgWydDcnlwdEtleUlEJ10pOwogICAgICAgIH0KCiAgICAgICAgaWYoISQoJy5DdXN0b21lckNvbnRhaW5lciBpbnB1dFt0eXBlPSJyYWRpbyJdJykuaXMoJzpjaGVja2VkJykpewogICAgICAgICAgICAvL3NldCB0aGUgZmlyc3Qgb25lIGFzIGNoZWNrZWQKICAgICAgICAgICAgJCgnLkN1c3RvbWVyQ29udGFpbmVyIGlucHV0W3R5cGU9InJhZGlvIl06Zmlyc3QnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEZpZWxkLmZpbmQoJy5DdXN0b21lclRpY2tldFRleHQ6dmlzaWJsZScpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAkRmllbGQuYWRkQ2xhc3MoJ0hpZGRlbicpOwoKICAgICAgICAgICAgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKICAgICAgICB9CgogICAgICAgIENoZWNrUGhvbmVDdXN0b21lckNvdW50TGltaXQoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBSZXNldEN1c3RvbWVySW5mbwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIGFsbCBzZWxlY3RlZCBjdXN0b21lciBpbmZvLgogICAgICovCiAgICBUYXJnZXROUy5SZXNldEN1c3RvbWVySW5mbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlcklEJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI0N1c3RvbWVySUQnKS52YWwoJycpOwogICAgICAgICAgICAkKCcjQ3VzdG9tZXJVc2VyT3B0aW9uJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI1Nob3dDdXN0b21lcklEJykuaHRtbCgnJyk7CgogICAgICAgICAgICAvLyByZXNldCBjdXN0b21lciBpbmZvIHRhYmxlCiAgICAgICAgICAgICQoJyNDdXN0b21lckluZm8gLkNvbnRlbnQnKS5odG1sKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdub25lJykpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFJlbG9hZEN1c3RvbWVySW5mbwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyS2V5CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZWxvYWRzIGluZm8gZm9yIHNlbGVjdGVkIGN1c3RvbWVyLgogICAgICovCiAgICBUYXJnZXROUy5SZWxvYWRDdXN0b21lckluZm8gPSBmdW5jdGlvbiAoQ3VzdG9tZXJLZXkpIHsKCiAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICBHZXRDdXN0b21lclRpY2tldHMoQ3VzdG9tZXJLZXkpOwoKICAgICAgICAvLyBnZXQgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZQogICAgICAgIEdldEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CgogICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgU2VsZWN0ZWRDdXN0b21lclVzZXIKICAgICAgICAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoQ3VzdG9tZXJLZXkpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRDdXN0b21lckZpZWxkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gJEVsZW1lbnQgLSBKUXVlcnkgb2JqZWN0LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGN1c3RvbWVyIGZpZWxkcy4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdEN1c3RvbWVyRmllbGQgPSBmdW5jdGlvbiAoJEVsZW1lbnQpIHsKICAgICAgICB2YXIgT2JqZWN0SWQgPSAkRWxlbWVudC5hdHRyKCdpZCcpOwoKICAgICAgICAkKCcjJyArIE9iamVjdElkKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgaWYgKCEkKCcjJyArIE9iamVjdElkKS52YWwoKSB8fCAkKCcjJyArIE9iamVjdElkKS52YWwoKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgYXV0b2NvbXBsZXRpb24gaXMgZGlzYWJsZWQgYW5kIG9ubHkgYXZhaWJsZSB2aWEgdGhlIGNsaWNrCiAgICAgICAgICAgIC8vIG9mIGEgYnV0dG9uIG5leHQgdG8gdGhlIGlucHV0IGZpZWxkLCB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMKICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50IHRoZSBub3JtYWwgd2F5LgogICAgICAgICAgICBpZiAoIUNvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnQWN0aXZlQXV0b0NvbXBsZXRlJykpIHsKICAgICAgICAgICAgICAgIC8vIHdlIHdhaXQgc29tZSB0aW1lIGFmdGVyIHRoaXMgZXZlbnQgdG8gY2hlY2ssIGlmIHRoZSBzZWFyY2ggYnV0dG9uCiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBmaWVsZCB3YXMgcHJlc3NlZC4gSWYgc28sIG5vIGFjdGlvbiBpcyBuZWVkZWQKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjaGFuZ2UgZXZlbnQgd2FzIGZpcmVkIHdpdGhvdXQgY2xpY2tpbmcgdGhlIHNlYXJjaCBidXR0b24sCiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSB0aGUgdXNlciBjbGlja2VkIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHNvIGFkZCB0aGUgY3VzdG9tZXIgKHRoZSBlbmV0ZXJlZCB2YWx1ZSkgdG8gdGhlIGxpc3QKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF0gPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50W09iamVjdElkXSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKENvcmUuVUkuQXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvbkNsaWNrZWRbT2JqZWN0SWRdKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIENvcmUuVUkuQXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvbkNsaWNrZWRbT2JqZWN0SWRdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyMnICsgT2JqZWN0SWQpLnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLy8gSWYgdGhlIGF1dG9jb21wbGV0ZSBwb3B1cCB3aW5kb3cgaXMgdmlzaWJsZSwgZGVsYXkgdGhpcyBjaGFuZ2UgZXZlbnQuCiAgICAgICAgICAgIC8vIEl0IG1pZ2h0IGJlIGNhdXNlZCBieSBjbGlja2luZyB3aXRoIHRoZSBtb3VzZSBpbnRvIHRoZSBhdXRvY29tcGxldGUgbGlzdC4KICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBpdCBpcyBjbG9zZWQgdG8gYmUgc3VyZSB0aGF0IHdlIGRvbid0IGFkZCBhIGN1c3RvbWVyIHR3aWNlLgoKICAgICAgICAgICAgaWYgKCRFbGVtZW50LmF1dG9jb21wbGV0ZSgid2lkZ2V0IikuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgJCgnIycgKyBPYmplY3RJZCkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLkFkZFRpY2tldEN1c3RvbWVyKE9iamVjdElkLCAkKCcjJyArIE9iamVjdElkKS52YWwoKSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnIycgKyBPYmplY3RJZCkub24oJ2tleXByZXNzJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IDEzKXsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoT2JqZWN0SWQsICQoJyMnICsgT2JqZWN0SWQpLnZhbCgpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFNob3dEdXBsaWNhdGVkRGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRmllbGQgLSBJRCBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgc2hvdWxkIHJlY2VpdmUgdGhlIGZvY3VzIG9uIGNsb3NlIGV2ZW50LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gc2hvd3MgYW4gYWxlcnQgZGlhbG9nIGZvciBkdXBsaWNhdGVkIGVudHJpZXMuCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dEdXBsaWNhdGVkRGlhbG9nID0gZnVuY3Rpb24oRmllbGQpewogICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dBbGVydCgKICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0R1cGxpY2F0ZWQgZW50cnknKSwKICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgYWRkcmVzcyBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgYWRkcmVzcyBsaXN0LicpICsgJyAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0l0IGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZmllbGQsIHBsZWFzZSB0cnkgYWdhaW4uJyksCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5BbGVydCcpKTsKICAgICAgICAgICAgICAgICQoJyMnICsgRmllbGQpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAkKCcjJyArIEZpZWxkKS5mb2N1cygpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2ggfHwge30pKTsK</File>
        <File Location="doc/en/AppointmentToTicket.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="calendar_appointment">
            <ColumnAdd Name="future_task_id" Required="false" Type="INTEGER"></ColumnAdd>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="calendar_appointment">
            <ColumnDrop Name="future_task_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>