AppHandling/ClientContext.ps1
#requires -Version 5.0 Param( [Parameter(Mandatory=$true)] [string] $clientDllPath ) class ClientContext { $events = @() $clientSession = $null $culture = "" $timezone = "" $caughtForm = $null $debugMode = $false $addressUri = $null $interactionStart = $null $currentInteraction = $null ClientContext([string] $serviceUrl, [string] $accessToken, [timespan] $interactionTimeout, [string] $culture, [string] $timezone) { $this.Initialize($serviceUrl, ([Microsoft.Dynamics.Framework.UI.Client.AuthenticationScheme]::AzureActiveDirectory), (New-Object Microsoft.Dynamics.Framework.UI.Client.TokenCredential -ArgumentList $accessToken), $interactionTimeout, $culture, $timezone) } ClientContext([string] $serviceUrl, [string] $accessToken) { $this.Initialize($serviceUrl, ([Microsoft.Dynamics.Framework.UI.Client.AuthenticationScheme]::AzureActiveDirectory), (New-Object Microsoft.Dynamics.Framework.UI.Client.TokenCredential -ArgumentList $accessToken), ([timespan]::FromMinutes(10)), 'en-US', '') } ClientContext([string] $serviceUrl, [pscredential] $credential, [timespan] $interactionTimeout, [string] $culture, [string] $timezone) { $this.Initialize($serviceUrl, ([Microsoft.Dynamics.Framework.UI.Client.AuthenticationScheme]::UserNamePassword), (New-Object System.Net.NetworkCredential -ArgumentList $credential.UserName, $credential.Password), $interactionTimeout, $culture, $timezone) } ClientContext([string] $serviceUrl, [pscredential] $credential) { $this.Initialize($serviceUrl, ([Microsoft.Dynamics.Framework.UI.Client.AuthenticationScheme]::UserNamePassword), (New-Object System.Net.NetworkCredential -ArgumentList $credential.UserName, $credential.Password), ([timespan]::FromMinutes(10)), 'en-US', '') } ClientContext([string] $serviceUrl, [timespan] $interactionTimeout, [string] $culture, [string] $timezone) { $this.Initialize($serviceUrl, ([Microsoft.Dynamics.Framework.UI.Client.AuthenticationScheme]::Windows), $null, $interactionTimeout, $culture, $timezone) } ClientContext([string] $serviceUrl) { $this.Initialize($serviceUrl, ([Microsoft.Dynamics.Framework.UI.Client.AuthenticationScheme]::Windows), $null, ([timespan]::FromMinutes(10)), 'en-US', '') } Initialize([string] $serviceUrl, [Microsoft.Dynamics.Framework.UI.Client.AuthenticationScheme] $authenticationScheme, [System.Net.ICredentials] $credential, [timespan] $interactionTimeout, [string] $culture, [string] $timezone) { $this.addressUri = New-Object System.Uri -ArgumentList $serviceUrl $this.addressUri = [Microsoft.Dynamics.Framework.UI.Client.ServiceAddressProvider]::ServiceAddress($this.addressUri) $jsonClient = New-Object Microsoft.Dynamics.Framework.UI.Client.JsonHttpClient -ArgumentList $this.addressUri, $credential, $authenticationScheme $httpClient = ($jsonClient.GetType().GetField("httpClient", [Reflection.BindingFlags]::NonPublic -bor [Reflection.BindingFlags]::Instance)).GetValue($jsonClient) $httpClient.Timeout = $interactionTimeout $this.clientSession = New-Object Microsoft.Dynamics.Framework.UI.Client.ClientSession -ArgumentList $jsonClient, (New-Object Microsoft.Dynamics.Framework.UI.Client.NonDispatcher), (New-Object 'Microsoft.Dynamics.Framework.UI.Client.TimerFactory[Microsoft.Dynamics.Framework.UI.Client.TaskTimer]') $this.culture = $culture if ($timezone -eq '') { $tz = Get-TimeZone $tz = Get-TimeZone -ListAvailable | Where-Object { $_.BaseUtcOffset -eq $tz.BaseUtcOffset -and $_.SupportsDaylightSavingTime -eq $tz.SupportsDaylightSavingTime } | Select-Object -First 1 if ($tz) { $this.timezone = $tz.Id } } else { $this.timezone = $timezone } $this.OpenSession() } OpenSession() { $Global:OpenClientContext = $this $clientSessionParameters = New-Object Microsoft.Dynamics.Framework.UI.Client.ClientSessionParameters $clientSessionParameters.CultureId = $this.culture $clientSessionParameters.UICultureId = $this.culture $clientSessionParameters.TimeZoneId = $this.timezone $clientSessionParameters.AdditionalSettings.Add("IncludeControlIdentifier", $true) $this.events += @(Register-ObjectEvent -InputObject $this.clientSession -EventName MessageToShow -Action { Write-Host -ForegroundColor Yellow "Message : $($EventArgs.Message)" if ($Global:OpenClientContext) { if ($Global:OpenClientContext.debugMode) { try { $Global:OpenClientContext.GetAllForms() | ForEach-Object { $formInfo = $Global:OpenClientContext.GetFormInfo($_) if ($formInfo) { Write-Host -ForegroundColor Yellow "Title: $($formInfo.title)" Write-Host -ForegroundColor Yellow "Title: $($formInfo.identifier)" $formInfo.controls | ConvertTo-Json -Depth 99 | Out-Host } } } catch { Write-Host "Exception when enumerating forms" } } } }) $this.events += @(Register-ObjectEvent -InputObject $this.clientSession -EventName CommunicationError -Action { Write-Host -ForegroundColor Red "CommunicationError : $($EventArgs.Exception.Message)" Get-PSCallStack | Write-Host -ForegroundColor Red if ($Global:OpenClientContext) { Write-Host -ForegroundColor Red "Current Interaction: $($Global:OpenClientContext.currentInteraction.ToString())" Write-Host -ForegroundColor Red "Time spend: $(([DateTime]::Now - $Global:OpenClientContext.interactionStart).Seconds) seconds" if ($Global:OpenClientContext.debugMode) { if ($null -ne $EventArgs.Exception.InnerException) { Write-Host -ForegroundColor Red "CommunicationError InnerException : $($EventArgs.Exception.InnerException)" } try { $Global:OpenClientContext.GetAllForms() | ForEach-Object { $formInfo = $Global:OpenClientContext.GetFormInfo($_) if ($formInfo) { Write-Host -ForegroundColor Yellow "Title: $($formInfo.title)" Write-Host -ForegroundColor Yellow "Title: $($formInfo.identifier)" $formInfo.controls | ConvertTo-Json -Depth 99 | Out-Host } } } catch { Write-Host "Exception when enumerating forms" } } } }) $this.events += @(Register-ObjectEvent -InputObject $this.clientSession -EventName UnhandledException -Action { Write-Host -ForegroundColor Red "UnhandledException : $($EventArgs.Exception.Message)" Get-PSCallStack | Write-Host -ForegroundColor Red if ($Global:OpenClientContext) { Write-Host -ForegroundColor Red "Current Interaction: $($Global:OpenClientContext.currentInteraction.ToString())" Write-Host -ForegroundColor Red "Time spend: $(([DateTime]::Now - $Global:OpenClientContext.interactionStart).Seconds) seconds" if ($Global:OpenClientContext.debugMode) { if ($null -ne $EventArgs.Exception.InnerException) { Write-Host -ForegroundColor Red "UnhandledException InnerException : $($EventArgs.Exception.InnerException)" } try { $Global:OpenClientContext.GetAllForms() | ForEach-Object { $formInfo = $Global:OpenClientContext.GetFormInfo($_) if ($formInfo) { Write-Host -ForegroundColor Yellow "Title: $($formInfo.title)" Write-Host -ForegroundColor Yellow "Title: $($formInfo.identifier)" $formInfo.controls | ConvertTo-Json -Depth 99 | Out-Host } } } catch { Write-Host "Exception when enumerating forms" } } } }) $this.events += @(Register-ObjectEvent -InputObject $this.clientSession -EventName InvalidCredentialsError -Action { Write-Host -ForegroundColor Red "InvalidCredentialsError" Get-PSCallStack | Write-Host -ForegroundColor Red }) $this.events += @(Register-ObjectEvent -InputObject $this.clientSession -EventName UriToShow -Action { Write-Host -ForegroundColor Yellow "UriToShow : $($EventArgs.UriToShow)" }) $this.events += @(Register-ObjectEvent -InputObject $this.clientSession -EventName LookupFormToShow -Action { Write-Host -ForegroundColor Yellow "Open Lookup form" }) $this.events += @(Register-ObjectEvent -InputObject $this.clientSession -EventName DialogToShow -Action { $form = $EventArgs.DialogToShow if ($Global:OpenClientContext) { if ($Global:OpenClientContext.debugMode) { Write-Host -ForegroundColor Yellow "Show dialog $($form.ControlIdentifier)" $formInfo = $Global:OpenClientContext.GetFormInfo($form) if ($formInfo) { Write-Host -ForegroundColor Yellow "Title: $($formInfo.title)" #$formInfo.controls | ConvertTo-Json -Depth 99 | Out-Host } } if ( $form.ControlIdentifier -eq "00000000-0000-0000-0800-0000836bd2d2" ) { $errorControl = $form.ContainedControls | Where-Object { $_ -is [Microsoft.Dynamics.Framework.UI.Client.ClientStaticStringControl] } | Select-Object -First 1 Write-Host -ForegroundColor Red "ERROR DIALOG: $($errorControl.StringValue)" $Global:OpenClientContext.CloseForm($form) throw "$($errorControl.StringValue)" } elseif ( $form.ControlIdentifier -eq "00000000-0000-0000-0300-0000836bd2d2" ) { $warningControl = $form.ContainedControls | Where-Object { $_ -is [Microsoft.Dynamics.Framework.UI.Client.ClientStaticStringControl] } | Select-Object -First 1 Write-Host -ForegroundColor Yellow "WARNING DIALOG: $($warningControl.StringValue)" $Global:OpenClientContext.CloseForm($form) } elseif ( $form.ControlIdentifier -eq "{000009ce-0000-0001-0c00-0000836bd2d2}" -or $form.ControlIdentifier -eq "{000009cd-0000-0001-0c00-0000836bd2d2}" ) { $Global:PsTestRunnerCaughtForm = $form } elseif ( $form.ControlIdentifier -eq '8da61efd-0002-0003-0507-0b0d1113171d') { $infoControl = $form.ContainedControls | Where-Object { $_ -is [Microsoft.Dynamics.Framework.UI.Client.ClientStaticStringControl] } | Select-Object -First 1 Write-Host "INFO DIALOG: $($infoControl.StringValue)" $Global:OpenClientContext.CloseForm($form) } else { Write-Host -NoNewline "DIALOG: $($form.Name) $($form.Caption) - " $OkAction = $Global:OpenClientContext.GetActionByName($form, 'OK') if ($OkAction) { Write-Host "Invoke OK" $Global:OpenClientContext.InvokeAction($OkAction) } else { Write-Host "close Dialog" $Global:OpenClientContext.CloseForm($form) } } } }) $this.clientSession.OpenSessionAsync($clientSessionParameters) $this.Awaitstate([Microsoft.Dynamics.Framework.UI.Client.ClientSessionState]::Ready) } # Dispose() { $Global:OpenClientContext = $null $this.events | ForEach-Object { Unregister-Event $_.Name } $this.events = @() try { if ($this.clientSession -and ($this.clientSession.State -ne ([Microsoft.Dynamics.Framework.UI.Client.ClientSessionState]::Closed))) { $this.clientSession.CloseSessionAsync() $this.AwaitState([Microsoft.Dynamics.Framework.UI.Client.ClientSessionState]::Closed) } } catch { } } AwaitState([Microsoft.Dynamics.Framework.UI.Client.ClientSessionState] $state) { $now = [DateTime]::Now While ($this.clientSession.State -ne $state) { Start-Sleep -Milliseconds 100 $thisstate = $this.clientSession.State if ($thisstate -eq [Microsoft.Dynamics.Framework.UI.Client.ClientSessionState]::InError) { throw "ClientSession State is InError (Wait time $(([DateTime]::Now - $now).Seconds) seconds)" } if ($thisstate -eq [Microsoft.Dynamics.Framework.UI.Client.ClientSessionState]::TimedOut) { throw "ClientSession State is TimedOut (Wait time $(([DateTime]::Now - $now).Seconds) seconds)" } if ($thisstate -eq [Microsoft.Dynamics.Framework.UI.Client.ClientSessionState]::Uninitialized) { $waited = ([DateTime]::Now - $now).Seconds if ($waited -ge 10) { throw "ClientSession State is Uninitialized (Wait time $waited seconds)" } } } Start-Sleep -Milliseconds 100 } InvokeInteraction([Microsoft.Dynamics.Framework.UI.Client.ClientInteraction] $interaction) { $this.interactionStart = [DateTime]::Now $this.currentInteraction = $interaction $this.clientSession.InvokeInteractionAsync($interaction) $this.AwaitState([Microsoft.Dynamics.Framework.UI.Client.ClientSessionState]::Ready) } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalForm] InvokeInteractionAndCatchForm([Microsoft.Dynamics.Framework.UI.Client.ClientInteraction] $interaction) { $Global:PsTestRunnerCaughtForm = $null $formToShowEvent = Register-ObjectEvent -InputObject $this.clientSession -EventName FormToShow -Action { $form = $EventArgs.FormToShow $Global:PsTestRunnerCaughtForm = $form if ($Global:OpenClientContext.debugMode) { Write-Host -ForegroundColor Yellow "Show form $($form.ControlIdentifier)" $formInfo = $Global:OpenClientContext.GetFormInfo($form) if ($formInfo) { Write-Host -ForegroundColor Yellow "Title: $($formInfo.title)" # $formInfo.controls | ConvertTo-Json -Depth 99 | Out-Host } } } try { $this.InvokeInteraction($interaction) if (!($Global:PsTestRunnerCaughtForm)) { $this.CloseAllWarningForms() } } finally { Unregister-Event -SourceIdentifier $formToShowEvent.Name } $form = $Global:PsTestRunnerCaughtForm Remove-Variable PsTestRunnerCaughtForm -Scope Global return $form } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalForm] OpenFormWithBookmark([int] $page, [string] $bookmark) { try { $interaction = New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.OpenFormInteraction $interaction.Page = $page $interaction.Bookmark = $bookmark return $this.InvokeInteractionAndCatchForm($interaction) } catch { return $null } } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalForm] OpenForm([int] $page) { try { $interaction = New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.OpenFormInteraction $interaction.Page = $page return $this.InvokeInteractionAndCatchForm($interaction) } catch { return $null } } CloseForm([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $form) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.CloseFormInteraction -ArgumentList $form)) } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalForm[]]GetAllForms() { try { $forms = @() $this.clientSession.OpenedForms.GetEnumerator() | ForEach-Object { $forms += $_ } } catch { Start-Sleep -Seconds 1 $forms = @() $this.clientSession.OpenedForms.GetEnumerator() | ForEach-Object { $forms += $_ } } return $forms } [string]GetErrorFromErrorForm() { $errorText = "" $this.clientSession.OpenedForms.GetEnumerator() | ForEach-Object { $form = $_ if ( $form.ControlIdentifier -eq "00000000-0000-0000-0800-0000836bd2d2" ) { $form.ContainedControls | Where-Object { $_ -is [Microsoft.Dynamics.Framework.UI.Client.ClientStaticStringControl] } | ForEach-Object { $errorText = $_.StringValue } } } return $errorText } [string]GetWarningFromWarningForm() { $warningText = "" $this.clientSession.OpenedForms.GetEnumerator() | ForEach-Object { $form = $_ if ( $form.ControlIdentifier -eq "00000000-0000-0000-0300-0000836bd2d2" ) { $form.ContainedControls | Where-Object { $_ -is [Microsoft.Dynamics.Framework.UI.Client.ClientStaticStringControl] } | ForEach-Object { $warningText = $_.StringValue } } } return $warningText } [Hashtable]GetFormInfo([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalForm] $form) { function Dump-RowControl { Param( [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control ) @{ "$($control.Name)" = $control.ObjectValue } } function Dump-Control { Param( [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control ) $output = @{ "name" = $control.Name "type" = $control.GetType().Name "identifier" = $control.ControlIdentifier } if ($control -is [Microsoft.Dynamics.Framework.UI.Client.ClientGroupControl]) { $output += @{ "caption" = $control.Caption "mappingHint" = $control.MappingHint "children" = @($control.Children | ForEach-Object { Dump-Control -control $_ }) } } elseif ($control -is [Microsoft.Dynamics.Framework.UI.Client.ClientStaticStringControl]) { $output += @{ "value" = $control.StringValue } } elseif ($control -is [Microsoft.Dynamics.Framework.UI.Client.ClientInt32Control]) { $output += @{ "value" = $control.ObjectValue } } elseif ($control -is [Microsoft.Dynamics.Framework.UI.Client.ClientStringControl]) { $output += @{ "value" = $control.stringValue } } elseif ($control -is [Microsoft.Dynamics.Framework.UI.Client.ClientActionControl]) { $output += @{ "caption" = $control.Caption } } elseif ($control -is [Microsoft.Dynamics.Framework.UI.Client.ClientFilterLogicalControl]) { } elseif ($control -is [Microsoft.Dynamics.Framework.UI.Client.ClientRepeaterControl]) { $output += @{ "$($control.name)" = @() } $index = 0 while ($true) { if ($index -ge ($control.Offset + $control.DefaultViewport.Count)) { break } $rowIndex = $index - $control.Offset if ($rowIndex -ge $control.DefaultViewport.Count) { break } $row = $control.DefaultViewport[$rowIndex] $rowoutput = @{} $row.Children | ForEach-Object { $rowoutput += Dump-RowControl -control $_ } $output[$control.name] += $rowoutput $index++ } } else { } $output } return @{ "title" = "$($form.Name) $($form.Caption)" "identifier" = $form.ControlIdentifier "controls" = $form.Children | ForEach-Object { Dump-Control -control $_ } } } CloseAllForms() { $this.GetAllForms() | ForEach-Object { $this.CloseForm($_) } } CloseAllErrorForms() { $this.GetAllForms() | ForEach-Object { if ($_.ControlIdentifier -eq "00000000-0000-0000-0800-0000836bd2d2") { $this.CloseForm($_) } } } CloseAllWarningForms() { $this.GetAllForms() | ForEach-Object { if ($_.ControlIdentifier -eq "00000000-0000-0000-0300-0000836bd2d2") { $this.CloseForm($_) } } } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl]GetControlByCaption([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control, [string] $caption) { return $control.ContainedControls | Where-Object { $_.Caption.Replace("&","") -eq $caption } | Select-Object -First 1 } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl]GetControlByName([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control, [string] $name) { $result = $control.ContainedControls | Where-Object { $_.Name -eq $name } | Select-Object -First 1 if (-not $result) { $result = $control.ContainedControls | Where-Object { $_.Caption -eq $name } | Select-Object -First 1 } return $result } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl]GetControlByType([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control, [Type] $type) { return $control.ContainedControls | Where-Object { $_ -is $type } | Select-Object -First 1 } SaveValue([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control, [string] $newValue) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.SaveValueInteraction -ArgumentList $control, $newValue)) } SelectFirstRow([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.InvokeActionInteraction -ArgumentList $control, SelectFirstRow)) } SelectLastRow([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.InvokeActionInteraction -ArgumentList $control, SelectLastRow)) } Refresh([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.InvokeActionInteraction -ArgumentList $control, Refresh)) } ScrollRepeater([Microsoft.Dynamics.Framework.UI.Client.ClientRepeaterControl] $repeater, [int] $by) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.ScrollRepeaterInteraction -ArgumentList $repeater, $by)) } ActivateControl([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.ActivateControlInteraction -ArgumentList $control)) } [Microsoft.Dynamics.Framework.UI.Client.ClientActionControl]GetActionByCaption([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control, [string] $caption) { return $control.ContainedControls | Where-Object { ($_ -is [Microsoft.Dynamics.Framework.UI.Client.ClientActionControl]) -and ($_.Caption.Replace("&","") -eq $caption) } | Select-Object -First 1 } [Microsoft.Dynamics.Framework.UI.Client.ClientActionControl]GetActionByName([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $control, [string] $name) { $result = $control.ContainedControls | Where-Object { ($_ -is [Microsoft.Dynamics.Framework.UI.Client.ClientActionControl]) -and ($_.Name -eq $name) } | Select-Object -First 1 if (-not $result) { $result = $control.ContainedControls | Where-Object { ($_ -is [Microsoft.Dynamics.Framework.UI.Client.ClientActionControl]) -and ($_.Caption -eq $name) } | Select-Object -First 1 } return $result } InvokeAction([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $action) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.InvokeActionInteraction -ArgumentList $action)) } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalForm]InvokeActionAndCatchForm([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $action) { return $this.InvokeInteractionAndCatchForm((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.InvokeActionInteraction -ArgumentList $action)) } InvokeSystemAction([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $action, [string] $systemAction) { $this.InvokeInteraction((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.InvokeActionInteraction -ArgumentList $action, $systemAction)) } [Microsoft.Dynamics.Framework.UI.Client.ClientLogicalForm]InvokeSystemActionAndCatchForm([Microsoft.Dynamics.Framework.UI.Client.ClientLogicalControl] $action, [string] $systemAction) { return $this.InvokeInteractionAndCatchForm((New-Object Microsoft.Dynamics.Framework.UI.Client.Interactions.InvokeActionInteraction -ArgumentList $action, $systemAction)) } } # SIG # Begin signature block # MIImbAYJKoZIhvcNAQcCoIImXTCCJlkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBrI551zQg1s7N0 # bcxt0wd8SqVvwsEHMzIhfufnUEzAS6CCH4QwggWNMIIEdaADAgECAhAOmxiO+dAt # 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV # BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa # Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD # ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E # MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy # unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF # xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 # 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB # MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR # WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 # nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB # YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S # UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x # q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB # NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP # TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC # AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 # aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB # LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc # Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov # Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy # oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW # juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF # mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z # twGpn1eqXijiuZQwggYaMIIEAqADAgECAhBiHW0MUgGeO5B5FSCJIRwKMA0GCSqG # SIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0 # ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBSb290IFI0 # NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5NTlaMFQxCzAJBgNVBAYTAkdC # MRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVi # bGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw # ggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjIztNsfvxYB5UXeWUzCxEeAEZG # bEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NVDgFigOMYzB2OKhdqfWGVoYW3 # haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/36F09fy1tsB8je/RV0mIk8XL/ # tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05ZwmRmTnAO5/arnY83jeNzhP06S # hdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm+qxp4VqpB3MV/h53yl41aHU5 # pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUedyz8rNyfQJy/aOs5b4s+ac7I # H60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz44MPZ1f9+YEQIQty/NQd/2yGg # W+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBMdlyh2n5HirY4jKnFH/9gRvd+ # QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFDLrkpr/NZZILyhAQnAg # NpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritUpimqF6TNDDAOBgNVHQ8BAf8E # BAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggrBgEFBQcDAzAb # BgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsGA1UdHwREMEIwQKA+oDyGOmh0 # dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nUm9v # dFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsGAQUFBzAChjpodHRwOi8vY3J0 # LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RSNDYucDdj # MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0B # AQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURhw1aVcdGRP4Wh60BAscjW4HL9 # hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0ZdOaWTsyNyBBsMLHqafvIhrCym # laS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajjcw5+w/KeFvPYfLF/ldYpmlG+ # vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNcWbWDRF/3sBp6fWXhz7DcML4i # TAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalOhOfCipnx8CaLZeVme5yELg09 # Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJszkyeiaerlphwoKx1uHRzNyE6 # bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z76mKnzAfZxCl/3dq3dUNw4rg3 # sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5JKdGvspbOrTfOXyXvmPL6E52z # 1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHHj95Ejza63zdrEcxWLDX6xWls # /GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2Bev6SivBBOHY+uqiirZtg0y9 # ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/L9Uo2bC5a4CH2RwwggZZMIIE # waADAgECAhANIM3qwHRbWKHw+Zq6JhzlMA0GCSqGSIb3DQEBDAUAMFQxCzAJBgNV # BAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3Rp # Z28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwHhcNMjExMDIyMDAwMDAwWhcN # MjQxMDIxMjM1OTU5WjBdMQswCQYDVQQGEwJESzEUMBIGA1UECAwLSG92ZWRzdGFk # ZW4xGzAZBgNVBAoMEkZyZWRkeSBLcmlzdGlhbnNlbjEbMBkGA1UEAwwSRnJlZGR5 # IEtyaXN0aWFuc2VuMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgYC5 # tlg+VRktRRkahxxaV8+DAd6vHoDpcO6w7yT24lnSoMuA6nR7kgy90Y/sHIwKE9Ww # t/px/GAY8eBePWjJrFpG8fBtJbXadRTVd/470Hs/q9t+kh6A/0ELj7wYsKSNOyuF # Poy4rtClOv9ZmrRpoDVnh8Epwg2DpklX2BNzykzBQxIbkpp+xVo2mhPNWDIesntc # 4/BnSebLGw1Vkxmu2acKkIjYrne/7lsuyL9ue0vk8TGk9JBPNPbGKJvHu9szP9oG # oH36fU1sEZ+AacXrp+onsyPf/hkkpAMHAhzQHl+5Ikvcus/cDm06twm7VywmZcas # 2rFAV5MyE6WMEaYAolwAHiPz9WAs2GDhFtZZg1tzbRjJIIgPpR+doTIcpcDBcHnN # dSdgWKrTkr2f339oT5bnJfo7oVzc/2HGWvb8Fom6LQAqSC11vWmznHYsCm72g+fo # TKqW8lLDfLF0+aFvToLosrtW9l6Z+l+RQ8MtJ9EHOm2Ny8cFLzZCDZYw32BydwcL # V5rKdy4Ica9on5xZvyMOLiFwuL4v2V4pjEgKJaGSS/IVSMEGjrM9DHT6YS4/oq9q # 20rQUmMZZQmGmEyyKQ8t11si8VHtScN5m0Li8peoWfCU9mRFxSESwTWow8d462+o # 9/SzmDxCACdFwzvfKx4JqDMm55cL+beunIvc0NsCAwEAAaOCAZwwggGYMB8GA1Ud # IwQYMBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0MMB0GA1UdDgQWBBTZD6uy9ZWIIqQh # 3srYu1FlUhdM0TAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUE # DDAKBggrBgEFBQcDAzARBglghkgBhvhCAQEEBAMCBBAwSgYDVR0gBEMwQTA1Bgwr # BgEEAbIxAQIBAwIwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9D # UFMwCAYGZ4EMAQQBMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGln # by5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUF # BwEBBG0wazBEBggrBgEFBQcwAoY4aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0 # aWdvUHVibGljQ29kZVNpZ25pbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6 # Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQASEbZACurQeQN8 # WDTR+YyNpoQ29YAbbdBRhhzHkT/1ao7LE0QIOgGR4GwKRzufCAwu8pCBiMOUTDHT # ezkh0rQrG6khxBX2nSTBL5i4LwKMR08HgZBsbECciABy15yexYWoB/D0H8WuGe63 # PhGWueR4IFPbIz+jEVxfW0Nyyr7bXTecpKd1iprm+TOmzc2E6ab95dkcXdJVx6Zy # s++QrrOfQ+a57qEXkS/wnjjbN9hukL0zg+g8L4DHLKTodzfiQOampvV8QzbnB7Y8 # YjNcxR9s/nptnlQH3jorNFhktiBXvD62jc8pAIg6wyH6NxSMjtTsn7QhkIp2kusw # IQwD8hN/fZ/m6gkXZhRJWFr2WRZOz+edZ62Jf25C/NYWscwfBwn2hzRZf1HgyxkX # Al88dvvUA3kw1T6uo8aAB9IcL6Owiy7q4T+RLRF7oqx0vcw0193Yhq/gPOaUFlqz # ExP6TQ5TR9XWVPQk+a1B1ATKMLi1JShO6KWTmNkFkgkgpkW69BEwggauMIIElqAD # AgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYT # AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy # dC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAz # MjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQK # Ew5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBS # U0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDM # g/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOx # s+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09ns # ad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtA # rF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149z # k6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6 # OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qh # HGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1 # KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX # 6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0 # sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQID # AQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2F # L3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08w # DgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEB # BGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsG # AQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz # dGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgG # BmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+Y # qUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjY # C+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0 # FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6 # WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGj # VoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzp # SwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwd # eDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o # 08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n # +2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y # 3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIO # K+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIGwjCCBKqgAwIBAgIQBUSv85SdCDmm # v9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO # RGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNB # NDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0 # MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ # bmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCCAiIwDQYJKoZI # hvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X5dLnXaEOCdwv # SKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uUUI8cIOrHmjsv # lmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa2mq62DvKXd4Z # GIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgtXkV1lnX+3RCh # G4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60pCFkcOvV5aDa # Y7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17cz4y7lI0+9S7 # 69SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BYQfvYsSzhUa+0 # rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9c33u3Qr/eTQQ # fqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw9/sqhux7Ujip # mAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2ckpMEtGlwJw1P # t7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhRB8qUt+JQofM6 # 04qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIw # ADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjAL # BglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYD # VR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEwT6BNoEuGSWh0 # dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZT # SEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsG # AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0 # dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQw # OTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAIEa # 1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF7SaCinEvGN1O # tt5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrCQDifXcigLiV4 # JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFcjGnRuSvExnvP # nPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8wWkZus8W8oM3 # NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbFKNOt50MAcN7M # mJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP4xeR0arAVeOG # v6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VPNTwAvb6cKmx5 # AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvrmoI1VygWy2ny # Mpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2obhDLN9OTH0e # aHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJuEbTbDJ8WC9n # R2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMYIGPjCCBjoCAQEwaDBUMQsw # CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJT # ZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2AhANIM3qwHRbWKHw+Zq6 # JhzlMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAw # GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG # AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINxqSQNnPMx6+1c7rsLccIGG0Eb4QqO2 # dKgkHzvQuROnMA0GCSqGSIb3DQEBAQUABIICAB2R/8qyBgqAkMPJg+iK16BE5uHG # K3HnReZ3AHAu/M2/wDLjwC17Vpj+OpQcGmo3S1YIwrNQY3+Fd9Klm6BOwpExcigO # 5w4aPsEyKZ/CujOtfY7bYLpFAwbc7GL9ZOD4zcztEzpAjc0A6ih8KodTSlVRFxcN # VQF2SyUmriyzAzvuDa297/Zj+5UCBaGQLegq++0GUPwnrjSsxTwcDdJitO78y7wa # gt6mZr1UKrzS2rZe1HB2QFoCDVFrWnltaIO5YSkx/B8fCJpFblk1IU/p5cyFSaAO # vDDsNrymRVr1Wca0b2UGZhsiTTwPHllC4WP9Z+FHB2QDh2O/FYh2wo7ZQi7+z4sy # 6Nda49n3a3He+OCmaQAEMyn5woi9fKEcn7MpUIthZF2kLOnVR2r3TSsOiqdybTQn # AiKhU+/Rzc8OpBFiZsWZAdPjlS3h0C2oaGGPVtGMxpToCttZFwWUauXN5EbOGq05 # 5RGupoSWf87/aFyXmos8ynalbzMAGj+pJz7IsSWjC9zSRi6I7I+ndIk0gTf2WnjH # rTRq1F99GqlwudobpsmfDWe81Hv8gOUB5Gk1XQxAkbazTOu4BTiVOceBEXbH59bK # Ji+s6XSm8nEZHknioYOTivGxMutSXLo27IzIOg7nQA2teMgAr3q4JxnV5IqSrhLN # 4+opvADXvjI9UOFhoYIDIDCCAxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcwYzEL # MAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJE # aWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBD # QQIQBUSv85SdCDmmv9s/X+VhFjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJ # AzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI0MDgyMTA3NDMxMFowLwYJ # KoZIhvcNAQkEMSIEIOfb0QUNX3EbJO0m8kUcSoZCylHhTyroCh6OgfzlXJQ1MA0G # CSqGSIb3DQEBAQUABIICAIWrOijavfmAjAjucSwArixbVGIiRLkkzxV0PI7T9d4J # W0TBWVsfeiRmG01d8KPfb0YsNHsuMOUAVLHWKJHjaEJmU7ZcEdtknu1ezTLQICuw # aHjOsPe1rUtQQnZF5yHU4VdU5lZXkvBXFVCkIU5AsjPaF4RlR1DUyW4CgOcypGGg # ynRxblDOUGmLYYe1Bj1QeFU28a+O+WwaFaMw8FY99knb/ifAIm2bAO+z/a5Px5rX # YzEHDBVNXfyA//MKANV6F6I83gaMAagosWWIc6Dbk4gl7Gdtkux7tPKTbRV0fL1a # m3+dd7x94HF1c9uwc1DdwzyB0vWGH9mFY6M89isEBkn7BjWetulVkfa5rC7GxpYk # yyAoKly8sbz/HjdWV0QuzfmZ0Ly9DwLIrrmch0dx4mlk5j53kxR80dTearaXzEmN # WqwVlLx4OHzDqnlOvDHyffzJ8NeFK3/oEItwVoAU3ATalzCKa13VucVYal9v9TrY # 7pP5uen0x8AWuzdO0haFfzmSmkPQYzZHUdZRmylonupDbqAtpDfJN1XxAMm6QDaO # ECLUWqPLpimh8GEwJVOSKqHbyNYNazpScvVIvZ4pa0G1bBjA0ZknfpFtnzNNCEvk # oq34zbNqm5H2arbE+MEnzs7xBQOO0ZgegV45lhXc3JSRG8DLjYcR5bcnz8IdUKzV # SIG # End signature block |