Obs/scripts/AzureLocal.StandaloneObservability.psm1

<#############################################################
 # #
 # Copyright (C) Microsoft Corporation. All rights reserved. #
 # #
 #############################################################>


<#
.SYNOPSIS
    Sends diagnostics data using standalone observability pipeline.
 
.DESCRIPTION
    Sends diagnostics data using standalone observability pipeline.
 
    PS C:\> Enter-PsSession -ComputerName <NodeName> -Credential $cred
 
    PS C:\> Send-AzureLocalDiagnosticData
 
.PARAMETER ResourceGroupName
    Azure Resource group name where temporary Arc resource will be created. This can be same parameter as used in AzS Deployment.
 
.PARAMETER SubscriptionId
    Azure SubscriptionID where temporary Arc resource will be created. This can be same parameter as used in AzS Deployment.
 
.PARAMETER RegistrationRegion
    Optional. Azure registration region where Arc resource will be created. This can be same parameter as used in AzS Deployment.
 
.PARAMETER DiagnosticLogPath
    Diagnostic Log path which will be parsed and sent to Microsoft.
 
.PARAMETER Cloud
    Optional. Azure Cloud name default: AzureCloud.
 
.PARAMETER CacheFlushWaitTimeInSec
    Optional wait time to Flush the cache folder. default:600
 
.PARAMETER RegistrationCredential
    Azure credentials used for authentication to register ArcAgent. Needed only for DefaultSet
 
.PARAMETER RegistrationWithDeviceCode
    This is RegistrationWithDeviceCode switch to use device code for authentication.
 
.PARAMETER RegistrationWithExistingContext
    This is RegistrationWithExistingContext switch to use existing Azure context on the local machine.
 
.PARAMETER RegistrationSPCredential
    This is SPN crednetials used for authentication to register ArcAgent. Needed only for ServicePrincipal set
 
.EXAMPLE
    The example below .
 
    During Remote Support JEA configuration, WinRM will be restarted twice and that can break the PsSession to node if you are installing Remote Support remotely. In that case, connect to remote node again and execute Enable cmdlet again after 4-5 minutes.
 
    PS C:\> Enter-PsSession -ComputerName <NodeName> -Credential $cred
 
    PS C:\> Send-AzureLocalDiagnosticData
 
    Processing data from remote server v-host1 failed with the following error message: The I/O operation has been aborted because of either a thread exit or an application request. For more information, see the about_Remote_Troubleshooting Help topic.
 
    PS C:\> Enter-PsSession -ComputerName <NodeName> -Credential $cred
 
    PS C:\> Send-AzureLocalDiagnosticData
 
.NOTES
    Requires Support VM to have stable internet connectivity.
#>


