Bindings.ps1
# Copyright (c) Microsoft Corporation. All rights reserved. $Arch = switch ($env:PROCESSOR_ARCHITECTURE) { 'AMD64' { 'x86_64' } 'ARM64' { 'arm64' } default { throw "Unsupported architecture '$env:PROCESSOR_ARCHITECTURE'." } } $DllPath = "$PSScriptRoot\bin\$Arch\Microsoft.OSConfig.dll" -replace '\\', '\\' if ((Get-Item -Path $DllPath).VersionInfo.FileVersion -ne '0.1.0') { throw "The DLL at '$DllPath' is not the expected version." } $TypeDefinition = @" // <auto-generated> // This code is generated by csbindgen. // DON'T CHANGE THIS DIRECTLY. // </auto-generated> #pragma warning disable CS8500 #pragma warning disable CS8981 using System; using System.Runtime.InteropServices; namespace Microsoft.OSConfig { public static unsafe partial class NativeMethods { const string __DllName = "$DllPath"; [DllImport(__DllName, EntryPoint = "init", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void init(ByteBuffer locale, Logger logger); [DllImport(__DllName, EntryPoint = "apply_by_file", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void apply_by_file(ByteBuffer authority, ByteBuffer id, ByteBuffer path, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "apply_by_content", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void apply_by_content(ByteBuffer authority, ByteBuffer id, ByteBuffer content, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "apply_by_url", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void apply_by_url(ByteBuffer authority, ByteBuffer id, ByteBuffer url, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "query_by_id", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void query_by_id(ByteBuffer authority, ByteBuffer id, ByteBuffer filter, ByteBuffer format, [MarshalAs(UnmanagedType.U1)] bool execute, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "query_by_file", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void query_by_file(ByteBuffer authority, ByteBuffer path, ByteBuffer filter, ByteBuffer format, [MarshalAs(UnmanagedType.U1)] bool execute, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "query_by_content", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void query_by_content(ByteBuffer authority, ByteBuffer content, ByteBuffer filter, ByteBuffer format, [MarshalAs(UnmanagedType.U1)] bool execute, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "query_by_url", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void query_by_url(ByteBuffer authority, ByteBuffer url, ByteBuffer filter, ByteBuffer format, [MarshalAs(UnmanagedType.U1)] bool execute, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "list_all", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void list_all(CallStatus* call_status); [DllImport(__DllName, EntryPoint = "remove_by_id", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void remove_by_id(ByteBuffer authority, ByteBuffer id, ByteBuffer filter, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "enable_drift_control", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void enable_drift_control(ByteBuffer authority, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "disable_drift_control", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void disable_drift_control(ByteBuffer authority, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "set_drift_control_refresh_period", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void set_drift_control_refresh_period(ByteBuffer authority, uint minutes, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "get_drift_control_status", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void get_drift_control_status(ByteBuffer authority, CallStatus* call_status); [DllImport(__DllName, EntryPoint = "emit_setting_change_event", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void emit_setting_change_event(ByteBuffer setting_name, ByteBuffer old_value, ByteBuffer new_value, ByteBuffer authority, ByteBuffer outcome, CallStatus* call_status); } [StructLayout(LayoutKind.Sequential)] public unsafe partial struct CallStatus { public CallStatusCode code; public ByteBuffer data; } [StructLayout(LayoutKind.Sequential)] public unsafe partial struct ByteBuffer { public uint len; public uint cap; public byte* ptr; } public enum CallStatusCode : sbyte { Success = 0, Error = 1, Panic = 2, } } namespace Microsoft.OSConfig { public unsafe partial struct ByteBuffer { public static ByteBuffer FromString(string str) { var bytes = System.Text.Encoding.UTF8.GetBytes(str); var buffer = new ByteBuffer { len = (uint)bytes.Length, cap = (uint)bytes.Length, ptr = (byte*)Marshal.AllocHGlobal(bytes.Length), }; Marshal.Copy(bytes, 0, (IntPtr)buffer.ptr, bytes.Length); return buffer; } public string AsString() { var bytes = new byte[len]; Marshal.Copy((IntPtr)ptr, bytes, 0, (int)len); return System.Text.Encoding.UTF8.GetString(bytes); } } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void LogCallback([MarshalAs(UnmanagedType.LPStr)] string message); [StructLayout(LayoutKind.Sequential)] public unsafe struct Logger { public LogCallback Error; public LogCallback Warning; public LogCallback Information; public LogCallback Debug; public LogCallback Verbose; }; public static class Platform { public static unsafe void Initialize(string locale, Logger logger) { NativeMethods.init(ByteBuffer.FromString(locale), logger); } public static unsafe void ApplyByFile(string authority, string id, string path) { var callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); var idBuffer = ByteBuffer.FromString(id); var pathBuffer = ByteBuffer.FromString(path); try { NativeMethods.apply_by_file(authorityBuffer, idBuffer, pathBuffer, &callStatus); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); Marshal.FreeHGlobal((IntPtr)idBuffer.ptr); Marshal.FreeHGlobal((IntPtr)pathBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } public static unsafe void ApplyByUrl(string authority, string id, string url) { var callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); var idBuffer = ByteBuffer.FromString(id); var urlBuffer = ByteBuffer.FromString(url); try { NativeMethods.apply_by_url(authorityBuffer, idBuffer, urlBuffer, &callStatus); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); Marshal.FreeHGlobal((IntPtr)idBuffer.ptr); Marshal.FreeHGlobal((IntPtr)urlBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } public static unsafe void ApplyByContent(string authority, string id, string content) { var callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); var idBuffer = ByteBuffer.FromString(id); var contentBuffer = ByteBuffer.FromString(content); try { NativeMethods.apply_by_content(authorityBuffer, idBuffer, contentBuffer, &callStatus); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); Marshal.FreeHGlobal((IntPtr)idBuffer.ptr); Marshal.FreeHGlobal((IntPtr)contentBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } public static unsafe string QueryById( string authority, string id, string[] filter, string format, bool execute ) { var callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); var idBuffer = ByteBuffer.FromString(id); var filterBuffer = ByteBuffer.FromString(string.Join(",", (filter == null ? Array.Empty<string>() : filter))); var formatBuffer = ByteBuffer.FromString(format); try { NativeMethods.query_by_id( authorityBuffer, idBuffer, filterBuffer, formatBuffer, execute, &callStatus ); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); Marshal.FreeHGlobal((IntPtr)idBuffer.ptr); Marshal.FreeHGlobal((IntPtr)filterBuffer.ptr); Marshal.FreeHGlobal((IntPtr)formatBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } return callStatus.data.AsString(); } public static unsafe string QueryByFile( string authority, string path, string[] filter, string format, bool execute ) { var callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); var pathBuffer = ByteBuffer.FromString(path); var filterBuffer = ByteBuffer.FromString(string.Join(",", (filter == null ? Array.Empty<string>() : filter))); var formatBuffer = ByteBuffer.FromString(format); try { NativeMethods.query_by_file( authorityBuffer, pathBuffer, filterBuffer, formatBuffer, execute, &callStatus ); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); Marshal.FreeHGlobal((IntPtr)pathBuffer.ptr); Marshal.FreeHGlobal((IntPtr)filterBuffer.ptr); Marshal.FreeHGlobal((IntPtr)formatBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } return callStatus.data.AsString(); } public static unsafe string QueryByContent( string authority, string content, string[] filter, string format, bool execute ) { var callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); var contentBuffer = ByteBuffer.FromString(content); var filterBuffer = ByteBuffer.FromString(string.Join(",", (filter == null ? Array.Empty<string>() : filter))); var formatBuffer = ByteBuffer.FromString(format); try { NativeMethods.query_by_content( authorityBuffer, contentBuffer, filterBuffer, formatBuffer, execute, &callStatus ); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); Marshal.FreeHGlobal((IntPtr)contentBuffer.ptr); Marshal.FreeHGlobal((IntPtr)filterBuffer.ptr); Marshal.FreeHGlobal((IntPtr)formatBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } return callStatus.data.AsString(); } public static unsafe string ListAll() { var callStatus = new CallStatus(); try { NativeMethods.list_all(&callStatus); } finally { // no-op } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } return callStatus.data.AsString(); } public static unsafe void RemoveById( string authority, string id, string[] filter ) { var callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); var idBuffer = ByteBuffer.FromString(id); var filterBuffer = ByteBuffer.FromString(string.Join(",", (filter == null ? Array.Empty<string>() : filter))); try { NativeMethods.remove_by_id( authorityBuffer, idBuffer, filterBuffer, &callStatus ); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); Marshal.FreeHGlobal((IntPtr)idBuffer.ptr); Marshal.FreeHGlobal((IntPtr)filterBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } public static unsafe void EnableDriftControl(string authority) { CallStatus callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); try { NativeMethods.enable_drift_control(authorityBuffer, &callStatus); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } public static unsafe void DisableDriftControl(string authority) { CallStatus callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); try { NativeMethods.disable_drift_control(authorityBuffer, &callStatus); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } public static unsafe void SetDriftControlRefreshPeriod(string authority, uint minutes) { CallStatus callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); try { NativeMethods.set_drift_control_refresh_period(authorityBuffer, minutes, &callStatus); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } public static unsafe string GetDriftControlStatus(string authority) { CallStatus callStatus = new CallStatus(); var authorityBuffer = ByteBuffer.FromString(authority); try { NativeMethods.get_drift_control_status(authorityBuffer, &callStatus); } finally { Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); } if (callStatus.code == CallStatusCode.Success) { return callStatus.data.AsString(); } else { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } public static unsafe void EmitSettingChangeEvent( string settingName, string oldValue, string newValue, string authority, string outcome ) { CallStatus callStatus = new CallStatus(); var settingNameBuffer = ByteBuffer.FromString(settingName); var oldValueBuffer = ByteBuffer.FromString(oldValue); var newValueBuffer = ByteBuffer.FromString(newValue); var authorityBuffer = ByteBuffer.FromString(authority); var outcomeBuffer = ByteBuffer.FromString(outcome); try { NativeMethods.emit_setting_change_event(settingNameBuffer, oldValueBuffer, newValueBuffer, authorityBuffer, outcomeBuffer, &callStatus); } finally { Marshal.FreeHGlobal((IntPtr)settingNameBuffer.ptr); Marshal.FreeHGlobal((IntPtr)oldValueBuffer.ptr); Marshal.FreeHGlobal((IntPtr)newValueBuffer.ptr); Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr); Marshal.FreeHGlobal((IntPtr)outcomeBuffer.ptr); } if (callStatus.code != CallStatusCode.Success) { throw new PlatformException( String.Format("Operation failed: {0}", callStatus.data.AsString()) ); } } } public class PlatformException : Exception { public PlatformException(string message) : base(message) { } } } "@ Write-Verbose "Loading '$DllPath'..." if ($PSVersionTable.PSEdition -eq 'Core') { Add-Type -TypeDefinition $TypeDefinition -CompilerOptions "/unsafe" -Language CSharp } else { $CompilerParameters = New-Object -TypeName System.CodeDom.Compiler.CompilerParameters $CompilerParameters.CompilerOptions = '/unsafe' Add-Type -TypeDefinition $TypeDefinition -CompilerParameters $CompilerParameters -Language CSharp } $Script:ErrorCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Error -Message "$Message" } $Script:WarningCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Warning -Message "$Message" } $Script:InformationCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Host -Object "$Message" } $Script:DebugCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Debug -Message "$Message" } $Script:VerboseCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Verbose -Message "$Message" } [Microsoft.OSConfig.Platform]::Initialize( (Get-Culture).Name, [Microsoft.OSConfig.Logger]@{ Error = $Script:ErrorCallback Warning = $Script:WarningCallback Information = $Script:InformationCallback Debug = $Script:DebugCallback Verbose = $Script:VerboseCallback } ) # SIG # Begin signature block # MIIoRgYJKoZIhvcNAQcCoIIoNzCCKDMCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC0O2VctJh4qyjs # y1wz3InmcPvZBSHmPm6XR2R9Wf9soqCCDXYwggX0MIID3KADAgECAhMzAAAEhV6Z # 7A5ZL83XAAAAAASFMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjUwNjE5MTgyMTM3WhcNMjYwNjE3MTgyMTM3WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDASkh1cpvuUqfbqxele7LCSHEamVNBfFE4uY1FkGsAdUF/vnjpE1dnAD9vMOqy # 5ZO49ILhP4jiP/P2Pn9ao+5TDtKmcQ+pZdzbG7t43yRXJC3nXvTGQroodPi9USQi # 9rI+0gwuXRKBII7L+k3kMkKLmFrsWUjzgXVCLYa6ZH7BCALAcJWZTwWPoiT4HpqQ # hJcYLB7pfetAVCeBEVZD8itKQ6QA5/LQR+9X6dlSj4Vxta4JnpxvgSrkjXCz+tlJ # 67ABZ551lw23RWU1uyfgCfEFhBfiyPR2WSjskPl9ap6qrf8fNQ1sGYun2p4JdXxe # UAKf1hVa/3TQXjvPTiRXCnJPAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUuCZyGiCuLYE0aU7j5TFqY05kko0w # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzUwNTM1OTAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBACjmqAp2Ci4sTHZci+qk # tEAKsFk5HNVGKyWR2rFGXsd7cggZ04H5U4SV0fAL6fOE9dLvt4I7HBHLhpGdE5Uj # Ly4NxLTG2bDAkeAVmxmd2uKWVGKym1aarDxXfv3GCN4mRX+Pn4c+py3S/6Kkt5eS # DAIIsrzKw3Kh2SW1hCwXX/k1v4b+NH1Fjl+i/xPJspXCFuZB4aC5FLT5fgbRKqns # WeAdn8DsrYQhT3QXLt6Nv3/dMzv7G/Cdpbdcoul8FYl+t3dmXM+SIClC3l2ae0wO # lNrQ42yQEycuPU5OoqLT85jsZ7+4CaScfFINlO7l7Y7r/xauqHbSPQ1r3oIC+e71 # 5s2G3ClZa3y99aYx2lnXYe1srcrIx8NAXTViiypXVn9ZGmEkfNcfDiqGQwkml5z9 # nm3pWiBZ69adaBBbAFEjyJG4y0a76bel/4sDCVvaZzLM3TFbxVO9BQrjZRtbJZbk # C3XArpLqZSfx53SuYdddxPX8pvcqFuEu8wcUeD05t9xNbJ4TtdAECJlEi0vvBxlm # M5tzFXy2qZeqPMXHSQYqPgZ9jvScZ6NwznFD0+33kbzyhOSz/WuGbAu4cHZG8gKn # lQVT4uA2Diex9DMs2WHiokNknYlLoUeWXW1QrJLpqO82TLyKTbBM/oZHAdIc0kzo # STro9b3+vjn2809D0+SOOCVZMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCGiYwghoiAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAASFXpnsDlkvzdcAAAAABIUwDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIKMWu5lW6tfYx60yOArWzJ6I # PxEQjoTytQBnRLKJQZhnMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAm7TY7yNFPJgpR6ZGcDakg3YlVjyMAMtpvrH1wk7LWlhaBQxSsz4ns3nB # X8BAxmSwZ5RkVA1hlHr/W/9V3BD9V7pna+O3/k1zk7cJRwV1bwGXdb8zj/nm4f09 # vYuP70fUkDax0aKDz9u8/qZV5GNs0+74VRZT9Ipi07YnwNyA0VFcX/fJxz0coDrW # 0rAQwB6+YUzmdFVfp1/4TphrQ0+iZQ/nah78x9FqM1Fvc3p7FM3P9f9Dh4fV6k43 # GnkrmSg9E4dSxV7K6Yh9R4yj34spZo5Dg8ZLKdw4lkz/TSA9EJiB5ZVUTBRrvBmj # rEIJ8ZXwMcQap37M/iPTnS8fGgHBEqGCF7AwghesBgorBgEEAYI3AwMBMYIXnDCC # F5gGCSqGSIb3DQEHAqCCF4kwgheFAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsq # hkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCAhXrglUOCc2jG2ziRMoi8iGW8Ki606zV5ISWyC+Q8esAIGaKOpP9b3 # GBMyMDI1MDkwMjE3MTM0Ni4zOTJaMASAAgH0oIHZpIHWMIHTMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl # bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT # TjozMjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg # U2VydmljZaCCEf4wggcoMIIFEKADAgECAhMzAAAB+KOhJgwMQEj+AAEAAAH4MA0G # CSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI0 # MDcyNTE4MzEwOFoXDTI1MTAyMjE4MzEwOFowgdMxCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9w # ZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjMyMUEt # MDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl # MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxR23pXYnD2BuODdeXs2C # u/T5kKI+bAw8cbtN50Cm/FArjXyL4RTqMe6laQ/CqeMTxgckvZr1JrW0Mi4F15rx # /VveGhKBmob45DmOcV5xyx7h9Tk59NAl5PNMAWKAIWf270SWAAWxQbpVIhhPWCnV # V3otVvahEad8pMmoSXrT5Z7Nk1RnB70A2bq9Hk8wIeC3vBuxEX2E8X50IgAHsyaR # 9roFq3ErzUEHlS8YnSq33ui5uBcrFOcFOCZILuVFVTgEqSrX4UiX0etqi7jUtKyp # gIflaZcV5cI5XI/eCxY8wDNmBprhYMNlYxdmQ9aLRDcTKWtddWpnJtyl5e3gHuYo # j8xuDQ0XZNy7ESRwJIK03+rTZqfaYyM4XSK1s0aa+mO69vo/NmJ4R/f1+KucBPJ4 # yUdbqJWM3xMvBwLYycvigI/WK4kgPog0UBNczaQwDVXpcU+TMcOvWP8HBWmWJQIm # TZInAFivXqUaBbo3wAfPNbsQpvNNGu/12pg0F8O/CdRfgPHfOhIWQ0D8ALCY+Lsi # wbzcejbrVl4N9fn2wOg2sDa8RfNoD614I0pFjy/lq1NsBo9V4GZBikzX7ZjWCRgd # 1FCBXGpfpDikHjQ05YOkAakdWDT2bGSaUZJGVYtepIpPTAs1gd/vUogcdiL51o7s # huHIlB6QSUiQ24XYhRbbQCECAwEAAaOCAUkwggFFMB0GA1UdDgQWBBS9zsZzz57Q # lT5nrt/oitLv1OQ7tjAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBf # BgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmww # bAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0El # MjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUF # BwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAYfk8GzzpEVnG # l7y6oXoytCb42Hx6TOA0+dkaBI36ftDE9tLubUa/xMbHB5rcNiRhFHZ93RefdPpc # 4+FF0DAl5lP8xKAO+293RWPKDFOFIxgtZY08t8D9cSQpgGUzyw3lETZebNLEA17A # /CTpA2F9uh8j84KygeEbj+bidWDiEfayoH2A5/5ywJJxIuLzFVHacvWxSCKoF9hl # SrZSG5fXWS3namf4tt690UT6AGyWLFWe895coFPxm/m0UIMjjp9VRFH7nb3Ng2Q4 # gPS9E5ZTMZ6nAlmUicDj0NXAs2wQuQrnYnbRAJ/DQW35qLo7Daw9AsItqjFhbMcG # 68gDc4j74L2KYe/2goBHLwzSn5UDftS1HZI0ZRsqmNHI0TZvvUWX9ajm6SfLBTEt # oTo6gLOX0UD/9rrhGjdkiCw4SwU5osClgqgiNMK5ndk2gxFlDXHCyLp5qB6BoPpc # 82RhO0yCzoP9gv7zv2EocAWEsqE5+0Wmu5uarmfvcziLfU1SY240OZW8ld4sS8fn # ybn/jDMmFAhazV1zH0QERWEsfLSpwkOXaImWNFJ5lmcnf1VTm6cmfasScYtElpjq # Z9GooCmk1XFApORPs/PO43IcFmPRwagt00iQSw+rBeIH00KQq+FJT/62SB70g9g/ # R8TS6k6b/wt2UWhqrW+Q8lw6Xzgex/YwggdxMIIFWaADAgECAhMzAAAAFcXna54C # m0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZp # Y2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMy # MjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV # BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0B # AQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51 # yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY # 6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9 # cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN # 7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDua # Rr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74 # kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2 # K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5 # TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZk # i1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9Q # BXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3Pmri # Lq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUC # BBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJl # pxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIB # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y # eS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUA # YgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU # 1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2Ny # bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIw # MTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0w # Ni0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/yp # b+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulm # ZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM # 9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECW # OKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4 # FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3Uw # xTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPX # fx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVX # VAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGC # onsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU # 5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEG # ahC0HVUzWLOhcGbyoYIDWTCCAkECAQEwggEBoYHZpIHWMIHTMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl # bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT # TjozMjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg # U2VydmljZaIjCgEBMAcGBSsOAwIaAxUAtkQt/ebWSQ5DnG+aKRzPELCFE9GggYMw # gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD # VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsF # AAIFAOxhRCgwIhgPMjAyNTA5MDIxMDIzMzZaGA8yMDI1MDkwMzEwMjMzNlowdzA9 # BgorBgEEAYRZCgQBMS8wLTAKAgUA7GFEKAIBADAKAgEAAgICegIB/zAHAgEAAgIV # OzAKAgUA7GKVqAIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow # CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQB1J2leaEej # 6+D7l/fJ8HOSvX4kNgjkJFahGirE9MjXZI2nELxulK3fR/iTvRkLcoyst8hzEecR # pAlW10vqm5Orim/Q/R1ysdU4UTbbLglwsnsF3y7conJsgbnHBAshp2jElsu3C21z # zXkXzUlVlPKfBOyvtczNRHgCuRiQN1RgFKgEgBqFdIgOWKy2qBjLQ/vbdCjNJ4k3 # 6irt7qdGqRdSeMFb33s2p72Bu8zIa8/jfjq+bqbgngdpmDpBND3s6zmYCpc5MLJO # Pw7qU1K4rSyrSmmP6P1shrX0xifwpbCBDavWn+N1iR2jumZNCmYzhJYdVsZCPUy1 # 5n+epUA9+xzbMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB # IDIwMTACEzMAAAH4o6EmDAxASP4AAQAAAfgwDQYJYIZIAWUDBAIBBQCgggFKMBoG # CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgO/xPMQWD # cNlS0tjUtH5Um2YU5nQtpY2p+kuABecCyCYwgfoGCyqGSIb3DQEJEAIvMYHqMIHn # MIHkMIG9BCDvzDPyXw1UkAUFYt8bR4UdjM90Qv5xnVaiKD3I0Zz3WjCBmDCBgKR+ # MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT # HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB+KOhJgwMQEj+AAEA # AAH4MCIEIBaVZIjdWVWiEpjf6Hn+1oT75Il7zgdb8vOVLvCTMIgIMA0GCSqGSIb3 # DQEBCwUABIICACBaIfTK7JT3Ilg8rkLprUW8VkUhikVlBUogdn9RG6iJMI+vMsEa # HGyf3+tW3q1sHEttwecPL0mF/ZkeEdR7bSKmLGgqI7tDY2PvmJoXZ8igz8oqGa5Q # 7BJHjIJNzowB4gDI2nUpyU0aahFSiCw0DcXlHWQwyD+gUHKbB1gac4YDB19M5sz+ # IuVqhCwQJcd3NywJxLAkTAG85mCxxUeHnbPzVtAEUE075pLSz5A/n6PST/OEcncs # GbPu8m8tGnKNEev2cm12W63sq+zJA5r4h1ehYnVoj/CUWtK1JVX5sjry0rXPOuKE # DGacDznkt8AbZgKAGrF/+Go0v8dabuHaoMRbP1hJX6UEyWBFMP9om+Xt+onMWZbW # jwc9BC0VICDNNEZapxv5HWzv0qbQctVr9KG+lFq/g22c5p2t7eToxOaK/HZNvUyB # 9uH0boozR1q4gC1mxOBEOCH/aqYFp61u9VUbaLUg+3Bk8BBlcbszDzeNcjsiPNnd # /R81nygU07lO6t4Xxa/GO0R+hbkGD4BzcCJMHZpiF/dk2Sgtb+fw9Rpqbe4/FtFC # F2biUjBfxwuEZ1x9jEDXFBqihbeWcxsacMVhKZfa69EmRmHCRnIkUEfbriLokmV3 # GpfkzP0rfKYkOzWBVtKgmudN7K8qkbsBe9eZWOrOiUGO0w4E9FrA7yoX # SIG # End signature block |