<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>ChatRexConnector</Name>
    <Version>1.0.2</Version>
    <Vendor>ChatRex</Vendor>
    <URL>https://chatrex.pro/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, November 2007</License>
    <ChangeLog Date="2026-08-14" Version="1.0.0">Initial OTRS Community Edition 6 connector.</ChangeLog>
    <ChangeLog Date="2026-08-14" Version="1.0.1">Emit strict JSON booleans in the capabilities contract.</ChangeLog>
    <ChangeLog Date="2026-08-14" Version="1.0.2">Use OTRS application time consistently for durable webhook retries.</ChangeLog>
    <Description Lang="en">Connects OTRS Community Edition 6 to ChatRex with ticket actions and signed customer article webhooks.</Description>
    <Description Lang="ru">Подключает OTRS Community Edition 6 к ChatRex: действия с заявками и подписанные вебхуки сообщений клиентов.</Description>
    <Framework>6.0.x</Framework>
    <PackageIsVisible>1</PackageIsVisible>
    <PackageIsDownloadable>1</PackageIsDownloadable>
    <PackageIsRemovable>1</PackageIsRemovable>
    <CodeInstall Type="post">
        $Kernel::OM-&gt;Get('Kernel::System::Main')-&gt;Require('var::packagesetup::ChatRexConnector');
        var::packagesetup::ChatRexConnector-&gt;new()-&gt;CodeInstall();
    </CodeInstall>
    <CodeUpgrade Type="post">
        $Kernel::OM-&gt;Get('Kernel::System::Main')-&gt;Require('var::packagesetup::ChatRexConnector');
        var::packagesetup::ChatRexConnector-&gt;new()-&gt;CodeUpgrade();
    </CodeUpgrade>
    <CodeUninstall Type="pre">
        $Kernel::OM-&gt;Get('Kernel::System::Main')-&gt;Require('var::packagesetup::ChatRexConnector');
        var::packagesetup::ChatRexConnector-&gt;new()-&gt;CodeUninstall();
    </CodeUninstall>
    <BuildDate>2026-08-14 13:46:49</BuildDate>
    <BuildHost>radiant-otrs.local</BuildHost>
    <Filelist>
        <File Location="Kernel/Config/Files/XML/ChatRexConnector.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxTZXR0aW5nIE5hbWU9IkNoYXRSZXhDb25uZWN0b3I6OkVuYWJsZWQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlIHRoZSBDaGF0UmV4IGNvbm5lY3RvciBSRVNUIEFQSSBhbmQgY3VzdG9tZXIgYXJ0aWNsZSB3ZWJob29rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q2hhdFJleENvbm5lY3RvcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkNoYXRSZXhDb25uZWN0b3I6OkFQSVRva2VuIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkJlYXJlciB0b2tlbiB1c2VkIGJ5IENoYXRSZXggdG8gY2FsbCB0aGlzIGNvbm5lY3Rvci4gU2V0IGEgdW5pcXVlIHJhbmRvbSB2YWx1ZSBiZWZvcmUgY29ubmVjdGluZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNoYXRSZXhDb25uZWN0b3I8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXi57MCw0MDk2fSQiPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ2hhdFJleENvbm5lY3Rvcjo6SW5zdGFsbGF0aW9uSUQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U3RhYmxlIGluc3RhbGxhdGlvbiBpZGVudGlmaWVyLiBJZiBlbXB0eSwgdGhlIE9UUlMgRlFETiBvciBTeXN0ZW1JRCBpcyB1c2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q2hhdFJleENvbm5lY3RvcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeW0EtWmEtejAtOS5fOi1dezAsMTI4fSQiPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ2hhdFJleENvbm5lY3Rvcjo6V2ViaG9va1VSTCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5IVFRQUyB3ZWJob29rIFVSTCByZXR1cm5lZCBieSBDaGF0UmV4IGFmdGVyIHRoZSBpbnRlZ3JhdGlvbiBpcyBjb25uZWN0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDaGF0UmV4Q29ubmVjdG9yPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ofGh0dHBzOi8vLispJCI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDaGF0UmV4Q29ubmVjdG9yOjpXZWJob29rU2VjcmV0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPldlYmhvb2sgc2lnbmluZyBzZWNyZXQgcmV0dXJuZWQgYnkgQ2hhdFJleCBhZnRlciB0aGUgaW50ZWdyYXRpb24gaXMgY29ubmVjdGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q2hhdFJleENvbm5lY3RvcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeLnswLDQwOTZ9JCI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDaGF0UmV4Q29ubmVjdG9yOjpTeXN0ZW1Vc2VySUQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+T1RSUyBhZ2VudCB1c2VyIElEIHVzZWQgZm9yIENoYXRSZXggd3JpdGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q2hhdFJleENvbm5lY3RvcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeWzEtOV1bMC05XSokIj4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDaGF0UmV4Q29ubmVjdG9yOjpUaW1lb3V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPldlYmhvb2sgSFRUUCB0aW1lb3V0IGluIHNlY29uZHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDaGF0UmV4Q29ubmVjdG9yPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5bMC05XSskIj4yMDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQ2hhdFJleENvbm5lY3Rvcjo6UmV0cnlNYXgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWF4aW11bSB3ZWJob29rIGRlbGl2ZXJ5IGF0dGVtcHRzIGJlZm9yZSBtYW51YWwgcmV0cnkgaXMgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDaGF0UmV4Q29ubmVjdG9yPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5bMS05XVswLTldKiQiPjEyPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzk5NTAtQ2hhdFJleENvbm5lY3RvciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5RdWV1ZSBzaWduZWQgQ2hhdFJleCB3ZWJob29rcyBmb3IgbmV3IHB1YmxpYyBjdXN0b21lciBhcnRpY2xlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpUaWNrZXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6Q2hhdFJleFdlYmhvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+QXJ0aWNsZUNyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJEYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzayMjI0NoYXRSZXhDb25uZWN0b3JXZWJob29rUmV0cnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmV0cnkgcGVuZGluZyBDaGF0UmV4IHdlYmhvb2sgZGVsaXZlcmllcyBldmVyeSBtaW51dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5EYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzazwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXNrTmFtZSI+Q2hhdFJleENvbm5lY3RvcldlYmhvb2tSZXRyeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2NoZWR1bGUiPiogKiAqICogKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2hhdFJleDo6Q29ubmVjdG9yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGdW5jdGlvbiI+RGVsaXZlclBlbmRpbmc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1heGltdW1QYXJhbGxlbEluc3RhbmNlcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGFyYW1zIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3Ryc19jb25maWc+Cg==</File>
        <File Location="Kernel/GenericInterface/Operation/ChatRex/Connector.pm" Permission="644" Encode="Base64">cGFja2FnZSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6Q2hhdFJleDo6Q29ubmVjdG9yOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwogICAgZm9yIG15ICROZWVkZWQgKHF3KERlYnVnZ2VyT2JqZWN0IE9wZXJhdGlvbiBXZWJzZXJ2aWNlSUQpKSB7CiAgICAgICAgcmV0dXJuIHsgU3VjY2VzcyA9PiAwLCBFcnJvck1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgfSBpZiAhJFBhcmFteyROZWVkZWR9OwogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH07CiAgICB9CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlndXJlZFRva2VuID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDaGF0UmV4Q29ubmVjdG9yOjpBUElUb2tlbicpIHx8ICcnOwogICAgbXkgJEF1dGhvcml6YXRpb24gPSAkRU5We0hUVFBfQVVUSE9SSVpBVElPTn0gfHwgJyc7CiAgICAkQXV0aG9yaXphdGlvbiA9fiBzL1xBQmVhcmVyXHMrLy9pOwogICAgbXkgJENvbXBhdGliaWxpdHlUb2tlbiA9ICRFTlZ7SFRUUF9YX0NIQVRSRVhfVE9LRU59IHx8ICcnOwogICAgbXkgJEF1dGhvcml6ZWQgPSAkU2VsZi0+X1NlY3VyZUVxdWFsKCAkQ29uZmlndXJlZFRva2VuLCAkQXV0aG9yaXphdGlvbiApCiAgICAgICAgfHwgJFNlbGYtPl9TZWN1cmVFcXVhbCggJENvbmZpZ3VyZWRUb2tlbiwgJENvbXBhdGliaWxpdHlUb2tlbiApOwogICAgaWYgKCAhJENvbmZpZ3VyZWRUb2tlbiB8fCAhJEF1dGhvcml6ZWQgKSB7CiAgICAgICAgcmV0dXJuIHsgU3VjY2VzcyA9PiAwLCBFcnJvck1lc3NhZ2UgPT4gJ0NoYXRSZXhDb25uZWN0b3IuQXV0aEZhaWwnIH07CiAgICB9CgogICAgbXkgJERhdGEgPSByZWYgJFBhcmFte0RhdGF9IGVxICdIQVNIJyA/ICRQYXJhbXtEYXRhfSA6IHt9OwogICAgbXkgJENvbm5lY3RvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0UmV4OjpDb25uZWN0b3InKTsKICAgIG15ICVNZXRob2RzID0gKAogICAgICAgIENhcGFiaWxpdGllcyA9PiAnQ2FwYWJpbGl0aWVzJywKICAgICAgICBEaXJlY3RvcnkgICAgPT4gJ0RpcmVjdG9yeScsCiAgICAgICAgVGlja2V0R2V0ICAgID0+ICdUaWNrZXRHZXQnLAogICAgICAgIEFydGljbGVMaXN0ICA9PiAnQXJ0aWNsZUxpc3QnLAogICAgICAgIEFydGljbGVDcmVhdGUgPT4gJ0FydGljbGVDcmVhdGUnLAogICAgICAgIFRpY2tldFVwZGF0ZSA9PiAnVGlja2V0VXBkYXRlJywKICAgICk7CiAgICBteSAkTWV0aG9kID0gJE1ldGhvZHN7ICRTZWxmLT57T3BlcmF0aW9ufSB9OwogICAgcmV0dXJuIHsgU3VjY2VzcyA9PiAwLCBFcnJvck1lc3NhZ2UgPT4gJ0NoYXRSZXhDb25uZWN0b3IuT3BlcmF0aW9uVW5zdXBwb3J0ZWQnIH0gaWYgISRNZXRob2Q7CgogICAgbXkgJFJlc3VsdCA9IGV2YWwgeyAkQ29ubmVjdG9yLT4kTWV0aG9kKCAleyREYXRhfSApIH07CiAgICBpZiAoICEkUmVzdWx0IHx8ICRAICkgewogICAgICAgIG15ICRFcnJvciA9ICRAIHx8ICdjb25uZWN0b3Igb3BlcmF0aW9uIGZhaWxlZCc7CiAgICAgICAgJEVycm9yID1+IHMvW1xyXG5dKy8gL2c7CiAgICAgICAgcmV0dXJuIHsgU3VjY2VzcyA9PiAwLCBFcnJvck1lc3NhZ2UgPT4gc3Vic3RyKCAkRXJyb3IsIDAsIDUwMCApIH07CiAgICB9CgogICAgcmV0dXJuIHsgU3VjY2VzcyA9PiAxLCBEYXRhID0+ICRSZXN1bHQgfTsKfQoKc3ViIF9TZWN1cmVFcXVhbCB7CiAgICBteSAoICRTZWxmLCAkRXhwZWN0ZWQsICRBY3R1YWwgKSA9IEBfOwogICAgcmV0dXJuIDAgaWYgbGVuZ3RoKCRFeHBlY3RlZCkgIT0gbGVuZ3RoKCRBY3R1YWwpOwogICAgbXkgJERpZmZlcmVuY2UgPSAwOwogICAgZm9yIG15ICRJbmRleCAoIDAgLi4gbGVuZ3RoKCRFeHBlY3RlZCkgLSAxICkgewogICAgICAgICREaWZmZXJlbmNlIHw9IG9yZCggc3Vic3RyKCAkRXhwZWN0ZWQsICRJbmRleCwgMSApICkgXiBvcmQoIHN1YnN0ciggJEFjdHVhbCwgJEluZGV4LCAxICkgKTsKICAgIH0KICAgIHJldHVybiAkRGlmZmVyZW5jZSA9PSAwID8gMSA6IDA7Cn0KCjE7Cg==</File>
        <File Location="Kernel/System/ChatRex/Connector.pm" Permission="644" Encode="Base64">cGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q2hhdFJleDo6Q29ubmVjdG9yOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERpZ2VzdDo6U0hBIHF3KGhtYWNfc2hhMjU2X2hleCBzaGEyNTZfaGV4KTsKdXNlIEhUVFA6OlJlcXVlc3Q7CnVzZSBKU09OOjpYUyAoKTsKdXNlIExXUDo6VXNlckFnZW50OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkpTT04nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGJsZXNzIHt9LCAkVHlwZTsKfQoKc3ViIENhcGFiaWxpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2VuZXJpY0ludGVyZmFjZSBzZXJpYWxpemVzIHBsYWluIFBlcmwgMS8wIHZhbHVlcyBhcyBKU09OIG51bWJlcnMuICBUaGUKICAgICMgQ2hhdFJleCBjYXBhYmlsaXR5IGNvbnRyYWN0IGRlbGliZXJhdGVseSByZXF1aXJlcyBKU09OIGJvb2xlYW5zIHNvIHRoYXQKICAgICMgYSBjb25uZWN0b3IgY2Fubm90IGFjY2lkZW50YWxseSBvcHQgaW4gdG8gYSBwcml2aWxlZ2VkIG9wZXJhdGlvbiB3aXRoIGEKICAgICMgbG9vc2VseSB0eXBlZCB2YWx1ZS4KICAgIG15ICRUcnVlID0gSlNPTjo6WFM6OnRydWU7CgogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkSW5zdGFsbGF0aW9uSUQgPSAkQ29uZmlnLT5HZXQoJ0NoYXRSZXhDb25uZWN0b3I6Okluc3RhbGxhdGlvbklEJykKICAgICAgICB8fCAkQ29uZmlnLT5HZXQoJ0ZRRE4nKQogICAgICAgIHx8ICRDb25maWctPkdldCgnU3lzdGVtSUQnKQogICAgICAgIHx8ICdvdHJzJzsKCiAgICByZXR1cm4gewogICAgICAgIGNvbnRyYWN0X3ZlcnNpb24gPT4gMSwKICAgICAgICBpbnN0YWxsYXRpb24gICAgID0+IHsKICAgICAgICAgICAgaWQgICAgICAgICAgICAgID0+ICIkSW5zdGFsbGF0aW9uSUQiLAogICAgICAgICAgICBwcm9kdWN0ICAgICAgICAgPT4gJENvbmZpZy0+R2V0KCdQcm9kdWN0JykgfHwgJ09UUlMgQ29tbXVuaXR5IEVkaXRpb24nLAogICAgICAgICAgICB2ZXJzaW9uICAgICAgICAgPT4gJENvbmZpZy0+R2V0KCdWZXJzaW9uJykgfHwgJzYuMCcsCiAgICAgICAgICAgIHBhY2thZ2VfdmVyc2lvbiA9PiAnMS4wLjInLAogICAgICAgIH0sCiAgICAgICAgY2FwYWJpbGl0aWVzID0+IHsKICAgICAgICAgICAgdGlja2V0c19yZWFkICAgICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgdGlja2V0X2V2ZW50c19yZWFkICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgYXJ0aWNsZXNfcmVhZCAgICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgYXJ0aWNsZXNfd3JpdGUgICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgcXVldWVzX3JlYWQgICAgICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgc3RhdGVzX3JlYWQgICAgICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgdGlja2V0X3N0YXRlX3dyaXRlICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgcHJpb3JpdHlfd3JpdGUgICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgYXNzaWdubWVudF93cml0ZSAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgc2VydmljZXNfcmVhZCAgICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgYXJ0aWNsZV9zZW5kZXJfdHlwZV9yZWFkICA9PiAkVHJ1ZSwKICAgICAgICAgICAgaW50ZXJuYWxfbm90ZXNfd3JpdGUgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgcHJpb3JpdGllc19yZWFkICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgYWdlbnRzX3JlYWQgICAgICAgICAgICAgICA9PiAkVHJ1ZSwKICAgICAgICAgICAgY29uZGl0aW9uX3NjaGVtYV9yZWFkICAgICA9PiAkVHJ1ZSwKICAgICAgICB9LAogICAgfTsKfQoKc3ViIERpcmVjdG9yeSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUeXBlID0gJFBhcmFte0RpcmVjdG9yeX0gfHwgJyc7CiAgICBteSBARGF0YTsKCiAgICBpZiAoICRUeXBlIGVxICdxdWV1ZXMnICkgewogICAgICAgIG15ICVJdGVtcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRBbGxRdWV1ZXMoKTsKICAgICAgICBARGF0YSA9IG1hcCB7ICt7IGlkID0+ICIkXyIsIG5hbWUgPT4gJEl0ZW1zeyRffSB9IH0gc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJUl0ZW1zOwogICAgfQogICAgZWxzaWYgKCAkVHlwZSBlcSAnc2VydmljZXMnICkgewogICAgICAgIG15ICVJdGVtcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBARGF0YSA9IG1hcCB7ICt7IGlkID0+ICIkXyIsIG5hbWUgPT4gJEl0ZW1zeyRffSB9IH0gc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJUl0ZW1zOwogICAgfQogICAgZWxzaWYgKCAkVHlwZSBlcSAnc3RhdGVzJyApIHsKICAgICAgICBteSAlSXRlbXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBARGF0YSA9IG1hcCB7ICt7IGlkID0+ICIkXyIsIG5hbWUgPT4gJEl0ZW1zeyRffSB9IH0gc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJUl0ZW1zOwogICAgfQogICAgZWxzaWYgKCAkVHlwZSBlcSAncHJpb3JpdGllcycgKSB7CiAgICAgICAgbXkgJUl0ZW1zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCggVmFsaWQgPT4gMSApOwogICAgICAgIEBEYXRhID0gbWFwIHsgK3sgaWQgPT4gIiRfIiwgbmFtZSA9PiAkSXRlbXN7JF99IH0gfSBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAlSXRlbXM7CiAgICB9CiAgICBlbHNpZiAoICRUeXBlIGVxICdhZ2VudHMnICkgewogICAgICAgIG15ICVJdGVtcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnU2hvcnQnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgQERhdGEgPSBtYXAgeyAreyBpZCA9PiAiJF8iLCBuYW1lID0+ICRJdGVtc3skX30gfSB9IHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICVJdGVtczsKICAgIH0KICAgIGVsc2lmICggJFR5cGUgZXEgJ2NvbmRpdGlvbi1zY2hlbWEnICkgewogICAgICAgIEBEYXRhID0gKAogICAgICAgICAgICB7IGtleSA9PiAndGlja2V0LnF1ZXVlX2lkJywgdHlwZSA9PiAnZGlyZWN0b3J5JywgZGlyZWN0b3J5ID0+ICdxdWV1ZXMnIH0sCiAgICAgICAgICAgIHsga2V5ID0+ICd0aWNrZXQuc2VydmljZV9pZCcsIHR5cGUgPT4gJ2RpcmVjdG9yeScsIGRpcmVjdG9yeSA9PiAnc2VydmljZXMnIH0sCiAgICAgICAgICAgIHsga2V5ID0+ICd0aWNrZXQuc3RhdGVfaWQnLCB0eXBlID0+ICdkaXJlY3RvcnknLCBkaXJlY3RvcnkgPT4gJ3N0YXRlcycgfSwKICAgICAgICAgICAgeyBrZXkgPT4gJ3RpY2tldC5wcmlvcml0eV9pZCcsIHR5cGUgPT4gJ2RpcmVjdG9yeScsIGRpcmVjdG9yeSA9PiAncHJpb3JpdGllcycgfSwKICAgICAgICAgICAgeyBrZXkgPT4gJ3RpY2tldC5hZ2VudF9pZCcsIHR5cGUgPT4gJ2RpcmVjdG9yeScsIGRpcmVjdG9yeSA9PiAnYWdlbnRzJyB9LAogICAgICAgICAgICB7IGtleSA9PiAnYXJ0aWNsZS5jaGFubmVsJywgdHlwZSA9PiAnc3RyaW5nJyB9LAogICAgICAgICAgICB7IGtleSA9PiAnYXJ0aWNsZS5zZW5kZXJfdHlwZScsIHR5cGUgPT4gJ3N0cmluZycgfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZGllICJVbnN1cHBvcnRlZCBkaXJlY3RvcnkgJyRUeXBlJyI7CiAgICB9CgogICAgcmV0dXJuIHsgZGF0YSA9PiBcQERhdGEgfTsKfQoKc3ViIFRpY2tldEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRJRCA9ICRTZWxmLT5fTnVtZXJpY0lEKCAkUGFyYW17VGlja2V0SUR9LCAnVGlja2V0SUQnICk7CiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPl9TeXN0ZW1Vc2VySUQoKSwKICAgICk7CiAgICBkaWUgIlRpY2tldCAkVGlja2V0SUQgd2FzIG5vdCBmb3VuZCIgaWYgISVUaWNrZXQ7CgogICAgbXkgJEN1c3RvbWVyTmFtZSA9ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9IHx8ICRUaWNrZXR7Q3VzdG9tZXJJRH0gfHwgJyc7CiAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgIG15ICVDdXN0b21lciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwogICAgICAgICRDdXN0b21lck5hbWUgPSAkQ3VzdG9tZXJ7VXNlckZ1bGxuYW1lfQogICAgICAgICAgICB8fCBqb2luKCAnICcsIGdyZXAgeyRffSBAQ3VzdG9tZXJ7cXcoVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpfSApCiAgICAgICAgICAgIHx8ICRDdXN0b21lck5hbWU7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICB0aWNrZXQgPT4gewogICAgICAgICAgICBpZCAgICAgICAgICAgICAgICAgPT4gIiRUaWNrZXRJRCIsCiAgICAgICAgICAgIHRpY2tldF9pZCAgICAgICAgICA9PiAiJFRpY2tldElEIiwKICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgID0+ICIkVGlja2V0e1RpY2tldE51bWJlcn0iLAogICAgICAgICAgICB0aXRsZSAgICAgICAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0gfHwgJycsCiAgICAgICAgICAgIHF1ZXVlX2lkICAgICAgICAgICA9PiAiJFRpY2tldHtRdWV1ZUlEfSIsCiAgICAgICAgICAgIHF1ZXVlICAgICAgICAgICAgICA9PiAkVGlja2V0e1F1ZXVlfSB8fCAnJywKICAgICAgICAgICAgc2VydmljZV9pZCAgICAgICAgID0+IGRlZmluZWQgJFRpY2tldHtTZXJ2aWNlSUR9ID8gIiRUaWNrZXR7U2VydmljZUlEfSIgOiB1bmRlZiwKICAgICAgICAgICAgc2VydmljZSAgICAgICAgICAgID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJycsCiAgICAgICAgICAgIHN0YXRlX2lkICAgICAgICAgICA9PiAiJFRpY2tldHtTdGF0ZUlEfSIsCiAgICAgICAgICAgIHN0YXRlICAgICAgICAgICAgICA9PiAkVGlja2V0e1N0YXRlfSB8fCAnJywKICAgICAgICAgICAgc3RhdGVfdHlwZSAgICAgICAgID0+ICRUaWNrZXR7U3RhdGVUeXBlfSB8fCAnJywKICAgICAgICAgICAgcHJpb3JpdHlfaWQgICAgICAgID0+ICIkVGlja2V0e1ByaW9yaXR5SUR9IiwKICAgICAgICAgICAgcHJpb3JpdHkgICAgICAgICAgID0+ICRUaWNrZXR7UHJpb3JpdHl9IHx8ICcnLAogICAgICAgICAgICBhZ2VudF9pZCAgICAgICAgICAgPT4gIiRUaWNrZXR7T3duZXJJRH0iLAogICAgICAgICAgICBhZ2VudCAgICAgICAgICAgICAgPT4gJFRpY2tldHtPd25lcn0gfHwgJycsCiAgICAgICAgICAgIGN1c3RvbWVyX2lkICAgICAgICA9PiAkVGlja2V0e0N1c3RvbWVySUR9IHx8ICcnLAogICAgICAgICAgICBjdXN0b21lcl91c2VyX2lkICAgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0gfHwgJycsCiAgICAgICAgICAgIGN1c3RvbWVyX25hbWUgICAgICA9PiAkQ3VzdG9tZXJOYW1lLAogICAgICAgICAgICBjdXN0b21lcl91c2VyX25hbWUgPT4gJEN1c3RvbWVyTmFtZSwKICAgICAgICAgICAgY3JlYXRlZF9hdCAgICAgICAgID0+ICRUaWNrZXR7Q3JlYXRlZH0gfHwgJycsCiAgICAgICAgICAgIHVwZGF0ZWRfYXQgICAgICAgICA9PiAkVGlja2V0e0NoYW5nZWR9IHx8ICcnLAogICAgICAgIH0sCiAgICB9Owp9CgpzdWIgQXJ0aWNsZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGlja2V0SUQgPSAkU2VsZi0+X051bWVyaWNJRCggJFBhcmFte1RpY2tldElEfSwgJ1RpY2tldElEJyApOwogICAgbXkgJExpbWl0ID0gaW50KCAkUGFyYW17bGltaXR9IHx8IDUwICk7CiAgICAkTGltaXQgPSAxIGlmICRMaW1pdCA8IDE7CiAgICAkTGltaXQgPSAxMDAgaWYgJExpbWl0ID4gMTAwOwoKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgQE1ldGEgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwogICAgQE1ldGEgPSBzcGxpY2UoIEBNZXRhLCAtJExpbWl0ICkgaWYgQE1ldGEgPiAkTGltaXQ7CgogICAgbXkgQEFydGljbGVzOwogICAgZm9yIG15ICRNZXRhIChATWV0YSkgewogICAgICAgIG15ICVBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRNZXRhfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAleyRNZXRhfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICBSZWFsTmFtZXMgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBuZXh0IGlmICElQXJ0aWNsZTsKCiAgICAgICAgbXkgJFNlbmRlclR5cGUgPSAkQXJ0aWNsZXtTZW5kZXJUeXBlfSB8fCAnJzsKICAgICAgICBpZiAoICEkU2VuZGVyVHlwZSAmJiAkTWV0YS0+e1NlbmRlclR5cGVJRH0gKSB7CiAgICAgICAgICAgICRTZW5kZXJUeXBlID0gJEFydGljbGVPYmplY3QtPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZUlEID0+ICRNZXRhLT57U2VuZGVyVHlwZUlEfSwKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgbXkgJEV4dGVybmFsSUQgPSAkU2VsZi0+X1JlY2VpcHRLZXlGb3JSZXNvdXJjZSgKICAgICAgICAgICAgT3BlcmF0aW9uICA9PiAnQXJ0aWNsZUNyZWF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBSZXNvdXJjZUlEID0+ICRNZXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBBcnRpY2xlcywgewogICAgICAgICAgICBpZCAgICAgICAgICAgICAgICAgICA9PiAiJE1ldGEtPntBcnRpY2xlSUR9IiwKICAgICAgICAgICAgYXJ0aWNsZV9pZCAgICAgICAgICAgPT4gIiRNZXRhLT57QXJ0aWNsZUlEfSIsCiAgICAgICAgICAgIHRpY2tldF9pZCAgICAgICAgICAgID0+ICIkVGlja2V0SUQiLAogICAgICAgICAgICBzZW5kZXJfdHlwZSAgICAgICAgICA9PiBsYyAkU2VuZGVyVHlwZSwKICAgICAgICAgICAgdmlzaWJpbGl0eSAgICAgICAgICAgPT4gJE1ldGEtPntJc1Zpc2libGVGb3JDdXN0b21lcn0gPyAncHVibGljJyA6ICdpbnRlcm5hbCcsCiAgICAgICAgICAgIGlzX2ludGVybmFsICAgICAgICAgID0+ICRNZXRhLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID8gMCA6IDEsCiAgICAgICAgICAgIGNoYXRyZXhfb3JpZ2luICAgICAgID0+ICRFeHRlcm5hbElEID8gMSA6IDAsCiAgICAgICAgICAgIGV4dGVybmFsX2lkICAgICAgICAgID0+ICRFeHRlcm5hbElEIHx8IHVuZGVmLAogICAgICAgICAgICBjaGFubmVsICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXtDb21tdW5pY2F0aW9uQ2hhbm5lbH0gfHwgJEFydGljbGV7Q2hhbm5lbE5hbWV9IHx8ICcnLAogICAgICAgICAgICBzdWJqZWN0ICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgYm9keSAgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7Qm9keX0gfHwgJycsCiAgICAgICAgICAgIGNvbnRlbnQgICAgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9IHx8ICcnLAogICAgICAgICAgICBjcmVhdGVkX2F0ICAgICAgICAgICA9PiAkTWV0YS0+e0NyZWF0ZVRpbWV9IHx8ICRBcnRpY2xle0NyZWF0ZVRpbWV9IHx8ICcnLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIHsgYXJ0aWNsZXMgPT4gXEBBcnRpY2xlcyB9Owp9CgpzdWIgQXJ0aWNsZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRJRCA9ICRTZWxmLT5fTnVtZXJpY0lEKCAkUGFyYW17VGlja2V0SUR9LCAnVGlja2V0SUQnICk7CiAgICBteSAkQXJ0aWNsZSA9IHJlZiAkUGFyYW17YXJ0aWNsZX0gZXEgJ0hBU0gnID8gJFBhcmFte2FydGljbGV9IDoge307CiAgICBteSAkQm9keSA9IGRlZmluZWQgJEFydGljbGUtPntib2R5fSA/ICIkQXJ0aWNsZS0+e2JvZHl9IiA6ICcnOwogICAgJEJvZHkgPX4gcy9eXHMrfFxzKyQvL2c7CiAgICBkaWUgJ0FydGljbGUgYm9keSBpcyByZXF1aXJlZCcgaWYgJEJvZHkgZXEgJycgfHwgbGVuZ3RoICRCb2R5ID4gNTBfMDAwOwoKICAgIG15ICRWaXNpYmlsaXR5ID0gJEFydGljbGUtPnt2aXNpYmlsaXR5fSB8fCAnaW50ZXJuYWwnOwogICAgZGllICdBcnRpY2xlIHZpc2liaWxpdHkgbXVzdCBiZSBwdWJsaWMgb3IgaW50ZXJuYWwnCiAgICAgICAgaWYgJFZpc2liaWxpdHkgbmUgJ3B1YmxpYycgJiYgJFZpc2liaWxpdHkgbmUgJ2ludGVybmFsJzsKCiAgICBteSAkSWRlbXBvdGVuY3lLZXkgPSAkU2VsZi0+X0lkZW1wb3RlbmN5S2V5KCk7CiAgICBpZiAoJElkZW1wb3RlbmN5S2V5KSB7CiAgICAgICAgbXkgJFN0b3JlZCA9ICRTZWxmLT5fUmVjZWlwdEdldCgkSWRlbXBvdGVuY3lLZXkpOwogICAgICAgIHJldHVybiAkU3RvcmVkIGlmICRTdG9yZWQ7CiAgICB9CgogICAgbXkgJEFydGljbGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKQogICAgICAgIC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdJbnRlcm5hbCcgKQogICAgICAgIC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkVmlzaWJpbGl0eSBlcSAncHVibGljJyA/IDEgOiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+X1N5c3RlbVVzZXJJRCgpLAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAnQ2hhdFJleCcsCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnQ2hhdFJleCcsCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRCb2R5LAogICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcsCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdBZGROb3RlJywKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gJ0NoYXRSZXggY29ubmVjdG9yIGFydGljbGUnLAogICAgICAgICk7CiAgICBkaWUgJ0NvdWxkIG5vdCBjcmVhdGUgYXJ0aWNsZScgaWYgISRBcnRpY2xlSUQ7CgogICAgbXkgJFJlc3VsdCA9IHsKICAgICAgICBzdWNjZXNzICAgICAgPT4gMSwKICAgICAgICB0aWNrZXRfaWQgICAgPT4gIiRUaWNrZXRJRCIsCiAgICAgICAgYXJ0aWNsZV9pZCAgID0+ICIkQXJ0aWNsZUlEIiwKICAgICAgICBpZCAgICAgICAgICAgID0+ICIkQXJ0aWNsZUlEIiwKICAgICAgICB2aXNpYmlsaXR5ICAgPT4gJFZpc2liaWxpdHksCiAgICAgICAgZXh0ZXJuYWxfaWQgID0+ICRJZGVtcG90ZW5jeUtleSB8fCB1bmRlZiwKICAgIH07CiAgICAkU2VsZi0+X1JlY2VpcHRTdG9yZSgKICAgICAgICBJZGVtcG90ZW5jeUtleSA9PiAkSWRlbXBvdGVuY3lLZXksCiAgICAgICAgT3BlcmF0aW9uICAgICAgPT4gJ0FydGljbGVDcmVhdGUnLAogICAgICAgIFRpY2tldElEICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBSZXNvdXJjZUlEICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgIFJlc3VsdCAgICAgICAgID0+ICRSZXN1bHQsCiAgICApIGlmICRJZGVtcG90ZW5jeUtleTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKc3ViIFRpY2tldFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRJRCA9ICRTZWxmLT5fTnVtZXJpY0lEKCAkUGFyYW17VGlja2V0SUR9LCAnVGlja2V0SUQnICk7CiAgICBteSAkVGlja2V0ID0gcmVmICRQYXJhbXt0aWNrZXR9IGVxICdIQVNIJyA/ICRQYXJhbXt0aWNrZXR9IDoge307CiAgICBkaWUgJ1RpY2tldCB1cGRhdGUgaXMgZW1wdHknIGlmICFrZXlzICV7JFRpY2tldH07CgogICAgbXkgJElkZW1wb3RlbmN5S2V5ID0gJFNlbGYtPl9JZGVtcG90ZW5jeUtleSgpOwogICAgaWYgKCRJZGVtcG90ZW5jeUtleSkgewogICAgICAgIG15ICRTdG9yZWQgPSAkU2VsZi0+X1JlY2VpcHRHZXQoJElkZW1wb3RlbmN5S2V5KTsKICAgICAgICByZXR1cm4gJFN0b3JlZCBpZiAkU3RvcmVkOwogICAgfQoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAlQ29tbW9uID0gKAogICAgICAgIFRpY2tldElEICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+X1N5c3RlbVVzZXJJRCgpLAogICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAwLAogICAgKTsKICAgIGlmICggZGVmaW5lZCAkVGlja2V0LT57cXVldWVfaWR9ICkgewogICAgICAgIG15ICRJRCA9ICRTZWxmLT5fTnVtZXJpY0lEKCAkVGlja2V0LT57cXVldWVfaWR9LCAncXVldWVfaWQnICk7CiAgICAgICAgZGllICdDb3VsZCBub3QgdXBkYXRlIHRpY2tldCBxdWV1ZScgaWYgISRUaWNrZXRPYmplY3QtPlRpY2tldFF1ZXVlU2V0KCAlQ29tbW9uLCBRdWV1ZUlEID0+ICRJRCApOwogICAgfQogICAgaWYgKCBkZWZpbmVkICRUaWNrZXQtPnthZ2VudF9pZH0gKSB7CiAgICAgICAgbXkgJElEID0gJFNlbGYtPl9OdW1lcmljSUQoICRUaWNrZXQtPnthZ2VudF9pZH0sICdhZ2VudF9pZCcgKTsKICAgICAgICBkaWUgJ0NvdWxkIG5vdCB1cGRhdGUgdGlja2V0IG93bmVyJyBpZiAhJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoICVDb21tb24sIE5ld1VzZXJJRCA9PiAkSUQgKTsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkVGlja2V0LT57c3RhdGVfaWR9ICkgewogICAgICAgIG15ICRJRCA9ICRTZWxmLT5fTnVtZXJpY0lEKCAkVGlja2V0LT57c3RhdGVfaWR9LCAnc3RhdGVfaWQnICk7CiAgICAgICAgZGllICdDb3VsZCBub3QgdXBkYXRlIHRpY2tldCBzdGF0ZScgaWYgISRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlU2V0KCAlQ29tbW9uLCBTdGF0ZUlEID0+ICRJRCApOwogICAgfQogICAgaWYgKCBkZWZpbmVkICRUaWNrZXQtPntwcmlvcml0eV9pZH0gKSB7CiAgICAgICAgbXkgJElEID0gJFNlbGYtPl9OdW1lcmljSUQoICRUaWNrZXQtPntwcmlvcml0eV9pZH0sICdwcmlvcml0eV9pZCcgKTsKICAgICAgICBkaWUgJ0NvdWxkIG5vdCB1cGRhdGUgdGlja2V0IHByaW9yaXR5JyBpZiAhJFRpY2tldE9iamVjdC0+VGlja2V0UHJpb3JpdHlTZXQoICVDb21tb24sIFByaW9yaXR5SUQgPT4gJElEICk7CiAgICB9CgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwogICAgJFJlc3VsdC0+e3N1Y2Nlc3N9ID0gMTsKICAgICRTZWxmLT5fUmVjZWlwdFN0b3JlKAogICAgICAgIElkZW1wb3RlbmN5S2V5ID0+ICRJZGVtcG90ZW5jeUtleSwKICAgICAgICBPcGVyYXRpb24gICAgICA9PiAnVGlja2V0VXBkYXRlJywKICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgUmVzb3VyY2VJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgIFJlc3VsdCAgICAgICAgID0+ICRSZXN1bHQsCiAgICApIGlmICRJZGVtcG90ZW5jeUtleTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKc3ViIEVucXVldWVXZWJob29rIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldElEID0gJFNlbGYtPl9OdW1lcmljSUQoICRQYXJhbXtUaWNrZXRJRH0sICdUaWNrZXRJRCcgKTsKICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+X051bWVyaWNJRCggJFBhcmFte0FydGljbGVJRH0sICdBcnRpY2xlSUQnICk7CiAgICBteSAkRXZlbnRJRCA9ICdvdHJzLScgLiBzaGEyNTZfaGV4KCAiJFRpY2tldElEfCRBcnRpY2xlSUQiICk7CiAgICBteSAkUGF5bG9hZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkVuY29kZSgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgZXZlbnRfaWQgICA9PiAkRXZlbnRJRCwKICAgICAgICAgICAgZXZlbnRfdHlwZSA9PiAndGlja2V0LmFydGljbGUuY3JlYXRlZCcsCiAgICAgICAgICAgIHRpY2tldF9pZCAgPT4gIiRUaWNrZXRJRCIsCiAgICAgICAgICAgIGFydGljbGVfaWQgPT4gIiRBcnRpY2xlSUQiLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICREQiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgcmV0dXJuIDEgaWYgJERCLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGF0cmV4X3dlYmhvb2tfb3V0Ym94IFdIRVJFIGV2ZW50X2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJEV2ZW50SUQgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKSAmJiAkREItPkZldGNocm93QXJyYXkoKTsKCiAgICBteSAkTm93ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CiAgICByZXR1cm4gJERCLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYXRyZXhfd2ViaG9va19vdXRib3ggJwogICAgICAgICAgICAuICcoZXZlbnRfaWQsIHRpY2tldF9pZCwgYXJ0aWNsZV9pZCwgcGF5bG9hZF9qc29uLCBhdHRlbXB0cywgbmV4dF9hdHRlbXB0X2F0LCBjcmVhdGVfdGltZSwgY2hhbmdlX3RpbWUpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCAwLCA/LCA/LCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkRXZlbnRJRCwgXCRUaWNrZXRJRCwgXCRBcnRpY2xlSUQsIFwkUGF5bG9hZCwgXCROb3csIFwkTm93LCBcJE5vdyBdLAogICAgKTsKfQoKc3ViIERlbGl2ZXJQZW5kaW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICByZXR1cm4geyBkZWxpdmVyZWQgPT4gMCwgZmFpbGVkID0+IDAsIHBlbmRpbmcgPT4gMCB9CiAgICAgICAgaWYgISRDb25maWctPkdldCgnQ2hhdFJleENvbm5lY3Rvcjo6RW5hYmxlZCcpOwogICAgbXkgJFVSTCA9ICRDb25maWctPkdldCgnQ2hhdFJleENvbm5lY3Rvcjo6V2ViaG9va1VSTCcpIHx8ICcnOwogICAgbXkgJFNlY3JldCA9ICRDb25maWctPkdldCgnQ2hhdFJleENvbm5lY3Rvcjo6V2ViaG9va1NlY3JldCcpIHx8ICcnOwogICAgcmV0dXJuIHsgZGVsaXZlcmVkID0+IDAsIGZhaWxlZCA9PiAwLCBwZW5kaW5nID0+IDAgfQogICAgICAgIGlmICRVUkwgIX4gbXtcQWh0dHBzOi8vfWkgfHwgJFNlY3JldCBlcSAnJzsKCiAgICBteSAkTWF4ID0gaW50KCAkUGFyYW17TWF4fSB8fCA1MCApOwogICAgJE1heCA9IDEgaWYgJE1heCA8IDE7CiAgICAkTWF4ID0gMjAwIGlmICRNYXggPiAyMDA7CgogICAgbXkgJERCID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkTm93ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CiAgICAkREItPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIHBheWxvYWRfanNvbiwgYXR0ZW1wdHMgRlJPTSBjaGF0cmV4X3dlYmhvb2tfb3V0Ym94ICcKICAgICAgICAgICAgLiAnV0hFUkUgZGVsaXZlcmVkX2F0IElTIE5VTEwgQU5EIG5leHRfYXR0ZW1wdF9hdCA8PSA/IE9SREVSIEJZIGlkJywKICAgICAgICBCaW5kICA9PiBbIFwkTm93IF0sCiAgICAgICAgTGltaXQgPT4gJE1heCwKICAgICk7CiAgICBteSBAUm93czsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQi0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFJvd3MsIFxAUm93OwogICAgfQoKICAgIG15ICVSZXN1bHQgPSAoIGRlbGl2ZXJlZCA9PiAwLCBmYWlsZWQgPT4gMCwgcGVuZGluZyA9PiBzY2FsYXIgQFJvd3MgKTsKICAgIGZvciBteSAkUm93IChAUm93cykgewogICAgICAgIG15ICggJElELCAkUGF5bG9hZCwgJEF0dGVtcHRzICkgPSBAeyRSb3d9OwogICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUG9zdFdlYmhvb2soCiAgICAgICAgICAgIFVSTCAgICAgPT4gJFVSTCwKICAgICAgICAgICAgU2VjcmV0ICA9PiAkU2VjcmV0LAogICAgICAgICAgICBQYXlsb2FkID0+ICRQYXlsb2FkLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgbXkgJERlbGl2ZXJlZEF0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICREQi0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdVUERBVEUgY2hhdHJleF93ZWJob29rX291dGJveCBTRVQgZGVsaXZlcmVkX2F0ID0gPywgY2hhbmdlX3RpbWUgPSA/LCBsYXN0X2Vycm9yID0gTlVMTCBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkRGVsaXZlcmVkQXQsIFwkRGVsaXZlcmVkQXQsIFwkSUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFJlc3VsdHtkZWxpdmVyZWR9Kys7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBteSAkTmV4dEF0dGVtcHRzID0gaW50KCRBdHRlbXB0cykgKyAxOwogICAgICAgIG15ICRSZXRyeU1heCA9IGludCggJENvbmZpZy0+R2V0KCdDaGF0UmV4Q29ubmVjdG9yOjpSZXRyeU1heCcpIHx8IDEyICk7CiAgICAgICAgbXkgJERlbGF5ID0gMioqKCAkTmV4dEF0dGVtcHRzID4gMTAgPyAxMCA6ICROZXh0QXR0ZW1wdHMgKTsKICAgICAgICAkRGVsYXkgPSAzNjAwIGlmICREZWxheSA+IDM2MDA7CiAgICAgICAgbXkgJE5leHQgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAkTmV4dC0+QWRkKCBTZWNvbmRzID0+ICREZWxheSApOwogICAgICAgIG15ICROZXh0U3RyaW5nID0gJE5leHQtPlRvU3RyaW5nKCk7CiAgICAgICAgbXkgJEVycm9yID0gc3Vic3RyKCAkUmVzcG9uc2UtPntFcnJvcn0gfHwgJ2RlbGl2ZXJ5X2ZhaWxlZCcsIDAsIDI1MCApOwogICAgICAgIGlmICggJE5leHRBdHRlbXB0cyA+PSAkUmV0cnlNYXggKSB7CiAgICAgICAgICAgICROZXh0U3RyaW5nID0gJzI5OTktMTItMzEgMjM6NTk6NTknOwogICAgICAgIH0KICAgICAgICBteSAkQ2hhbmdlZEF0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CiAgICAgICAgJERCLT5EbygKICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgY2hhdHJleF93ZWJob29rX291dGJveCBTRVQgYXR0ZW1wdHMgPSA/LCBuZXh0X2F0dGVtcHRfYXQgPSA/LCBsYXN0X2Vycm9yID0gPywgY2hhbmdlX3RpbWUgPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJE5leHRBdHRlbXB0cywgXCROZXh0U3RyaW5nLCBcJEVycm9yLCBcJENoYW5nZWRBdCwgXCRJRCBdLAogICAgICAgICk7CiAgICAgICAgJFJlc3VsdHtmYWlsZWR9Kys7CiAgICB9CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9CgpzdWIgX1Bvc3RXZWJob29rIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEluc3RhbGxhdGlvbklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDaGF0UmV4Q29ubmVjdG9yOjpJbnN0YWxsYXRpb25JRCcpCiAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGUUROJykKICAgICAgICB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1N5c3RlbUlEJykKICAgICAgICB8fCAnb3Rycyc7CiAgICBteSAkU2lnbmF0dXJlID0gaG1hY19zaGEyNTZfaGV4KCAkUGFyYW17UGF5bG9hZH0sICRQYXJhbXtTZWNyZXR9ICk7CiAgICBteSAkUmVxdWVzdCA9IEhUVFA6OlJlcXVlc3QtPm5ldyggJ1BPU1QnLCAkUGFyYW17VVJMfSApOwogICAgJFJlcXVlc3QtPmhlYWRlciggJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnICk7CiAgICAkUmVxdWVzdC0+aGVhZGVyKCAnQWNjZXB0JyA9PiAnYXBwbGljYXRpb24vanNvbicgKTsKICAgICRSZXF1ZXN0LT5oZWFkZXIoICdYLUNoYXRSZXgtU2lnbmF0dXJlJyA9PiAnc2hhMjU2PScgLiAkU2lnbmF0dXJlICk7CiAgICAkUmVxdWVzdC0+aGVhZGVyKCAnWC1SYWRpYW50LUluc3RhbGxhdGlvbicgPT4gIiRJbnN0YWxsYXRpb25JRCIgKTsKICAgICRSZXF1ZXN0LT5jb250ZW50KCAkUGFyYW17UGF5bG9hZH0gKTsKCiAgICBteSAkVGltZW91dCA9IGludCggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDaGF0UmV4Q29ubmVjdG9yOjpUaW1lb3V0JykgfHwgMjAgKTsKICAgICRUaW1lb3V0ID0gMiBpZiAkVGltZW91dCA8IDI7CiAgICAkVGltZW91dCA9IDYwIGlmICRUaW1lb3V0ID4gNjA7CiAgICBteSAkVUEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCB0aW1lb3V0ID0+ICRUaW1lb3V0ICk7CiAgICAkVUEtPmFnZW50KCdDaGF0UmV4Q29ubmVjdG9yLzEuMC4yJyk7CiAgICBteSAkUmVzcG9uc2UgPSBldmFsIHsgJFVBLT5yZXF1ZXN0KCRSZXF1ZXN0KSB9OwogICAgcmV0dXJuIHsgU3VjY2VzcyA9PiAwLCBFcnJvciA9PiAicmVxdWVzdF9leGNlcHRpb246JEAiIH0gaWYgISRSZXNwb25zZTsKICAgIHJldHVybiB7IFN1Y2Nlc3MgPT4gMCwgRXJyb3IgPT4gJ2h0dHBfJyAuICRSZXNwb25zZS0+Y29kZSB9IGlmICEkUmVzcG9uc2UtPmlzX3N1Y2Nlc3M7CgogICAgcmV0dXJuIHsgU3VjY2VzcyA9PiAxIH07Cn0KCnN1YiBfU3lzdGVtVXNlcklEIHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICRJRCA9IGludCggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDaGF0UmV4Q29ubmVjdG9yOjpTeXN0ZW1Vc2VySUQnKSB8fCAxICk7CiAgICByZXR1cm4gJElEID4gMCA/ICRJRCA6IDE7Cn0KCnN1YiBfTnVtZXJpY0lEIHsKICAgIG15ICggJFNlbGYsICRWYWx1ZSwgJE5hbWUgKSA9IEBfOwogICAgZGllICIkTmFtZSBpcyBpbnZhbGlkIiBpZiAhZGVmaW5lZCAkVmFsdWUgfHwgIiRWYWx1ZSIgIX4gL1xBWzEtOV1bMC05XXswLDE3fVx6LzsKICAgIHJldHVybiBpbnQoJFZhbHVlKTsKfQoKc3ViIF9JZGVtcG90ZW5jeUtleSB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICBteSAkS2V5ID0gJEVOVntIVFRQX0lERU1QT1RFTkNZX0tFWX0gfHwgJyc7CiAgICAkS2V5ID1+IHMvXlxzK3xccyskLy9nOwogICAgZGllICdJZGVtcG90ZW5jeS1LZXkgaXMgaW52YWxpZCcgaWYgJEtleSBuZSAnJyAmJiAoIGxlbmd0aCgkS2V5KSA+IDIwMCB8fCAkS2V5ICF+IC9cQVtBLVphLXowLTkuXzotXStcei8gKTsKICAgIHJldHVybiAkS2V5Owp9CgpzdWIgX1JlY2VpcHRHZXQgewogICAgbXkgKCAkU2VsZiwgJEtleSApID0gQF87CiAgICBteSAkREIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIHJldHVybiBpZiAhJERCLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgcmVzdWx0X2pzb24gRlJPTSBjaGF0cmV4X29wZXJhdGlvbl9yZWNlaXB0IFdIRVJFIGlkZW1wb3RlbmN5X2tleSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRLZXkgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIG15ICgkSlNPTikgPSAkREItPkZldGNocm93QXJyYXkoKTsKICAgIHJldHVybiBpZiAhJEpTT047CiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKCBEYXRhID0+ICRKU09OICk7Cn0KCnN1YiBfUmVjZWlwdFN0b3JlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkSlNPTiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkVuY29kZSggRGF0YSA9PiAkUGFyYW17UmVzdWx0fSApOwogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYXRyZXhfb3BlcmF0aW9uX3JlY2VpcHQgJwogICAgICAgICAgICAuICcoaWRlbXBvdGVuY3lfa2V5LCBvcGVyYXRpb24sIHRpY2tldF9pZCwgcmVzb3VyY2VfaWQsIHJlc3VsdF9qc29uLCBjcmVhdGVfdGltZSkgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0lkZW1wb3RlbmN5S2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtPcGVyYXRpb259LAogICAgICAgICAgICBcJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgXCRQYXJhbXtSZXNvdXJjZUlEfSwKICAgICAgICAgICAgXCRKU09OLAogICAgICAgIF0sCiAgICApOwp9CgpzdWIgX1JlY2VpcHRLZXlGb3JSZXNvdXJjZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERCID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICByZXR1cm4gaWYgISREQi0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZGVtcG90ZW5jeV9rZXkgRlJPTSBjaGF0cmV4X29wZXJhdGlvbl9yZWNlaXB0IFdIRVJFIG9wZXJhdGlvbiA9ID8gQU5EIHRpY2tldF9pZCA9ID8gQU5EIHJlc291cmNlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17T3BlcmF0aW9ufSwgXCRQYXJhbXtUaWNrZXRJRH0sIFwkUGFyYW17UmVzb3VyY2VJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIG15ICgkS2V5KSA9ICREQi0+RmV0Y2hyb3dBcnJheSgpOwogICAgcmV0dXJuICRLZXk7Cn0KCjE7Cg==</File>
        <File Location="Kernel/System/Console/Command/Maint/ChatRex/WebhookRetry.pm" Permission="644" Encode="Base64">cGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OkNoYXRSZXg6OldlYmhvb2tSZXRyeTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGF0UmV4OjpDb25uZWN0b3InLAopOwoKc3ViIENvbmZpZ3VyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdSZXRyeSBxdWV1ZWQgQ2hhdFJleCB3ZWJob29rIGRlbGl2ZXJpZXMuJyk7CiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdFJleDo6Q29ubmVjdG9yJyktPkRlbGl2ZXJQZW5kaW5nKCBNYXggPT4gMjAwICk7CiAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgIjxncmVlbj5EZWxpdmVyZWQgJFJlc3VsdC0+e2RlbGl2ZXJlZH07IGZhaWxlZCAkUmVzdWx0LT57ZmFpbGVkfTsgZHVlICRSZXN1bHQtPntwZW5kaW5nfS48L2dyZWVuPlxuIgogICAgKTsKICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVPaygpOwp9CgoxOwo=</File>
        <File Location="Kernel/System/Ticket/Event/ChatRexWebhook.pm" Permission="644" Encode="Base64">cGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6Q2hhdFJleFdlYmhvb2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNoYXRSZXg6OkNvbm5lY3RvcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CiAgICByZXR1cm4gYmxlc3Mge30sICRUeXBlOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDEgaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ2hhdFJleENvbm5lY3Rvcjo6RW5hYmxlZCcpOwogICAgcmV0dXJuIDEgaWYgKCAkUGFyYW17RXZlbnR9IHx8ICcnICkgbmUgJ0FydGljbGVDcmVhdGUnOwogICAgcmV0dXJuIDEgaWYgISRQYXJhbXtEYXRhfS0+e1RpY2tldElEfSB8fCAhJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfTsKCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15IEBNZXRhID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgIFRpY2tldElEICA9PiAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtEYXRhfS0+e0FydGljbGVJRH0sCiAgICApOwogICAgcmV0dXJuIDEgaWYgIUBNZXRhOwogICAgbXkgJFNlbmRlclR5cGUgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZVNlbmRlclR5cGVMb29rdXAoCiAgICAgICAgU2VuZGVyVHlwZUlEID0+ICRNZXRhWzBdLT57U2VuZGVyVHlwZUlEfSwKICAgICkgfHwgJyc7CiAgICByZXR1cm4gMSBpZiBsYygkU2VuZGVyVHlwZSkgbmUgJ2N1c3RvbWVyJzsKICAgIHJldHVybiAxIGlmICEkTWV0YVswXS0+e0lzVmlzaWJsZUZvckN1c3RvbWVyfTsKCiAgICBteSAkQ29ubmVjdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXRSZXg6OkNvbm5lY3RvcicpOwogICAgbXkgJFF1ZXVlZCA9IGV2YWwgewogICAgICAgICRDb25uZWN0b3ItPkVucXVldWVXZWJob29rKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFBhcmFte0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0RhdGF9LT57QXJ0aWNsZUlEfSwKICAgICAgICApOwogICAgfTsKICAgIGlmICggISRRdWV1ZWQgfHwgJEAgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDaGF0UmV4IGNvbm5lY3RvciBjb3VsZCBub3QgZW5xdWV1ZSBBcnRpY2xlQ3JlYXRlIHdlYmhvb2suJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBldmFsIHsgJENvbm5lY3Rvci0+RGVsaXZlclBlbmRpbmcoIE1heCA9PiAxICkgfTsKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="var/packagesetup/ChatRexConnector.pm" Permission="644" Encode="Base64">cGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6Q2hhdFJleENvbm5lY3RvcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKICAgIHJldHVybiBibGVzcyB7fSwgJFR5cGU7Cn0KCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICByZXR1cm4gJFNlbGYtPl9XZWJzZXJ2aWNlVXBzZXJ0KCk7Cn0KCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICByZXR1cm4gJFNlbGYtPl9XZWJzZXJ2aWNlVXBzZXJ0KCk7Cn0KCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpOwogICAgbXkgJExpc3QgPSAkT2JqZWN0LT5XZWJzZXJ2aWNlTGlzdCggVmFsaWQgPT4gMCApIHx8IHt9OwogICAgZm9yIG15ICRJRCAoIGtleXMgJXskTGlzdH0gKSB7CiAgICAgICAgbmV4dCBpZiAkTGlzdC0+eyRJRH0gbmUgJ0NoYXRSZXhDb25uZWN0b3InOwogICAgICAgIHJldHVybiAkT2JqZWN0LT5XZWJzZXJ2aWNlRGVsZXRlKCBJRCA9PiAkSUQsIFVzZXJJRCA9PiAxICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9XZWJzZXJ2aWNlVXBzZXJ0IHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICVPcGVyYXRpb25zID0gKAogICAgICAgIENhcGFiaWxpdGllcyA9PiB7IE1ldGhvZCA9PiBbJ0dFVCddLCAgIFJvdXRlID0+ICcvY2FwYWJpbGl0aWVzJyB9LAogICAgICAgIERpcmVjdG9yeSAgICA9PiB7IE1ldGhvZCA9PiBbJ0dFVCddLCAgIFJvdXRlID0+ICcvZGlyZWN0b3JpZXMvOkRpcmVjdG9yeScgfSwKICAgICAgICBUaWNrZXRHZXQgICAgPT4geyBNZXRob2QgPT4gWydHRVQnXSwgICBSb3V0ZSA9PiAnL3RpY2tldHMvOlRpY2tldElEJyB9LAogICAgICAgIEFydGljbGVMaXN0ICA9PiB7IE1ldGhvZCA9PiBbJ0dFVCddLCAgIFJvdXRlID0+ICcvdGlja2V0cy86VGlja2V0SUQvYXJ0aWNsZXMnIH0sCiAgICAgICAgQXJ0aWNsZUNyZWF0ZSA9PiB7IE1ldGhvZCA9PiBbJ1BPU1QnXSwgUm91dGUgPT4gJy90aWNrZXRzLzpUaWNrZXRJRC9hcnRpY2xlcycgfSwKICAgICAgICBUaWNrZXRVcGRhdGUgPT4geyBNZXRob2QgPT4gWydQQVRDSCddLCBSb3V0ZSA9PiAnL3RpY2tldHMvOlRpY2tldElEJyB9LAogICAgKTsKICAgIG15ICggJVByb3ZpZGVyT3BlcmF0aW9ucywgJVJvdXRlcyApOwogICAgZm9yIG15ICROYW1lICgga2V5cyAlT3BlcmF0aW9ucyApIHsKICAgICAgICAkUHJvdmlkZXJPcGVyYXRpb25zeyROYW1lfSA9IHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICJDaGF0UmV4ICROYW1lIiwKICAgICAgICAgICAgTWFwcGluZ0luYm91bmQgID0+IHt9LAogICAgICAgICAgICBNYXBwaW5nT3V0Ym91bmQgPT4ge30sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAnQ2hhdFJleDo6Q29ubmVjdG9yJywKICAgICAgICB9OwogICAgICAgICRSb3V0ZXN7JE5hbWV9ID0gewogICAgICAgICAgICBSZXF1ZXN0TWV0aG9kID0+ICRPcGVyYXRpb25zeyROYW1lfS0+e01ldGhvZH0sCiAgICAgICAgICAgIFJvdXRlICAgICAgICAgPT4gJE9wZXJhdGlvbnN7JE5hbWV9LT57Um91dGV9LAogICAgICAgIH07CiAgICB9CiAgICBteSAkQ29uZmlnID0gewogICAgICAgIERlYnVnZ2VyID0+IHsgRGVidWdUaHJlc2hvbGQgPT4gJ2Vycm9yJywgVGVzdE1vZGUgPT4gJzAnIH0sCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYXRSZXggY29ubmVjdG9yIGZvciBPVFJTIENvbW11bml0eSBFZGl0aW9uIDYnLAogICAgICAgIEZyYW1ld29ya1ZlcnNpb24gPT4gJzYuMC54JywKICAgICAgICBQcm92aWRlciA9PiB7CiAgICAgICAgICAgIE9wZXJhdGlvbiA9PiBcJVByb3ZpZGVyT3BlcmF0aW9ucywKICAgICAgICAgICAgVHJhbnNwb3J0ID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbEhlYWRlcnMgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgS2VlcEFsaXZlICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCAgICAgICAgICA9PiAnMTAwMDAwMCcsCiAgICAgICAgICAgICAgICAgICAgUm91dGVPcGVyYXRpb25NYXBwaW5nID0+IFwlUm91dGVzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0hUVFA6OlJFU1QnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVtb3RlU3lzdGVtID0+ICdDaGF0UmV4JywKICAgIH07CgogICAgbXkgJE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJyk7CiAgICBteSAkTGlzdCA9ICRPYmplY3QtPldlYnNlcnZpY2VMaXN0KCBWYWxpZCA9PiAwICkgfHwge307CiAgICBmb3IgbXkgJElEICgga2V5cyAleyRMaXN0fSApIHsKICAgICAgICBuZXh0IGlmICRMaXN0LT57JElEfSBuZSAnQ2hhdFJleENvbm5lY3Rvcic7CiAgICAgICAgcmV0dXJuICRPYmplY3QtPldlYnNlcnZpY2VVcGRhdGUoCiAgICAgICAgICAgIElEID0+ICRJRCwgTmFtZSA9PiAnQ2hhdFJleENvbm5lY3RvcicsIENvbmZpZyA9PiAkQ29uZmlnLCBWYWxpZElEID0+IDEsIFVzZXJJRCA9PiAxLAogICAgICAgICkgfHwgMTsKICAgIH0KICAgIHJldHVybiAkT2JqZWN0LT5XZWJzZXJ2aWNlQWRkKAogICAgICAgIE5hbWUgPT4gJ0NoYXRSZXhDb25uZWN0b3InLCBDb25maWcgPT4gJENvbmZpZywgVmFsaWRJRCA9PiAxLCBVc2VySUQgPT4gMSwKICAgICk7Cn0KCjE7Cg==</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableCreate Type="post" Name="chatrex_operation_receipt">
            <Column AutoIncrement="true" Name="id" PrimaryKey="true" Required="true" Type="BIGINT"></Column>
            <Column Name="idempotency_key" Required="true" Size="200" Type="VARCHAR"></Column>
            <Column Name="operation" Required="true" Size="60" Type="VARCHAR"></Column>
            <Column Name="ticket_id" Required="true" Type="BIGINT"></Column>
            <Column Name="resource_id" Required="true" Type="BIGINT"></Column>
            <Column Name="result_json" Required="true" Type="LONGBLOB"></Column>
            <Column Name="create_time" Required="true" Type="DATE"></Column>
            <Unique Name="chatrex_receipt_key">
                                <UniqueColumn Name="idempotency_key"></UniqueColumn>