function Send-AzureLocalDiagnosticData
{
    [CmdletBinding(PositionalBinding = $false, DefaultParameterSetName = "Interactive")]
    param(
        [Parameter(Mandatory = $true)]
        [System.String] $ResourceGroupName,

        [Parameter(Mandatory = $true)]
        [System.String] $SubscriptionId,

        [Parameter(Mandatory = $true, ParameterSetName = "DefaultSet")]
        [PSCredential] $RegistrationCredential,

        [Parameter(Mandatory = $true, ParameterSetName = "Interactive")]
        [Switch] $RegistrationWithDeviceCode,

        [Parameter(Mandatory = $true, ParameterSetName = "PassThrough")]
        [Switch] $RegistrationWithExistingContext,

        [Parameter(Mandatory = $true, ParameterSetName = "ServicePrincipal")]
        [PSCredential] $RegistrationSPCredential,

        [Parameter(Mandatory = $true, ParameterSetName = "AccessToken")]
        [System.String] $AccessToken,

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [ValidateScript({ Test-Path -Path $_ -PathType Container })]
        [System.String] $DiagnosticLogPath,

        [Parameter(Mandatory=$false)]
        [System.String] $InstanceGuid = "",

        [Parameter(Mandatory=$false)]
        [System.String] $RegistrationRegion = "eastus",

        [Parameter(Mandatory=$false)]
        [System.String] $ObsRootFolderPath = "C:\StdObservability",

        [Parameter(Mandatory=$false)]
        [System.String] $Cloud = "AzureCloud",

        [Parameter(Mandatory=$false)]
        [Int] $CacheFlushWaitTimeInSec = 600
    )

    $functionName = $MyInvocation.MyCommand.Name

    $script:ErrorActionPreference = 'Stop'

    $skipArcForServer = $false
    try
    {
        $transcriptFileName = "{0}.{1:yyyy-MM-dd-hh-mm-ss}.log" -f $functionName, $(Get-Date)
        $transcriptFilePath = Join-Path -Path $ObsRootFolderPath -ChildPath $transcriptFileName
        Start-Transcript -Path $transcriptFilePath -Append

        Import-Module "$PSScriptRoot\StandaloneObservabilityHelper.psm1" -Force

        $TenantId = Get-TenantId -AzureEnvironment $Cloud -SubscriptionId $SubscriptionId

        # Fail if Arc Agent is already connected
        if(Test-IsArcAgentConnected)
        {
            $skipArcForServer = $true
        }
        $service = Get-Service "WatchdogAgent" -ErrorAction SilentlyContinue
        if ($null -ne $service)
        {
            throw "Watchdog is present. Use the extension instead of this Cmdlet"
        }

        # Ensure we are elevated
        if (Test-UserIsElevated)
        {
            Write-Host "Powershell running as Administrator. Continuing."
        }
        else
        {
            Write-Error -Message "Running as administrator is required for this operation. Please restart PowerShell as Administrator and retry." -Type Error -ConsoleOut
            throw "$functionName requires elevated permissions."
        }

        Push-Location -Path $PSScriptRoot

        if ($PSCmdlet.ParameterSetName -eq "ServicePrincipal") {
            & .\Install-StandaloneObservability.ps1 -ResourceGroupName $ResourceGroupName `
                                                                -SubscriptionId $SubscriptionId `
                                                                -TenantId $TenantId `
                                                                -RegistrationSPCredential $RegistrationSPCredential `
                                                                -FactoryLogShare $DiagnosticLogPath `
                                                                -ObsRootFolderPath $ObsRootFolderPath `
                                                                -InstanceGuid $InstanceGuid `
                                                                -Cloud $Cloud `
                                                                -RegistrationRegion $RegistrationRegion `
                                                                -GcsRegion $RegistrationRegion `
                                                                -SkipArcForServer $skipArcForServer -ParseOnce | Out-Null
        }
        elseif ($PSCmdlet.ParameterSetName -eq "Interactive") {
            & .\Install-StandaloneObservability.ps1 -ResourceGroupName $ResourceGroupName `
                                                                -SubscriptionId $SubscriptionId `
                                                                -TenantId $TenantId `
                                                                -Interactive `
                                                                -FactoryLogShare $DiagnosticLogPath `
                                                                -ObsRootFolderPath $ObsRootFolderPath `
                                                                -InstanceGuid $InstanceGuid `
                                                                -Cloud $Cloud `
                                                                -RegistrationRegion $RegistrationRegion `
                                                                -GcsRegion $RegistrationRegion `
                                                                -SkipArcForServer $skipArcForServer -ParseOnce | Out-Null
        }
        elseif ($PSCmdlet.ParameterSetName -eq "PassThrough") {
            & .\Install-StandaloneObservability.ps1 -ResourceGroupName $ResourceGroupName `
                                                                -SubscriptionId $SubscriptionId `
                                                                -TenantId $TenantId `
                                                                -PassThrough `
                                                                -FactoryLogShare $DiagnosticLogPath `
                                                                -ObsRootFolderPath $ObsRootFolderPath `
                                                                -InstanceGuid $InstanceGuid `
                                                                -Cloud $Cloud `
                                                                -RegistrationRegion $RegistrationRegion `
                                                                -GcsRegion $RegistrationRegion `
                                                                -SkipArcForServer $skipArcForServer -ParseOnce | Out-Null
        }
        elseif ($PSCmdlet.ParameterSetName -eq "AccessToken") {
            & .\Install-StandaloneObservability.ps1 -ResourceGroupName $ResourceGroupName `
                                                                -SubscriptionId $SubscriptionId `
                                                                -TenantId $TenantId `
                                                                -AccessToken $AccessToken `
                                                                -FactoryLogShare $DiagnosticLogPath `
                                                                -ObsRootFolderPath $ObsRootFolderPath `
                                                                -InstanceGuid $InstanceGuid `
                                                                -Cloud $Cloud `
                                                                -RegistrationRegion $RegistrationRegion `
                                                                -GcsRegion $RegistrationRegion `
                                                                -SkipArcForServer $skipArcForServer -ParseOnce | Out-Null
        }
        else {
            & .\Install-StandaloneObservability.ps1 -ResourceGroupName $ResourceGroupName `
                                                                -SubscriptionId $SubscriptionId `
                                                                -TenantId $TenantId `
                                                                -RegistrationCredential $RegistrationCredential `
                                                                -FactoryLogShare $DiagnosticLogPath `
                                                                -ObsRootFolderPath $ObsRootFolderPath `
                                                                -InstanceGuid $InstanceGuid `
                                                                -Cloud $Cloud `
                                                                -RegistrationRegion $RegistrationRegion `
                                                                -GcsRegion $RegistrationRegion `
                                                                -SkipArcForServer $skipArcForServer -ParseOnce | Out-Null
        }

        Write-Host "Going to Wait for MA to flush the Cahce folder: $CacheFlushWaitTimeInSec"
        Start-Sleep -Seconds $CacheFlushWaitTimeInSec
    }
    catch
    {
        $exception = $_
        Write-Error "$functionName failed. $exception"
        Write-Error "$($exception.ScriptStackTrace)"
        throw $exception
    }
    finally
    {
        $Script:ErrorActionPreference = 'SilentlyContinue'
        if ($PSCmdlet.ParameterSetName -eq "AccessToken")
        {
            & .\Uninstall-StandaloneObservability.ps1 -AccessToken $AccessToken -SkipArcForServer $skipArcForServer | Out-Null
        }
        else
        {
            $token = Get-AzAccessToken
            if ($null -eq $token)
            {
                Import-Module "$PSScriptRoot\StandaloneObservabilityHelper.psm1" -Force
                $TenantId = Get-TenantId -AzureEnvironment $Cloud -SubscriptionId $SubscriptionId

                Write-Host "Token was null. Going to try to use Connect-AzAccount to get the token."
                if ($PSCmdlet.ParameterSetName -eq "ServicePrincipal")
                {
                    Connect-AzAccount -Credential $RegistrationSPCredential -ServicePrincipal -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId
                }
                elseif ($PSCmdlet.ParameterSetName -eq "Interactive")
                {
                    Connect-AzAccount -UseDeviceAuthentication -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId
                }
                elseif ($PSCmdlet.ParameterSetName -eq "DefaultSet")
                {
                    Connect-AzAccount -Credential $RegistrationCredential -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId
                }
                $token = Get-AzAccessToken
            }
            & .\Uninstall-StandaloneObservability.ps1 -AccessToken $token.Token -SkipArcForServer $skipArcForServer | Out-Null
        }

        Pop-Location
        Stop-Transcript -ErrorAction SilentlyContinue
    }

}

