AzStackHciStandaloneObservability/package/bin/ObsDep/content/Powershell/Roles/Common/NetworkControllerWorkloadHelpers.psm1

<###################################################
 # #
 # Copyright (c) Microsoft. All rights reserved. #
 # #
 ##################################################>


Import-Module "NetworkControllerRESTWrappers.psm1" -DisableNameChecking

function New-ACL
{
    param(
        [Parameter(mandatory=$false)]
        [String] $ResourceId=[System.Guid]::NewGuid(),
        [Parameter(mandatory=$true)]
        [object[]] $aclRules
    )

    $ar = @()
    foreach ($rule in $aclRules)
    {
        $ar += New-NCAccessControlListRule -Protocol $rule.Protocol -SourcePortRange $rule.SourcePortRange -DestinationPortRange $rule.DestinationPortRange -sourceAddressPrefix $rule.sourceAddressPrefix -destinationAddressPrefix $rule.destinationAddressPrefix -Action $rule.Action -ACLType $rule.Type -Logging $true -Priority $rule.Priority
    }

    $acl1 = New-NCAccessControlList -resourceId $ResourceId -AccessControlListRules $ar
    return $acl1
}

function Get-PortProfileId
{
    param(
        [Parameter(mandatory=$true)]
        [String] $VMName,
        [Parameter(mandatory=$false)]
        [String] $VMNetworkAdapterName=$null,
        [Parameter(mandatory=$false)]
        [String] $ComputerName="localhost"
        )

    Write-Verbose ("Getting port profile for [$vmname] on [$computername]" )

    try
    {
        $pssession = New-PSSession -ComputerName $computername

        Invoke-Command -Session $pssession -ScriptBlock {
            if ([String]::IsNullOrEmpty($using:VMNetworkAdapterName))
            {
                $vmNics = Get-VMNetworkAdapter -VMName $using:VMName
            }
            else
            {
                $vmNics = @(Get-VMNetworkAdapter -VMName $using:VMName -Name $using:VMNetworkAdapterName)
            }

            $result = @()

            foreach ($vmNic in $vmNics)
            {
                $currentProfile = Get-VMSwitchExtensionPortFeature -FeatureId "9940cd46-8b06-43bb-b9d5-93d50381fd56" -VMNetworkAdapter $vmNic
                if ( $currentProfile -eq $null)
                {
                    $result += $null
                }
                else
                {
                    $result += [system.guid]::parse($currentProfile.SettingData.ProfileId).tostring()
                }
            }

            return $result
        }
    }
    finally
    {
        $pssession | Remove-PSSession -ErrorAction Ignore
    }
}

function Get-MacAddress
{
    param(
        [Parameter(mandatory=$true)]
        [String] $VMName,
        [Parameter(mandatory=$false)]
        [String] $VMNetworkAdapterName=$null,
        [Parameter(mandatory=$false)]
        [String] $ComputerName="localhost"
        )

    Write-Verbose ("Getting mac address for [$vmname] on [$computername]" )

    try
    {
        $pssession = New-PSSession -ComputerName $computername

        Invoke-Command -Session $pssession -ScriptBlock {
            if ([String]::IsNullOrEmpty($using:VMNetworkAdapterName))
            {
                $vmNics = Get-VMNetworkAdapter -VMName $using:VMName
            }
            else
            {
                $vmNics = @(Get-VMNetworkAdapter -VMName $using:VMName -Name $using:VMNetworkAdapterName)
            }

            $result = @()

            foreach ($vmNic in $vmNics)
            {
                $result += $VMNic.MacAddress
            }

            return $result
        }
    }
    finally
    {
        $pssession | Remove-PSSession -ErrorAction Ignore
    }
}

