Client/vSphereConfiguration.ps1

#
# vSphere Runtime for VMware Infrastructure Bindings
# vSphere Runtime Implementation for vSphere Components.
# Version: 1.0
# Contact: powercli@vmware.com
# Generated by OpenAPI Generator: https://openapi-generator.tech
#


$PRODUCT_NAME = 'vSphere'

<#
.SYNOPSIS
 
Creates server configuration instance for a product.
 
.DESCRIPTION
 
Creates server configuration instance for a product.
 
.PARAMETER Server
Specifies the IP address or the DNS name of the server to which you want to connect.
 
.PARAMETER Username
Username in HTTP basic authentication
 
.PARAMETER Password
Password in HTTP basic authentication
 
.PARAMETER Credential
Credential object based on the username and password in HTTP basic authentication.
 
.PARAMETER ApiKey
API Keys for authentication/authorization
 
.PARAMETER AccessToken
Access token for authentication/authorization
 
.PARAMETER SkipCertificateCheck
Skip certificate verification
 
.PARAMETER ProxyUri
Proxy Uri setting
 
.PARAMETER SerializeNulls
If specified, serializes all $null values and sends them as part of the request.
 
.PARAMETER WebOperationTimeoutSeconds
Maximum HTTP request/response time in seconds
 
.PARAMETER VIConnection
Specifies the PowerCLI Connection from which to create a server configuration instance for a product.
 
.PARAMETER NotDefault
If specified, the created server configuration will not be added to the list of server configurations used by Invoke-ApiClient.
 
.OUTPUTS
 
ServerConfiguration
#>