</Unique>
            <Index Name="chatrex_receipt_resource">
                <IndexColumn Name="operation">
                </IndexColumn>
                <IndexColumn Name="ticket_id">
                </IndexColumn>
                <IndexColumn Name="resource_id">
                </IndexColumn>
            </Index>
        </TableCreate>
        <TableCreate Type="post" Name="chatrex_webhook_outbox">
            <Column AutoIncrement="true" Name="id" PrimaryKey="true" Required="true" Type="BIGINT"></Column>
            <Column Name="event_id" Required="true" Size="80" Type="VARCHAR"></Column>
            <Column Name="ticket_id" Required="true" Type="BIGINT"></Column>
            <Column Name="article_id" Required="true" Type="BIGINT"></Column>
            <Column Name="payload_json" Required="true" Type="LONGBLOB"></Column>
            <Column Default="0" Name="attempts" Required="true" Type="INTEGER"></Column>
            <Column Name="next_attempt_at" Required="true" Type="DATE"></Column>
            <Column Name="delivered_at" Required="false" Type="DATE"></Column>
            <Column Name="last_error" Required="false" Size="250" Type="VARCHAR"></Column>
            <Column Name="create_time" Required="true" Type="DATE"></Column>
            <Column Name="change_time" Required="true" Type="DATE"></Column>
            <Unique Name="chatrex_outbox_event">
                                <UniqueColumn Name="event_id"></UniqueColumn>
</Unique>
            <Index Name="chatrex_outbox_due">
                <IndexColumn Name="delivered_at">
                </IndexColumn>
                <IndexColumn Name="next_attempt_at">
                </IndexColumn>
            </Index>
        </TableCreate>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableDrop Type="pre" Name="chatrex_webhook_outbox">
        </TableDrop>
        <TableDrop Type="pre" Name="chatrex_operation_receipt">
        </TableDrop>
    </DatabaseUninstall>
</otrs_package>