function Add-NetworkAdapterToNetwork
{
    param(
        [Parameter(mandatory=$true)]
        [String] $VMName,
        [Parameter(mandatory=$true)]
        [String] $VMNetworkAdapterName,
        [Parameter(mandatory=$true)]
        [String] $ComputerName,
        [Parameter(mandatory=$false)]
        [String] $NetworkInterfaceResourceId="",
        [Parameter(mandatory=$true)]
        [Object] $LogicalNetworkResourceId,
        [Parameter(mandatory=$true)]
        [String] $SubnetAddressPrefix,
        [Parameter(mandatory=$false)]
        [String] $ACLResourceId=$null,
        [Parameter(mandatory=$false)]
        [String] $IPAddress,
        [Parameter(mandatory=$false)]
        [Object] $Credential
    )

    if ([string]::IsNullOrEmpty($NetworkInterfaceResourceId))
    {
        $NetworkInterfaceInstanceId = Get-PortProfileId -vmname $vmname -vmnetworkadaptername $VMNetworkAdapterName -computername $computername
        $NetworkInterfaceResourceId = Get-NCNetworkInterfaceResourceId -InstanceId $NetworkInterfaceInstanceId
    }

    # If NetworkInterfaceResourceId is still null, it is possible that the NIC is already in the NC but the port profile is still a null port profile. This Could
    # happen in the case of VM update scenario. So try to get the NIC from NC based on mac address and IP address.
    $mac = Get-MacAddress -vmname $vmname -VMNetworkAdapterName $VMNetworkAdapterName -ComputerName $ComputerName
    if ($mac.count -eq 0)
    {
        throw "Couldn't find the MACAddress for network adapter ($VMNetworkAdapterName) of VM $vmname on host $ComputerName."
    }

    $macAddress = $mac.Replace('-', '')
    $ncNics = get-ncnetworkinterface
    Trace-Execution "Searching a network interface with MAC address ($macAddress) and IP ($IPAddress) from NC."
    foreach ($ncnic in $ncNics)
    {
        if (($ncnic.properties.privateMacAddress -eq $macAddress) -and
        ($ncnic.properties.ipconfigurations -ne $null) -and
        ($ncnic.properties.ipconfigurations.count -gt 0) -and
        ($ncnic.properties.ipconfigurations[0].properties.privateIPAddress -eq $IPAddress))
        {
            $NetworkInterfaceResourceId = $ncnic.resourceId
            Trace-Execution "Found NC network interface with resourceId $NetworkInterfaceResourceId for network adapter with MAC address ($macAddress) and IP ($IPAddress)"
            break
        }
    }

    $ln = Get-NCLogicalNetwork -ResourceId $LogicalNetworkResourceId
    if ($ln -eq $null)
    {
        throw "Logical Network is Null."
    }

    foreach ($lnsubnet in $ln.properties.subnets)
    {
        if ($subnetaddressprefix -eq $lnsubnet.properties.Addressprefix)
        {
            $subnet = $lnsubnet
            break
        }
    }

    if ([string]::IsNullOrEmpty($subnet))
    {
        throw "Logical Network doesn't contain any subnet that matches [$subnetaddressprefix]."
    }

    # if network interface is still not found on NC, we should add a new network interface to NC.
    if (([string]::IsNullOrEmpty($NetworkInterfaceResourceId)) -or ($NetworkInterfaceResourceId -eq "") -or ($NetworkInterfaceResourceId -eq [System.Guid]::Empty))
    {
        $NetworkInterfaceResourceId = [System.Guid]::NewGuid()
    }

    # add acl if specified
    Trace-Execution "Creating network interface in Network Controller with resourceId $NetworkInterfaceResourceId, MAC address $mac and IP $IPAddress."
    if (![String]::IsNullOrEmpty($ACLResourceId))
    {
        $acl = Get-NCAccessControlList -resourceID $ACLResourceId
        if ($acl -eq $null)
        {
            throw "ACL with resource id $aclresourceid was not found on the network controller."
        }
        $nic = New-NCNetworkInterface -resourceId $NetworkInterfaceResourceId -Subnet $subnet -MACAddress $mac -acl $acl -ipaddress $ipaddress
    } else {
        $nic = New-NCNetworkInterface -resourceId $NetworkInterfaceResourceId -Subnet $subnet -MACAddress $mac -ipaddress $ipaddress
    }

    if ($nic -eq $null)
    {
        throw "Failed to create network interface in Network Controller with resourceId $NetworkInterfaceResourceId."
    }

    set-portprofileid -resourceID $nic.instanceid -VMName $vmname -VMNetworkAdapterName $vmnetworkadaptername -computername $computername -Credential $Credential -Force

    return $nic
}