Export-ModuleMember -Function Send-AzureLocalDiagnosticData
# SIG # Begin signature block
# MIIoRgYJKoZIhvcNAQcCoIIoNzCCKDMCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCADNERI2iaZlk5o
# iGg4plQR+D2j3bu4z2wW2dH7lQ2h66CCDXYwggX0MIID3KADAgECAhMzAAAEBGx0
# Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz
# NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo
# DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3
# a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF
# HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy
# 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC
# Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj
# L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp
# h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3
# cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X
# dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL
# E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi
# u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1
# sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq
# 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb
# DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/
# V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# 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
# Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIHD4U6QGKFyaRcZgQJ+HGlTN
# GOwwErY051eGZwXPI736MEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAFvaDFtgDWeTwo+KwzykDKWzdjlRsKDlB1W6esJ6BSv7GIgthujvtH3AH
# 2gUnTR/zoj3nYvUZ2f1U3OUjGXUAu7Cr40DH7xmLIkSfzyn78ZbMHTaBZABFCH2y
# 61xBO/sJy9m9+KIiHftH1mKef6xvptS5NkkHGBFRWr1aJ6HAlY0Fw0awzXNjd1gi
# EufCd1vVXxecUOsqJxYx1eNZXzDmtVtvPsjqHxA4QWHjPZ3fTgetDR9RanwqTqGY
# +lbYkt/0yKznfhqfY8rlbmstfjrvJoEQeIbBhJnMFPpMyC8Dclx/uqHptB+frSsn
# 8N3K5K0AGCbZbI95m26YqV2eYmHUVqGCF7AwghesBgorBgEEAYI3AwMBMYIXnDCC
# F5gGCSqGSIb3DQEHAqCCF4kwgheFAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsq
# hkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCCrDULgnJi70RaOmvq+B4GrAgv18vUl6wCVh289mAGWjwIGaC5kLxdx
# GBMyMDI1MDYxMDE1NDgzMS41MzJaMASAAgH0oIHZpIHWMIHTMQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT
# Tjo2RjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaCCEf4wggcoMIIFEKADAgECAhMzAAAB/Bigr8xpWoc6AAEAAAH8MA0G
# CSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI0
# MDcyNTE4MzExNFoXDTI1MTAyMjE4MzExNFowgdMxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9w
# ZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjZGMUEt
# MDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp1DAKLxpbQcPVYPHlJHy
# W7W5lBZjJWWDjMfl5WyhuAylP/LDm2hb4ymUmSymV0EFRQcmM8BypwjhWP8F7x4i
# O88d+9GZ9MQmNh3jSDohhXXgf8rONEAyfCPVmJzM7ytsurZ9xocbuEL7+P7EkIwo
# OuMFlTF2G/zuqx1E+wANslpPqPpb8PC56BQxgJCI1LOF5lk3AePJ78OL3aw/Ndlk
# vdVl3VgBSPX4Nawt3UgUofuPn/cp9vwKKBwuIWQEFZ837GXXITshd2Mfs6oYfxXE
# tmj2SBGEhxVs7xERuWGb0cK6afy7naKkbZI2v1UqsxuZt94rn/ey2ynvunlx0R6/
# b6nNkC1rOTAfWlpsAj/QlzyM6uYTSxYZC2YWzLbbRl0lRtSz+4TdpUU/oAZSB+Y+
# s12Rqmgzi7RVxNcI2lm//sCEm6A63nCJCgYtM+LLe9pTshl/Wf8OOuPQRiA+stTs
# g89BOG9tblaz2kfeOkYf5hdH8phAbuOuDQfr6s5Ya6W+vZz6E0Zsenzi0OtMf5RC
# a2hADYVgUxD+grC8EptfWeVAWgYCaQFheNN/ZGNQMkk78V63yoPBffJEAu+B5xlT
# PYoijUdo9NXovJmoGXj6R8Tgso+QPaAGHKxCbHa1QL9ASMF3Os1jrogCHGiykfp1
# dKGnmA5wJT6Nx7BedlSDsAkCAwEAAaOCAUkwggFFMB0GA1UdDgQWBBSY8aUrsUaz
# hxByH79dhiQCL/7QdjAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBf
# BgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmww
# bAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0El
# MjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUF
# BwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAT7ss/ZAZ0bTa
# FsrsiJYd//LQ6ImKb9JZSKiRw9xs8hwk5Y/7zign9gGtweRChC2lJ8GVRHgrFkBx
# ACjuuPprSz/UYX7n522JKcudnWuIeE1p30BZrqPTOnscD98DZi6WNTAymnaS7it5
# qAgNInreAJbTU2cAosJoeXAHr50YgSGlmJM+cN6mYLAL6TTFMtFYJrpK9TM5Ryh5
# eZmm6UTJnGg0jt1pF/2u8PSdz3dDy7DF7KDJad2qHxZORvM3k9V8Yn3JI5YLPuLs
# o2J5s3fpXyCVgR/hq86g5zjd9bRRyyiC8iLIm/N95q6HWVsCeySetrqfsDyYWStw
# L96hy7DIyLL5ih8YFMd0AdmvTRoylmADuKwE2TQCTvPnjnLk7ypJW29t17Yya4V+
# Jlz54sBnPU7kIeYZsvUT+YKgykP1QB+p+uUdRH6e79Vaiz+iewWrIJZ4tXkDMmL2
# 1nh0j+58E1ecAYDvT6B4yFIeonxA/6Gl9Xs7JLciPCIC6hGdliiEBpyYeUF0ohZF
# n7NKQu80IZ0jd511WA2bq6x9aUq/zFyf8Egw+dunUj1KtNoWpq7VuJqapckYsmvm
# mYHZXCjK1Eus7V1I+aXjrBYuqyM9QpeFZU4U01YG15uWwUCaj0uZlah/RGSYMd84
# y9DCqOpfeKE6PLMk7hLnhvcOQrnxP6kwggdxMIIFWaADAgECAhMzAAAAFcXna54C
# 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
# Tjo2RjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaIjCgEBMAcGBSsOAwIaAxUATkEpJXOaqI2wfqBsw4NLVwqYqqqggYMw
# gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD
# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsF
# AAIFAOvylhYwIhgPMjAyNTA2MTAxMTMxMzRaGA8yMDI1MDYxMTExMzEzNFowdzA9
# BgorBgEEAYRZCgQBMS8wLTAKAgUA6/KWFgIBADAKAgEAAgIOyAIB/zAHAgEAAgIT
# JjAKAgUA6/PnlgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow
# CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQAsKQ9mkBA4
# qk+CVKbWhbJmqLg+3TlrgZbl5jE25SF2AYBqbDaAzMbYRHJTKeXq1SqnjKHuZsvS
# Tq9Z83A9mpl0iwkAHCLtFtrXSVjI3bfcwgSe/Y2cg8GFEHX/BcsQ28GKjAIZkmQE
# fJisbWmY3ApNAvHaSxZOlu05OE2wEulv5qTcADPywB5WVk8SCz79nA6AlxD+O34i
# r32k0koXZVdmRw2amhHs1rNSubKrsiJJdsZcUuEGsVKYx7+9kDHyOfjtsFnTwjGR
# lRUEJYJnhhvo+T6liF2wMDqcEL91E+xoFpNElL2OwH986j21/ONNM7PwGBSxq2S1
# MRXoC7MVZfjrMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTACEzMAAAH8GKCvzGlahzoAAQAAAfwwDQYJYIZIAWUDBAIBBQCgggFKMBoG
# CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgXH/D+uRG
# hmlSOlIRNhFSJuFdMkTCsLxCODYW0vZeBDQwgfoGCyqGSIb3DQEJEAIvMYHqMIHn
# MIHkMIG9BCCVQq+Qu+/h/BOVP4wweUwbHuCUhh+T7hq3d5MCaNEtYjCBmDCBgKR+
# MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT
# HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB/Bigr8xpWoc6AAEA
# AAH8MCIEILw9OEBQ+nvDCWUFQXvc9xDSXxjqP+Ivb4dcArbk/RNXMA0GCSqGSIb3
# DQEBCwUABIICAHWtOTlu0uvJ2omZY7xSwx7FInO0VVIW4HdIHckUesGa3hUashyX
# AN6g/0fPhZzkJcWYG9QzjhMOHaJ8b6n4kLJBWI54Hr0gNq4tEHelQ6Tq+IqDLF9T
# TYtMOlcC2tP0Tzf+ZWbz5/2FzhmteNCxl2gTY9GHPyP2tLYmG+Xd8depyVeIe/YE
# Q+m3DB+TGLnSy9Eie4I6yrhFndevl0IWyuluvhN8s9aY6Lx8zWlVykdl/LSv72HV
# k/rhKNJuyRCBWE4GygNgow+udnFddBnDF0X1Ma8yeq8a469xp9fyKfN7XSq+uoWH
# 5/kTAdOtN+xuutwOCXhxBp93umq+z//qfP+x6blbmY3FHitAYaZs1AsntzNXFueS
# 0aC7seHXoUX3Ow8Te2mvJMPe1nrp95W6YhfmYtdTMrx7xnniB9XnnQR2CVLp9/j4
# hsixb8x8NdmQ4NkBzM97CDCFRuUjnpC/fZRxoyXl09Qky0RfvjSqytpqZwRTLJ9Z
# mLwHfJvG0jdT5T6rwsaaeNYpgMnD68Px40gxVUKoAO6NKhtGt268hfKvSqA80Upr
# ly6uJiJp0xL7Xd3HeB/W4KowyoVm68n+VcePKJdatyt2pEDdZ7NkReWOsIvcV6Ka
# 8mUT777JZJFpRVa7UQHnk/YLis/xZyIUMepcYGiKntQWerVSIGzlWIXH
# SIG # End signature block