<?xml version="1.0" encoding="utf-8"?>
<otrs_package version="1.0">
    <Name>ExoOooSync</Name>
    <Version>6.5.0</Version>
    <Framework>6.5.x</Framework>
    <Vendor>wolkig.it - Stephan Lang</Vendor>
    <URL>https://wolkig.it</URL>
    <License>GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007</License>
    <Description Lang="en">Synchronizes Out-of-Office status from Microsoft Exchange Online (via Graph API) to Znuny agent preferences.</Description>
    <Description Lang="de">Synchronisiert den Abwesenheitsstatus vom Microsoft Exchange Online (via Graph API) in die Znuny-Agenten-Einstellungen.</Description>

    <ChangeLog Version="6.5.0" Date="2026-09-20">Initial release for Znuny 6.5.x, ported from the 7.2.x line: Exchange Online OOO sync via Graph API, three user mapping modes (SAM/UPN/PrimarySMTP), scheduled cron tasks, detailed change logging. Adds a dedicated notification module (ExoOooSyncCheck) that replaces the native Out-of-Office banner with sync-aware text when enabled, and disables local OOO preference editing to prevent agents from fighting the next scheduled sync.</ChangeLog>
    <ChangeLog Version="7.2.0" Date="2026-03-23">Initial release: Exchange Online OOO sync via Graph API, three user mapping modes (SAM/UPN/PrimarySMTP), scheduled cron tasks, detailed change logging.</ChangeLog>

    <Filelist>
        <File Permission="660" Location="Kernel/Config/Files/XML/ExoOooSync.xml" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KCiAgICA8IS0tIEZlYXR1cmUgVG9nZ2xlIC0tPgogICAgPFNldHRpbmcgTmFtZT0iRXhvT29vU3luYzo6RW5hYmxlZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVzIG9yIGRpc2FibGVzIHRoZSBFeGNoYW5nZSBPbmxpbmUgT3V0LW9mLU9mZmljZSBzeW5jaHJvbml6YXRpb24uIE5vdGU6IGRpc2FibGluZyB0aGlzIGRvZXMgTk9UIGF1dG9tYXRpY2FsbHkgcmVzdG9yZSBhZ2VudHMnIGFiaWxpdHkgdG8gZWRpdCB0aGVpciBPdXQgT2YgT2ZmaWNlIHRpbWUgbG9jYWxseSAtIFByZWZlcmVuY2VzR3JvdXBzIyMjT3V0T2ZPZmZpY2UjIyNBY3RpdmUgd2FzIHNldCB0byAwIGJ5IHRoaXMgYWRkLW9uIChzaW5jZSBsb2NhbCBlZGl0cyB3b3VsZCBvdGhlcndpc2UganVzdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgc3luYykgYW5kIG5lZWRzIHRvIGJlIHNldCBiYWNrIHRvIDEgYnkgaGFuZCBpZiBhZ2VudHMgc2hvdWxkIG1hbmFnZSBpdCB0aGVtc2VsdmVzIGFnYWluLiBUaGUgaGVhZGVyIG5vdGlmaWNhdGlvbiBiYW5uZXIgdGV4dCBkb2VzIHN3aXRjaCBiYWNrIHRvIFpudW55J3MgbmF0aXZlICJkaXNhYmxlIGl0IGhlcmUiIG1lc3NhZ2UgYW5kIGxpbmsgYXV0b21hdGljYWxseS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV4b09vb1N5bmM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSBBenVyZSBBRCAvIEVudHJhIElEIFNldHRpbmdzIC0tPgogICAgPFNldHRpbmcgTmFtZT0iRXhvT29vU3luYzo6QXp1cmVBRDo6VGVuYW50SUQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhlIEF6dXJlIEFEIChFbnRyYSBJRCkgVGVuYW50IElEIGZvciBPQXV0aDIgYXV0aGVudGljYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFeG9Pb29TeW5jOjpBenVyZUFEPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkV4b09vb1N5bmM6OkF6dXJlQUQ6OkNsaWVudElEIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBBenVyZSBBRCAoRW50cmEgSUQpIEFwcGxpY2F0aW9uIChDbGllbnQpIElEIGZvciBPQXV0aDIgYXV0aGVudGljYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFeG9Pb29TeW5jOjpBenVyZUFEPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkV4b09vb1N5bmM6OkF6dXJlQUQ6OkNsaWVudFNlY3JldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgQXp1cmUgQUQgKEVudHJhIElEKSBDbGllbnQgU2VjcmV0IGZvciBPQXV0aDIgYXV0aGVudGljYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFeG9Pb29TeW5jOjpBenVyZUFEPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJQYXNzd29yZCI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSBVc2VyIE1hcHBpbmcgTW9kZSAtLT4KICAgIDxTZXR0aW5nIE5hbWU9IkV4b09vb1N5bmM6OlVzZXJNYXBwaW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaG93IFpudW55IHVzZXJzIGFyZSBtYXRjaGVkIHRvIEV4Y2hhbmdlIE9ubGluZSBtYWlsYm94ZXMuICdVc2VyTG9naW5fU0FNJzogWm51bnkgVXNlckxvZ2luIGlzIGxvb2tlZCB1cCB2aWEgb25QcmVtaXNlc1NhbUFjY291bnROYW1lIGluIEVudHJhIElEICh3b3JrcyB3aGVuIFVzZXJMb2dpbiBlcXVhbHMgdGhlIEFEIHNBTUFjY291bnROYW1lKS4gJ1VzZXJFbWFpbF9VUE4nOiBabnVueSBVc2VyRW1haWwgZXF1YWxzIHRoZSBVUE4gaW4gRXhjaGFuZ2UgKGRpcmVjdCBsb29rdXAsIG1vc3QgZWZmaWNpZW50KS4gJ1VzZXJFbWFpbF9QcmltYXJ5U01UUCc6IFpudW55IFVzZXJFbWFpbCBpcyBsb29rZWQgdXAgdmlhIG1haWwgYXR0cmlidXRlIGluIEVudHJhIElELjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXhvT29vU3luYzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJVc2VyRW1haWxfVVBOIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iVXNlckxvZ2luX1NBTSIgVHJhbnNsYXRhYmxlPSIxIj5abnVueSBVc2VyTG9naW4gLT4gRW50cmEgSUQgb25QcmVtaXNlc1NhbUFjY291bnROYW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJVc2VyRW1haWxfVVBOIiBUcmFuc2xhdGFibGU9IjEiPlpudW55IEVtYWlsID0gRXhjaGFuZ2UgVVBOIChkaXJlY3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJVc2VyRW1haWxfUHJpbWFyeVNNVFAiIFRyYW5zbGF0YWJsZT0iMSI+Wm51bnkgRW1haWwgLT4gRW50cmEgSUQgbWFpbCAoUHJpbWFyeSBTTVRQKTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSBFbWFpbCBEb21haW4gRmlsdGVyIC0tPgogICAgPFNldHRpbmcgTmFtZT0iRXhvT29vU3luYzo6RW1haWxEb21haW5GaWx0ZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SWYgc2V0LCBvbmx5IGFnZW50cyB3aG9zZSBlbWFpbCBhZGRyZXNzIG1hdGNoZXMgb25lIG9mIHRoZXNlIGRvbWFpbnMgd2lsbCBiZSBzeW5jaHJvbml6ZWQuIExlYXZlIGVtcHR5IHRvIHN5bmMgYWxsIHZhbGlkIGFnZW50cy4gRXhhbXBsZTogY29tcGFueS5jb20sIHN1YnNpZGlhcnkub3JnPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFeG9Pb29TeW5jPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSBBZ2VudCBVSSBPdmVycmlkZXMgLS0+CiAgICA8IS0tIEV4Y2hhbmdlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggb25jZSBzeW5jZWQgLSBtYW51YWxseSBlZGl0aW5nCiAgICAgICAgIE91dCBPZiBPZmZpY2UgbG9jYWxseSB3b3VsZCBqdXN0IGdldCBvdmVyd3JpdHRlbiBieSB0aGUgbmV4dAogICAgICAgICBzY2hlZHVsZWQgc3luYywgc28gdGhlIG5hdGl2ZSBlZGl0aW5nIFVJIGlzIGhpZGRlbiBhbmQgdGhlCiAgICAgICAgIGhlYWRlciBiYW5uZXIgZXhwbGFpbnMgd2hlcmUgdGhlIHN0YXR1cyBhY3R1YWxseSBjb21lcyBmcm9tLiAtLT4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOb3RpZnlNb2R1bGUjIyM1NTAwLU91dG9mT2ZmaWNlLUNoZWNrIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG1vZHVsZSB0byBkaXNwbGF5IGEgbm90aWZpY2F0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UsIGlmIHRoZSBhZ2VudCBpcyBsb2dnZWQgaW4gd2hpbGUgaGF2aW5nIG91dC1vZi1vZmZpY2UgYWN0aXZlLiBPdmVycmlkZGVuIGJ5IEV4b09vb1N5bmMgdG8gZXhwbGFpbiB0aGUgRXhjaGFuZ2Utc3luY2VkIHN0YXR1cyBpbnN0ZWFkIG9mIGxpbmtpbmcgdG8gYSBsb2NhbCAiZGlzYWJsZSBpdCBoZXJlIiB0aGF0IHdvdWxkIGp1c3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG5leHQgc3luYy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV4b09vb1N5bmM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6Tm90aWZpY2F0aW9uOjpFeG9Pb29TeW5jQ2hlY2s8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gUHJlZmVyZW5jZXNHcm91cHMjIyNPdXRPZk9mZmljZSdzIEFjdGl2ZSBmbGFnIGlzIHNldCB0byAwIChhbmQKICAgICAgICAgYmFjayB0byAxIG9uIHVuaW5zdGFsbCkgYnkgdGhpcyBwYWNrYWdlJ3Mgb3duIENvZGVJbnN0YWxsIC8KICAgICAgICAgQ29kZVVuaW5zdGFsbCBob29rcyBpbiBFeG9Pb29TeW5jLnNvcG0gLSBub3QgZHVwbGljYXRlZCBoZXJlIGFzCiAgICAgICAgIGEgZGVjbGFyYXRpdmUgb3ZlcnJpZGUsIHRvIGF2b2lkIHR3byBtZWNoYW5pc21zIGRvaW5nIHRoZSBzYW1lCiAgICAgICAgIGpvYi4gU2VlIEV4b09vb1N5bmMuc29wbSBmb3IgdGhlIGFjdHVhbCBTZXR0aW5nVXBkYXRlIGNhbGxzLiAtLT4KCiAgICA8IS0tIENyb24gVGFzazogV29yayBob3VycyAtIGV2ZXJ5IDE1IG1pbnV0ZXMgKE1vbi1GcmkgMDY6MDAtMTc6NTkpIC0tPgogICAgPFNldHRpbmcgTmFtZT0iRGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2sjIyNFeG9Pb29TeW5jLVdvcmtIb3VycyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TeW5jaHJvbml6ZXMgT3V0LW9mLU9mZmljZSBzdGF0dXMgZnJvbSBFeGNoYW5nZSBPbmxpbmUgdG8gWm51bnkgZHVyaW5nIHdvcmsgaG91cnMgKE1vbi1GcmkgMDY6MDAtMTg6MDAsIGV2ZXJ5IDE1IG1pbnV0ZXMpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2s8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFza05hbWUiPkV4b09vb1N5bmMtV29ya0hvdXJzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTY2hlZHVsZSI+MTUsMzAsNDUgNi0xNyAqICogMS01PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpFeG9Pb29TeW5jPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGdW5jdGlvbiI+UnVuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBhcmFtcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gQ3JvbiBUYXNrOiBIb3VybHkgYmFzZWxpbmUgLSBldmVyeSBmdWxsIGhvdXIsIGFsbCBkYXksIGV2ZXJ5IGRheSAtLT4KICAgIDxTZXR0aW5nIE5hbWU9IkRhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrIyMjRXhvT29vU3luYy1Ib3VybHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U3luY2hyb25pemVzIE91dC1vZi1PZmZpY2Ugc3RhdHVzIGZyb20gRXhjaGFuZ2UgT25saW5lIHRvIFpudW55IGV2ZXJ5IGZ1bGwgaG91ciAoY292ZXJzIG9mZi1ob3VycyBhbmQgd2Vla2VuZHM7IGR1cmluZyB3b3JrIGhvdXJzIGNvbXBsZW1lbnRzIHRoZSAxNS1taW51dGUgdGFzaykuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5EYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzazwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXNrTmFtZSI+RXhvT29vU3luYy1Ib3VybHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNjaGVkdWxlIj4wICogKiAqICo8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkV4b09vb1N5bmM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZ1bmN0aW9uIj5SdW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1heGltdW1QYXJhbGxlbEluc3RhbmNlcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGFyYW1zIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cgo8L290cnNfY29uZmlnPgo=</File>
        <File Permission="660" Location="Kernel/System/ExoOooSync.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpFeG9Pb29TeW5jOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSBIVFRQOjpIZWFkZXJzOwp1c2UgSFRUUDo6UmVxdWVzdDsKdXNlIExXUDo6VXNlckFnZW50Owp1c2UgVVJJOjpFc2NhcGUgcXcodXJpX2VzY2FwZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWJVc2VyQWdlbnQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpFeG9Pb29TeW5jIC0gU3luYyBPdXQtb2YtT2ZmaWNlIHN0YXR1cyBmcm9tIEV4Y2hhbmdlIE9ubGluZSAoR3JhcGggQVBJKSB0byBabnVueQoKPWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIG1vZHVsZSBmZXRjaGVzIHRoZSBhdXRvbWF0aWMgcmVwbGllcyAoT3V0LW9mLU9mZmljZSkgc3RhdHVzIGZyb20gTWljcm9zb2Z0IEV4Y2hhbmdlIE9ubGluZQp2aWEgdGhlIE1pY3Jvc29mdCBHcmFwaCBBUEkgYW5kIHVwZGF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgWm51bnkgdXNlciBwcmVmZXJlbmNlcyBhY2NvcmRpbmdseS4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgpNYWluIGVudHJ5IHBvaW50IGNhbGxlZCBieSB0aGUgWm51bnkgRGFlbW9uIHNjaGVkdWxlci4gRmV0Y2hlcyBPT08gc3RhdHVzIGZvciBhbGwgdmFsaWQKYWdlbnRzIGFuZCB1cGRhdGVzIHRoZWlyIFpudW55IE91dE9mT2ZmaWNlIHByZWZlcmVuY2VzLgoKICAgIG15ICRTdWNjZXNzID0gJEV4b09vb1N5bmNPYmplY3QtPlJ1bigpOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRVc2VyT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgQ2hlY2sgaWYgZmVhdHVyZSBpcyBlbmFibGVkLgogICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdFeG9Pb29TeW5jOjpFbmFibGVkJykgKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PiAnRXhvT29vU3luYzogU3RhcnRpbmcgT3V0LW9mLU9mZmljZSBzeW5jaHJvbml6YXRpb24gZnJvbSBFeGNoYW5nZSBPbmxpbmUuJywKICAgICk7CgogICAgIyBHZXQgT0F1dGgyIGFjY2VzcyB0b2tlbi4KICAgIG15ICRBY2Nlc3NUb2tlbiA9ICRTZWxmLT5fR2V0QWNjZXNzVG9rZW4oKTsKICAgIGlmICggISRBY2Nlc3NUb2tlbiApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdFeG9Pb29TeW5jOiBGYWlsZWQgdG8gb2J0YWluIE9BdXRoMiBhY2Nlc3MgdG9rZW4uIEFib3J0aW5nIHN5bmMuJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkTWFwcGluZ01vZGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0V4b09vb1N5bmM6OlVzZXJNYXBwaW5nJykgfHwgJ1VzZXJFbWFpbF9VUE4nOwoKICAgICMgR2V0IGVtYWlsIGRvbWFpbiBmaWx0ZXIgKG9wdGlvbmFsKS4KICAgIG15ICREb21haW5GaWx0ZXJSZWYgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0V4b09vb1N5bmM6OkVtYWlsRG9tYWluRmlsdGVyJykgfHwgW107CiAgICBteSAlQWxsb3dlZERvbWFpbnM7CiAgICBmb3IgbXkgJERvbWFpbiAoIEB7JERvbWFpbkZpbHRlclJlZn0gKSB7CiAgICAgICAgJERvbWFpbiA9fiBzL15ccyt8XHMrJC8vZzsgICAgIyB0cmltIHdoaXRlc3BhY2UKICAgICAgICBuZXh0IGlmICEkRG9tYWluOwogICAgICAgICRBbGxvd2VkRG9tYWluc3sgbGMgJERvbWFpbiB9ID0gMTsKICAgIH0KICAgIG15ICRIYXNEb21haW5GaWx0ZXIgPSBzY2FsYXIga2V5cyAlQWxsb3dlZERvbWFpbnM7CgogICAgIyBHZXQgYWxsIHZhbGlkIGFnZW50cy4KICAgIG15ICVVc2VyTGlzdCA9ICRVc2VyT2JqZWN0LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnU2hvcnQnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgIG15ICRTeW5jZWRDb3VudCAgICAgID0gMDsKICAgIG15ICRFcnJvckNvdW50ICAgICAgID0gMDsKICAgIG15ICRDaGFuZ2VkQ291bnQgICAgID0gMDsKICAgIG15ICRTa2lwcGVkQ291bnQgICAgID0gMDsKICAgIG15ICROb01haWxib3hDb3VudCAgID0gMDsKCiAgICAjIFBoYXNlIDE6IENvbGxlY3QgdXNlcnMgYW5kIHJlc29sdmUgR3JhcGggaWRlbnRpZmllcnMuCiAgICBteSBAVXNlcnNUb1N5bmM7CgogICAgVVNFUklEOgogICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVVzZXJMaXN0ICkgewoKICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgbmV4dCBVU0VSSUQgaWYgISVVc2VyRGF0YTsKCiAgICAgICAgIyBTa2lwIHN5c3RlbSBhZG1pbiBhY2NvdW50IChyb290QGxvY2FsaG9zdCkgLSBubyBFeGNoYW5nZSBtYWlsYm94LgogICAgICAgIGlmICggJFVzZXJEYXRhe1VzZXJMb2dpbn0gZXEgJ3Jvb3RAbG9jYWxob3N0JyApIHsKICAgICAgICAgICAgJFNraXBwZWRDb3VudCsrOwogICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICB9CgogICAgICAgICMgQXBwbHkgZW1haWwgZG9tYWluIGZpbHRlciBpZiBjb25maWd1cmVkLgogICAgICAgIGlmICgkSGFzRG9tYWluRmlsdGVyKSB7CiAgICAgICAgICAgIG15ICRFbWFpbCA9ICRVc2VyRGF0YXtVc2VyRW1haWx9IHx8ICcnOwogICAgICAgICAgICBpZiAoICRFbWFpbCA9fiBtL0AoLispJC8gKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQWxsb3dlZERvbWFpbnN7IGxjICQxIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNraXBwZWRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIG5leHQgVVNFUklEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyBObyBlbWFpbCBvciBubyBkb21haW4gcGFydCAtIHNraXAuCiAgICAgICAgICAgICAgICAkU2tpcHBlZENvdW50Kys7CiAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgdGhlIEV4Y2hhbmdlIE9ubGluZSBpZGVudGlmaWVyIGJhc2VkIG9uIG1hcHBpbmcgbW9kZS4KICAgICAgICBteSAkRXhjaGFuZ2VJZGVudGlmaWVyID0gJFNlbGYtPl9HZXRFeGNoYW5nZUlkZW50aWZpZXIoCiAgICAgICAgICAgIFVzZXJEYXRhICAgID0+IFwlVXNlckRhdGEsCiAgICAgICAgICAgIE1hcHBpbmdNb2RlID0+ICRNYXBwaW5nTW9kZSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkRXhjaGFuZ2VJZGVudGlmaWVyICkgewogICAgICAgICAgICAkU2tpcHBlZENvdW50Kys7CiAgICAgICAgICAgIG5leHQgVVNFUklEOwogICAgICAgIH0KCiAgICAgICAgIyBGb3IgU0FNIGFuZCBQcmltYXJ5U01UUCwgcmVzb2x2ZSB0aGUgR3JhcGggdXNlciBJRCBmaXJzdCAoY2Fubm90IGJlIGJhdGNoZWQpLgogICAgICAgIG15ICRHcmFwaFVzZXJJRDsKICAgICAgICBpZiAoICRNYXBwaW5nTW9kZSBlcSAnVXNlckxvZ2luX1NBTScgKSB7CiAgICAgICAgICAgICRHcmFwaFVzZXJJRCA9ICRTZWxmLT5fTG9va3VwR3JhcGhVc2VyQnlBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgICBBY2Nlc3NUb2tlbiA9PiAkQWNjZXNzVG9rZW4sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnb25QcmVtaXNlc1NhbUFjY291bnROYW1lJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRFeGNoYW5nZUlkZW50aWZpZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRHcmFwaFVzZXJJRCApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRXhvT29vU3luYzogTm8gRW50cmEgSUQgdXNlciBmb3VuZCB3aXRoIG9uUHJlbWlzZXNTYW1BY2NvdW50TmFtZSAnJEV4Y2hhbmdlSWRlbnRpZmllcicuIFNraXBwaW5nLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE5vTWFpbGJveENvdW50Kys7CiAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRNYXBwaW5nTW9kZSBlcSAnVXNlckVtYWlsX1ByaW1hcnlTTVRQJyApIHsKICAgICAgICAgICAgJEdyYXBoVXNlcklEID0gJFNlbGYtPl9Mb29rdXBHcmFwaFVzZXJCeUF0dHJpYnV0ZSgKICAgICAgICAgICAgICAgIEFjY2Vzc1Rva2VuID0+ICRBY2Nlc3NUb2tlbiwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSAgID0+ICdtYWlsJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRFeGNoYW5nZUlkZW50aWZpZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRHcmFwaFVzZXJJRCApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRXhvT29vU3luYzogTm8gRW50cmEgSUQgdXNlciBmb3VuZCB3aXRoIG1haWwgJyRFeGNoYW5nZUlkZW50aWZpZXInLiBTa2lwcGluZy4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICROb01haWxib3hDb3VudCsrOwogICAgICAgICAgICAgICAgbmV4dCBVU0VSSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgVXNlckVtYWlsX1VQTjogdXNlIHRoZSBlbWFpbCBkaXJlY3RseS4KICAgICAgICAgICAgJEdyYXBoVXNlcklEID0gJEV4Y2hhbmdlSWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQFVzZXJzVG9TeW5jLCB7CiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVXNlckxvZ2luICA9PiAkVXNlckRhdGF7VXNlckxvZ2lufSwKICAgICAgICAgICAgSWRlbnRpZmllciA9PiAkRXhjaGFuZ2VJZGVudGlmaWVyLAogICAgICAgICAgICBHcmFwaFVzZXJJRCA9PiAkR3JhcGhVc2VySUQsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIFBoYXNlIDI6IEZldGNoIE9PTyBzdGF0dXMgaW4gYmF0Y2hlcyB2aWEgR3JhcGggJGJhdGNoIEFQSSAobWF4IDIwIHBlciBiYXRjaCkuCiAgICBteSAkQmF0Y2hTaXplID0gMjA7CiAgICBteSAkVG90YWwgICAgID0gc2NhbGFyIEBVc2Vyc1RvU3luYzsKCiAgICB3aGlsZSAoIG15IEBCYXRjaCA9IHNwbGljZSggQFVzZXJzVG9TeW5jLCAwLCAkQmF0Y2hTaXplICkgKSB7CgogICAgICAgIG15ICVCYXRjaFJlc3VsdHMgPSAkU2VsZi0+X0dldEdyYXBoT29vU3RhdHVzQmF0Y2goCiAgICAgICAgICAgIEFjY2Vzc1Rva2VuID0+ICRBY2Nlc3NUb2tlbiwKICAgICAgICAgICAgVXNlcnMgICAgICAgPT4gXEBCYXRjaCwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFVzZXJFbnRyeSAoQEJhdGNoKSB7CiAgICAgICAgICAgIG15ICRHcmFwaFVzZXJJRCA9ICRVc2VyRW50cnktPntHcmFwaFVzZXJJRH07CiAgICAgICAgICAgIG15ICVHcmFwaE9vb0RhdGE7CgogICAgICAgICAgICBpZiAoIGV4aXN0cyAkQmF0Y2hSZXN1bHRzeyRHcmFwaFVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAlR3JhcGhPb29EYXRhID0gJXsgJEJhdGNoUmVzdWx0c3skR3JhcGhVc2VySUR9IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRXJyb3JDb3VudCsrOwogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR3JhcGhPb29EYXRhe1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgJEVycm9yQ291bnQrKzsKICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgTm8gbWFpbGJveCBmb3VuZCBpcyBub3QgYW4gZXJyb3IgLSBqdXN0IHNraXAuCiAgICAgICAgICAgIGlmICggISRHcmFwaE9vb0RhdGF7U3VjY2Vzc30gJiYgJEdyYXBoT29vRGF0YXtOb01haWxib3h9ICkgewogICAgICAgICAgICAgICAgJE5vTWFpbGJveENvdW50Kys7CiAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkR3JhcGhPb29EYXRhe1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgJEVycm9yQ291bnQrKzsKICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcGFyZSBhbmQgdXBkYXRlIFpudW55IE9PTyBwcmVmZXJlbmNlcyBpZiBjaGFuZ2VkLgogICAgICAgICAgICBteSAkQ2hhbmdlZCA9ICRTZWxmLT5fVXBkYXRlVXNlck9vb1N0YXR1cygKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlckVudHJ5LT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiAgICA9PiAkVXNlckVudHJ5LT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIEdyYXBoT29vRGF0YSA9PiBcJUdyYXBoT29vRGF0YSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgJENoYW5nZWRDb3VudCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU3luY2VkQ291bnQrKzsKICAgICAgICB9CiAgICB9CgogICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PiAiRXhvT29vU3luYzogU3luY2hyb25pemF0aW9uIGNvbXBsZXRlZC4gU3luY2VkOiAkU3luY2VkQ291bnQsIENoYW5nZWQ6ICRDaGFuZ2VkQ291bnQsICIKICAgICAgICAgICAgLiAiU2tpcHBlZDogJFNraXBwZWRDb3VudCwgTm9NYWlsYm94OiAkTm9NYWlsYm94Q291bnQsIEVycm9yczogJEVycm9yQ291bnQuIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfR2V0QWNjZXNzVG9rZW4oKQoKT2J0YWlucyBhbiBPQXV0aDIgYWNjZXNzIHRva2VuIGZyb20gQXp1cmUgQUQgdXNpbmcgY2xpZW50IGNyZWRlbnRpYWxzIGZsb3cuCgogICAgbXkgJEFjY2Vzc1Rva2VuID0gJFNlbGYtPl9HZXRBY2Nlc3NUb2tlbigpOwoKPWN1dAoKc3ViIF9HZXRBY2Nlc3NUb2tlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJEpTT05PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgIG15ICRUZW5hbnRJRCAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0V4b09vb1N5bmM6OkF6dXJlQUQ6OlRlbmFudElEJyk7CiAgICBteSAkQ2xpZW50SUQgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdFeG9Pb29TeW5jOjpBenVyZUFEOjpDbGllbnRJRCcpOwogICAgbXkgJENsaWVudFNlY3JldCA9ICRDb25maWdPYmplY3QtPkdldCgnRXhvT29vU3luYzo6QXp1cmVBRDo6Q2xpZW50U2VjcmV0Jyk7CgogICAgaWYgKCAhJFRlbmFudElEIHx8ICEkQ2xpZW50SUQgfHwgISRDbGllbnRTZWNyZXQgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRXhvT29vU3luYzogQXp1cmUgQUQgY29uZmlndXJhdGlvbiBpbmNvbXBsZXRlIChUZW5hbnRJRCwgQ2xpZW50SUQsIG9yIENsaWVudFNlY3JldCBtaXNzaW5nKS4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRUb2tlblVSTCA9ICJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vJFRlbmFudElEL29hdXRoMi92Mi4wL3Rva2VuIjsKCiAgICBteSAkV2ViVXNlckFnZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYlVzZXJBZ2VudCcpOwoKICAgIG15ICVSZXNwb25zZSA9ICRXZWJVc2VyQWdlbnRPYmplY3QtPlJlcXVlc3QoCiAgICAgICAgVVJMICAgPT4gJFRva2VuVVJMLAogICAgICAgIFR5cGUgID0+ICdQT1NUJywKICAgICAgICBOb0xvZyA9PiAxLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgY2xpZW50X2lkICAgICA9PiAkQ2xpZW50SUQsCiAgICAgICAgICAgIGNsaWVudF9zZWNyZXQgPT4gJENsaWVudFNlY3JldCwKICAgICAgICAgICAgc2NvcGUgICAgICAgICA9PiAnaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tLy5kZWZhdWx0JywKICAgICAgICAgICAgZ3JhbnRfdHlwZSAgICA9PiAnY2xpZW50X2NyZWRlbnRpYWxzJywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRSZXNwb25zZXtTdGF0dXN9ICF+IG17XjIwMH14ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4b09vb1N5bmM6IE9BdXRoMiB0b2tlbiByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1czogJFJlc3BvbnNle1N0YXR1c30iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRSZXNwb25zZURhdGEgPSAkSlNPTk9iamVjdC0+RGVjb2RlKAogICAgICAgIERhdGEgPT4gJHsgJFJlc3BvbnNle0NvbnRlbnR9IH0sCiAgICApOwoKICAgIGlmICggISRSZXNwb25zZURhdGEgfHwgISRSZXNwb25zZURhdGEtPnthY2Nlc3NfdG9rZW59ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0V4b09vb1N5bmM6IE9BdXRoMiB0b2tlbiByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGFjY2Vzc190b2tlbi4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkUmVzcG9uc2VEYXRhLT57YWNjZXNzX3Rva2VufTsKfQoKPWhlYWQyIF9HZXRFeGNoYW5nZUlkZW50aWZpZXIoKQoKRGV0ZXJtaW5lcyB0aGUgaWRlbnRpZmllciB0byB1c2UgZm9yIHRoZSBHcmFwaCBBUEkgbG9va3VwIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIG1hcHBpbmcgbW9kZS4KCiAgICBteSAkSWRlbnRpZmllciA9ICRTZWxmLT5fR2V0RXhjaGFuZ2VJZGVudGlmaWVyKAogICAgICAgIFVzZXJEYXRhICAgID0+IFwlVXNlckRhdGEsCiAgICAgICAgTWFwcGluZ01vZGUgPT4gJ1VzZXJFbWFpbF9VUE4nLAogICAgKTsKCj1jdXQKCnN1YiBfR2V0RXhjaGFuZ2VJZGVudGlmaWVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBteSAkTWFwcGluZ01vZGUgPSAkUGFyYW17TWFwcGluZ01vZGV9OwogICAgbXkgJVVzZXJEYXRhICAgID0gJXsgJFBhcmFte1VzZXJEYXRhfSB9OwoKICAgIG15ICRJZGVudGlmaWVyOwoKICAgIGlmICggJE1hcHBpbmdNb2RlIGVxICdVc2VyTG9naW5fU0FNJyApIHsKICAgICAgICAjIFVzZSBabnVueSBsb2dpbiAoc0FNQWNjb3VudE5hbWUpIHRvIHNlYXJjaCBieSBvblByZW1pc2VzU2FtQWNjb3VudE5hbWUgaW4gRW50cmEgSUQuCiAgICAgICAgJElkZW50aWZpZXIgPSAkVXNlckRhdGF7VXNlckxvZ2lufTsKICAgIH0KICAgIGVsc2lmICggJE1hcHBpbmdNb2RlIGVxICdVc2VyRW1haWxfVVBOJyB8fCAkTWFwcGluZ01vZGUgZXEgJ1VzZXJFbWFpbF9QcmltYXJ5U01UUCcgKSB7CiAgICAgICAgIyBVc2UgWm51bnkgZW1haWwgYWRkcmVzcy4KICAgICAgICAkSWRlbnRpZmllciA9ICRVc2VyRGF0YXtVc2VyRW1haWx9OwogICAgfQoKICAgIGlmICggISRJZGVudGlmaWVyICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4b09vb1N5bmM6IE5vIGlkZW50aWZpZXIgZm91bmQgZm9yIHVzZXIgJyRVc2VyRGF0YXtVc2VyTG9naW59JyAiCiAgICAgICAgICAgICAgICAuICJ3aXRoIG1hcHBpbmcgbW9kZSAnJE1hcHBpbmdNb2RlJy4gU2tpcHBpbmcuIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkSWRlbnRpZmllcjsKfQoKPWhlYWQyIF9HZXRHcmFwaE9vb1N0YXR1c0JhdGNoKCkKCkZldGNoZXMgdGhlIE91dC1vZi1PZmZpY2UgKGF1dG9tYXRpYyByZXBsaWVzKSBzdGF0dXMgZm9yIG11bHRpcGxlIHVzZXJzIGluIGEgc2luZ2xlCkdyYXBoIEFQSSAkYmF0Y2ggcmVxdWVzdCAobWF4IDIwIHBlciBjYWxsIHBlciBNaWNyb3NvZnQgc3BlYykuCgogICAgbXkgJVJlc3VsdHMgPSAkU2VsZi0+X0dldEdyYXBoT29vU3RhdHVzQmF0Y2goCiAgICAgICAgQWNjZXNzVG9rZW4gPT4gJEFjY2Vzc1Rva2VuLAogICAgICAgIFVzZXJzICAgICAgID0+IFsKICAgICAgICAgICAgeyBHcmFwaFVzZXJJRCA9PiAndXNlckBkb21haW4uY29tJywgSWRlbnRpZmllciA9PiAndXNlckBkb21haW4uY29tJyB9LAogICAgICAgICAgICAuLi4KICAgICAgICBdLAogICAgKTsKClJldHVybnMgYSBoYXNoIGtleWVkIGJ5IEdyYXBoVXNlcklELCBlYWNoIHZhbHVlIGJlaW5nIGEgaGFzaCB3aXRoOgogICAgU3VjY2VzcyAgICAgICA9PiAxLzAsCiAgICBPdXRPZk9mZmljZSAgID0+IDEvMCwKICAgIE5vTWFpbGJveCAgICAgPT4gMSwgICAgICAgICAgICAgICMgaWYgYXBwbGljYWJsZQogICAgU3RhcnREYXRlICAgICA9PiAnMjAyNi0wMy0yMycsICAgIyBvbmx5IGlmIHNjaGVkdWxlZAogICAgRW5kRGF0ZSAgICAgICA9PiAnMjAyNi0wMy0zMCcsICAgIyBvbmx5IGlmIHNjaGVkdWxlZAoKPWN1dAoKc3ViIF9HZXRHcmFwaE9vb1N0YXR1c0JhdGNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgbXkgJExvZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgbXkgJEFjY2Vzc1Rva2VuID0gJFBhcmFte0FjY2Vzc1Rva2VufTsKICAgIG15IEBVc2VycyAgICAgICA9IEB7ICRQYXJhbXtVc2Vyc30gfTsKCiAgICBteSAkV2ViVXNlckFnZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYlVzZXJBZ2VudCcpOwoKICAgICMgQnVpbGQgYmF0Y2ggcmVxdWVzdCBib2R5LgogICAgbXkgQFJlcXVlc3RzOwogICAgZm9yIG15ICRpICggMCAuLiAkI1VzZXJzICkgewogICAgICAgIG15ICRFbmNvZGVkSUQgPSB1cmlfZXNjYXBlKCAkVXNlcnNbJGlde0dyYXBoVXNlcklEfSApOwogICAgICAgIHB1c2ggQFJlcXVlc3RzLCB7CiAgICAgICAgICAgIGlkICAgICA9PiAiJGkiLAogICAgICAgICAgICBtZXRob2QgPT4gJ0dFVCcsCiAgICAgICAgICAgIHVybCAgICA9PiAiL3VzZXJzLyRFbmNvZGVkSUQvbWFpbGJveFNldHRpbmdzL2F1dG9tYXRpY1JlcGxpZXNTZXR0aW5nIiwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRCYXRjaEJvZHkgPSAkSlNPTk9iamVjdC0+RW5jb2RlKAogICAgICAgIERhdGEgPT4geyByZXF1ZXN0cyA9PiBcQFJlcXVlc3RzIH0sCiAgICApOwoKICAgICMgRXhlY3V0ZSBiYXRjaCByZXF1ZXN0IHdpdGggcmV0cnkgb24gdGhyb3R0bGluZyAoSFRUUCA0MjkpLgogICAgIyBVc2VzIExXUCBkaXJlY3RseSBiZWNhdXNlIFpudW55J3MgV2ViVXNlckFnZW50IGNhbm5vdCBzZW5kIHJhdyBKU09OIFBPU1QgYm9kaWVzLgogICAgbXkgJVJlc3BvbnNlID0gJFNlbGYtPl9HcmFwaEJhdGNoUmVxdWVzdCgKICAgICAgICBBY2Nlc3NUb2tlbiA9PiAkQWNjZXNzVG9rZW4sCiAgICAgICAgVVJMICAgICAgICAgPT4gJ2h0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS92MS4wLyRiYXRjaCcsCiAgICAgICAgQm9keSAgICAgICAgPT4gJEJhdGNoQm9keSwKICAgICk7CgogICAgbXkgJVJlc3VsdHM7CgogICAgaWYgKCAkUmVzcG9uc2V7U3RhdHVzfSAhfiBte14yMDB9eCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFeG9Pb29TeW5jOiBHcmFwaCBcJGJhdGNoIHJlcXVlc3QgZmFpbGVkOiAkUmVzcG9uc2V7U3RhdHVzfSIsCiAgICAgICAgKTsKICAgICAgICAjIFJldHVybiBlbXB0eSAtIGNhbGxlciB3aWxsIGNvdW50IGFsbCBhcyBlcnJvcnMuCiAgICAgICAgcmV0dXJuICVSZXN1bHRzOwogICAgfQoKICAgIG15ICRCYXRjaERhdGEgPSAkSlNPTk9iamVjdC0+RGVjb2RlKAogICAgICAgIERhdGEgPT4gJHsgJFJlc3BvbnNle0NvbnRlbnR9IH0sCiAgICApOwoKICAgIGlmICggISRCYXRjaERhdGEgfHwgIUlzQXJyYXlSZWZXaXRoRGF0YSggJEJhdGNoRGF0YS0+e3Jlc3BvbnNlc30gKSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdFeG9Pb29TeW5jOiBJbnZhbGlkICRiYXRjaCByZXNwb25zZSBmcm9tIEdyYXBoIEFQSS4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICVSZXN1bHRzOwogICAgfQoKICAgICMgUHJvY2VzcyBlYWNoIGluZGl2aWR1YWwgcmVzcG9uc2UuCiAgICBmb3IgbXkgJFJlc3AgKCBAeyAkQmF0Y2hEYXRhLT57cmVzcG9uc2VzfSB9ICkgewogICAgICAgIG15ICRJZHggPSAkUmVzcC0+e2lkfTsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRJZHggfHwgISRVc2Vyc1skSWR4XTsKCiAgICAgICAgbXkgJEdyYXBoVXNlcklEID0gJFVzZXJzWyRJZHhde0dyYXBoVXNlcklEfTsKICAgICAgICBteSAkSWRlbnRpZmllciAgPSAkVXNlcnNbJElkeF17SWRlbnRpZmllcn07CiAgICAgICAgbXkgJFN0YXR1c0NvZGUgID0gJFJlc3AtPntzdGF0dXN9OwoKICAgICAgICBpZiAoICRTdGF0dXNDb2RlID09IDQwNCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRXhvT29vU3luYzogTm8gbWFpbGJveCBmb3VuZCBmb3IgJyRJZGVudGlmaWVyJy4gU2tpcHBpbmcuIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFJlc3VsdHN7JEdyYXBoVXNlcklEfSA9IHsgU3VjY2VzcyA9PiAwLCBOb01haWxib3ggPT4gMSB9OwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU3RhdHVzQ29kZSA9PSA0MjkgKSB7CiAgICAgICAgICAgICMgSW5kaXZpZHVhbCByZXF1ZXN0IHRocm90dGxlZCB3aXRoaW4gYmF0Y2guCiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4b09vb1N5bmM6IFRocm90dGxlZCBieSBHcmFwaCBBUEkgZm9yICckSWRlbnRpZmllcicuIFdpbGwgcmV0cnkgb24gbmV4dCBzeW5jLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRSZXN1bHRzeyRHcmFwaFVzZXJJRH0gPSB7IFN1Y2Nlc3MgPT4gMCB9OwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU3RhdHVzQ29kZSAhPSAyMDAgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRXhvT29vU3luYzogR3JhcGggQVBJIGVycm9yIGZvciAnJElkZW50aWZpZXInOiBIVFRQICRTdGF0dXNDb2RlIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFJlc3VsdHN7JEdyYXBoVXNlcklEfSA9IHsgU3VjY2VzcyA9PiAwIH07CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBteSAkRGF0YSA9ICRSZXNwLT57Ym9keX07CgogICAgICAgIGlmICggISREYXRhIHx8ICFkZWZpbmVkICREYXRhLT57c3RhdHVzfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFeG9Pb29TeW5jOiBJbnZhbGlkIEdyYXBoIEFQSSByZXNwb25zZSBmb3IgJyRJZGVudGlmaWVyJy4iLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUmVzdWx0c3skR3JhcGhVc2VySUR9ID0geyBTdWNjZXNzID0+IDAgfTsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CgogICAgICAgICRSZXN1bHRzeyRHcmFwaFVzZXJJRH0gPSAkU2VsZi0+X1BhcnNlT29vU3RhdHVzKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICREYXRhLAogICAgICAgICAgICBJZGVudGlmaWVyID0+ICRJZGVudGlmaWVyLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVSZXN1bHRzOwp9Cgo9aGVhZDIgX1BhcnNlT29vU3RhdHVzKCkKClBhcnNlcyB0aGUgYXV0b21hdGljUmVwbGllc1NldHRpbmcgcmVzcG9uc2UgZnJvbSBHcmFwaCBBUEkgaW50byBhIG5vcm1hbGl6ZWQgaGFzaC4KCj1jdXQKCnN1YiBfUGFyc2VPb29TdGF0dXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREYXRhICAgICAgID0gJFBhcmFte0RhdGF9OwogICAgbXkgJElkZW50aWZpZXIgPSAkUGFyYW17SWRlbnRpZmllcn07CgogICAgbXkgJFN0YXR1cyA9ICREYXRhLT57c3RhdHVzfTsKCiAgICBpZiAoICRTdGF0dXMgZXEgJ2Rpc2FibGVkJyApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzICAgICA9PiAxLAogICAgICAgICAgICBPdXRPZk9mZmljZSA9PiAwLAogICAgICAgIH07CiAgICB9CiAgICBlbHNpZiAoICRTdGF0dXMgZXEgJ2Fsd2F5c0VuYWJsZWQnICkgewogICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgICAgIG15ICRDdXJyZW50RGF0ZSA9ICREYXRlVGltZU9iamVjdC0+Rm9ybWF0KCBGb3JtYXQgPT4gJyVZLSVtLSVkJyApOwoKICAgICAgICAkRGF0ZVRpbWVPYmplY3QtPkFkZCggWWVhcnMgPT4gMSApOwogICAgICAgIG15ICRGdXR1cmVEYXRlID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoIEZvcm1hdCA9PiAnJVktJW0tJWQnICk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgICAgID0+IDEsCiAgICAgICAgICAgIE91dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgICAgIFN0YXJ0RGF0ZSAgID0+ICRDdXJyZW50RGF0ZSwKICAgICAgICAgICAgRW5kRGF0ZSAgICAgPT4gJEZ1dHVyZURhdGUsCiAgICAgICAgfTsKICAgIH0KICAgIGVsc2lmICggJFN0YXR1cyBlcSAnc2NoZWR1bGVkJyApIHsKICAgICAgICBteSAkU3RhcnREYXRlVGltZSA9ICREYXRhLT57c2NoZWR1bGVkU3RhcnREYXRlVGltZX17ZGF0ZVRpbWV9IHx8ICcnOwogICAgICAgIG15ICRFbmREYXRlVGltZSAgID0gJERhdGEtPntzY2hlZHVsZWRFbmREYXRlVGltZX17ZGF0ZVRpbWV9ICAgfHwgJyc7CgogICAgICAgIG15ICggJFN0YXJ0RGF0ZSwgJEVuZERhdGUgKTsKICAgICAgICBpZiAoICRTdGFydERhdGVUaW1lID1+IG17XihcZHs0fS1cZHsyfS1cZHsyfSl9ICkgewogICAgICAgICAgICAkU3RhcnREYXRlID0gJDE7CiAgICAgICAgfQogICAgICAgIGlmICggJEVuZERhdGVUaW1lID1+IG17XihcZHs0fS1cZHsyfS1cZHsyfSl9ICkgewogICAgICAgICAgICAkRW5kRGF0ZSA9ICQxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFN0YXJ0RGF0ZSB8fCAhJEVuZERhdGUgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRXhvT29vU3luYzogQ291bGQgbm90IHBhcnNlIHNjaGVkdWxlZCBkYXRlcyBmb3IgJyRJZGVudGlmaWVyJzogIgogICAgICAgICAgICAgICAgICAgIC4gIlN0YXJ0PSckU3RhcnREYXRlVGltZScsIEVuZD0nJEVuZERhdGVUaW1lJy4iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4geyBTdWNjZXNzID0+IDAgfTsKICAgICAgICB9CgogICAgICAgICMgQWx3YXlzIHNldCBPdXRPZk9mZmljZSA9IDEgd2l0aCB0aGUgZGF0ZXMgZnJvbSBFeGNoYW5nZS4KICAgICAgICAjIFpudW55IGV2YWx1YXRlcyB0aGUgZGF0ZSByYW5nZSBpdHNlbGYgKFVzZXIucG06MzY5KSBhbmQgb25seQogICAgICAgICMgZGlzcGxheXMgdGhlIE9PTyBtZXNzYWdlIHdoZW4gdGhlIGN1cnJlbnQgZGF0ZSBpcyB3aXRoaW4gcmFuZ2UuCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyAgICAgPT4gMSwKICAgICAgICAgICAgT3V0T2ZPZmZpY2UgPT4gMSwKICAgICAgICAgICAgU3RhcnREYXRlICAgPT4gJFN0YXJ0RGF0ZSwKICAgICAgICAgICAgRW5kRGF0ZSAgICAgPT4gJEVuZERhdGUsCiAgICAgICAgfTsKICAgIH0KCiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4b09vb1N5bmM6IFVua25vd24gYXV0b21hdGljIHJlcGxpZXMgc3RhdHVzICckU3RhdHVzJyBmb3IgJyRJZGVudGlmaWVyJy4iLAogICAgKTsKCiAgICByZXR1cm4geyBTdWNjZXNzID0+IDAgfTsKfQoKPWhlYWQyIF9HcmFwaEJhdGNoUmVxdWVzdCgpCgpTZW5kcyBhIHJhdyBKU09OIFBPU1QgdG8gdGhlIEdyYXBoIEFQSSAkYmF0Y2ggZW5kcG9pbnQgdXNpbmcgTFdQOjpVc2VyQWdlbnQgZGlyZWN0bHkKKFpudW55J3MgV2ViVXNlckFnZW50IG9ubHkgc3VwcG9ydHMgZm9ybS1lbmNvZGVkIFBPU1QgZGF0YSkuCkluY2x1ZGVzIGF1dG9tYXRpYyByZXRyeSB3aXRoIFJldHJ5LUFmdGVyIG9uIEhUVFAgNDI5ICh0aHJvdHRsaW5nKS4gTWF4aW11bSAzIHJldHJpZXMuCgo9Y3V0CgpzdWIgX0dyYXBoQmF0Y2hSZXF1ZXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRNYXhSZXRyaWVzID0gMzsKICAgIG15ICRVc2VyQWdlbnQgID0gTFdQOjpVc2VyQWdlbnQtPm5ldygpOwogICAgJFVzZXJBZ2VudC0+dGltZW91dCgzMCk7CgogICAgbXkgJFByb2R1Y3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2R1Y3QnKSB8fCAnWm51bnknOwogICAgbXkgJFZlcnNpb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1ZlcnNpb24nKSB8fCAnJzsKICAgICRVc2VyQWdlbnQtPmFnZW50KCIkUHJvZHVjdCAkVmVyc2lvbiAtIEV4b09vb1N5bmMiKTsKCiAgICBmb3IgbXkgJEF0dGVtcHQgKCAxIC4uICRNYXhSZXRyaWVzICsgMSApIHsKCiAgICAgICAgbXkgJFJlcXVlc3QgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoCiAgICAgICAgICAgICdQT1NUJywKICAgICAgICAgICAgJFBhcmFte1VSTH0sCiAgICAgICAgICAgIEhUVFA6OkhlYWRlcnMtPm5ldygKICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb24gID0+ICJCZWFyZXIgJFBhcmFte0FjY2Vzc1Rva2VufSIsCiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRQYXJhbXtCb2R5fSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVzcG9uc2UgICAgICAgID0gJFVzZXJBZ2VudC0+cmVxdWVzdCgkUmVxdWVzdCk7CiAgICAgICAgbXkgJFJlc3BvbnNlQ29udGVudCA9ICRSZXNwb25zZS0+ZGVjb2RlZF9jb250ZW50KCkgfHwgJyc7CgogICAgICAgICMgTm90IHRocm90dGxlZCAtIHJldHVybiBpbW1lZGlhdGVseS4KICAgICAgICBpZiAoICRSZXNwb25zZS0+Y29kZSgpICE9IDQyOSApIHsKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIFN0YXR1cyAgPT4gJFJlc3BvbnNlLT5zdGF0dXNfbGluZSgpLAogICAgICAgICAgICAgICAgQ29udGVudCA9PiBcJFJlc3BvbnNlQ29udGVudCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgVGhyb3R0bGVkIC0gY2hlY2sgaWYgd2UgY2FuIHJldHJ5LgogICAgICAgIGlmICggJEF0dGVtcHQgPiAkTWF4UmV0cmllcyApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFeG9Pb29TeW5jOiBHcmFwaCBBUEkgdGhyb3R0bGVkICg0MjkpIGFmdGVyICRNYXhSZXRyaWVzIHJldHJpZXMuIEdpdmluZyB1cC4iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgU3RhdHVzICA9PiAkUmVzcG9uc2UtPnN0YXR1c19saW5lKCksCiAgICAgICAgICAgICAgICBDb250ZW50ID0+IFwkUmVzcG9uc2VDb250ZW50LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBSZXNwZWN0IFJldHJ5LUFmdGVyIGhlYWRlciAoc2Vjb25kcykuIERlZmF1bHQgdG8gMTBzLgogICAgICAgIG15ICRSZXRyeUFmdGVyID0gJFJlc3BvbnNlLT5oZWFkZXIoJ1JldHJ5LUFmdGVyJykgfHwgMTA7CiAgICAgICAgJFJldHJ5QWZ0ZXIgPSBpbnQoJFJldHJ5QWZ0ZXIpOwogICAgICAgICRSZXRyeUFmdGVyID0gMTAgaWYgJFJldHJ5QWZ0ZXIgPCAxIHx8ICRSZXRyeUFmdGVyID4gMTIwOwoKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRXhvT29vU3luYzogR3JhcGggQVBJIHRocm90dGxlZCAoNDI5KS4gV2FpdGluZyAke1JldHJ5QWZ0ZXJ9cyBiZWZvcmUgcmV0cnkgJEF0dGVtcHQvJE1heFJldHJpZXMuIiwKICAgICAgICApOwoKICAgICAgICBzbGVlcCAkUmV0cnlBZnRlcjsKICAgIH0KCiAgICByZXR1cm4gKCk7Cn0KCj1oZWFkMiBfTG9va3VwR3JhcGhVc2VyQnlBdHRyaWJ1dGUoKQoKTG9va3MgdXAgYSB1c2VyIGluIE1pY3Jvc29mdCBHcmFwaCBieSBhIHNwZWNpZmllZCBhdHRyaWJ1dGUgKGUuZy4gbWFpbCwgb25QcmVtaXNlc1NhbUFjY291bnROYW1lKS4KUmV0dXJucyB0aGUgVVBOIG9yIG9iamVjdCBJRCBuZWVkZWQgZm9yIGZ1cnRoZXIgR3JhcGggQVBJIGNhbGxzLgoKICAgIG15ICRHcmFwaFVzZXJJRCA9ICRTZWxmLT5fTG9va3VwR3JhcGhVc2VyQnlBdHRyaWJ1dGUoCiAgICAgICAgQWNjZXNzVG9rZW4gPT4gJEFjY2Vzc1Rva2VuLAogICAgICAgIEF0dHJpYnV0ZSAgID0+ICdtYWlsJywgICAgICAgICAgICAgICAgICAjIG9yICdvblByZW1pc2VzU2FtQWNjb3VudE5hbWUnCiAgICAgICAgVmFsdWUgICAgICAgPT4gJ3VzZXJAZG9tYWluLmNvbScsICAgICAgICMgb3IgJ2pkb2UnCiAgICApOwoKPWN1dAoKc3ViIF9Mb29rdXBHcmFwaFVzZXJCeUF0dHJpYnV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRKU09OT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKICAgIG15ICRMb2dPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgIG15ICRXZWJVc2VyQWdlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViVXNlckFnZW50Jyk7CgogICAgbXkgJEF0dHJpYnV0ZSA9ICRQYXJhbXtBdHRyaWJ1dGV9OwogICAgbXkgJFZhbHVlICAgICA9ICRQYXJhbXtWYWx1ZX07CgogICAgIyBFc2NhcGUgc2luZ2xlIHF1b3RlcyBmb3IgT0RhdGEgZmlsdGVyIChPRGF0YSBzcGVjOiBkb3VibGUgdGhlIHF1b3RlKS4KICAgICRWYWx1ZSA9fiBzLycvJycvZzsKCiAgICAjIFVSSS1lbmNvZGUgdGhlIHZhbHVlIHRvIHByZXZlbnQgVVJMIGluamVjdGlvbiBmcm9tIHNwZWNpYWwgY2hhcmFjdGVycy4KICAgIG15ICRFbmNvZGVkVmFsdWUgPSB1cmlfZXNjYXBlKCRWYWx1ZSk7CgogICAgIyBTb21lIGF0dHJpYnV0ZXMgbGlrZSBvblByZW1pc2VzU2FtQWNjb3VudE5hbWUgcmVxdWlyZSBhZHZhbmNlZCBxdWVyeSBjYXBhYmlsaXRpZXMuCiAgICBteSAkVVJMID0gImh0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS92MS4wL3VzZXJzP1wkZmlsdGVyPSR7QXR0cmlidXRlfStlcSsnJEVuY29kZWRWYWx1ZScmXCRzZWxlY3Q9aWQsdXNlclByaW5jaXBhbE5hbWUmXCRjb3VudD10cnVlIjsKCiAgICBteSAlUmVzcG9uc2UgPSAkV2ViVXNlckFnZW50T2JqZWN0LT5SZXF1ZXN0KAogICAgICAgIFVSTCAgICA9PiAkVVJMLAogICAgICAgIFR5cGUgICA9PiAnR0VUJywKICAgICAgICBOb0xvZyAgPT4gMSwKICAgICAgICBIZWFkZXIgPT4gewogICAgICAgICAgICBBdXRob3JpemF0aW9uICAgID0+ICJCZWFyZXIgJFBhcmFte0FjY2Vzc1Rva2VufSIsCiAgICAgICAgICAgIENvbnNpc3RlbmN5TGV2ZWwgPT4gJ2V2ZW50dWFsJywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRSZXNwb25zZXtTdGF0dXN9ICF+IG17XjIwMH14ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4b09vb1N5bmM6IEdyYXBoIHVzZXIgbG9va3VwIGJ5ICRBdHRyaWJ1dGUgZmFpbGVkIGZvciAnJFZhbHVlJzogJFJlc3BvbnNle1N0YXR1c30iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICREYXRhID0gJEpTT05PYmplY3QtPkRlY29kZSgKICAgICAgICBEYXRhID0+ICR7ICRSZXNwb25zZXtDb250ZW50fSB9LAogICAgKTsKCiAgICBpZiAoICEkRGF0YSB8fCAhSXNBcnJheVJlZldpdGhEYXRhKCAkRGF0YS0+e3ZhbHVlfSApICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIHNjYWxhciBAeyAkRGF0YS0+e3ZhbHVlfSB9ICE9IDEgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4b09vb1N5bmM6IEV4cGVjdGVkIGV4YWN0bHkgb25lIHVzZXIgZm9yICRBdHRyaWJ1dGU9JyRWYWx1ZScsICIKICAgICAgICAgICAgICAgIC4gImZvdW5kICIgLiBzY2FsYXIgQHsgJERhdGEtPnt2YWx1ZX0gfSAuICIuIFNraXBwaW5nLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICREYXRhLT57dmFsdWV9WzBde3VzZXJQcmluY2lwYWxOYW1lfSB8fCAkRGF0YS0+e3ZhbHVlfVswXXtpZH07Cn0KCj1oZWFkMiBfVXBkYXRlVXNlck9vb1N0YXR1cygpCgpDb21wYXJlcyB0aGUgY3VycmVudCBabnVueSBPT08gc3RhdHVzIHdpdGggdGhlIEV4Y2hhbmdlIE9ubGluZSBzdGF0dXMgYW5kIHVwZGF0ZXMgaWYgZGlmZmVyZW50LgpMb2dzIGFsbCBjaGFuZ2VzLgoKICAgIG15ICRDaGFuZ2VkID0gJFNlbGYtPl9VcGRhdGVVc2VyT29vU3RhdHVzKAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICAgICAgVXNlckxvZ2luICAgID0+ICdqZG9lJywKICAgICAgICBHcmFwaE9vb0RhdGEgPT4gewogICAgICAgICAgICBPdXRPZk9mZmljZSA9PiAxLAogICAgICAgICAgICBTdGFydERhdGUgICA9PiAnMjAyNi0wMy0yMycsCiAgICAgICAgICAgIEVuZERhdGUgICAgID0+ICcyMDI2LTAzLTMwJywKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBfVXBkYXRlVXNlck9vb1N0YXR1cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgIG15ICRVc2VySUQgICAgPSAkUGFyYW17VXNlcklEfTsKICAgIG15ICRVc2VyTG9naW4gPSAkUGFyYW17VXNlckxvZ2lufTsKICAgIG15ICVHcmFwaERhdGEgPSAleyAkUGFyYW17R3JhcGhPb29EYXRhfSB9OwoKICAgICMgR2V0IGN1cnJlbnQgWm51bnkgT09PIHByZWZlcmVuY2VzLgogICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKCiAgICBteSAkQ3VycmVudE9vbyA9ICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZX0gfHwgMDsKICAgIG15ICROZXdPb28gICAgID0gJEdyYXBoRGF0YXtPdXRPZk9mZmljZX0gICAgfHwgMDsKCiAgICAjIEJ1aWxkIHRoZSBuZXcgcHJlZmVyZW5jZSB2YWx1ZXMuCiAgICBteSAlTmV3UHJlZnM7CiAgICAkTmV3UHJlZnN7T3V0T2ZPZmZpY2V9ID0gJE5ld09vbzsKCiAgICBpZiAoICROZXdPb28gJiYgJEdyYXBoRGF0YXtTdGFydERhdGV9ICYmICRHcmFwaERhdGF7RW5kRGF0ZX0gKSB7CiAgICAgICAgaWYgKCAkR3JhcGhEYXRhe1N0YXJ0RGF0ZX0gPX4gbXteKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkkfSApIHsKICAgICAgICAgICAgJE5ld1ByZWZze091dE9mT2ZmaWNlU3RhcnRZZWFyfSAgPSAkMTsKICAgICAgICAgICAgJE5ld1ByZWZze091dE9mT2ZmaWNlU3RhcnRNb250aH0gPSBpbnQoJDIpOwogICAgICAgICAgICAkTmV3UHJlZnN7T3V0T2ZPZmZpY2VTdGFydERheX0gICA9IGludCgkMyk7CiAgICAgICAgfQogICAgICAgIGlmICggJEdyYXBoRGF0YXtFbmREYXRlfSA9fiBte14oXGR7NH0pLShcZHsyfSktKFxkezJ9KSR9ICkgewogICAgICAgICAgICAkTmV3UHJlZnN7T3V0T2ZPZmZpY2VFbmRZZWFyfSAgPSAkMTsKICAgICAgICAgICAgJE5ld1ByZWZze091dE9mT2ZmaWNlRW5kTW9udGh9ID0gaW50KCQyKTsKICAgICAgICAgICAgJE5ld1ByZWZze091dE9mT2ZmaWNlRW5kRGF5fSAgID0gaW50KCQzKTsKICAgICAgICB9CiAgICB9CgogICAgIyBEZXRlcm1pbmUgY3VycmVudCB2YWx1ZXMgZm9yIGNvbXBhcmlzb24uCiAgICBteSAlQ3VycmVudFByZWZzID0gKAogICAgICAgIE91dE9mT2ZmaWNlICAgICAgICAgICA9PiAkQ3VycmVudE9vbywKICAgICAgICBPdXRPZk9mZmljZVN0YXJ0WWVhciAgPT4gJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlU3RhcnRZZWFyfSAgfHwgJycsCiAgICAgICAgT3V0T2ZPZmZpY2VTdGFydE1vbnRoID0+ICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZVN0YXJ0TW9udGh9IHx8ICcnLAogICAgICAgIE91dE9mT2ZmaWNlU3RhcnREYXkgICA9PiAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VTdGFydERheX0gICB8fCAnJywKICAgICAgICBPdXRPZk9mZmljZUVuZFllYXIgICAgPT4gJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlRW5kWWVhcn0gICAgfHwgJycsCiAgICAgICAgT3V0T2ZPZmZpY2VFbmRNb250aCAgID0+ICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZE1vbnRofSAgIHx8ICcnLAogICAgICAgIE91dE9mT2ZmaWNlRW5kRGF5ICAgICA9PiAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VFbmREYXl9ICAgICB8fCAnJywKICAgICk7CgogICAgIyBDaGVjayBpZiBhbnl0aGluZyBjaGFuZ2VkLgogICAgbXkgJEhhc0NoYW5nZXMgPSAwOwogICAgbXkgQENoYW5nZUxvZzsKCiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTmV3UHJlZnMgKSB7CiAgICAgICAgbXkgJE9sZFZhbCA9IGRlZmluZWQgJEN1cnJlbnRQcmVmc3skS2V5fSA/ICRDdXJyZW50UHJlZnN7JEtleX0gOiAnJzsKICAgICAgICBteSAkTmV3VmFsID0gZGVmaW5lZCAkTmV3UHJlZnN7JEtleX0gICAgICA/ICROZXdQcmVmc3skS2V5fSAgICAgIDogJyc7CgogICAgICAgIGlmICggIiRPbGRWYWwiIG5lICIkTmV3VmFsIiApIHsKICAgICAgICAgICAgJEhhc0NoYW5nZXMgPSAxOwogICAgICAgICAgICBwdXNoIEBDaGFuZ2VMb2csICIkS2V5OiAnJE9sZFZhbCcgLT4gJyROZXdWYWwnIjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEhhc0NoYW5nZXMgKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgIyBBcHBseSBjaGFuZ2VzLgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJU5ld1ByZWZzICkgewogICAgICAgICRVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICBWYWx1ZSAgPT4gJE5ld1ByZWZzeyRLZXl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBJZiBPT08gd2FzIGRlYWN0aXZhdGVkLCBhbHNvIGNsZWFyIHRoZSBkYXRlIGZpZWxkcyB0byBrZWVwIHRoaW5ncyBjbGVhbi4KICAgIGlmICggISROZXdPb28gJiYgJEN1cnJlbnRPb28gKSB7CiAgICAgICAgZm9yIG15ICRLZXkgKAogICAgICAgICAgICBxdyhPdXRPZk9mZmljZVN0YXJ0WWVhciBPdXRPZk9mZmljZVN0YXJ0TW9udGggT3V0T2ZPZmZpY2VTdGFydERheQogICAgICAgICAgICBPdXRPZk9mZmljZUVuZFllYXIgT3V0T2ZPZmZpY2VFbmRNb250aCBPdXRPZk9mZmljZUVuZERheSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAhZXhpc3RzICROZXdQcmVmc3skS2V5fSApIHsKICAgICAgICAgICAgICAgICRVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDaGFuZ2VMb2dTdHIgPSBqb2luKCAnLCAnLCBAQ2hhbmdlTG9nICk7CiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4b09vb1N5bmM6IFVwZGF0ZWQgdXNlciAnJFVzZXJMb2dpbicgKElEOiAkVXNlcklEKTogJENoYW5nZUxvZ1N0ciIsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Permission="660" Location="Kernel/System/Console/Command/Maint/ExoOooSync/Run.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6RXhvT29vU3luYzo6UnVuOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RXhvT29vU3luYycsCik7CgpzdWIgQ29uZmlndXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdTeW5jaHJvbml6ZSBPdXQtb2YtT2ZmaWNlIHN0YXR1cyBmcm9tIEV4Y2hhbmdlIE9ubGluZSB0byBabnVueS4nKTsKCiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdmb3JjZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1J1biBzeW5jaHJvbml6YXRpb24gZXZlbiBpZiB0aGUgZmVhdHVyZSBpcyBkaXNhYmxlZCBpbiBTeXNDb25maWcuJywKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDAsCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFByZVJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRTZWxmLT5HZXRPcHRpb24oJ2ZvcmNlJykgKSB7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdFeG9Pb29TeW5jOjpFbmFibGVkJykgKSB7CiAgICAgICAgICAgIGRpZSAiRXhvT29vU3luYyBpcyBkaXNhYmxlZCBpbiBTeXNDb25maWcuIFVzZSAtLWZvcmNlIHRvIHJ1biBhbnl3YXkuXG4iOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5TdGFydGluZyBFeGNoYW5nZSBPbmxpbmUgT3V0LW9mLU9mZmljZSBzeW5jaHJvbml6YXRpb24uLi48L3llbGxvdz5cbiIpOwoKICAgICMgVGVtcG9yYXJpbHkgZW5hYmxlIHRoZSBmZWF0dXJlIGlmIC0tZm9yY2UgaXMgdXNlZCwgc28gdGhhdCBSdW4oKSBkb2Vzbid0IGJhaWwgb3V0LgogICAgaWYgKCAkU2VsZi0+R2V0T3B0aW9uKCdmb3JjZScpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPlNldCgKICAgICAgICAgICAgS2V5ICAgPT4gJ0V4b09vb1N5bmM6OkVuYWJsZWQnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEV4b09vb1N5bmNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RXhvT29vU3luYycpOwogICAgbXkgJFN1Y2Nlc3MgPSAkRXhvT29vU3luY09iamVjdC0+UnVuKCk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIlN5bmNocm9uaXphdGlvbiBmYWlsZWQuIENoZWNrIHRoZSBzeXN0ZW0gbG9nIGZvciBkZXRhaWxzLlxuIik7CiAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7CiAgICB9CgogICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+U3luY2hyb25pemF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuPC9ncmVlbj5cbiIpOwogICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7Cn0KCjE7Cg==</File>
        <File Permission="660" Location="Kernel/Output/HTML/Notification/ExoOooSyncCheck.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb246OkV4b09vb1N5bmNDaGVjazsKCnVzZSBwYXJlbnQgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb246Ok91dG9mT2ZmaWNlQ2hlY2snOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb246OkV4b09vb1N5bmNDaGVjayAtIE91dC1vZi1PZmZpY2UgYmFubmVyIG92ZXJyaWRlCgo9aGVhZDEgREVTQ1JJUFRJT04KClJlcGxhY2VzIFpudW55J3MgbmF0aXZlIG91dC1vZi1vZmZpY2UgYmFubmVyICh3aGljaCBsaW5rcyB0byBhICJkaXNhYmxlCml0IGhlcmUiIHByZWZlcmVuY2VzIHBhZ2UpIHdpdGggb25lIHRoYXQgZXhwbGFpbnMgdGhlIHN0YXR1cyBpcyBzeW5jZWQKYXV0b21hdGljYWxseSBmcm9tIEV4Y2hhbmdlIE9ubGluZS4gTWFudWFsbHkgdHVybmluZyBpdCBvZmYgaW4gWm51bnkKd291bGQgYmUgcG9pbnRsZXNzIHdoaWxlIHRoZSBzeW5jIGlzIGVuYWJsZWQgLSB0aGUgbmV4dCBzY2hlZHVsZWQgc3luYwpydW4ganVzdCB0dXJucyBpdCBiYWNrIG9uIGZyb20gd2hhdCBFeGNoYW5nZSByZXBvcnRzLgoKSWYgRXhvT29vU3luYzo6RW5hYmxlZCBpcyBvZmYsIGZhbGxzIGJhY2sgZW50aXJlbHkgdG8gdGhlIG5hdGl2ZQpiZWhhdmlvciBhbmQgbGluayB2aWEgU1VQRVI6OlJ1bigpIC0gbG9jYWwgZWRpdGluZyBpcyBtZWFuaW5nZnVsIGFnYWluCm9uY2Ugbm90aGluZyBpcyBvdmVyd3JpdGluZyBpdC4KCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICByZXR1cm4gJFNlbGYtPlNVUEVSOjpSdW4oJVBhcmFtKSBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCdFeG9Pb29TeW5jOjpFbmFibGVkJyk7CgogICAgbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0gKTsKICAgIHJldHVybiAnJyBpZiAhJFVzZXJEYXRhe091dE9mT2ZmaWNlfTsKCiAgICBteSAkQ3VyU3lzdGVtRFRPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgIG15ICRPT09TdGFydERUT2JqZWN0ICA9ICRTZWxmLT5fR2V0T3V0T2ZPZmZpY2VEYXRlVGltZU9iamVjdCggVXNlckRhdGEgPT4gXCVVc2VyRGF0YSwgVHlwZSA9PiAnU3RhcnQnICk7CiAgICBteSAkT09PRW5kRFRPYmplY3QgICAgPSAkU2VsZi0+X0dldE91dE9mT2ZmaWNlRGF0ZVRpbWVPYmplY3QoIFVzZXJEYXRhID0+IFwlVXNlckRhdGEsIFR5cGUgPT4gJ0VuZCcgKTsKCiAgICByZXR1cm4gJycgaWYgISggJE9PT1N0YXJ0RFRPYmplY3QgPCAkQ3VyU3lzdGVtRFRPYmplY3QgJiYgJE9PT0VuZERUT2JqZWN0ID4gJEN1clN5c3RlbURUT2JqZWN0ICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIE5vIExpbmsgLSB1bmxpa2UgdGhlIG5hdGl2ZSBiYW5uZXIsIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRvIGNsaWNrCiAgICAjIHRvIHR1cm4gb2ZmOyBpdCB3b3VsZCBqdXN0IGJlIHJlLWVuYWJsZWQgYnkgdGhlIG5leHQgc3luYyBydW4uCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgIFByaW9yaXR5ID0+ICdOb3RpY2UnLAogICAgICAgIERhdGEgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJ091dCBvZiBPZmZpY2UgaXMgYWN0aXZlLCBzeW5jZWQgYXV0b21hdGljYWxseSBmcm9tIEV4Y2hhbmdlIE9ubGluZSAtIG1hbmFnZSBpdCBpbiBPdXRsb29rLCBub3QgaGVyZS4nCiAgICAgICAgKSwKICAgICk7Cn0KCjE7Cg==</File>
        <File Permission="660" Location="Kernel/Language/de_ExoOooSync.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0V4b09vb1N5bmM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBFeGNoYW5nZSBPbmxpbmUgT3V0LW9mLU9mZmljZSBzeW5jaHJvbml6YXRpb24uIE5vdGU6IGRpc2FibGluZyB0aGlzIGRvZXMgTk9UIGF1dG9tYXRpY2FsbHkgcmVzdG9yZSBhZ2VudHNcJyBhYmlsaXR5IHRvIGVkaXQgdGhlaXIgT3V0IE9mIE9mZmljZSB0aW1lIGxvY2FsbHkgLSBQcmVmZXJlbmNlc0dyb3VwcyMjI091dE9mT2ZmaWNlIyMjQWN0aXZlIHdhcyBzZXQgdG8gMCBieSB0aGlzIGFkZC1vbiAoc2luY2UgbG9jYWwgZWRpdHMgd291bGQgb3RoZXJ3aXNlIGp1c3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIHN5bmMpIGFuZCBuZWVkcyB0byBiZSBzZXQgYmFjayB0byAxIGJ5IGhhbmQgaWYgYWdlbnRzIHNob3VsZCBtYW5hZ2UgaXQgdGhlbXNlbHZlcyBhZ2Fpbi4gVGhlIGhlYWRlciBub3RpZmljYXRpb24gYmFubmVyIHRleHQgZG9lcyBzd2l0Y2ggYmFjayB0byBabnVueVwncyBuYXRpdmUgImRpc2FibGUgaXQgaGVyZSIgbWVzc2FnZSBhbmQgbGluayBhdXRvbWF0aWNhbGx5Lid9CiAgICAgICAgPSAnQWt0aXZpZXJ0IG9kZXIgZGVha3RpdmllcnQgZGllIEV4Y2hhbmdlIE9ubGluZSBBYndlc2VuaGVpdHNhc3Npc3RlbnQtU3luY2hyb25pc2F0aW9uLiBIaW53ZWlzOiBEYXMgRGVha3RpdmllcmVuIHN0ZWxsdCBOSUNIVCBhdXRvbWF0aXNjaCBkaWUgTW9lZ2xpY2hrZWl0IGZ1ZXIgQWdlbnRlbiB3aWVkZXIgaGVyLCBpaHJlIEFid2VzZW5oZWl0c3plaXQgbG9rYWwgenUgYmVhcmJlaXRlbiAtIFByZWZlcmVuY2VzR3JvdXBzIyMjT3V0T2ZPZmZpY2UjIyNBY3RpdmUgd3VyZGUgdm9uIGRpZXNlbSBBZGQtb24gYXVmIDAgZ2VzZXR6dCAoZGEgbG9rYWxlIEFlbmRlcnVuZ2VuIHNvbnN0IGVpbmZhY2ggdm9uIGRlciBTeW5jaHJvbmlzYXRpb24gdWViZXJzY2hyaWViZW4gd3VlcmRlbikgdW5kIG11c3Mgdm9uIEhhbmQgd2llZGVyIGF1ZiAxIGdlc2V0enQgd2VyZGVuLCB3ZW5uIEFnZW50ZW4gZGllcyB3aWVkZXIgc2VsYnN0IHZlcndhbHRlbiBzb2xsZW4uIERlciBIaW53ZWlzdGV4dCBpbSBIZWFkZXIgd2VjaHNlbHQgYXV0b21hdGlzY2ggenVydWVjayB6dSBabnVueXMgbmF0aXZlciAiaGllciBkZWFrdGl2aWVyZW4iLU1lbGR1bmcgbWl0IExpbmsuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgQXp1cmUgQUQgKEVudHJhIElEKSBUZW5hbnQgSUQgZm9yIE9BdXRoMiBhdXRoZW50aWNhdGlvbi4nfQogICAgICAgID0gJ0RpZSBBenVyZSBBRCAoRW50cmEgSUQpIE1hbmRhbnRlbi1JRCBmw7xyIGRpZSBPQXV0aDItQXV0aGVudGlmaXppZXJ1bmcuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgQXp1cmUgQUQgKEVudHJhIElEKSBBcHBsaWNhdGlvbiAoQ2xpZW50KSBJRCBmb3IgT0F1dGgyIGF1dGhlbnRpY2F0aW9uLid9CiAgICAgICAgPSAnRGllIEF6dXJlIEFEIChFbnRyYSBJRCkgQ2xpZW50LUlEIChBbndlbmR1bmdzLUlEKSBmw7xyIGRpZSBPQXV0aDItQXV0aGVudGlmaXppZXJ1bmcuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgQXp1cmUgQUQgKEVudHJhIElEKSBDbGllbnQgU2VjcmV0IGZvciBPQXV0aDIgYXV0aGVudGljYXRpb24uJ30KICAgICAgICA9ICdEYXMgQXp1cmUgQUQgKEVudHJhIElEKSBDbGllbnQtR2VoZWltbmlzIGbDvHIgZGllIE9BdXRoMi1BdXRoZW50aWZpemllcnVuZy4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaG93IFpudW55IHVzZXJzIGFyZSBtYXRjaGVkIHRvIEV4Y2hhbmdlIE9ubGluZSBtYWlsYm94ZXMuIFwnVXNlckxvZ2luX1NBTVwnOiBabnVueSBVc2VyTG9naW4gaXMgbG9va2VkIHVwIHZpYSBvblByZW1pc2VzU2FtQWNjb3VudE5hbWUgaW4gRW50cmEgSUQgKHdvcmtzIHdoZW4gVXNlckxvZ2luIGVxdWFscyB0aGUgQUQgc0FNQWNjb3VudE5hbWUpLiBcJ1VzZXJFbWFpbF9VUE5cJzogWm51bnkgVXNlckVtYWlsIGVxdWFscyB0aGUgVVBOIGluIEV4Y2hhbmdlIChkaXJlY3QgbG9va3VwLCBtb3N0IGVmZmljaWVudCkuIFwnVXNlckVtYWlsX1ByaW1hcnlTTVRQXCc6IFpudW55IFVzZXJFbWFpbCBpcyBsb29rZWQgdXAgdmlhIG1haWwgYXR0cmlidXRlIGluIEVudHJhIElELid9CiAgICAgICAgPSAnRGVmaW5pZXJ0LCB3aWUgWm51bnktQmVudXR6ZXIgZGVuIEV4Y2hhbmdlIE9ubGluZS1Qb3N0ZsOkY2hlcm4genVnZW9yZG5ldCB3ZXJkZW4uIFwnVXNlckxvZ2luX1NBTVwnOiBabnVueSBVc2VyTG9naW4gd2lyZCDDvGJlciBvblByZW1pc2VzU2FtQWNjb3VudE5hbWUgaW4gRW50cmEgSUQgZ2VzdWNodCAoZnVua3Rpb25pZXJ0IHdlbm4gVXNlckxvZ2luIGRlbSBBRCBzQU1BY2NvdW50TmFtZSBlbnRzcHJpY2h0KS4gXCdVc2VyRW1haWxfVVBOXCc6IFpudW55IFVzZXJFbWFpbCBlbnRzcHJpY2h0IGRlbSBVUE4gaW4gRXhjaGFuZ2UgKGRpcmVrdGUgWnVvcmRudW5nLCBhbSBlZmZpemllbnRlc3RlbikuIFwnVXNlckVtYWlsX1ByaW1hcnlTTVRQXCc6IFpudW55IFVzZXJFbWFpbCB3aXJkIMO8YmVyIGRhcyBtYWlsLUF0dHJpYnV0IGluIEVudHJhIElEIGdlc3VjaHQuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydabnVueSBVc2VyTG9naW4gLT4gRW50cmEgSUQgb25QcmVtaXNlc1NhbUFjY291bnROYW1lJ30KICAgICAgICA9ICdabnVueSBVc2VyTG9naW4gLT4gRW50cmEgSUQgb25QcmVtaXNlc1NhbUFjY291bnROYW1lJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydabnVueSBFbWFpbCA9IEV4Y2hhbmdlIFVQTiAoZGlyZWN0KSd9CiAgICAgICAgPSAnWm51bnktRS1NYWlsID0gRXhjaGFuZ2UgVVBOIChkaXJla3QpJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydabnVueSBFbWFpbCAtPiBFbnRyYSBJRCBtYWlsIChQcmltYXJ5IFNNVFApJ30KICAgICAgICA9ICdabnVueS1FLU1haWwgLT4gRW50cmEgSUQgbWFpbCAoUHJpbcOkcmUgU01UUC1BZHJlc3NlKSc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgc2V0LCBvbmx5IGFnZW50cyB3aG9zZSBlbWFpbCBhZGRyZXNzIG1hdGNoZXMgb25lIG9mIHRoZXNlIGRvbWFpbnMgd2lsbCBiZSBzeW5jaHJvbml6ZWQuIExlYXZlIGVtcHR5IHRvIHN5bmMgYWxsIHZhbGlkIGFnZW50cy4gRXhhbXBsZTogY29tcGFueS5jb20sIHN1YnNpZGlhcnkub3JnJ30KICAgICAgICA9ICdXZW5uIGdlc2V0enQsIHdlcmRlbiBudXIgQWdlbnRlbiBzeW5jaHJvbmlzaWVydCwgZGVyZW4gRS1NYWlsLUFkcmVzc2UgZWluZXIgZGllc2VyIERvbcOkbmVuIGVudHNwcmljaHQuIExlZXIgbGFzc2VuLCB1bSBhbGxlIGfDvGx0aWdlbiBBZ2VudGVuIHp1IHN5bmNocm9uaXNpZXJlbi4gQmVpc3BpZWw6IGZpcm1hLmRlLCB0b2NodGVyLm9yZyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3luY2hyb25pemVzIE91dC1vZi1PZmZpY2Ugc3RhdHVzIGZyb20gRXhjaGFuZ2UgT25saW5lIHRvIFpudW55IGR1cmluZyB3b3JrIGhvdXJzIChNb24tRnJpIDA2OjAwLTE4OjAwLCBldmVyeSAxNSBtaW51dGVzKS4nfQogICAgICAgID0gJ1N5bmNocm9uaXNpZXJ0IGRlbiBBYndlc2VuaGVpdHNzdGF0dXMgdm9uIEV4Y2hhbmdlIE9ubGluZSBuYWNoIFpudW55IHdhZWhyZW5kIGRlciBBcmJlaXRzemVpdCAoTW8tRnIgMDY6MDAtMTg6MDAgVWhyLCBhbGxlIDE1IE1pbnV0ZW4pLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3luY2hyb25pemVzIE91dC1vZi1PZmZpY2Ugc3RhdHVzIGZyb20gRXhjaGFuZ2UgT25saW5lIHRvIFpudW55IGV2ZXJ5IGZ1bGwgaG91ciAoY292ZXJzIG9mZi1ob3VycyBhbmQgd2Vla2VuZHM7IGR1cmluZyB3b3JrIGhvdXJzIGNvbXBsZW1lbnRzIHRoZSAxNS1taW51dGUgdGFzaykuJ30KICAgICAgICA9ICdTeW5jaHJvbmlzaWVydCBkZW4gQWJ3ZXNlbmhlaXRzc3RhdHVzIHZvbiBFeGNoYW5nZSBPbmxpbmUgbmFjaCBabnVueSB6dXIgdm9sbGVuIFN0dW5kZSAoZGVja3QgUmFuZHplaXRlbiB1bmQgV29jaGVuZW5kZW4gYWI7IGVyZ2Flbnp0IHdhZWhyZW5kIGRlciBBcmJlaXRzemVpdCBkZW4gMTUtTWludXRlbi1UYXNrKS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J091dCBvZiBPZmZpY2UgaXMgYWN0aXZlLCBzeW5jZWQgYXV0b21hdGljYWxseSBmcm9tIEV4Y2hhbmdlIE9ubGluZSAtIG1hbmFnZSBpdCBpbiBPdXRsb29rLCBub3QgaGVyZS4nfQogICAgICAgID0gJ0Fid2VzZW5oZWl0IGlzdCBha3RpdiwgYXV0b21hdGlzY2ggc3luY2hyb25pc2llcnQgYXVzIEV4Y2hhbmdlIE9ubGluZSAtIGJpdHRlIGluIE91dGxvb2sgdmVyd2FsdGVuLCBuaWNodCBoaWVyLic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>

        <!-- Unit Tests -->
        <File Permission="660" Location="scripts/test/ExoOooSync/ExoOooSync.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXI7CgojIEdldCBoZWxwZXIgb2JqZWN0LgpteSAkSGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVGVzdDogTW9kdWxlIExvYWRpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICctLS0gTW9kdWxlIExvYWRpbmcgVGVzdHMgLS0tJywKKTsKCm15ICRFeG9Pb29TeW5jT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkV4b09vb1N5bmMnKTsKCiRTZWxmLT5UcnVlKAogICAgJEV4b09vb1N5bmNPYmplY3QsCiAgICAnRXhvT29vU3luYyBvYmplY3QgY3JlYXRlZCBzdWNjZXNzZnVsbHknLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUZXN0OiBfR2V0RXhjaGFuZ2VJZGVudGlmaWVyKCkKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICctLS0gX0dldEV4Y2hhbmdlSWRlbnRpZmllciBUZXN0cyAtLS0nLAopOwoKIyBUZXN0IFVzZXJFbWFpbF9VUE4gbW9kZSAtIHNob3VsZCByZXR1cm4gVXNlckVtYWlsLgp7CiAgICBteSAkSWRlbnRpZmllciA9ICRFeG9Pb29TeW5jT2JqZWN0LT5fR2V0RXhjaGFuZ2VJZGVudGlmaWVyKAogICAgICAgIFVzZXJEYXRhID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luID0+ICdqZG9lJywKICAgICAgICAgICAgVXNlckVtYWlsID0+ICdqb2huLmRvZUBleGFtcGxlLmNvbScsCiAgICAgICAgfSwKICAgICAgICBNYXBwaW5nTW9kZSA9PiAnVXNlckVtYWlsX1VQTicsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkSWRlbnRpZmllciwKICAgICAgICAnam9obi5kb2VAZXhhbXBsZS5jb20nLAogICAgICAgICdfR2V0RXhjaGFuZ2VJZGVudGlmaWVyKCkgLSBVc2VyRW1haWxfVVBOIHJldHVybnMgVXNlckVtYWlsJywKICAgICk7Cn0KCiMgVGVzdCBVc2VyRW1haWxfUHJpbWFyeVNNVFAgbW9kZSAtIHNob3VsZCBhbHNvIHJldHVybiBVc2VyRW1haWwuCnsKICAgIG15ICRJZGVudGlmaWVyID0gJEV4b09vb1N5bmNPYmplY3QtPl9HZXRFeGNoYW5nZUlkZW50aWZpZXIoCiAgICAgICAgVXNlckRhdGEgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gPT4gJ2pkb2UnLAogICAgICAgICAgICBVc2VyRW1haWwgPT4gJ2pvaG4uZG9lQGV4YW1wbGUuY29tJywKICAgICAgICB9LAogICAgICAgIE1hcHBpbmdNb2RlID0+ICdVc2VyRW1haWxfUHJpbWFyeVNNVFAnLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJElkZW50aWZpZXIsCiAgICAgICAgJ2pvaG4uZG9lQGV4YW1wbGUuY29tJywKICAgICAgICAnX0dldEV4Y2hhbmdlSWRlbnRpZmllcigpIC0gVXNlckVtYWlsX1ByaW1hcnlTTVRQIHJldHVybnMgVXNlckVtYWlsJywKICAgICk7Cn0KCiMgVGVzdCBVc2VyTG9naW5fU0FNIG1vZGUgLSBzaG91bGQgcmV0dXJuIFVzZXJMb2dpbi4KewogICAgbXkgJElkZW50aWZpZXIgPSAkRXhvT29vU3luY09iamVjdC0+X0dldEV4Y2hhbmdlSWRlbnRpZmllcigKICAgICAgICBVc2VyRGF0YSA9PiB7CiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAnamRvZScsCiAgICAgICAgICAgIFVzZXJFbWFpbCA9PiAnam9obi5kb2VAZXhhbXBsZS5jb20nLAogICAgICAgIH0sCiAgICAgICAgTWFwcGluZ01vZGUgPT4gJ1VzZXJMb2dpbl9TQU0nLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJElkZW50aWZpZXIsCiAgICAgICAgJ2pkb2UnLAogICAgICAgICdfR2V0RXhjaGFuZ2VJZGVudGlmaWVyKCkgLSBVc2VyTG9naW5fU0FNIHJldHVybnMgVXNlckxvZ2luJywKICAgICk7Cn0KCiMgVGVzdCB3aXRoIG1pc3NpbmcgZW1haWwgLSBzaG91bGQgcmV0dXJuIHVuZGVmLgp7CiAgICBteSAkSWRlbnRpZmllciA9ICRFeG9Pb29TeW5jT2JqZWN0LT5fR2V0RXhjaGFuZ2VJZGVudGlmaWVyKAogICAgICAgIFVzZXJEYXRhID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luID0+ICdqZG9lJywKICAgICAgICAgICAgVXNlckVtYWlsID0+ICcnLAogICAgICAgIH0sCiAgICAgICAgTWFwcGluZ01vZGUgPT4gJ1VzZXJFbWFpbF9VUE4nLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJElkZW50aWZpZXIsCiAgICAgICAgJ19HZXRFeGNoYW5nZUlkZW50aWZpZXIoKSAtIEVtcHR5IFVzZXJFbWFpbCByZXR1cm5zIHVuZGVmJywKICAgICk7Cn0KCiMgVGVzdCB3aXRoIG1pc3NpbmcgbG9naW4gLSBzaG91bGQgcmV0dXJuIHVuZGVmLgp7CiAgICBteSAkSWRlbnRpZmllciA9ICRFeG9Pb29TeW5jT2JqZWN0LT5fR2V0RXhjaGFuZ2VJZGVudGlmaWVyKAogICAgICAgIFVzZXJEYXRhID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luID0+ICcnLAogICAgICAgICAgICBVc2VyRW1haWwgPT4gJ2pvaG4uZG9lQGV4YW1wbGUuY29tJywKICAgICAgICB9LAogICAgICAgIE1hcHBpbmdNb2RlID0+ICdVc2VyTG9naW5fU0FNJywKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRJZGVudGlmaWVyLAogICAgICAgICdfR2V0RXhjaGFuZ2VJZGVudGlmaWVyKCkgLSBFbXB0eSBVc2VyTG9naW4gcmV0dXJucyB1bmRlZiBmb3IgU0FNIG1vZGUnLAogICAgKTsKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUZXN0OiBfVXBkYXRlVXNlck9vb1N0YXR1cygpIC0gRW5hYmxlIE9PTwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKJFNlbGYtPlRydWUoCiAgICAxLAogICAgJy0tLSBfVXBkYXRlVXNlck9vb1N0YXR1cyBUZXN0cyAtLS0nLAopOwoKIyBDcmVhdGUgYSB0ZXN0IHVzZXIgZm9yIE9PTyB1cGRhdGVzLgpteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7Cm15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdFVzZXJDcmVhdGUoKTsKCm15ICRUZXN0VXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCik7CgokU2VsZi0+VHJ1ZSgKICAgICRUZXN0VXNlcklELAogICAgIlRlc3QgdXNlciBjcmVhdGVkOiAkVGVzdFVzZXJMb2dpbiAoSUQ6ICRUZXN0VXNlcklEKSIsCik7CgojIEVuc3VyZSBPT08gaXMgb2ZmIGluaXRpYWxseS4KJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgVXNlcklEID0+ICRUZXN0VXNlcklELAogICAgS2V5ICAgID0+ICdPdXRPZk9mZmljZScsCiAgICBWYWx1ZSAgPT4gMCwKKTsKCiMgVGVzdDogRW5hYmxlIE9PTyB3aXRoIHNjaGVkdWxlZCBkYXRlcy4KewogICAgbXkgJENoYW5nZWQgPSAkRXhvT29vU3luY09iamVjdC0+X1VwZGF0ZVVzZXJPb29TdGF0dXMoCiAgICAgICAgVXNlcklEICAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgIFVzZXJMb2dpbiAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICBHcmFwaE9vb0RhdGEgPT4gewogICAgICAgICAgICBPdXRPZk9mZmljZSA9PiAxLAogICAgICAgICAgICBTdGFydERhdGUgICA9PiAnMjAyNi0wMy0yMCcsCiAgICAgICAgICAgIEVuZERhdGUgICAgID0+ICcyMDI2LTAzLTMwJywKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlZCwKICAgICAgICAnX1VwZGF0ZVVzZXJPb29TdGF0dXMoKSAtIEVuYWJsZSBPT08gcmV0dXJucyBDaGFuZ2VkPTEnLAogICAgKTsKCiAgICAjIFZlcmlmeSBwcmVmZXJlbmNlcyB3ZXJlIHNldC4KICAgIG15ICVQcmVmcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcyggVXNlcklEID0+ICRUZXN0VXNlcklEICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRQcmVmc3tPdXRPZk9mZmljZX0sCiAgICAgICAgMSwKICAgICAgICAnX1VwZGF0ZVVzZXJPb29TdGF0dXMoKSAtIE91dE9mT2ZmaWNlIHByZWZlcmVuY2UgaXMgMScsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUHJlZnN7T3V0T2ZPZmZpY2VTdGFydFllYXJ9LAogICAgICAgIDIwMjYsCiAgICAgICAgJ19VcGRhdGVVc2VyT29vU3RhdHVzKCkgLSBPdXRPZk9mZmljZVN0YXJ0WWVhciBpcyAyMDI2JywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRQcmVmc3tPdXRPZk9mZmljZVN0YXJ0TW9udGh9LAogICAgICAgIDMsCiAgICAgICAgJ19VcGRhdGVVc2VyT29vU3RhdHVzKCkgLSBPdXRPZk9mZmljZVN0YXJ0TW9udGggaXMgMycsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUHJlZnN7T3V0T2ZPZmZpY2VTdGFydERheX0sCiAgICAgICAgMjAsCiAgICAgICAgJ19VcGRhdGVVc2VyT29vU3RhdHVzKCkgLSBPdXRPZk9mZmljZVN0YXJ0RGF5IGlzIDIwJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRQcmVmc3tPdXRPZk9mZmljZUVuZFllYXJ9LAogICAgICAgIDIwMjYsCiAgICAgICAgJ19VcGRhdGVVc2VyT29vU3RhdHVzKCkgLSBPdXRPZk9mZmljZUVuZFllYXIgaXMgMjAyNicsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUHJlZnN7T3V0T2ZPZmZpY2VFbmRNb250aH0sCiAgICAgICAgMywKICAgICAgICAnX1VwZGF0ZVVzZXJPb29TdGF0dXMoKSAtIE91dE9mT2ZmaWNlRW5kTW9udGggaXMgMycsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUHJlZnN7T3V0T2ZPZmZpY2VFbmREYXl9LAogICAgICAgIDMwLAogICAgICAgICdfVXBkYXRlVXNlck9vb1N0YXR1cygpIC0gT3V0T2ZPZmZpY2VFbmREYXkgaXMgMzAnLAogICAgKTsKfQoKIyBUZXN0OiBObyBjaGFuZ2Ugd2hlbiBzYW1lIGRhdGEgaXMgYXBwbGllZCBhZ2Fpbi4KewogICAgbXkgJENoYW5nZWQgPSAkRXhvT29vU3luY09iamVjdC0+X1VwZGF0ZVVzZXJPb29TdGF0dXMoCiAgICAgICAgVXNlcklEICAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgIFVzZXJMb2dpbiAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICBHcmFwaE9vb0RhdGEgPT4gewogICAgICAgICAgICBPdXRPZk9mZmljZSA9PiAxLAogICAgICAgICAgICBTdGFydERhdGUgICA9PiAnMjAyNi0wMy0yMCcsCiAgICAgICAgICAgIEVuZERhdGUgICAgID0+ICcyMDI2LTAzLTMwJywKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJENoYW5nZWQsCiAgICAgICAgJ19VcGRhdGVVc2VyT29vU3RhdHVzKCkgLSBTYW1lIGRhdGEgYXBwbGllZCBhZ2FpbiByZXR1cm5zIENoYW5nZWQ9MCcsCiAgICApOwp9CgojIFRlc3Q6IFVwZGF0ZSBlbmQgZGF0ZSBvbmx5Lgp7CiAgICBteSAkQ2hhbmdlZCA9ICRFeG9Pb29TeW5jT2JqZWN0LT5fVXBkYXRlVXNlck9vb1N0YXR1cygKICAgICAgICBVc2VySUQgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgVXNlckxvZ2luICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgIEdyYXBoT29vRGF0YSA9PiB7CiAgICAgICAgICAgIE91dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgICAgIFN0YXJ0RGF0ZSAgID0+ICcyMDI2LTAzLTIwJywKICAgICAgICAgICAgRW5kRGF0ZSAgICAgPT4gJzIwMjYtMDQtMDUnLAogICAgICAgIH0sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VkLAogICAgICAgICdfVXBkYXRlVXNlck9vb1N0YXR1cygpIC0gQ2hhbmdlZCBlbmQgZGF0ZSByZXR1cm5zIENoYW5nZWQ9MScsCiAgICApOwoKICAgIG15ICVQcmVmcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcyggVXNlcklEID0+ICRUZXN0VXNlcklEICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRQcmVmc3tPdXRPZk9mZmljZUVuZE1vbnRofSwKICAgICAgICA0LAogICAgICAgICdfVXBkYXRlVXNlck9vb1N0YXR1cygpIC0gT3V0T2ZPZmZpY2VFbmRNb250aCB1cGRhdGVkIHRvIDQnLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFByZWZze091dE9mT2ZmaWNlRW5kRGF5fSwKICAgICAgICA1LAogICAgICAgICdfVXBkYXRlVXNlck9vb1N0YXR1cygpIC0gT3V0T2ZPZmZpY2VFbmREYXkgdXBkYXRlZCB0byA1JywKICAgICk7Cn0KCiMgVGVzdDogRGlzYWJsZSBPT08uCnsKICAgIG15ICRDaGFuZ2VkID0gJEV4b09vb1N5bmNPYmplY3QtPl9VcGRhdGVVc2VyT29vU3RhdHVzKAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICBVc2VyTG9naW4gICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgR3JhcGhPb29EYXRhID0+IHsKICAgICAgICAgICAgT3V0T2ZPZmZpY2UgPT4gMCwKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlZCwKICAgICAgICAnX1VwZGF0ZVVzZXJPb29TdGF0dXMoKSAtIERpc2FibGUgT09PIHJldHVybnMgQ2hhbmdlZD0xJywKICAgICk7CgogICAgbXkgJVByZWZzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKCBVc2VySUQgPT4gJFRlc3RVc2VySUQgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFByZWZze091dE9mT2ZmaWNlfSwKICAgICAgICAwLAogICAgICAgICdfVXBkYXRlVXNlck9vb1N0YXR1cygpIC0gT3V0T2ZPZmZpY2UgcHJlZmVyZW5jZSBpcyAwJywKICAgICk7CgogICAgIyBEYXRlIGZpZWxkcyBzaG91bGQgYmUgY2xlYXJlZC4KICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkUHJlZnN7T3V0T2ZPZmZpY2VTdGFydFllYXJ9LAogICAgICAgICdfVXBkYXRlVXNlck9vb1N0YXR1cygpIC0gU3RhcnRZZWFyIGNsZWFyZWQgYWZ0ZXIgZGlzYWJsZScsCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkUHJlZnN7T3V0T2ZPZmZpY2VFbmRZZWFyfSwKICAgICAgICAnX1VwZGF0ZVVzZXJPb29TdGF0dXMoKSAtIEVuZFllYXIgY2xlYXJlZCBhZnRlciBkaXNhYmxlJywKICAgICk7Cn0KCiMgVGVzdDogRGlzYWJsZSB3aGVuIGFscmVhZHkgZGlzYWJsZWQgLSBubyBjaGFuZ2UuCnsKICAgIG15ICRDaGFuZ2VkID0gJEV4b09vb1N5bmNPYmplY3QtPl9VcGRhdGVVc2VyT29vU3RhdHVzKAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICBVc2VyTG9naW4gICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgR3JhcGhPb29EYXRhID0+IHsKICAgICAgICAgICAgT3V0T2ZPZmZpY2UgPT4gMCwKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJENoYW5nZWQsCiAgICAgICAgJ19VcGRhdGVVc2VyT29vU3RhdHVzKCkgLSBBbHJlYWR5IGRpc2FibGVkIHJldHVybnMgQ2hhbmdlZD0wJywKICAgICk7Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVGVzdDogUnVuKCkgLSBGZWF0dXJlIGRpc2FibGVkCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokU2VsZi0+VHJ1ZSgKICAgIDEsCiAgICAnLS0tIFJ1bigpIEZlYXR1cmUgVG9nZ2xlIFRlc3RzIC0tLScsCik7CgojIEVuc3VyZSBmZWF0dXJlIGlzIGRpc2FibGVkLgpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0V4b09vb1N5bmM6OkVuYWJsZWQnLAogICAgVmFsdWUgPT4gMCwKKTsKCnsKICAgIG15ICRSZXN1bHQgPSAkRXhvT29vU3luY09iamVjdC0+UnVuKCk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFJlc3VsdCwKICAgICAgICAnUnVuKCkgLSBSZXR1cm5zIHRydWUgKHNpbGVudCBza2lwKSB3aGVuIGZlYXR1cmUgaXMgZGlzYWJsZWQnLAogICAgKTsKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUZXN0OiBfR2V0QWNjZXNzVG9rZW4oKSAtIE1pc3NpbmcgY29uZmlnCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokU2VsZi0+VHJ1ZSgKICAgIDEsCiAgICAnLS0tIF9HZXRBY2Nlc3NUb2tlbiBDb25maWcgVmFsaWRhdGlvbiBUZXN0cyAtLS0nLAopOwoKIyBDbGVhciBBenVyZSBBRCBjb25maWcgdG8gdGVzdCB2YWxpZGF0aW9uLgokQ29uZmlnT2JqZWN0LT5TZXQoIEtleSA9PiAnRXhvT29vU3luYzo6QXp1cmVBRDo6VGVuYW50SUQnLCBWYWx1ZSA9PiAnJyApOwokQ29uZmlnT2JqZWN0LT5TZXQoIEtleSA9PiAnRXhvT29vU3luYzo6QXp1cmVBRDo6Q2xpZW50SUQnLCBWYWx1ZSA9PiAnJyApOwokQ29uZmlnT2JqZWN0LT5TZXQoIEtleSA9PiAnRXhvT29vU3luYzo6QXp1cmVBRDo6Q2xpZW50U2VjcmV0JywgVmFsdWUgPT4gJycgKTsKCnsKICAgIG15ICRUb2tlbiA9ICRFeG9Pb29TeW5jT2JqZWN0LT5fR2V0QWNjZXNzVG9rZW4oKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFRva2VuLAogICAgICAgICdfR2V0QWNjZXNzVG9rZW4oKSAtIFJldHVybnMgdW5kZWYgd2l0aCBlbXB0eSBjb25maWcnLAogICAgKTsKfQoKIyBUZXN0IHdpdGggcGFydGlhbCBjb25maWcuCiRDb25maWdPYmplY3QtPlNldCggS2V5ID0+ICdFeG9Pb29TeW5jOjpBenVyZUFEOjpUZW5hbnRJRCcsIFZhbHVlID0+ICd0ZXN0LXRlbmFudCcgKTsKJENvbmZpZ09iamVjdC0+U2V0KCBLZXkgPT4gJ0V4b09vb1N5bmM6OkF6dXJlQUQ6OkNsaWVudElEJywgVmFsdWUgPT4gJycgKTsKCnsKICAgIG15ICRUb2tlbiA9ICRFeG9Pb29TeW5jT2JqZWN0LT5fR2V0QWNjZXNzVG9rZW4oKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFRva2VuLAogICAgICAgICdfR2V0QWNjZXNzVG9rZW4oKSAtIFJldHVybnMgdW5kZWYgd2l0aCBwYXJ0aWFsIGNvbmZpZyAobWlzc2luZyBDbGllbnRJRCknLAogICAgKTsKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUZXN0OiBfUGFyc2VPb29TdGF0dXMoKQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKJFNlbGYtPlRydWUoCiAgICAxLAogICAgJy0tLSBfUGFyc2VPb29TdGF0dXMgVGVzdHMgLS0tJywKKTsKCiMgVGVzdDogZGlzYWJsZWQgc3RhdHVzLgp7CiAgICBteSAkUmVzdWx0ID0gJEV4b09vb1N5bmNPYmplY3QtPl9QYXJzZU9vb1N0YXR1cygKICAgICAgICBEYXRhICAgICAgID0+IHsgc3RhdHVzID0+ICdkaXNhYmxlZCcgfSwKICAgICAgICBJZGVudGlmaWVyID0+ICd0ZXN0QGV4YW1wbGUuY29tJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXN1bHQtPntTdWNjZXNzfSwKICAgICAgICAxLAogICAgICAgICdfUGFyc2VPb29TdGF0dXMoKSAtIGRpc2FibGVkOiBTdWNjZXNzPTEnLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFJlc3VsdC0+e091dE9mT2ZmaWNlfSwKICAgICAgICAwLAogICAgICAgICdfUGFyc2VPb29TdGF0dXMoKSAtIGRpc2FibGVkOiBPdXRPZk9mZmljZT0wJywKICAgICk7Cn0KCiMgVGVzdDogYWx3YXlzRW5hYmxlZCBzdGF0dXMuCnsKICAgIG15ICRSZXN1bHQgPSAkRXhvT29vU3luY09iamVjdC0+X1BhcnNlT29vU3RhdHVzKAogICAgICAgIERhdGEgICAgICAgPT4geyBzdGF0dXMgPT4gJ2Fsd2F5c0VuYWJsZWQnIH0sCiAgICAgICAgSWRlbnRpZmllciA9PiAndGVzdEBleGFtcGxlLmNvbScsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVzdWx0LT57U3VjY2Vzc30sCiAgICAgICAgMSwKICAgICAgICAnX1BhcnNlT29vU3RhdHVzKCkgLSBhbHdheXNFbmFibGVkOiBTdWNjZXNzPTEnLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFJlc3VsdC0+e091dE9mT2ZmaWNlfSwKICAgICAgICAxLAogICAgICAgICdfUGFyc2VPb29TdGF0dXMoKSAtIGFsd2F5c0VuYWJsZWQ6IE91dE9mT2ZmaWNlPTEnLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkUmVzdWx0LT57U3RhcnREYXRlfSwKICAgICAgICAnX1BhcnNlT29vU3RhdHVzKCkgLSBhbHdheXNFbmFibGVkOiBTdGFydERhdGUgaXMgc2V0JywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFJlc3VsdC0+e0VuZERhdGV9LAogICAgICAgICdfUGFyc2VPb29TdGF0dXMoKSAtIGFsd2F5c0VuYWJsZWQ6IEVuZERhdGUgaXMgc2V0JywKICAgICk7Cn0KCiMgVGVzdDogc2NoZWR1bGVkIHN0YXR1cy4KewogICAgbXkgJFJlc3VsdCA9ICRFeG9Pb29TeW5jT2JqZWN0LT5fUGFyc2VPb29TdGF0dXMoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIHN0YXR1cyA9PiAnc2NoZWR1bGVkJywKICAgICAgICAgICAgc2NoZWR1bGVkU3RhcnREYXRlVGltZSA9PiB7IGRhdGVUaW1lID0+ICcyMDI2LTA0LTAxVDA4OjAwOjAwLjAwMDAwMDAnIH0sCiAgICAgICAgICAgIHNjaGVkdWxlZEVuZERhdGVUaW1lICAgPT4geyBkYXRlVGltZSA9PiAnMjAyNi0wNC0xMFQxNzowMDowMC4wMDAwMDAwJyB9LAogICAgICAgIH0sCiAgICAgICAgSWRlbnRpZmllciA9PiAndGVzdEBleGFtcGxlLmNvbScsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVzdWx0LT57U3VjY2Vzc30sCiAgICAgICAgMSwKICAgICAgICAnX1BhcnNlT29vU3RhdHVzKCkgLSBzY2hlZHVsZWQ6IFN1Y2Nlc3M9MScsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVzdWx0LT57T3V0T2ZPZmZpY2V9LAogICAgICAgIDEsCiAgICAgICAgJ19QYXJzZU9vb1N0YXR1cygpIC0gc2NoZWR1bGVkOiBPdXRPZk9mZmljZT0xJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXN1bHQtPntTdGFydERhdGV9LAogICAgICAgICcyMDI2LTA0LTAxJywKICAgICAgICAnX1BhcnNlT29vU3RhdHVzKCkgLSBzY2hlZHVsZWQ6IFN0YXJ0RGF0ZSBwYXJzZWQgY29ycmVjdGx5JywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXN1bHQtPntFbmREYXRlfSwKICAgICAgICAnMjAyNi0wNC0xMCcsCiAgICAgICAgJ19QYXJzZU9vb1N0YXR1cygpIC0gc2NoZWR1bGVkOiBFbmREYXRlIHBhcnNlZCBjb3JyZWN0bHknLAogICAgKTsKfQoKIyBUZXN0OiBzY2hlZHVsZWQgd2l0aCBpbnZhbGlkIGRhdGVzLgp7CiAgICBteSAkUmVzdWx0ID0gJEV4b09vb1N5bmNPYmplY3QtPl9QYXJzZU9vb1N0YXR1cygKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgc3RhdHVzID0+ICdzY2hlZHVsZWQnLAogICAgICAgICAgICBzY2hlZHVsZWRTdGFydERhdGVUaW1lID0+IHsgZGF0ZVRpbWUgPT4gJycgfSwKICAgICAgICAgICAgc2NoZWR1bGVkRW5kRGF0ZVRpbWUgICA9PiB7IGRhdGVUaW1lID0+ICcnIH0sCiAgICAgICAgfSwKICAgICAgICBJZGVudGlmaWVyID0+ICd0ZXN0QGV4YW1wbGUuY29tJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXN1bHQtPntTdWNjZXNzfSwKICAgICAgICAwLAogICAgICAgICdfUGFyc2VPb29TdGF0dXMoKSAtIHNjaGVkdWxlZCB3aXRoIGVtcHR5IGRhdGVzOiBTdWNjZXNzPTAnLAogICAgKTsKfQoKIyBUZXN0OiB1bmtub3duIHN0YXR1cy4KewogICAgbXkgJFJlc3VsdCA9ICRFeG9Pb29TeW5jT2JqZWN0LT5fUGFyc2VPb29TdGF0dXMoCiAgICAgICAgRGF0YSAgICAgICA9PiB7IHN0YXR1cyA9PiAnc29tZU5ld1N0YXR1cycgfSwKICAgICAgICBJZGVudGlmaWVyID0+ICd0ZXN0QGV4YW1wbGUuY29tJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXN1bHQtPntTdWNjZXNzfSwKICAgICAgICAwLAogICAgICAgICdfUGFyc2VPb29TdGF0dXMoKSAtIHVua25vd24gc3RhdHVzOiBTdWNjZXNzPTAnLAogICAgKTsKfQoKMTsK</File>
    </Filelist>

    <CodeInstall Type="post"><![CDATA[
        # Disable the Out-of-Office preference widget for agents.
        # OOO is now managed by Exchange Online sync, agents should not edit it manually.
        # Admins can still manage OOO via Admin > Users if needed.
        my $SysConfigObject = $Kernel::OM->Get('Kernel::System::SysConfig');

        my $ExclusiveLockGUID = $SysConfigObject->SettingLock(
            Name   => 'PreferencesGroups###OutOfOffice',
            Force  => 1,
            UserID => 1,
        );

        if ($ExclusiveLockGUID) {
            my %Setting = $SysConfigObject->SettingGet(
                Name => 'PreferencesGroups###OutOfOffice',
            );

            if (%Setting) {
                my %EffectiveValue = %{ $Setting{EffectiveValue} };
                $EffectiveValue{Active} = '0';

                $SysConfigObject->SettingUpdate(
                    Name              => 'PreferencesGroups###OutOfOffice',
                    EffectiveValue    => \%EffectiveValue,
                    ExclusiveLockGUID => $ExclusiveLockGUID,
                    UserID            => 1,
                );
            }

            $SysConfigObject->SettingUnlock(
                Name => 'PreferencesGroups###OutOfOffice',
            );
        }

        # Deploy the configuration change.
        $SysConfigObject->ConfigurationDeploy(
            Comments => 'ExoOooSync: Disabled agent OOO preference widget',
            UserID   => 1,
            Force    => 1,
        );
    ]]></CodeInstall>

    <CodeUninstall Type="pre"><![CDATA[
        # Re-enable the Out-of-Office preference widget for agents on uninstall.
        my $SysConfigObject = $Kernel::OM->Get('Kernel::System::SysConfig');

        my $ExclusiveLockGUID = $SysConfigObject->SettingLock(
            Name   => 'PreferencesGroups###OutOfOffice',
            Force  => 1,
            UserID => 1,
        );

        if ($ExclusiveLockGUID) {
            my %Setting = $SysConfigObject->SettingGet(
                Name => 'PreferencesGroups###OutOfOffice',
            );

            if (%Setting) {
                my %EffectiveValue = %{ $Setting{EffectiveValue} };
                $EffectiveValue{Active} = '1';

                $SysConfigObject->SettingUpdate(
                    Name              => 'PreferencesGroups###OutOfOffice',
                    EffectiveValue    => \%EffectiveValue,
                    ExclusiveLockGUID => $ExclusiveLockGUID,
                    UserID            => 1,
                );
            }

            $SysConfigObject->SettingUnlock(
                Name => 'PreferencesGroups###OutOfOffice',
            );
        }

        $SysConfigObject->ConfigurationDeploy(
            Comments => 'ExoOooSync: Re-enabled agent OOO preference widget',
            UserID   => 1,
            Force    => 1,
        );
    ]]></CodeUninstall>

    <IntroInstall Type="post" Lang="en" Title="ExoOooSync - Installation">
        <![CDATA[
        <p>Thank you for installing ExoOooSync!</p>
        <p>To configure the addon:</p>
        <ol>
            <li>Go to <b>Admin > System Configuration</b></li>
            <li>Search for <b>ExoOooSync</b></li>
            <li>Configure your Azure AD (Entra ID) credentials: Tenant ID, Client ID, Client Secret</li>
            <li>Select the appropriate user mapping mode</li>
            <li>Enable the feature by setting <b>ExoOooSync::Enabled</b> to active</li>
        </ol>
        <p><b>Required Azure AD App Registration permissions:</b></p>
        <ul>
            <li>Microsoft Graph: <code>MailboxSettings.Read</code> (Application permission)</li>
            <li>Microsoft Graph: <code>User.Read.All</code> (Application permission, only needed for SAM and PrimarySMTP mapping)</li>
        </ul>
        <p>You can also run the sync manually via CLI:</p>
        <pre>bin/znuny.Console.pl Maint::ExoOooSync::Run</pre>
        <p><b>Note:</b> The Out-of-Office preference widget has been automatically disabled for agents.
        OOO status is now managed exclusively by Exchange Online sync. Administrators can still
        manage OOO settings via <b>Admin > Users</b>. To re-enable the widget, set
        <code>PreferencesGroups###OutOfOffice</code> → <code>Active: 1</code> in System Configuration.</p>
        ]]>
    </IntroInstall>

    <IntroInstall Type="post" Lang="de" Title="ExoOooSync - Installation">
        <![CDATA[
        <p>Vielen Dank für die Installation von ExoOooSync!</p>
        <p>So konfigurieren Sie das Addon:</p>
        <ol>
            <li>Gehen Sie zu <b>Admin > Systemkonfiguration</b></li>
            <li>Suchen Sie nach <b>ExoOooSync</b></li>
            <li>Konfigurieren Sie Ihre Azure AD (Entra ID) Zugangsdaten: Mandanten-ID, Client-ID, Client-Geheimnis</li>
            <li>Wählen Sie den passenden Benutzer-Zuordnungsmodus</li>
            <li>Aktivieren Sie die Funktion über <b>ExoOooSync::Enabled</b></li>
        </ol>
        <p><b>Benötigte Azure AD App-Registrierungsberechtigungen:</b></p>
        <ul>
            <li>Microsoft Graph: <code>MailboxSettings.Read</code> (Anwendungsberechtigung)</li>
            <li>Microsoft Graph: <code>User.Read.All</code> (Anwendungsberechtigung, nur für SAM- und PrimarySMTP-Zuordnung benötigt)</li>
        </ul>
        <p>Manuelle Ausführung über CLI:</p>
        <pre>bin/znuny.Console.pl Maint::ExoOooSync::Run</pre>
        <p><b>Hinweis:</b> Das Abwesenheits-Widget wurde automatisch für Agenten deaktiviert.
        Der OOO-Status wird jetzt ausschließlich über den Exchange Online Sync verwaltet. Administratoren
        können OOO-Einstellungen weiterhin über <b>Admin > Benutzer</b> verwalten. Um das Widget wieder
        zu aktivieren: <code>PreferencesGroups###OutOfOffice</code> → <code>Active: 1</code> in der Systemkonfiguration.</p>
        ]]>
    </IntroInstall>

    <IntroUninstall Type="pre" Lang="en" Title="ExoOooSync - Uninstall">
        <![CDATA[
        <p><b>Warning:</b> Uninstalling ExoOooSync will permanently remove the following settings from your system configuration:</p>
        <ul>
            <li>Azure AD credentials (Tenant ID, Client ID, Client Secret)</li>
            <li>User mapping mode and email domain filter</li>
            <li>Cron task schedules</li>
        </ul>
        <p>Please note these values before proceeding if you plan to reinstall later.</p>
        <p>The Out-of-Office preference widget will be automatically re-enabled for agents.</p>
        <p>Existing agent OOO settings (dates, active/inactive) will <b>not</b> be removed.</p>
        ]]>
    </IntroUninstall>

    <IntroUninstall Type="pre" Lang="de" Title="ExoOooSync - Deinstallation">
        <![CDATA[
        <p><b>Warnung:</b> Bei der Deinstallation von ExoOooSync werden folgende Einstellungen unwiderruflich aus der Systemkonfiguration entfernt:</p>
        <ul>
            <li>Azure AD Zugangsdaten (Mandanten-ID, Client-ID, Client-Geheimnis)</li>
            <li>Benutzer-Zuordnungsmodus und E-Mail-Domänenfilter</li>
            <li>Cron-Task-Zeitpläne</li>
        </ul>
        <p>Bitte notieren Sie sich diese Werte vor der Deinstallation, falls Sie das Addon später erneut installieren möchten.</p>
        <p>Das Abwesenheits-Widget wird automatisch für Agenten wieder aktiviert.</p>
        <p>Bestehende OOO-Einstellungen der Agenten (Datum, aktiv/inaktiv) werden <b>nicht</b> entfernt.</p>
        ]]>
    </IntroUninstall>

</otrs_package>