function New-LoadBalancerVIP
{
    param(
        [Parameter(mandatory=$true)]
        [Object[]] $VMPool, #Object expected type is Microsoft.HyperV.PowerShell.VirtualMachine
        [Parameter(mandatory=$true, ParameterSetName="PrivateIp")]
        [string] $Vip,
        [Parameter(mandatory=$true, ParameterSetName="PublicIpReference")]
        [string] $PublicIpResourceRef,
        [Parameter(mandatory=$false)]
        [string] $protocol="TCP",
        [Parameter(mandatory=$false)]
        [int] $frontendPort,
        [Parameter(mandatory=$false)]
        [int] $backendPort=$frontendport,
        [Parameter(mandatory=$false)]
        [Switch] $EnableOutboundNat,
        [Parameter(mandatory=$false)]
        [object] $Probe = $null,
        [parameter(mandatory=$false)]
        [string] $LoadBalancerResourceID=[System.Guid]::NewGuid(),
        [parameter(mandatory=$false)]
        [string] $VMNicName = $null
    )
    Trace-ECEScript "New load balancer VIP $Vip or PublicVip resource ref $PublicIpResourceRef" {
        switch($PsCmdlet.ParameterSetName)
        {
            "PrivateIp"
            {
                $slbm = get-ncloadbalancermanager

                if ($slbm.properties.vipippools.count -lt 1)
                {
                    throw "New-LoadBalancerVIP requires at least one VIP pool in the NC Load balancer manager."
                }

                $vipPools = $slbm.properties.vipippools

                # check if the input VIP is within range of one of the VIP pools
                foreach ($vippool in $vipPools)
                {
                    # IP pool's resourceRef is in this format:
                    # /logicalnetworks/f8f67956-3906-4303-94c5-09cf91e7e311/subnets/aaf28340-30fe-4f27-8be4-40eca97b052d/ipPools/ed48962b-2789-41bf-aa7b-3e6d5b247384
                    $sp = $vippool.resourceRef.split("/")

                    $ln = Get-NCLogicalNetwork -resourceId $sp[2] #LN resourceid is always the first ID (after /logicalnetwork/)
                    if (-not $ln)
                    {
                        throw "Can't find logical network with resourceId $($sp[2]) from NC."
                    }

                    $subnet = $ln.properties.subnets | ? {$_.resourceId -eq $sp[4]}
                    if (-not $subnet)
                    {
                        throw "can't find subnet with resourceId $($sp[4]) from NC."
                    }

                    $pool = $subnet.properties.ipPools | ? {$_.resourceId -eq $sp[6]}
                    if (-not $pool)
                    {
                        throw "can't find IP pool with resourceId $($sp[6]) from NC."
                    }

                    $startIp = $pool.properties.startIpAddress
                    $endIp = $pool.properties.endIpAddress
                    if (IsIpWithinPoolRange -targetIp $Vip -startIp $startIp -endIp $endIp)
                    {
                        $vipLn = $ln
                        break;
                    }
                }

                if (-not $vipLn)
                {
                    throw "$Vip is not within range of any of the VIP pools managed by SLB manager."
                }

                $lbfe = @(New-NCLoadBalancerFrontEndIPConfiguration -PrivateIPAddress $Vip -SubnetResourceRef ($vipLn.properties.Subnets[0].resourceRef))
            }
            "PublicIpReference"
            {
                $lbfe = @(New-NCLoadBalancerFrontEndIPConfiguration -PublicIpResourceRef $PublicIpResourceRef)
            }
        }

        $ppids = @()
        foreach ($VM in $VMPool)
        {
            $vm_name = $VM.Name
            $vm_computer = $VM.ComputerName
            if ([String]::IsNullOrEmpty($VMNicName))
            {
                $vm_nic = $VM.NetworkAdapters[0].Name
            }
            else
            {
                $vm_nic = $VMNicName
            }
            $instanceid = Get-PortProfileId -VMName $vm_name -VMNetworkAdapterName $vm_nic -ComputerName $vm_computer

            #convert port profile id to from instance id to resource id
            $ppid = Get-NCNetworkInterfaceResourceId -InstanceId $instanceid
            if (-not $ppid)
            {
                throw "Can't find ResourceId for network interface with instanceId $instanceid"
            }
            $ppids += $ppid
        }

        $lbbe = @(New-NCLoadBalancerBackendAddressPool)

        $rules = @()
        if($protocol -ne $null -and $frontendPort -ne 0 -and $backendPort -ne 0)
        {
            $rules = @(New-NCLoadBalancerLoadBalancingRule -protocol $protocol -frontendPort $frontendPort -backendport $backendPort -enableFloatingIP $False -frontEndIPConfigurations $lbfe -backendAddressPool $lbbe -probe $Probe)
        }

        $probes = @()
        if ($Probe -ne $null)
        {
            $probes = @($Probe)
        }

        if ($EnableOutboundNat)
        {
            $onats = @(New-NCLoadBalancerOutboundNatRule -frontendipconfigurations $lbfe -backendaddresspool $lbbe)
            $lb = New-NCLoadBalancer -ResourceID $LoadBalancerResourceID -frontendipconfigurations $lbfe -backendaddresspools $lbbe -loadbalancingrules $rules -outboundnatrules $onats -probes $probes
        }
        else
        {
            $lb = New-NCLoadBalancer -ResourceID $LoadBalancerResourceID -frontendipconfigurations $lbfe -backendaddresspools $lbbe -loadbalancingrules $rules -probes $probes
        }

        if($lb -eq $null)
        {
            Trace-Error "Failed to add/update load balancer with resourceID $LoadBalancerResourceID."
        }

        Add-LoadBalancerToNetworkAdapter -LoadBalancerResourceID $LoadBalancerResourceID -VMNicResourceIds $ppids
    }

    return $lb
}

