AzStackHciSBEHealth/AzStackHci.SBEHealth.psm1
<#############################################################
# # # Copyright (C) Microsoft Corporation. All rights reserved. # # # #############################################################> Import-Module $PSScriptRoot\AzStackHci.SBEHealth.Helpers.psm1 -Force -DisableNameChecking -Global Import-Module $PSScriptRoot\..\AzStackHci.EnvironmentChecker.Utilities.psm1 -Force -DisableNameChecking -Global Import-Module $PSScriptRoot\..\AzStackHci.EnvironmentChecker.Reporting.psm1 -Force -DisableNameChecking -Global Import-LocalizedData -BindingVariable lhwTxt -FileName AzStackHci.SBEHealth.Strings.psd1 function Invoke-AzStackHciSBEHealthValidation { <# .SYNOPSIS Perform AzStackHci SBE Health validation .DESCRIPTION Perform AzStackHci SBE Health validation .EXAMPLE PS C:\> Invoke-AzStackHciSBEHealthValidation -SBESourcePath "C:\SBE" Perform SBE Health validations on localhost .EXAMPLE PS C:\> $Credential = Get-Credential -Message "Credential for RemoteSystem" PS C:\> $RemoteSystemSession = New-PSSession -Computer 10.0.0.4,10.0.0.5 -Credential $Credential PS C:\> Invoke-AzStackHciSBEHealthValidation -SBESourcePath "C:\SBE" -PsSession $RemoteSystemSession Perform SBE Health validations on the localhost and all specified remote PS sessions .PARAMETER PsSession Specify the PsSession(s) used to validation from .PARAMETER Tag Specify the Tag value to be passed to the SolutionExtension module when called .PARAMETER SBESourcePath Specify the full local path to the folder containing the extracted SBE Package .PARAMETER SBEMetadataPath Specify the full local path to the folder containing the SBE Metadata files .PARAMETER PassThru Return PSObject result .PARAMETER OutputPath Directory path for log and report output .PARAMETER CleanReport Remove all previous progress and create a clean report .INPUTS Inputs (if any) .OUTPUTS Output (if any) #> [CmdletBinding()] param ( [Parameter(Mandatory = $false, HelpMessage = "Specify the PsSession(s) used to validation from. If null the local machine will be used.")] [System.Management.Automation.Runspaces.PSSession[]] $PsSession, [Parameter(Mandatory = $false, HelpMessage = "Tag to pass to SolutionExtension module functions.")] [string] $Tag = "Deployment", [Parameter(Mandatory = $true, HelpMessage = "Local path to the folder containing the extracted SBE Package.")] [string] $SBESourcePath, [Parameter(Mandatory = $true, HelpMessage = "Local path to the folder containing the SBE metadata file.")] [string] $SBEMetadataPath, [Parameter(Mandatory = $false, HelpMessage = "Return PSObject result.")] [switch] $PassThru, [Parameter(Mandatory = $false, HelpMessage = "Directory path for log and report output")] [string]$OutputPath, [Parameter(Mandatory = $false, HelpMessage = "Remove all previous progress and create a clean report")] [switch]$CleanReport = $false, [Parameter(Mandatory = $false, HelpMessage = "Show only failed results on screen.")] [switch]$ShowFailedOnly, [Parameter(Mandatory = $false, HelpMessage = "Skip the SBE file integrity test.")] [switch]$SkipIntegrityTest, [Parameter(Mandatory = $false, HelpMessage = "ECE Params")] [CloudEngine.Configurations.EceInterfaceParameters]$ECEParameters ) try { $script:ErrorActionPreference = 'Stop' Set-AzStackHciOutputPath -Path $OutputPath $allResult = @() $sbeWorkingDir = Join-Path -Path $env:SystemDrive -ChildPath "SBE\Extracted" Write-AzStackHciHeader -Invocation $MyInvocation -Params $PSBoundParameters -PassThru:$PassThru Test-ModuleUpdate -PassThru:$PassThru # Call/Initialise reporting $envcheckerReport = Get-AzStackHciEnvProgress -Clean:$CleanReport $envcheckerReport = Add-AzStackHciEnvJob -Report $envcheckerReport Log-Info -Message ("Check partner properties in unattended.json match SBE manifest") -Type Info try { $result = Test-SBEPropertiesValid -ECEParameters $ECEParameters } catch { Log-Info -Message "Error validating partner properties in unattended.json with SBE manifest" -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $exceptionResult = New-SBEHealthResultObject -TestName 'Test-SBEPropertiesValid' -TargetName $env:ComputerName -Status 'FAILURE' -Description "Validate partner properties in unattended.json" $exceptionResult.Severity = 'CRITICAL' $detailedMessage = "Found invalid partnerProperties in unattended.json. $($PSItem.Exception.Message)" $exceptionResult.Remediation = "Fix PartnerProperties to be compliant with the JSON schema in the <PartnerProperties> element of the SBE manifest located at c:\SBE\SBE_Discovery*.xml." $exceptionResult.AdditionalData.Detail = $detailedMessage $allResult += $exceptionResult throw $detailedMessage } Log-Info -Message ("Check SBE credentials in secret store match SBE manifest") -Type Info try { $result = Test-SBECredentialsValid -ECEParameters $ECEParameters } catch { Log-Info -Message "Error validating SBE credentials in secret store with SBE manifest" -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $exceptionResult = New-SBEHealthResultObject -TestName 'Test-SBECredentialsValid' -TargetName $env:ComputerName -Status 'FAILURE' -Description "Validate SBE credentials in secret store" $exceptionResult.Severity = 'CRITICAL' $detailedMessage = "Found invalid SBE Credentials in secret store. $($PSItem.Exception.Message)" $exceptionResult.Remediation = "Correct issues with the indicated secrets in the Key Vault associated with this cluster and restart your deployment." $exceptionResult.AdditionalData.Detail = $detailedMessage $allResult += $exceptionResult throw $detailedMessage } # Pre-validation checks and preparation Log-Info -Message ("Validate the SolutionExtension module is present and meets the requirements for health testing.") -Type Info try { $result = Test-SolutionExtensionModule -PackagePath $SBESourcePath if ($false -eq $result) { $detailedMessage = "Skipping as the provided SolutionExtension module has not implemented any tests or does not support the HealthServiceIntegration tag." Log-Info -Message $detailedMessage -Type Info $instanceResult = New-SBEHealthResultObject -TestName 'Test-SolutionExtensionModule' -TargetName $env:ComputerName -Status 'SUCCESS' -Description "Validate SolutionExtension module exists and supports health tests" $instanceResult.AdditionalData.Detail = $detailedMessage $allResult += $instanceResult return $allResult } } catch { Log-Info -Message "The SolutionExtension module could not be validated" -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $exceptionResult = New-SBEHealthResultObject -TestName 'Test-SolutionExtensionModule' -TargetName $env:ComputerName -Status 'FAILURE' -Description "Validate SolutionExtension module exists and supports health tests" $exceptionResult.Severity = 'CRITICAL' $detailedMessage = "The SolutionExtension module could not be validated. $($PSItem.Exception.Message)" $exceptionResult.Remediation = "https://learn.microsoft.com/en-us/azure-stack/hci/deploy/deployment-tool-troubleshoot#rerun-deployment" $exceptionResult.AdditionalData.Detail = $detailedMessage $allResult += $exceptionResult throw $detailedMessage } # Copy SBE package to local working dir try { $result = Copy-SBEContentLocalToNode -PackagePath $SBESourcePath -TargetNodeName $env:ComputerName -ExcludeDirs @("IntegratedContent") if ($false -eq $result) { throw "An error occurred during the SBE package copy operation. See logs for details." } } catch { Log-Info -Message "An error occurred during the SBE package copy operation" -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $detailedMessage = $PSItem.Exception.Message $exceptionResult = New-SBEHealthResultObject -TestName 'Copy-SBEContentLocalToNode' -TargetName $env:ComputerName -Status 'FAILURE' -Description "Copy the SBE Package to working folder on '$($env:ComputerName)'" $exceptionResult.Severity = 'CRITICAL' $exceptionResult.Remediation = "https://learn.microsoft.com/en-us/azure-stack/hci/deploy/deployment-tool-troubleshoot#rerun-deployment" $exceptionResult.AdditionalData.Detail = $detailedMessage $allResult += $exceptionResult throw $detailedMessage } # Validate SBE content integrity of working dir try { if (-not $SkipIntegrityTest) { $result = Invoke-TestSBEContentIntegrity -SBEMetadataPath $SBEMetadataPath -SBEContentPath $sbeWorkingDir if ($false -eq $result) { throw "SBE content integrity check found irregularities in the files at '$($sbeWorkingDir)'. Check the ECE logs for more information." } } } catch { $detailedMessage = "SBE content failed integrity check at '$($sbeWorkingDir)'" Log-Info -Message $detailedMessage -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $exceptionResult = New-SBEHealthResultObject -TestName 'Test-SBEContentIntegrity' -TargetName $env:ComputerName -Status 'FAILURE' -Description "Validate SBE content integrity" $exceptionResult.Severity = 'CRITICAL' $exceptionResult.Remediation = "https://learn.microsoft.com/en-us/azure-stack/hci/deploy/deployment-tool-troubleshoot#rerun-deployment" $exceptionResult.AdditionalData.Detail = $detailedMessage $allResult += $exceptionResult throw $detailedMessage } # Import the SolutionExtension module try { $result = Import-SolutionExtensionModule -PackagePath $sbeWorkingDir } catch { $detailedMessage = "Import SolutionExtension module from '$($sbeWorkingDir)' failed. The exception was: $($PSItem.Exception.Message)" Log-Info -Message "Import SolutionExtension module from '$($sbeWorkingDir)' failed." -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $exceptionResult = New-SBEHealthResultObject -TestName 'Import-SolutionExtensionModule' -TargetName $env:ComputerName -Status 'FAILURE' -Description "Import SolutionExtension module" $exceptionResult.Severity = 'CRITICAL' $exceptionResult.Remediation = "https://learn.microsoft.com/en-us/azure-stack/hci/deploy/deployment-tool-troubleshoot#rerun-deployment" $exceptionResult.AdditionalData.Detail = $detailedMessage $allResult += $exceptionResult throw $detailedMessage } # Run validation try { $functionName = 'Get-SBEHealthCheckResult' $exceptionResult = $null $instanceResult = @() $functionFound = Get-Command -Module SolutionExtension -Name $functionName -ErrorAction SilentlyContinue if ($null -eq $functionFound) { $detailedMessage = "A function named '$($functionName)' was not found in the SolutionExtension module." Log-Info -Message $detailedMessage -Type Error -ConsoleOut $thisResult = New-SBEHealthResultObject -TestName $functionName -TargetName $env:ComputerName -Status 'FAILURE' -Description "Invoke $functionName" $thisResult.Severity = 'CRITICAL' $thisResult.AdditionalData.Detail = $detailedMessage $instanceResult += $thisResult } else { $solExtVersion = $functionFound.Version.ToString() Log-Info -Message "SolutionExtension version being used: $solExtVersion" -Type Info $params = Get-SBEHealthCheckParams -ECEParameters $ECEParameters Log-Info -Message "Invoke $functionName on $($env:ComputerName)" -Type Info [array]$thisResult = & $functionName @params if ($thisResult.Count -eq 0) { Log-Info -Message "'$($functionName)' did not return any test results or no tests have been implemented." -Type Warning } else { [array]$assertResult = Assert-ResponseSchemaValid -ResultObject $thisResult $instanceResult += $assertResult } } } catch { # Unexpected exception occurred during partner tests Log-Info -Message "An error occurred during '$($functionName)'" -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $exceptionResult = New-SBEHealthResultObject -TestName $functionName -TargetName $env:ComputerName -Status 'FAILURE' -Description "$functionName on $($env:ComputerName)" $exceptionResult.Severity = 'CRITICAL' $exceptionResult.Remediation = "https://learn.microsoft.com/en-us/azure-stack/hci/deploy/deployment-tool-troubleshoot#rerun-deployment" $exceptionResult.AdditionalData.Detail = "An unhandled error occurred: " + ($PSItem | Format-List * | Out-String).Trim() throw $PSItem } finally { $allResult += $instanceResult $allResult += $exceptionResult } try { $jobRun = @() $exceptionResult = "" $instanceResult = @() $functionName = 'Get-SBEHealthCheckResultOnNode' $functionFound = Get-Command -Module SolutionExtension -Name $functionName -ErrorAction SilentlyContinue if ($null -eq $functionFound) { $detailedMessage = "A function named '$($functionName)' was not found in the SolutionExtension module." Log-Info -Message $detailedMessage -Type Error -ConsoleOut $exceptionResult = New-SBEHealthResultObject -TestName $functionName -TargetName $env:ComputerName -Status 'FAILURE' -Description "Invoke $functionName" $exceptionResult.Severity = 'CRITICAL' $exceptionResult.AdditionalData.Detail = $detailedMessage } else { if ($null -eq $params) { $params = Get-SBEHealthCheckParams -ECEParameters $ECEParameters } foreach ($session in $PsSession) { try { $thisCred = $session.Runspace.ConnectionInfo.Credential $result = Copy-SBEContentLocalToNode -PackagePath $SBESourcePath -TargetNodeName ($session.ComputerName) -ExcludeDirs @("IntegratedContent") -Credential $thisCred if ($false -eq $result) { throw "An error occurred during the SBE package copy operation to '$($session.ComputerName)'. See logs for details." } } catch { Log-Info -Message "An unhandled error occurred during 'Copy-SBEContentLocalToNode' to '$($session.ComputerName)'" -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $detailedMessage = $PSItem.Exception.Message $exceptionResult = New-SBEHealthResultObject -TestName $functionName -TargetName $session.ComputerName -Status 'FAILURE' -Description "Copy-SBEContentLocalToNode to '$($session.ComputerName)'" $exceptionResult.Severity = 'CRITICAL' $exceptionResult.AdditionalData.Detail = $detailedMessage throw $detailedMessage } } try { foreach ($session in $PsSession) { # Verify SBE content integrity if (-not $SkipIntegrityTest) { $result = Invoke-TestSBEContentIntegrity -SBEMetadataPath $SBEMetadataPath -SBEContentPath $sbeWorkingDir -PsSession $session if ($false -eq $result) { throw "SBE content integrity check found irregularities in the files at '$($sbeWorkingDir)' on '$($session.ComputerName)'" } } # Import the SolutionExtension module $result = Import-SolutionExtensionModule -PackagePath $sbeWorkingDir -PsSession $session Log-Info -Message "Invoke $functionName on '$($session.ComputerName)'" -Type Info $sbJob = { if ($null -eq $functionName) { $functionName = $using:functionName } if ($null -eq $params) { $params = $using:params } & $functionName @params } $jobRun += Invoke-Command -Session $session -ScriptBlock $sbJob -AsJob } } catch { Log-Info -Message "An unhandled error occurred on '$($session.ComputerName)' during '$($functionName)'" -Type Error -ConsoleOut Log-Info -Message ("The exception message was: $($PSItem.Exception.Message)") -Type Error -ConsoleOut $detailedMessage = $PSItem.Exception.Message $exceptionResult = New-SBEHealthResultObject -TestName $functionName -TargetName $session.ComputerName -Status 'FAILURE' -Description "Invoke '$($functionName)' on '$($session.ComputerName)'" $exceptionResult.Severity = 'CRITICAL' $exceptionResult.AdditionalData.Detail = $detailedMessage throw $detailedMessage } # Wait for all jobs to complete with a timeout after 30 minutes Log-Info -Message "Waiting for all '$($functionName)' jobs to complete" -Type Info $waitJob = $true $stopwatch = [System.Diagnostics.Stopwatch]::StartNew() $timeoutMinutes = 30 while ($true -eq $waitJob) { if ($stopwatch.Elapsed.TotalMinutes -ge $timeoutMinutes) { Log-Info -Message "All jobs have not completed in the specified timeout period." -Type Error $stopwatch.Stop() $waitJob = $false } else { $keepWaiting = $false foreach ($job in $jobRun.ChildJobs) { if ($job.State -eq 'Running') { $keepWaiting = $true } } if ($false -eq $keepWaiting) { $stopwatch.Stop() $waitJob = $false } else { Start-Sleep -Seconds 30 } } } foreach ($job in $jobRun.ChildJobs) { $thisComputerName = $job.Location if ($job.State -eq 'Failed') { [string]$detailedMessage = "Error while running '$($functionName)' on '$($thisComputerName)'. Exception message: " + $job.JobStateInfo.Reason.Message Log-Info -Message $detailedMessage -Type Error -ConsoleOut $exceptionResult = New-SBEHealthResultObject -TestName $functionName -TargetName $job.Location -Status 'FAILURE' -Description "An exception occurred during $functionName" $exceptionResult.Severity = 'CRITICAL' $exceptionResult.AdditionalData.Detail = $detailedMessage $allResult += $exceptionResult } elseif ($job.State -eq 'Running') { Log-Info -Message "'$($functionName)' was still running on '$($thisComputerName)' when the timeout period was hit." -Type Warning $job | Stop-Job } else { Log-Info -Message "Log results for '$($thisComputerName)'" -Type Info [array]$thisOutput = $job.Output if ($thisOutput.Count -gt 0) { $instanceResult += $thisOutput } } } if ($instanceResult.Count -gt 0) { [array]$assertResult = Assert-ResponseSchemaValid -ResultObject $instanceResult [array]$instanceResult = $assertResult } else { Log-Info -Message "'$($functionName)' did not return any test results or no tests have been implemented." -Type Warning } } } catch { foreach ($job in $jobRun.ChildJobs) { if ($job.State -eq 'Running') { Log-Info -Message "'$($functionName)' was still running on '$($thisComputerName)' when an exception occurred." -Type Warning $job | Stop-Job } } throw $PSItem } finally { $allResult += $instanceResult $allResult += $exceptionResult } return $allResult } catch { Log-Info -Message "" -ConsoleOut Log-Info -Message "$($PSItem.Exception.Message)" -ConsoleOut -Type Error Log-Info -Message "$($PSItem.ScriptStackTrace)" -ConsoleOut -Type Error $cmdletException = $_ throw $PSItem } finally { Log-Info -Message "Performing clean up" $cleanupScriptBlock = { Get-Module -Name SolutionExtension -ErrorAction SilentlyContinue | Remove-Module -Force -Verbose:$false if ($null -eq $sbeWorkingDir) { $sbeWorkingDir = $using:sbeWorkingDir } if (Test-Path -Path $sbeWorkingDir) { Write-Output "Remove SBE temporary working folder '$($sbeWorkingDir)' on '$($env:ComputerName)'" Remove-Item -Path $sbeWorkingDir -Recurse -Force } } if ($PsSession.Count -gt 0) { $jobClean = Invoke-Command -Session $PsSession -ScriptBlock $cleanupScriptBlock -AsJob $jobClean | Wait-Job | Out-Null foreach ($job in $jobClean.ChildJobs) { if ($job.State -eq 'Failed') { [string]$detailedMessage = "An exception occurred during clean-up on '$($job.Location)'. Exception message: " + $job.JobStateInfo.Reason.Message Log-Info -Message $detailedMessage -Type Warning } else { [string]$output = $job.Output Log-Info -Message $output -Type Info } } } else { Invoke-Command -ScriptBlock $cleanupScriptBlock } $script:ErrorActionPreference = 'SilentlyContinue' # Write result to telemetry channel foreach ($res in $allResult) { Write-ETWResult -Result $res } # Write validation result to report object and close out report $envcheckerReport | Add-Member -MemberType NoteProperty -Name 'SBEHealth' -Value $allResult -Force $envcheckerReport = Close-AzStackHciEnvJob -Report $envcheckerReport Write-AzStackHciEnvReport -Report $envcheckerReport Write-AzStackHciFooter -Invocation $MyInvocation -Exception $cmdletException -PassThru:$PassThru } } # SIG # Begin signature block # MIIoLAYJKoZIhvcNAQcCoIIoHTCCKBkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBPeX4QhKFsKf3S # bpIsMgPyKYvyysvNLzTfvXYkLL2iRaCCDXYwggX0MIID3KADAgECAhMzAAADrzBA # DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA # hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG # 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN # xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL # go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB # tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd # mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ # 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY # 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp # XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn # TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT # e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG # OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O # PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk # ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx # HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt # CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # 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 # /Xmfwb1tbWrJUnMTDXpQzTGCGgwwghoIAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILp69MQcBM72qm5Qh5On3QRt # 8Djk07QYMLRWkF2x3RwTMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAc8jTLVYJJmNi92qPHN0eUb1BaGt1cF5yjSak8BvZ5pp1tU9Uygl5gjGM # EIG31i8afkGg07JIhBhhEw7TJ8v/oTmTWZC+d+yLZ8/zeseOYQGc2UD4qHztm4/+ # LL4SZBFTjNu4A3RBJbts77VW1gK26ehC0DHoSyN1Qnt0/0Z+4f8KtBRfJXf+0dLk # GqJSIb26LKrA++S4VixUq5u6NrS6/ewQ6GEBgmIX1gSRadbHEN3owb3OodmBAuTe # a3gZ1xADmZqNt96ZDjKF/QGpGZRy9o0APRFRmR4XXT9aiWSNoiPWMy9lTzcrrETd # 1PVyjdG5cJw0mbHEwwETFgrvdQkYwKGCF5YwgheSBgorBgEEAYI3AwMBMYIXgjCC # F34GCSqGSIb3DQEHAqCCF28wghdrAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFRBgsq # hkiG9w0BCRABBKCCAUAEggE8MIIBOAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCAVLfjL/1AZOjTpnrMknRdy35sQWoSKNbnCYP990qtrJgIGZpVdjZA8 # GBIyMDI0MDcxNjE2MjY1Mi4xNlowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVy # aWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjpBMDAwLTA1 # RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCC # Ee0wggcgMIIFCKADAgECAhMzAAAB6+AYbLW27zjtAAEAAAHrMA0GCSqGSIb3DQEB # CwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV # BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIzMTIwNjE4NDUz # NFoXDTI1MDMwNTE4NDUzNFowgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMx # JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjpBMDAwLTA1RTAtRDk0NzElMCMGA1UE # AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBAMEVaCHaVuBXd4mnTWiqJoUG5hs1zuFIqaS28nXk2sH8 # MFuhSjDxY85M/FufuByYg4abAmR35PIXHso6fOvGegHeG6+/3V9m5S6AiwpOcC+D # YFT+d83tnOf0qTWam4nbtLrFQMfih0WJfnUgJwqXoQbhzEqBwMCKeKFPzGuglZUB # Mvunxtt+fCxzWmKFmZy8i5gadvVNj22el0KFav0QBG4KjdOJEaMzYunimJPaUPmG # d3dVoZN6k2rJqSmQIZXT5wrxW78eQhl2/L7PkQveiNN0Usvm8n0gCiBZ/dcC7d3t # KkVpqh6LHR7WrnkAP3hnAM/6LOotp2wFHe3OOrZF+sI0v5OaL+NqVG2j8npuHh8+ # EcROcMLvxPXJ9dRB0a2Yn+60j8A3GLsdXyAA/OJ31NiMw9tiobzLnHP6Aj9IXKP5 # oq0cdaYrMRc+21fMBx7EnUQfvBu6JWTewSs8r0wuDVdvqEzkchYDSMQBmEoTJ3mE # fZcyJvNqRunazYQlBZqxBzgMxoXUSxDULOAKUNghgbqtSG518juTwv0ooIS59Fsr # mV1Fg0Cp12v/JIl+5m/c9Lf6+0PpfqrUfhQ6aMMp2OhbeqzslExmYf1+QWQzNvph # LOvp5fUuhibc+s7Ul5rjdJjOUHdPPzg6+5VJXs1yJ1W02qJl5ZalWN9q9H4mP8k5 # AgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUdJ4FrNZVzG7ipP07mNPYH6oB6uEwHwYD # VR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZO # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw # VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBc # BggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0 # cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYD # VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC # B4AwDQYJKoZIhvcNAQELBQADggIBAIN03y+g93wL5VZk/f5bztz9Bt1tYrSw631n # iQQ5aeDsqaH5YPYuc8lMkogRrGeI5y33AyAnzJDLBHxYeAM69vCp2qwtRozg2t6u # 0joUj2uGOF5orE02cFnMdksPCWQv28IQN71FzR0ZJV3kGDcJaSdXe69Vq7XgXnkR # JNYgE1pBL0KmjY6nPdxGABhV9osUZsCs1xG9Ja9JRt4jYgOpHELjEFtGI1D7Wodc # MI+fSEaxd8v7KcNmdwJ+zM2uWBlPbheCG9PNgwdxeKgtVij/YeTKjDp0ju5Qslsr # EtfzAeGyLCuJcgMKeMtWwbQTltHzZCByx4SHFtTZ3VFUdxC2RQTtb3PFmpnr+M+Z # qiNmBdA7fdePE4dhhVr8Fdwi67xIzM+OMABu6PBNrClrMsG/33stEHRk5s1yQljJ # BCkRNJ+U3fqNb7PtH+cbImpFnce1nWVdbV/rMQIB4/713LqeZwKtVw6ptAdftmvx # Y9yCEckAAOWbkTE+HnGLW01GT6LoXZr1KlN5Cdlc/nTD4mhPEhJCru8GKPaeK0Cx # ItpV4yqg+L41eVNQ1nY121sWvoiKv1kr259rPcXF+8Nmjfrm8s6jOZA579n6m7i9 # jnM+a02JUhxCcXLslk6JlUMjlsh3BBFqLaq4conqW1R2yLceM2eJ64TvZ9Ph5aHG # 2ac3kdgIMIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG # 9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy # MDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw # MTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt # ZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB # AOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az # /1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V2 # 9YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oa # ezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkN # yjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7K # MtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRf # NN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SU # HDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoY # WmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5 # C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8 # FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TAS # BgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1 # Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUw # UzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoG # CCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIB # hjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fO # mhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9w # a2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggr # BgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3 # DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEz # tTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJW # AAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G # 82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/Aye # ixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI9 # 5ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1j # dEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZ # KCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xB # Zj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuP # Ntq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvp # e784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA1Aw # ggI4AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScw # JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTAwMC0wNUUwLUQ5NDcxJTAjBgNVBAMT # HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAIAG # iXW7XDDBiBS1SjAyepi9u6XeoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDqQIS5MCIYDzIwMjQwNzE2MDUzMzQ1 # WhgPMjAyNDA3MTcwNTMzNDVaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOpAhLkC # AQAwCgIBAAICD3ECAf8wBwIBAAICE1AwCgIFAOpB1jkCAQAwNgYKKwYBBAGEWQoE # AjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkq # hkiG9w0BAQsFAAOCAQEAoIrhgrEdeEFcZUVmzyhV4bbEENWU/JTADDPHxB0ltP5n # GZAmnvQQpjv0CxoJZBsqROo/qRsk4EyG9ONxibuC+uhHD1U3BAtAtlocHBhm1ZUA # j7twsUOGdbMgviM6BpBg9EnJ6/dujiwnayv/HV+S6BSocoriG0i+0hLZxlVMgRqm # UyXnaEgqOyNm0cTUDoW5pgfexf9tmu+ls0zA6z6kl7STGNT6n5mWl5JGmGM/fPWF # F8SWsCEwxz/3moik2sEKITg3fTWrlv6kXRPxbsZdK2BKc5S0Ydh8pIed6fSwMW9L # 23mF3LjVzkjohsWYBIU3eXld863xW+j4jeFKNgR3fjGCBA0wggQJAgEBMIGTMHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB6+AYbLW27zjtAAEAAAHr # MA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw # LwYJKoZIhvcNAQkEMSIEIPb5wwA7x8jz9KSeuE+QQPAwc/uCWSIMlq+HcIZo8YWD # MIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgzrdrvl9pA+F/xIENO2TYNJSA # ht2LNezPvqHUl2EsLPgwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg # MjAxMAITMwAAAevgGGy1tu847QABAAAB6zAiBCBelyXXsN7gKR3G6Up6Xz/sLdxX # dqqhu82EwL9OFz46tjANBgkqhkiG9w0BAQsFAASCAgAMc1H8oSPXhaxKTFzv6SNN # cke+Mj6okiL1hMIc2+DOJwzOXPRnvLoofvTi2WQvC99YxnohybFWrHD6UlbfAB6W # 3z1JgnqyTvxn/hR9WJFwc3jQ8yONgbpcDcVFMJLKkKogoglbQqLkY6eclQab9Ztm # P+b9uYfdIHRRux/+VBOJxiIKf8MIgP2Po7IsAYnkNvRc7B4pMgEGSYvot4wegOrV # Hadi/zWupyqcMemyKBmrxIR+yQHd49cY9h1F2R91JkWde4WZW+95xbx0oFmYsG9H # Cu6LoTvSvF6Hs0dqxXgxji6Sk+LUv2uxlQW4FYWLVOhM/3hH9zoSFHaYSZN2yB3Q # z/HNAdZfevWF3DYUMQiz9vi6TXR4VsoK7+CJ0H0ELuQNigdrEte7lAbtQjRn9S2l # SSr6yiLFkvyCUcxwU/iKbylIAV1Cv1ncuAUULq9Y7ICZbe1SPE+nl635YqilQlL4 # o7u5b+zYougbV7OBcZgsle7C88D3XawGOcHY2uzt9QpMB5D2IpQ6SJjLF10NpGuV # QWU0Rhe2WD7/Tfldpx09j57rxKistb9Aa7aZtPjggUsGj8oDo7TAopQ4aQMvnnnz # OGkg5vZoa9WLrmYbHcQYdWLkiCSDsKSYBillOYmqOb7v8rMIZFvR94chlGumw4lr # 3ejnARRzkwTNKCzr0EX/Rw== # SIG # End signature block |