function New-vSphereServerConfiguration {
    [CmdletBinding(DefaultParameterSetName = 'Username')]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'Username')]
        [Parameter(Mandatory = $true, ParameterSetName = 'Credential')]
        [ValidateNotNullOrEmpty()]
        [string]
        $Server,

        [Parameter(ParameterSetName = 'Username')]
        [AllowEmptyString()]
        [string]
        $Username,

        [Parameter(ParameterSetName = 'Username')]
        [AllowEmptyString()]
        [SecureString]
        $Password,

        [Parameter(ParameterSetName = 'Credential')]
        [PSCredential]
        $Credential,

        [Parameter(Mandatory = $false, ParameterSetName = 'Username')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Credential')]
        [string]
        $ApiKey,

        [Parameter(Mandatory = $false, ParameterSetName = 'Username')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Credential')]
        [string]
        $AccessToken,

        [Parameter(Mandatory = $false, ParameterSetName = 'Username')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Credential')]
        [switch]
        $SerializeNulls,

        [Parameter(Mandatory = $false, ParameterSetName = 'Username')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Credential')]
        [switch]
        $SkipCertificateCheck,

        [Parameter(Mandatory = $false, ParameterSetName = 'Username')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Credential')]
        [int]
        $WebOperationTimeoutSeconds,

        [Parameter(Mandatory = $false, ParameterSetName = 'Username')]
        [Parameter(Mandatory = $false, ParameterSetName = 'Credential')]
        [Uri]
        $ProxyUri,

        [Parameter(Mandatory = $true, ParameterSetName = 'VIConnection')]
        [object]
        $VIConnection,

        [Parameter()]
        [switch]
        $NotDefault = $false,

        [Parameter()]
        [switch]
        $UseDeprecatedApis
    )

    if ($PSCmdlet.ParameterSetName -eq 'VIConnection') {
        if ($null -eq ($VIConnection.GetType().GetInterfaces() | Where-Object -FilterScript { $_.Name -eq 'CisSession' })) {
            throw "Invalid value for parameter 'VIConnection': $VIConnection. Only objects of type 'VIServer' are supported."
        }

        $PowerCLIConfiguration = Get-PowerCLIConfiguration -Scope Session

        $CisSessionId = $null

        try {
            $CisSessionId = $VIConnection.GetCisSessionId()
        } catch {
            throw ('An error occurred while establishing a CIS connection for server {0}. For more information: {1}' -f $VIConnection.Name, $_.Exception.Message)
        }

        if ($null -eq $CisSessionId) {
            throw ('CIS session id not found for server {0}' -f $VIConnection.Name)
        }

        $newServerConfigurationParams = @{
            'Product' = $PRODUCT_NAME
            'BaseUrl' = "https://$($VIConnection.Name)"
            'SerializeNulls' = $false
            'SkipCertificateCheck' = $VIConnection.GetClient().ConnectivityService.GetValidationHandlerForCurrentServer().BadCertificateAction -eq 'Ignore'
            'ProxyUri' = $null
            'NotDefault' = $true
        }

        $result = New-ServerConfiguration @newServerConfigurationParams
        $result.PSObject.TypeNames.Add('ServerConfiguration')

        $result.Authorization.Headers['vmware-api-session-id'] = $CisSessionId

        $result.PSObject.TypeNames.Add('vSphereServerConfiguration')
        $result | Add-Member -MemberType NoteProperty -Name Server -Value $VIConnection.Name
        $result | Add-Member -MemberType NoteProperty -Name Username -Value $null
        $result | Add-Member -MemberType NoteProperty -Name Password -Value $null
        $result | Add-Member -MemberType NoteProperty -Name PowerCLIConnection -Value $VIConnection
        $result | Add-Member -MemberType NoteProperty -Name WebOperationTimeoutSeconds -Value $PowerCLIConfiguration.WebOperationTimeoutSeconds
        $result | Add-Member -MemberType NoteProperty -Name UseDeprecatedApis -Value $null
        if ($PSBoundParameters.ContainsKey('UseDeprecatedApis')) {
            $result.UseDeprecatedApis = $UseDeprecatedApis.IsPresent
        }

        $PowerCLIConnections = $global:DefaultVIServers | Where-Object -FilterScript { $_.IsConnected }
        $result | Add-Member -MemberType NoteProperty -Name InSyncWithPowerCLIServers -Value ($PowerCLIConnections -Contains $VIConnection)

        $result | Add-Member -MemberType ScriptMethod -Name Equals -Value {param($that) ($this.BaseUrl -eq $that.BaseUrl) -and ($this.PowerCLIConnection -eq $that.PowerCLIConnection)} -Force
        $result | Add-Member -MemberType ScriptMethod -Name ToString { $this.PowerCLIConnection.Id } -Force

        $result | Update-ServerConfigurationDeprecatedApis
        if ($NotDefault.IsPresent) {
            $result
        } else {
            $result | Add-ServerConfiguration
        }
    } else {
        if ($PSCmdlet.ParameterSetName -eq 'Credential' -and $null -ne $Credential) {
            $Username = $Credential.UserName
            $Password = $Credential.Password
        }

        $result = New-ServerConfiguration `
            -Product $PRODUCT_NAME `
            -BaseUrl "https://$Server" `
            -SerializeNulls:$SerializeNulls.IsPresent `
            -SkipCertificateCheck:$SkipCertificateCheck.IsPresent `
            -ProxyUri $ProxyUri `
            -NotDefault:$true

        $result.PSObject.TypeNames.Add('ServerConfiguration')

        if ($PSBoundParameters.ContainsKey('ApiKey')) {
            $result.Authorization.Headers['vmware-api-session-id'] = $ApiKey
        }

        $result.PSObject.TypeNames.Add('vSphereServerConfiguration')
        $result | Add-Member -MemberType NoteProperty -Name Server -Value $Server
        $result | Add-Member -MemberType NoteProperty -Name Username -Value $Username
        $result | Add-Member -MemberType NoteProperty -Name Password -Value $Password
        $result | Add-Member -MemberType NoteProperty -Name WebOperationTimeoutSeconds -Value $WebOperationTimeoutSeconds
        $result | Add-Member -MemberType NoteProperty -Name UseDeprecatedApis -Value $null
        if ($PSBoundParameters.ContainsKey('UseDeprecatedApis')) {
            $result.UseDeprecatedApis = $UseDeprecatedApis.IsPresent
        }

        $result | Add-Member -MemberType ScriptMethod -Name ToString { $this.Server } -Force

        $result | Update-ServerConfigurationDeprecatedApis
        if ($NotDefault.IsPresent) {
            $result
        } else {
            $result | Add-ServerConfiguration
        }
    }
}

function Update-ServerConfigurationDeprecatedApis {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [PSTypeName('vSphereServerConfiguration')]
        $ServerConfiguration
    )

    if (
        $null -eq $ServerConfiguration.UseDeprecatedApis -and
        $null -ne $ServerConfiguration.Authorization.Headers['vmware-api-session-id']
    ) {
        $versionApiUrl = $ServerConfiguration.BaseUrl + '/rest/appliance/system/version'
        $SkipCertificateCheck = $ServerConfiguration.SkipCertificateCheck

        $invokeParams = @{
            'Method' = 'GET'
            'Uri' = $versionApiUrl
            'Headers' = $ServerConfiguration.Authorization.Headers
        }

        try {
            $InvokeRestMethodXParams = @{
                'InvokeParams' = $invokeParams
                'SkipCertificateCheck' = ([bool] $SkipCertificateCheck)
            }

            $result = Invoke-RestMethodX @InvokeRestMethodXParams
            if ($null -ne $result) {
                $ServerConfiguration.UseDeprecatedApis = ([version]($result.value.version) -lt [version]"7.0.2")
            }
        } catch {
            $ServerConfiguration.UseDeprecatedApis = $false
        }
    }
}

<#
.SYNOPSIS
 
Syncs vSphere Server Configuration Objects with PowerCLI $DefaultVIServers
#>

function Sync-PowerCLIConnections {

    if ($null -ne (Get-Module -Name 'VMware.VimAutomation.Core')) {
        $ServerConfigurations = Get-ServerConfiguration -Product $PRODUCT_NAME | Where-Object -FilterScript { $_.PowerCLIConnection -ne $null }
        $PowerCLIConnections = $global:DefaultVIServers | Where-Object -FilterScript { $_.IsConnected }

        $ServerConfigurationsPowerCLIConnections = $ServerConfigurations | Foreach-Object { $_.PowerCLIConnection }

        # Remove Server Configurations for missing PowerCLI Connections
        foreach ($ServerConfiguration in $ServerConfigurations) {
            if ($PowerCLIConnections -NotContains $ServerConfiguration.PowerCLIConnection -and $ServerConfiguration.InSyncWithPowerCLIServers) {
                $ServerConfiguration | Remove-ServerConfiguration
            }
        }

        foreach ($PowerCLIConnection in $PowerCLIConnections) {
            if ($ServerConfigurationsPowerCLIConnections -NotContains $PowerCLIConnection) {
                New-vSphereServerConfiguration -VIConnection $PowerCLIConnection | Out-Null
            } else {
                $CisSessionId = $PowerCLIConnection.GetCisSessionId()

                # Update CIS session id on each sync for existing Server Configuration Objects to ensure that the session is still alive.
                $PowerCLIServerConfiguration = $ServerConfigurations | Where-Object -FilterScript { $_.PowerCLIConnection -eq $PowerCLIConnection }
                $PowerCLIServerConfiguration | Set-vSphereServerConfiguration -ApiKey $CisSessionId | Out-Null
            }
        }
    }
}

<#
.SYNOPSIS
 
Gets vSphereServerConfiguration objects.
 
.DESCRIPTION
 
The result server configuration objects are used by the Invoke-vSphereApiClient. A server configuration object can be modified or removed from the list of tracked server configurations.
 
Set the API Key.
 
.OUTPUTS
ServerConfiguration
 
None
#>

function Get-vSphereServerConfiguration {
    Sync-PowerCLIConnections
    Get-ServerConfiguration -Product $PRODUCT_NAME | Where-Object { $_ -ne $null }
}

<#
.SYNOPSIS
 
Updates vSphere Server Configuration
 
.DESCRIPTION
 
Updates vSphere Server Configuration
 
.PARAMETER ServerConfiguration
The server configuration object to update with an API Key from the SessionResponse
 
.PARAMETER Username
Username in HTTP basic authentication
 
.PARAMETER Password
Password in HTTP basic authentication
 
.PARAMETER Credential
Credential object based on the username and password in HTTP basic authentication.
 
.PARAMETER ApiKey
API Keys for authentication/authorization
 
.PARAMETER AccessToken
Access token for authentication/authorization
 
.PARAMETER SkipCertificateCheck
Skip certificate verification
 
.PARAMETER DefaultHeaders
Default HTTP headers to be included in the HTTP request
 
.PARAMETER ProxyUri
Proxy Uri setting
 
.PARAMETER SerializeNulls
If specified, serializes all $null values and sends them as part of the request.
 
.OUTPUTS
 
None
#>

function Set-vSphereServerConfiguration {
    [CmdletBinding(DefaultParameterSetName = 'Username')]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [PSTypeName('vSphereServerConfiguration')]
        $ServerConfiguration,

        [Parameter(ParameterSetName = 'Username')]
        [AllowEmptyString()]
        [string]
        $Username,

        [Parameter(ParameterSetName = 'Username')]
        [AllowEmptyString()]
        [SecureString]
        $Password,

        [Parameter(ParameterSetName = 'Credential')]
        [PSCredential]
        $Credential,

        [Parameter()]
        [string]
        $ApiKey,

        [Parameter()]
        [AllowEmptyString()]
        [string]
        $AccessToken,

        [Parameter()]
        [switch]
        $SerializeNulls,

        [Parameter()]
        [switch]
        $SkipCertificateCheck,

        [Parameter()]
        [int]
        $WebOperationTimeoutSeconds,

        [Parameter()]
        [Uri]
        $ProxyUri
    )

    Process {
        if ($PSCmdlet.ParameterSetName -eq 'Credential' -and $null -ne $Credential) {
            $Username = $Credential.UserName
            $Password = $Credential.Password
        }

        if ($PSBoundParameters.ContainsKey('Username') -or $PSBoundParameters.ContainsKey('Credential')) {
            $ServerConfiguration.Username = $Username
        }

        if ($PSBoundParameters.ContainsKey('Password') -or $PSBoundParameters.ContainsKey('Credential')) {
            $ServerConfiguration.Password = $Password
        }

        if ($PSBoundParameters.ContainsKey('ApiKey')) {
            $ServerConfiguration.Authorization.Headers['vmware-api-session-id'] = $ApiKey
        }
        if ($PSBoundParameters.ContainsKey('WebOperationTimeoutSeconds')) {
            $ServerConfiguration.WebOperationTimeoutSeconds = $WebOperationTimeoutSeconds
        }

        if ($PSBoundParameters.ContainsKey('SkipCertificateCheck')) {
            $ServerConfiguration.SkipCertificateCheck = $SkipCertificateCheck.IsPresent
            $ServerConfiguration = $ServerConfiguration | Set-ServerConfiguration -SkipCertificateCheck:$SkipCertificateCheck.IsPresent
        }

        if ($PSBoundParameters.ContainsKey('SerializeNulls')) {
            $ServerConfiguration.SerializeNulls = $SerializeNulls.IsPresent
        }

        if ($PSBoundParameters.ContainsKey('ProxyUri')) {
            $ServerConfiguration.Proxy = $ProxyUri
        }

        $ServerConfiguration | Update-ServerConfigurationDeprecatedApis

        $ServerConfiguration
    }
}

<#
.SYNOPSIS
 
Set the API Key.
 
.DESCRIPTION
 
Set the API Key.
 
.PARAMETER ServerConfiguration
The server configuration object to update with an API Key from the SessionResponse
 
.PARAMETER SessionResponse
The object returned by Invoke-CreateSession
 
.OUTPUTS
 
None
#>

function Set-vSphereServerConfigurationApiKey {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [PSTypeName('vSphereServerConfiguration')]
        $ServerConfiguration,

        [Parameter()]
        [Hashtable]
        $SessionResponse
    )

    Process {
        if ($null -ne $SessionResponse -and $null -ne $SessionResponse.Headers) {
            $ApiKey = $null
            $ApiKeyHeaderValue = $SessionResponse.Headers['vmware-api-session-id'] | Select-Object -First 1
            $DeprecatedApiKeyHeaderValue = $null

            <#
                On PowerShell Core, the Header value is an array of strings and on PowerShell 5.1 a
                single string. So depending on the version, the ApiKey is extracted differently.
            #>

            if ($Global:PSVersionTable.PSEdition -eq 'Core') {
                $DeprecatedApiKeyHeaderValue = $SessionResponse.Headers['Set-Cookie'] | Select-Object -First 1
            } else {
                <#
                    In the deprecated APIs on PowerShell 5.1, the Header string value contains two entries
                    separated by ',', so we need to extract the first entry from the string.
                #>

                $DeprecatedApiKeyHeaderValue = $SessionResponse.Headers['Set-Cookie'] -Split ',' | Select-Object -First 1
            }

            if (![string]::IsNullOrEmpty($ApiKeyHeaderValue)) {
                $ApiKey = $ApiKeyHeaderValue
            } elseif (![string]::IsNullOrEmpty($DeprecatedApiKeyHeaderValue) -and $DeprecatedApiKeyHeaderValue -Match 'vmware-api-session-id') {
                <#
                    The API Key should be extracted from the cookie because it comes in
                    the following format: "vmware-api-session-id=83d25d63393fbd0075cee756500ffd37; Path=/rest; Secure; HttpOnly"
                #>

                $SessionCookie = $DeprecatedApiKeyHeaderValue
                $SessionPart = $SessionCookie -Split ';' | Select-Object -First 1

                $ApiKey = ($SessionPart -Split 'vmware-api-session-id=')[1]
            }

            if (![string]::IsNullOrEmpty($ApiKey)) {
                # reset Username and Password as the ApiKey is with highest priority
                $ServerConfiguration | Set-vSphereServerConfiguration -Username $null -Password $null -ApiKey $ApiKey
            }
        }
    }
}