Export-ModuleMember -Function Add-IDnsConfiguration
Export-ModuleMember -Function Add-LoadBalancerToNetworkAdapter
Export-ModuleMember -Function Add-NetworkAdapterToNetwork
Export-ModuleMember -Function Convert-IPv4IntToString
Export-ModuleMember -Function Convert-IPv4StringToInt
Export-ModuleMember -Function ConvertTo-MacAddress
Export-ModuleMember -Function Get-MacAddress
Export-ModuleMember -Function Get-NCAccessControlList
Export-ModuleMember -Function Get-NCCredential
Export-ModuleMember -Function Get-NCGateway
Export-ModuleMember -Function Get-NCGatewayPool
Export-ModuleMember -Function Get-NCIPPool
Export-ModuleMember -Function Get-NCLoadBalancer
Export-ModuleMember -Function Get-NCLoadbalancerManager
Export-ModuleMember -Function Get-NCLoadBalancerMux
Export-ModuleMember -Function Get-NCLogicalNetwork
Export-ModuleMember -Function Get-NCLogicalNetworkSubnet
Export-ModuleMember -Function Get-NCMACPool
Export-ModuleMember -Function Get-NCNetworkInterface
Export-ModuleMember -Function Get-NCNetworkInterfaceInstanceId
Export-ModuleMember -Function Get-NCNetworkInterfaceResourceId
Export-ModuleMember -Function Get-NCPublicIPAddress
Export-ModuleMember -Function Get-NCServer
Export-ModuleMember -Function Get-NCSwitch
Export-ModuleMember -Function Get-NCVirtualGateway
Export-ModuleMember -Function Get-NCVirtualNetwork
Export-ModuleMember -Function Get-NCVirtualServer
Export-ModuleMember -Function Get-NCVirtualSubnet
Export-ModuleMember -Function Get-PortProfileId
Export-ModuleMember -Function Get-ServerResourceId
Export-ModuleMember -Function Invoke-WebRequestWithRetries
Export-ModuleMember -Function IsIpPoolRangeValid
Export-ModuleMember -Function IsIpWithinPoolRange
Export-ModuleMember -Function JSONDelete
Export-ModuleMember -Function JSONGet
Export-ModuleMember -Function JSONPost
Export-ModuleMember -Function New-ACL
Export-ModuleMember -Function New-LoadBalancerVIP
Export-ModuleMember -Function New-NCAccessControlList
Export-ModuleMember -Function New-NCAccessControlListRule
Export-ModuleMember -Function New-NCBgpPeer
Export-ModuleMember -Function New-NCBgpRouter
Export-ModuleMember -Function New-NCBgpRoutingPolicy
Export-ModuleMember -Function New-NCBgpRoutingPolicyMap
Export-ModuleMember -Function New-NCCredential
Export-ModuleMember -Function New-NCGateway
Export-ModuleMember -Function New-NCGatewayPool
Export-ModuleMember -Function New-NCGreTunnel
Export-ModuleMember -Function New-NCIPPool
Export-ModuleMember -Function New-NCIPSecTunnel
Export-ModuleMember -Function New-NCL3Tunnel
Export-ModuleMember -Function New-NCLoadBalancer
Export-ModuleMember -Function New-NCLoadBalancerBackendAddressPool
Export-ModuleMember -Function New-NCLoadBalancerFrontEndIPConfiguration
Export-ModuleMember -Function New-NCLoadBalancerLoadBalancingRule
Export-ModuleMember -Function New-NCLoadBalancerMux
Export-ModuleMember -Function New-NCLoadBalancerMuxPeerRouterConfiguration
Export-ModuleMember -Function New-NCLoadBalancerOutboundNatRule
Export-ModuleMember -Function New-NCLoadBalancerProbe
Export-ModuleMember -Function New-NCLoadBalancerProbeObject
Export-ModuleMember -Function New-NCLogicalNetwork
Export-ModuleMember -Function New-NCLogicalNetworkSubnet
Export-ModuleMember -Function New-NCLogicalSubnet
Export-ModuleMember -Function New-NCMACPool
Export-ModuleMember -Function New-NCNetworkInterface
Export-ModuleMember -Function New-NCPublicIPAddress
Export-ModuleMember -Function New-NCServer
Export-ModuleMember -Function New-NCServerConnection
Export-ModuleMember -Function New-NCServerNetworkInterface
Export-ModuleMember -Function New-NCSlbState
Export-ModuleMember -Function New-NCSwitch
Export-ModuleMember -Function New-NCSwitchPort
Export-ModuleMember -Function New-NCVirtualGateway
Export-ModuleMember -Function New-NCVirtualNetwork
Export-ModuleMember -Function New-NCVirtualServer
Export-ModuleMember -Function New-NCVirtualSubnet
Export-ModuleMember -Function New-NCVpnClientAddressSpace
Export-ModuleMember -Function Remove-LoadBalancerFromNetworkAdapter
Export-ModuleMember -Function Remove-NCAccessControlList
Export-ModuleMember -Function Remove-NCCredential
Export-ModuleMember -Function Remove-NCGateway
Export-ModuleMember -Function Remove-NCGatewayPool
Export-ModuleMember -Function Remove-NCIPPool
Export-ModuleMember -Function Remove-NCLoadBalancer
Export-ModuleMember -Function Remove-NCLoadBalancerMux
Export-ModuleMember -Function Remove-NCLogicalNetwork
Export-ModuleMember -Function Remove-NCMACPool
Export-ModuleMember -Function Remove-NCNetworkInterface
Export-ModuleMember -Function Remove-NCPublicIPAddress
Export-ModuleMember -Function Remove-NCServer
Export-ModuleMember -Function Remove-NCSwitch
Export-ModuleMember -Function Remove-NCVirtualGateway
Export-ModuleMember -Function Remove-NCVirtualNetwork
Export-ModuleMember -Function Remove-NCVirtualServer
Export-ModuleMember -Function Remove-PortProfileId
Export-ModuleMember -Function Set-NCConnection
Export-ModuleMember -Function Set-NCLoadBalancerManager
Export-ModuleMember -Function Set-PortProfileId
Export-ModuleMember -Function Set-PortProfileIdHelper
Export-ModuleMember -Function Update-NCCredential
Export-ModuleMember -Function Update-NCServer
Export-ModuleMember -Function Update-NCVirtualServer

# SIG # Begin signature block
# MIInvQYJKoZIhvcNAQcCoIInrjCCJ6oCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD9tIEwOl9hxfmC
# JTxeneJ2Go4c6NrS4dEGgti7N4hhzKCCDXYwggX0MIID3KADAgECAhMzAAADTrU8
# esGEb+srAAAAAANOMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjMwMzE2MTg0MzI5WhcNMjQwMzE0MTg0MzI5WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDdCKiNI6IBFWuvJUmf6WdOJqZmIwYs5G7AJD5UbcL6tsC+EBPDbr36pFGo1bsU
# p53nRyFYnncoMg8FK0d8jLlw0lgexDDr7gicf2zOBFWqfv/nSLwzJFNP5W03DF/1
# 1oZ12rSFqGlm+O46cRjTDFBpMRCZZGddZlRBjivby0eI1VgTD1TvAdfBYQe82fhm
# WQkYR/lWmAK+vW/1+bO7jHaxXTNCxLIBW07F8PBjUcwFxxyfbe2mHB4h1L4U0Ofa
# +HX/aREQ7SqYZz59sXM2ySOfvYyIjnqSO80NGBaz5DvzIG88J0+BNhOu2jl6Dfcq
# jYQs1H/PMSQIK6E7lXDXSpXzAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUnMc7Zn/ukKBsBiWkwdNfsN5pdwAw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwMDUxNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAD21v9pHoLdBSNlFAjmk
# mx4XxOZAPsVxxXbDyQv1+kGDe9XpgBnT1lXnx7JDpFMKBwAyIwdInmvhK9pGBa31
# TyeL3p7R2s0L8SABPPRJHAEk4NHpBXxHjm4TKjezAbSqqbgsy10Y7KApy+9UrKa2
# kGmsuASsk95PVm5vem7OmTs42vm0BJUU+JPQLg8Y/sdj3TtSfLYYZAaJwTAIgi7d
# hzn5hatLo7Dhz+4T+MrFd+6LUa2U3zr97QwzDthx+RP9/RZnur4inzSQsG5DCVIM
# pA1l2NWEA3KAca0tI2l6hQNYsaKL1kefdfHCrPxEry8onJjyGGv9YKoLv6AOO7Oh
# JEmbQlz/xksYG2N/JSOJ+QqYpGTEuYFYVWain7He6jgb41JbpOGKDdE/b+V2q/gX
# UgFe2gdwTpCDsvh8SMRoq1/BNXcr7iTAU38Vgr83iVtPYmFhZOVM0ULp/kKTVoir
# IpP2KCxT4OekOctt8grYnhJ16QMjmMv5o53hjNFXOxigkQWYzUO+6w50g0FAeFa8
# 5ugCCB6lXEk21FFB1FdIHpjSQf+LP/W2OV/HfhC3uTPgKbRtXo83TZYEudooyZ/A
# Vu08sibZ3MkGOJORLERNwKm2G7oqdOv4Qj8Z0JrGgMzj46NFKAxkLSpE5oHQYP1H
# tPx1lPfD7iNSbJsP6LiUHXH1MIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# 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
# /Xmfwb1tbWrJUnMTDXpQzTGCGZ0wghmZAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAANOtTx6wYRv6ysAAAAAA04wDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEICC/C20pkCKg4GMhoPjASCXv
# gumeDrarDWScvBpwMXACMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAzYs3E7wL3BUCnjMXLOL7jrrgcSfjgo6i2r8E71CFYHI8eBw3CIlvx91t
# jcu1SFhvF9EVXu/7QFyquSdnPOUBinfdQpNK9PiUvmNYGRGHMBIia78GWko5KtLf
# kVAgNMi62UiitpsQ+4jDBGn78RTC79jSY4Pf5lTTmbRWn73KOFlUXGbHlpeLNYdz
# SJZV2IJzLzBsBujtY55yC+bwVfV95zEn0prunWb3h0CkdnGincaDn13YC5Jn2TjK
# afOalXcib5cen5Xm4CTcroXAhSV7j/zswNJvuRv/7xCg3nnweFZBKeS+dI6lx437
# oWtvBP2ScLqXW2elCdmemyTy9+F3fKGCFycwghcjBgorBgEEAYI3AwMBMYIXEzCC
# Fw8GCSqGSIb3DQEHAqCCFwAwghb8AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFXBgsq
# hkiG9w0BCRABBKCCAUYEggFCMIIBPgIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCDgQdM4oPfDJ4ai9TpPbM23yDeRSj54aRPcZbqKL1/C2QIGZJMsHE91
# GBEyMDIzMDcxMzE5MjQ1NS4yWjAEgAIB9KCB2KSB1TCB0jELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxh
# bmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo4
# NkRGLTRCQkMtOTMzNTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
# dmljZaCCEXgwggcnMIIFD6ADAgECAhMzAAABtyEnGgeiKoZGAAEAAAG3MA0GCSqG
# SIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIyMDky
# MDIwMjIxNFoXDTIzMTIxNDIwMjIxNFowgdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh
# dGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046ODZERi00QkJD
# LTkzMzUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIi
# MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDH/c9XUDQTZEwatxyXJcqY0HCS
# JQwIKb7MOLxyXtOp+d9kShpHJ9Fe6euTngNcDqDvvDbKKZ4z6VWfPuLP0YXTAjDT
# 0CV6FnZFjqf96biBLNX8zwYEya3Zs3clGM6wJaCAmMe9toJnaWzX9z9MuWdoETuP
# LFiGMmHjSWHIfmXyc16qr7r6uxvDZvCDEIvGWsr8fuXUhgTOVWBwcQhI1xfRDekM
# OwOtEml4yo6I0qVJqWjOBZlXnPfOTzXUofITnj9rS+/NUgWp/dg09fbXzR7/R9BQ
# JhNhxkcIsx5Cf/5gGXUtLOm4v1MDzJLAImuW6ZyAwTqGmHVpFdJVRuazdPpbUc/c
# 45Wh/boXRkyflojSjq+5kZ5c2EAOd37UkiQarBKU8wr+3Ou933b5bcd8uPD3q+r3
# OlEeXuJEmbB9eNSIcYZkUdkphGm7mCjk3Tu0P75bwH0MbhJyfdzS+C2FdSFsPDvs
# TTuoJY6waQjnzjk0IFiRfjOvyD8rmK3L+/S7u5XOu0vlPTBLtnaINDLiSKGAjIrl
# Wl0ufhZjiYsn4gmZtFSbCee9MvZP7REHumkEfTMQ1tadhdx1nm6JV4/bLu866xJT
# ZRwBL6RYXIKDJ4spTU4k2cy8FI+0x/N4J7oMNRQhFVYeVPZcDTDy9SBrs/91PkU/
# cGQgSWCKxST3epPFLQIDAQABo4IBSTCCAUUwHQYDVR0OBBYEFLPyOT4MNCQFYQ3W
# AdsjyCPJeLTsMB8GA1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1Ud
# HwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js
# L01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggr
# BgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIw
# MTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgw
# DgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4ICAQANnWTMm4VcUl02ycxY
# LzYjAlefwMp+VLsyVOPeWA7XHn6JXdHoUfUARgYR5gDLddFmAh89lkFMjN5kA+CL
# B3xC9SRMIBvbRqu9bnJ/XZJywRw99Cb20EYSCnLxUp70QgqVaYpTPBf2GllwvVYm
# 0nn/z1NhlgPtc7OuFRcSah3rsvCqq0MnxdtEgp3fM0WZeGGAXI4fRtBo4SR1DwGB
# MdK/I0lo8otqNlgBw+gqaQbZMJ2Un+wOvAy+DsMAaZhQd/r7m44DcGiAkvn5Blb0
# Zz9mYJpX52gGrPDMe4oCanIqqtEOgJ/tKx49ZMYrDXSIk8xZbuRsNnoV6S65efZL
# 7JjjVQCR4Z3acd5/9K++kx/t1jUvVE/Y28UJBPrdrYYn+jCuZKxTJ5ASAgkfw1XF
# dasPbIOrDBKNMFkl5UGF73EFgOuXlc0pKLMpYSJSGWSy9xh2Q9S0LQI6dgORewty
# MODbewu2gwn6RcaJt2bpUZxSaJZTx297p4/YQPcb0Yip1jADKUuDGQKIleDtvc1i
# mXVM8oKe4A+FoyitdeSgidKLxHH/dgJ8DAFzJzbNaNCwrM4Prg5okGbOXke483Ss
# 1Xxdc+23w2DTwCb5uaUkHW8t8CDrDf7LWIzPhJGj7VM6/DsjMKxvo6RTG7AeHHze
# rbyHhra7ZJTCRbZxevAnGWeSADCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkA
# AAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRl
# IEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVow
# fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd
# TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX
# 9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1q
# UoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8d
# q6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byN
# pOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2k
# rnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4d
# Pf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgS
# Uei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8
# QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6Cm
# gyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzF
# ER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQID
# AQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQU
# KqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1
# GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0
# bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA
# QTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbL
# j+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1p
# Y3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0w
# Ni0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIz
# LmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwU
# tj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN
# 3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU
# 5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5
# KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGy
# qVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB6
# 2FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltE
# AY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFp
# AUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcd
# FYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRb
# atGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQd
# VTNYs6FwZvKhggLUMIICPQIBATCCAQChgdikgdUwgdIxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5k
# IE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046ODZE
# Ri00QkJDLTkzMzUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZp
# Y2WiIwoBATAHBgUrDgMCGgMVAMhnQRjDmzg5bBgWZklF9qFoH6nGoIGDMIGApH4w
# fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd
# TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQACBQDo
# WqmqMCIYDzIwMjMwNzE0MDA0OTQ2WhgPMjAyMzA3MTUwMDQ5NDZaMHQwOgYKKwYB
# BAGEWQoEATEsMCowCgIFAOhaqaoCAQAwBwIBAAICAokwBwIBAAICE0AwCgIFAOhb
# +yoCAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAweh
# IKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQBeWeuXqCPurHpkV0StGes5
# wlSiM2ESGjXI5E0QUFmfGrk2ocpab5dGRYV8boYJaMCYd3QccmOlI8jL2qpVVU00
# ToX4bzq9+BkajWX1SzbtnHE9k61LH7zaQsoO2s85QKutrkdT2UqQxDovUJ9eoZkz
# BzLQgpB0vUsW+knUUmI0mTGCBA0wggQJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0
# YW1wIFBDQSAyMDEwAhMzAAABtyEnGgeiKoZGAAEAAAG3MA0GCWCGSAFlAwQCAQUA
# oIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIE
# IHwgzsTdvJ+RGd+cuPKoxo05Hba5aAyvWhtWxjCqqDyVMIH6BgsqhkiG9w0BCRAC
# LzGB6jCB5zCB5DCBvQQgbCd407Ie2i/ITXomBi+f/CAZ/M1H6+/0O65DPInNcEEw
# gZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw
# JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAbchJxoH
# oiqGRgABAAABtzAiBCBGENmg1tUqIfsCSRoxKLFI5y79tIs8TRwVWeTyAvVBRzAN
# BgkqhkiG9w0BAQsFAASCAgAlTFCDCXsphjd23awCO4D338AyzaTj6m1rU3C/2EGc
# oPMqOGVsHAtukqV/UCqgq/vl3rtnH0hVCiyagwEAZfehCc1NcZOiZMctED8yeSZ7
# ZBK1S6UQ4g4zHP8rzjIJ4k7vfu3ymupTH5W7bbRwt+qgpk1mXenG+mejRGF/Yq6L
# BrMYHH7/1zhq4Yb7j9iuTh5yzxfuUxpdfiscEhK1mukLNsBHGWicDSAtMt6FnzX4
# TNenr0YSyqDrrY2IfnjAMbMQfMUDdizrGdaOHtPhpl7rL3EI9CJ/ugJd5yIy3HFd
# 6As34WfWL4HrWKx8pfqNPql+iQm4T8g6O9xptcWcAzsK2rCjkeJ31UH6Ob6FNbzd
# eT5tFXgEjZYUGj5azCQzSmUKnDzrqxw9lfpVtqq9pBJIxPltQKpZCRttCKWecgB0
# aZKUVQk2qbw9Iud6PTprm374t/lJz6RVoVwPEeIYVOroMtJURUS4/7iaUuyx0fw7
# VEX0uTubqrTcvs5QL6I9zNhoiUsDmS1WUzpmLsFYxmvmDjlHUjdwxto0ghwGazbh
# Mg713K10osk/dIc+d/G72yXH1mME3R3KijR8RY8vzXdokcOWQ6yhN+uWdh45hiTu
# PYDkATqNwfyK2YbrIE0H6ky9GlHqATGpVFnUxOc+LdmAVxhtv1cX10vuX/apQBfv
# 8A==
# SIG # End signature block