<#
.SYNOPSIS
Removes a vSphere server configuration object.
 
.DESCRIPTION
Removes a vSphere server configuration object from the list of the server configurations used by Invoke cmdlets.
 
.PARAMETER ServerConfiguration
Specifies the server configuration object to remove
 
.OUTPUTS
None
 
#>

function Remove-vSphereServerConfiguration {
param(
    [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
    [PSTypeName('vSphereServerConfiguration')]
    $ServerConfiguration
)

    Process {
        Remove-ServerConfiguration -ServerConfiguration $ServerConfiguration
    }
}

# SIG # Begin signature block
# MIIp0AYJKoZIhvcNAQcCoIIpwTCCKb0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAIUxAyxz8SMwZ1
# Se+Uv1c+BCnhI5jmKYFhLpFh6W5uf6CCDrwwggawMIIEmKADAgECAhAIrUCyYNKc
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
# yK+p/pQd52MbOoZWeE4wgggEMIIF7KADAgECAhAIV5dCqVO62Q1CN6Pz44xeMA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjIwNTA0MDAwMDAwWhcNMjQwNTA0
# MjM1OTU5WjCBxTETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgEC
# EwhEZWxhd2FyZTEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEDAOBgNV
# BAUTBzI4NTM4OTQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRIw
# EAYDVQQHEwlQYWxvIEFsdG8xFTATBgNVBAoTDFZNd2FyZSwgSW5jLjEVMBMGA1UE
# AxMMVk13YXJlLCBJbmMuMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# 6kAACeNtbODhaayXmhKLpjNsCENWh3WTl/NOvObo1Prl949C6y2EU9zMsfYuODNI
# Tv2OoByT3nBCXk3G1gzanGscaUDgr18pzf77Og4ArUHNzil6aX7uAlvKRBPl+6Hv
# wpSMtyK0D6J79UKfYqztvf/9YOFJLGCiq7Dw8932vg0ijcH7sLGgoSjH6+jqBwTT
# suOav1lyiAxE4Q6r8KyDNjg6mYu2uu1TALU4B7/OX/zBIadArVgPHRurud9SSGPq
# itFCgd2OuY0r81Jr0LRxOnwWHLqPOwuSmsnxw7ZaQJCz7FY3oxiES8mbA+VV6zN8
# 18/s2v5htLd3SRrE5n4mhzGyXAVkqIILKiSppibj59dEc5voQ/1MXJ25W1kSy2MX
# B8XjI9j64JzcpjW5YPs2M+BR4mIEC5i2mURO/u3HGG9prRTPOv2MN1WzbLLUG98O
# sqLTrUTQtdvpcWizS1c6m9IFY14fj1OeagnUwY3W0THEloNKC1WZoe+5Oxq/NRxO
# Bz4N4fzCsqc44TBUWmHSqBVOV8PpmQ8xVrfj+aLdk40naf/cf9cdvqslsrKtzkvL
# b+ohLCvqymua9GLNmUbY2EyrOogMseRX8y0awJS4cWRLl9c1O7j7q31GwfX+ozEI
# h1z4pBNATaZSbTTsMi4eKMCzsU/QiDM/iCaZbWL6VgsCAwEAAaOCAkkwggJFMB8G
# A1UdIwQYMBaAFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB0GA1UdDgQWBBRS+9+VGnhS
# 2uj4hRdXRyZkmfv5GzBCBgNVHREEOzA5gRJub3JlcGx5QHZtd2FyZS5jb22gIwYI
# KwYBBQUHCAOgFzAVDBNVUy1ERUxBV0FSRS0yODUzODk0MA4GA1UdDwEB/wQEAwIH
# gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw
# Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu
# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB
# Mzg0MjAyMUNBMS5jcmwwPQYDVR0gBDYwNDAyBgVngQwBAzApMCcGCCsGAQUFBwIB
# FhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGE
# MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUH
# MAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH
# NENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB/wQC
# MAAwDQYJKoZIhvcNAQELBQADggIBANPAhp5gl2m66jB8Ft1vCSC2ij4PKMQ3Mwkv
# 1gtZoMKnS/NCi9jl8WpooSMth39ze0LyDrQY8nUO6CPX/LDGkWuf/f+HUoRNw2wS
# seCFw/yvQJBzmmTRzuQqdhkAIM99kD6RCo60WQxskrhOCqx8LNFl3pcsIqonSvok
# /GC1+KmwUKdV5Wuag3jkH1LLOJ5x8CnyTmMWSPsx9aVY+mIzvYuLuZIdAybGYUW7
# sOLRTzhUiGBLlxL56n1dFqzF6IgPePpZHWMwyhIKQLgbkkYNFectTeTehws5v1YZ
# f/tjw2TsVJFEB4UIS1mHnBPiCNMt+/f33jH8vfT6fxVV5FIBXqvr0ruDVseZb/Jm
# xdBfjt2AzMHk3d3l2Ar+06vo4gAFbLFtULTjV9d3jjP4YCGix5Q2UwHvkBjfB46e
# ChIEjkbWnjmkFdZPpvILRVL9lhTa1kKwBzbTnW5KSnxA5CtB3gShY7U8rYmZfPrS
# 4gBBTutdhD8nd4roDdlJZPVMIvcqeRrdb2cx8WGohV8/MCOPeEUvsMiuOwFroreG
# 6ecUwbdjCNkzx2o3hXaHyfolUj4n+iQuealnn4KKfDp7eYDabu9zWbv6UN3D//Ug
# DlYdiQWzsKF0GqJQeqeq0Lga63zr7nOSPzn82AF7QfdYkccoLnD3y2iJObDrAsY0
# KjiW7SylMYIaajCCGmYCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGln
# aUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBT
# aWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAIV5dCqVO62Q1CN6Pz44xe
# MA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkD
# MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ
# KoZIhvcNAQkEMSIEIHn42+Cv+qhJgQexnjuzaXPm5DirM0e+Q6cMoDqI116UMA0G
# CSqGSIb3DQEBAQUABIICAGRIicdDzEdLM20WRJp3+RUnQ+QgJUfCgyIfH9Vou45h
# cpmMKOmyWE5AVWMR5RuTNbkJ9X1qtbgPLBuJlWmNvWQgiKF/AMmeFb8sjMC4faKA
# HZQa9CGkvDxa9kc4UnGjjn0FYyIahvbsk4Rpy+M9iaOPIJ05Myp8scsLfCZX0+ZS
# g0XGll4VjYVQ3lvoU0qg4HZHhmO+z2IXJw23NAn43KY0wos4yp+yRAWu7axG/l5j
# z8xwQR7XK3dRWyQhsmiplHAqm6ZlhHqpRiWI4aFl14OtoeQ3TONJH71xdG+gpvXs
# SC5VnMujK55M1d/2GOl6tpvKJnX0iEEr8m8qkW8REVkilP2Kayh8AiEfv009CEZQ
# CqNBqocpDRBrGosAmvognErBFt+/TLQVShZqeDA80o/X943sdy6JpATdkaTMC1Dk
# NNWCyDAFbaPbiWqUu2LHHd8Y0TE9Lq0kn02d46h9VyUX/WQT9IyR6Zp6gLfBSaxG
# K6UhXMbBuAnadz2e43iO/QCebj/wlPTcy84qZtiQcKCDHnUM0tMScS1UDVE1G0P+
# wdhA2SMcJs3TAm2Xduh1yiZ4VOuGdVF/C8UVvutOUglRkas2IYSNWvL9vZ/WHxiP
# TMrFVGhH9oWwjdYNfysfa2oSx0T+HcNH6E6hhkM3cLMOksYwVyZUOjKUw4hTuKvO
# oYIXQDCCFzwGCisGAQQBgjcDAwExghcsMIIXKAYJKoZIhvcNAQcCoIIXGTCCFxUC
# AQMxDzANBglghkgBZQMEAgEFADB4BgsqhkiG9w0BCRABBKBpBGcwZQIBAQYJYIZI
# AYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAEILinsUYyQE9X39b7iL2VjwdHjqrcK/nS
# SlfPs9WWfivcAhEA5jPyVF8+xSnhiOZ8e7Dy8xgPMjAyMzEwMjExODIxNTVaoIIT
# CTCCBsIwggSqoAMCAQICEAVEr/OUnQg5pr/bP1/lYRYwDQYJKoZIhvcNAQELBQAw
# YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD
# EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu
# ZyBDQTAeFw0yMzA3MTQwMDAwMDBaFw0zNDEwMTMyMzU5NTlaMEgxCzAJBgNVBAYT
# AlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjEgMB4GA1UEAxMXRGlnaUNlcnQg
# VGltZXN0YW1wIDIwMjMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCj
# U0WHHYOOW6w+VLMj4M+f1+XS512hDgncL0ijl3o7Kpxn3GIVWMGpkxGnzaqyat0Q
# KYoeYmNp01icNXG/OpfrlFCPHCDqx5o7L5Zm42nnaf5bw9YrIBzBl5S0pVCB8s/L
# B6YwaMqDQtr8fwkklKSCGtpqutg7yl3eGRiF+0XqDWFsnf5xXsQGmjzwxS55Dxtm
# UuPI1j5f2kPThPXQx/ZILV5FdZZ1/t0QoRuDwbjmUpW1R9d4KTlr4HhZl+NEK0rV
# lc7vCBfqgmRN/yPjyobutKQhZHDr1eWg2mOzLukF7qr2JPUdvJscsrdf3/Dudn0x
# mWVHVZ1KJC+sK5e+n+T9e3M+Mu5SNPvUu+vUoCw0m+PebmQZBzcBkQ8ctVHNqkxm
# g4hoYru8QRt4GW3k2Q/gWEH72LEs4VGvtK0VBhTqYggT02kefGRNnQ/fztFejKqr
# UBXJs8q818Q7aESjpTtC/XN97t0K/3k0EH6mXApYTAA+hWl1x4Nk1nXNjxJ2VqUk
# +tfEayG66B80mC866msBsPf7Kobse1I4qZgJoXGybHGvPrhvltXhEBP+YUcKjP7w
# tsfVx95sJPC/QoLKoHE9nJKTBLRpcCcNT7e1NtHJXwikcKPsCvERLmTgyyIryvEo
# EyFJUX4GZtM7vvrrkTjYUQfKlLfiUKHzOtOKg8tAewIDAQABo4IBizCCAYcwDgYD
# VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUH
# AwgwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMB8GA1UdIwQYMBaA
# FLoW2W1NhS9zKXaaL3WMaiCPnshvMB0GA1UdDgQWBBSltu8T5+/N0GSh1VapZTGj
# 3tXjSTBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
# RGlnaUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3Js
# MIGQBggrBgEFBQcBAQSBgzCBgDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln
# aWNlcnQuY29tMFgGCCsGAQUFBzAChkxodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0Eu
# Y3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCBGtbeoKm1mBe8cI1PijxonNgl/8ss5M3q
# XSKS7IwiAqm4z4Co2efjxe0mgopxLxjdTrbebNfhYJwr7e09SI64a7p8Xb3CYTdo
# SXej65CqEtcnhfOOHpLawkA4n13IoC4leCWdKgV6hCmYtld5j9smViuw86e9NwzY
# mHZPVrlSwradOKmB521BXIxp0bkrxMZ7z5z6eOKTGnaiaXXTUOREEr4gDZ6pRND4
# 5Ul3CFohxbTPmJUaVLq5vMFpGbrPFvKDNzRusEEm3d5al08zjdSNd311RaGlWCZq
# A0Xe2VC1UIyvVr1MxeFGxSjTredDAHDezJieGYkD6tSRN+9NUvPJYCHEVkft2hFL
# jDLDiOZY4rbbPvlfsELWj+MXkdGqwFXjhr+sJyxB0JozSqg21Llyln6XeThIX8rC
# 3D0y33XWNmdaifj2p8flTzU8AL2+nCpseQHc2kTmOt44OwdeOVj0fHMxVaCAEcsU
# DH6uvP6k63llqmjWIso765qCNVcoFstp8jKastLYOrixRoZruhf9xHdsFWyuq69z
# OuhJRrfVf8y2OMDY7Bz1tqG4QyzfTkx9HmhwwHcK1ALgXGC7KP845VJa1qwXIiNO
# 9OzTF/tQa/8Hdx9xl0RBybhG02wyfFgvZ0dl5Rtztpn5aywGRu9BHvDwX+Db2a2Q
# gESvgBBBijCCBq4wggSWoAMCAQICEAc2N7ckVHzYR6z9KGYqXlswDQYJKoZIhvcN
# AQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG
# A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3Rl
# ZCBSb290IEc0MB4XDTIyMDMyMzAwMDAwMFoXDTM3MDMyMjIzNTk1OVowYzELMAkG
# A1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdp
# Q2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMaGNQZJs8E9cklRVcclA8Ty
# kTepl1Gh1tKD0Z5Mom2gsMyD+Vr2EaFEFUJfpIjzaPp985yJC3+dH54PMx9QEwsm
# c5Zt+FeoAn39Q7SE2hHxc7Gz7iuAhIoiGN/r2j3EF3+rGSs+QtxnjupRPfDWVtTn
# KC3r07G1decfBmWNlCnT2exp39mQh0YAe9tEQYncfGpXevA3eZ9drMvohGS0UvJ2
# R/dhgxndX7RUCyFobjchu0CsX7LeSn3O9TkSZ+8OpWNs5KbFHc02DVzV5huowWR0
# QKfAcsW6Th+xtVhNef7Xj3OTrCw54qVI1vCwMROpVymWJy71h6aPTnYVVSZwmCZ/
# oBpHIEPjQ2OAe3VuJyWQmDo4EbP29p7mO1vsgd4iFNmCKseSv6De4z6ic/rnH1ps
# lPJSlRErWHRAKKtzQ87fSqEcazjFKfPKqpZzQmiftkaznTqj1QPgv/CiPMpC3BhI
# fxQ0z9JMq++bPf4OuGQq+nUoJEHtQr8FnGZJUlD0UfM2SU2LINIsVzV5K6jzRWC8
# I41Y99xh3pP+OcD5sjClTNfpmEpYPtMDiP6zj9NeS3YSUZPJjAw7W4oiqMEmCPkU
# EBIDfV8ju2TjY+Cm4T72wnSyPx4JduyrXUZ14mCjWAkBKAAOhFTuzuldyF4wEr1G
# nrXTdrnSDmuZDNIztM2xAgMBAAGjggFdMIIBWTASBgNVHRMBAf8ECDAGAQH/AgEA
# MB0GA1UdDgQWBBS6FtltTYUvcyl2mi91jGogj57IbzAfBgNVHSMEGDAWgBTs1+OC
# 0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYB
# BQUHAwgwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5k
# aWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDowOKA2oDSG
# Mmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQu
# Y3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0B
# AQsFAAOCAgEAfVmOwJO2b5ipRCIBfmbW2CFC4bAYLhBNE88wU86/GPvHUF3iSyn7
# cIoNqilp/GnBzx0H6T5gyNgL5Vxb122H+oQgJTQxZ822EpZvxFBMYh0MCIKoFr2p
# Vs8Vc40BIiXOlWk/R3f7cnQU1/+rT4osequFzUNf7WC2qk+RZp4snuCKrOX9jLxk
# Jodskr2dfNBwCnzvqLx1T7pa96kQsl3p/yhUifDVinF2ZdrM8HKjI/rAJ4JErpkn
# G6skHibBt94q6/aesXmZgaNWhqsKRcnfxI2g55j7+6adcq/Ex8HBanHZxhOACcS2
# n82HhyS7T6NJuXdmkfFynOlLAlKnN36TU6w7HQhJD5TNOXrd/yVjmScsPT9rp/Fm
# w0HNT7ZAmyEhQNC3EyTN3B14OuSereU0cZLXJmvkOHOrpgFPvT87eK1MrfvElXvt
# Cl8zOYdBeHo46Zzh3SP9HSjTx/no8Zhf+yvYfvJGnXUsHicsJttvFXseGYs2uJPU
# 5vIXmVnKcPA3v5gA3yAWTyf7YGcWoWa63VXAOimGsJigK+2VQbc61RWYMbRiCQ8K
# vYHZE/6/pNHzV9m8BPqC3jLfBInwAM1dwvnQI38AC+R2AibZ8GV2QqYphwlHK+Z/
# GqSFD/yYlvZVVCsfgPrA8g4r5db7qS9EFUrnEw4d2zc4GqEr9u3WfPwwggWNMIIE
# daADAgECAhAOmxiO+dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNV
# BAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdp
# Y2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAe
# Fw0yMjA4MDEwMDAwMDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUw
# EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
# ITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcN
# AQEBBQADggIPADCCAgoCggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC
# 4SmnPVirdprNrnsbhA3EMB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWl
# fr6fqVcWWVVyr2iTcMKyunWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1j
# KS3O7F5OyJP4IWGbNOsFxl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dP
# pzDZVu7Ke13jrclPXuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3
# pC4FfYj1gj4QkXCrVYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJ
# pMLmqaBn3aQnvKFPObURWBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aa
# dMreSx7nDmOu5tTvkpI6nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXD
# j/chsrIRt7t/8tWMcCxBYKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB
# 4Q+UDCEdslQpJYls5Q5SUUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ
# 33xMdT9j7CFfxCBRa2+xq4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amy
# HeUbAgMBAAGjggE6MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC
# 0nFdZEzfLmc/57qYrhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823I
# DzAOBgNVHQ8BAf8EBAMCAYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhho
# dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNl
# cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYD
# VR0fBD4wPDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# QXNzdXJlZElEUm9vdENBLmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcN
# AQEMBQADggEBAHCgv0NcVec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxpp
# VCLtpIh3bb0aFPQTSnovLbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6
# mouyXtTP0UNEm0Mh65ZyoUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPH
# h6jSTEAZNUZqaVSwuKFWjuyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCN
# NWAcAgPLILCsWKAOQGPFmCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg6
# 2fC2h5b9W9FcrBjDTZ9ztwGpn1eqXijiuZQxggN2MIIDcgIBATB3MGMxCzAJBgNV
# BAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNl
# cnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0ECEAVE
# r/OUnQg5pr/bP1/lYRYwDQYJYIZIAWUDBAIBBQCggdEwGgYJKoZIhvcNAQkDMQ0G
# CyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yMzEwMjExODIxNTVaMCsGCyqG
# SIb3DQEJEAIMMRwwGjAYMBYEFGbwKzLCwskPgl3OqorJxk8ZnM9AMC8GCSqGSIb3
# DQEJBDEiBCD8H2YZ4fqMm5jfjlmdQ461N1YI6MKNfCcuaLUXO/9NmTA3BgsqhkiG
# 9w0BCRACLzEoMCYwJDAiBCDS9uRt7XQizNHUQFdoQTZvgoraVZquMxavTRqa1Ax4
# KDANBgkqhkiG9w0BAQEFAASCAgA9BrdIy3+zAZLfKmMJaUIQOYcq6XR3Gn0l6AQV
# AccikRpo4Z04/2qRmzGSS/F6JN+7cPVvYLVb2eD2+QUBgaJzk4qSBgFjc3R/aiGW
# iGW83B5auD39jha9wcXgj8wMcyI6dRYD9ITfEaDD2ZS7ct0BUqaAXoopl2CmrVVC
# xnr5/UmOkCso9JhsTxRxYCBYiHNgWXq6QzubdM0nI+UYVSnjwKGwvOnXt7A9+Gdx
# 0vSjCgl8qffkqtXBu1HK5Bxp+mlc4L2qhR4M0reAav1lcEhR9d5xVdsaTv/Z9d/4
# XWwDlNFQnSL/kMl4+NY3e9khbD+ujrHxAAfzpg2GQCRa+tJ0nXccnM2YRsPOgmf8
# 3IA6YnoPuuTKsPoBc+8dMtDge52rHI/D/7JoPCrroy9z6Zm46DiodVxt5nK8QKWQ
# cM0tMK1xDOFu5J6x8taNnPdVdlvgiFS9I4PmLaSVOGcVEXLrjs25ZE9NC9JbY3EY
# 3L31u7OJ7MKv70STjB+Cf6iYUIgJ96RkLHC0jqpsK3BLy9sxjw5jcVbMAIszApl2
# mn9ofZooozAv5TtELpPdZNmXrNtryVUOdpZn1TyWeZogIjJAhdhgivZ2hvDJm7At
# 5jzBZ0YmmnRzxkz2UeiFtOBwdP1uBYUWZczcga1fOMFYlXrW7HUK5D8U7V97zAve
# YWeNyw==
# SIG # End signature block