New-AaddsResourceForest.ps1

<#PSScriptInfo
 
.VERSION 1.1
 
.GUID fbc2de0b-325d-450c-a6c6-34669155d3d5
 
.AUTHOR aaddsfb@microsoft.com
 
.COMPANYNAME Microsoft Corporation
 
.COPYRIGHT (c) Microsoft Corporation
 
.TAGS Azure-AD-Domain-Services ResourceForest
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    07/19/2020 - Initial release
#>


<#
 
.SYNOPSIS
    Creates a Azure AD Domain Services resource forest instance.
 
.DESCRIPTION
    Creates a Azure AD Domain Services resource forest instance.
 
.PARAMETER azureSubscriptionId
    The subscription ID used for Azure AD Domain Services billing.
    You can get the list of subscriptions using the Get-AzureRMSubscription cmdlet.
    This parameter is MANDATORY
 
.PARAMETER aaddsAdminUser
    The user principal name of the first Azure AD Domain Services administrator
    This user and the user running this script will be Azure AD Domain Services Administrators
    This parameter is MANDATORY
 
.PARAMETER aaddsDomainName
    The FQDN of the Azure AD Domain Services forest. This name MUST be different from your on-premises forest.
    The first part of the domain name cannot exceed 15 characters. It is recommended to use 'aadds' or 'aaddsrf'
    This parameter is MANDATORY
 
.PARAMETER aaddsResourceGroupName
    The resource group hosting the Azure AD Domain Services instance (and its associated resources).
    This can be an existing resource group or a new one that will be created.
    This parameter is MANDATORY
 
.PARAMETER aaddsVnetName
    The name of the virtual network hosting the Azure AD Domain Services instance.
    This can be an existing virtual network or a new one that will be created.
    This parameter is MANDATORY
 
.PARAMETER aaddsVnetCIDRAddressSpace
    The virtual network's address range in CIDR notation.
    This parameter is MANDATORY when creating a new virtual network.
    OMIT/SKIP this parameter if you are using an existing virutal network.
 
.PARAMETER aaddsSubnetName
    The name of the subnet hosting Azure AD Domain Services.
    This CANNOT be an existing subnet on the virtual network.
    This parameter is MANDATORY
 
.PARAMETER aaddsSubnetCIRDAddressRange
    The subnet's address range in CIDR notation for the Azure AD Domain Services instance (e.g. 192.168.1.0/24).
    It must be contained by the address range of the virtual network and different from other subnets.
    This parameter is MANDATORY
 
.PARAMETER aaddsLocation
    The name of the Azure Region hosting your Azure AD Domain Services instance.
    Use "Get-AzLocation | fl -Property Location" for a list of locations.
    This parameter is MANDATORY
 
.PARAMETER createWorkloadSubnet
    Determines if the script creates a workload subnet for your application
    workloads. $true = workload subnet is created; $false = workload subnet is not created.
    This parameter is OPTIONAL
 
.PARAMETER workloadSubnetName
    The name of the subnet of the $aaddsVnetName virtual network that hosts your
    application workload (if the workload is hosted on the same virtual network).
    NOTE! It is recommended you host your application in its own virtual network and peer the workload virtual network
    to the virtual network hosting Azure AD Domain Services.
    This parameter is OPTIONAL
 
.PARAMETER workloadSubnetCIRDAddressRange
    The subnet's address range in CIDR notation for application workload (e.g. 192.168.1.0/24).
    It must be contained by the address range of the virtual network and different from other subnets.
    This parameter is OPTIONAL
 
 
.NOTES
     
    * This cmdlet creates a new Azure AD Domain Services resource forest instance in the tenant and subscription.
 
    * The cmdlet prompts for authentication twice. The first authentication is to Azure Active Directory. The
      second authentication is to Azure Resource Manager.
 
    * Your tenant must have an active subscription. You must authenticate as a global adminstrator of the tenant
      to create an instance of Azure AD Domain Services.
 
    * The cmdlet create a new resource group and virtual network if the named items do not exist.
     
    * The cmdlet MUST create the subnet that hosts Azure AD Domain Services and fails if the named subnet exists.
 
    * The cmdlet can optionally create a workload subnet. If it exists, it will skip the operation.
 
 
#>

[CmdletBinding()]
Param (

    [Parameter(
        Mandatory=$true,
        Position=0)]
        [string]
        $azureSubscriptionId,

    [Parameter(
        Mandatory=$true,
        Position=1)]
        [string]
        $aaddsAdminUser,

    [Parameter(
        Mandatory=$true,
        Position=2)]
        [string]
        $aaddsDomainName,

    [Parameter(
        Mandatory=$true,
        Position=3)]
        [string]
        $aaddsResourceGroupName,

    [Parameter(
        Mandatory=$true,
        Position=4)]
        [string]
        $aaddsVnetName,

    [Parameter(
        Mandatory=$false,
        Position=5)]
        [string]
        $aaddsVnetCIDRAddressSpace,

    [Parameter(
        Mandatory=$true,
        Position=6)]
        [string]
        $aaddsSubnetName,

    [Parameter(
        Mandatory=$true,
        Position=7)]
        [string]
        $aaddsSubnetCIRDAddressRange,

    [Parameter(
        Mandatory=$true,
        Position=8)]
        [string]
        $aaddsLocation,

    [Parameter(
        Mandatory=$false,        
        Position=9)]
        [switch]
        $createWorkloadSubnet = $false,

    [Parameter(
        Mandatory=$false,
        Position=10)]
        [string]
        $workloadSubnetName,

    [Parameter(
        Mandatory=$false,
        Position=11)]
        [string]
        $workloadSubnetCIRDAddressRange


)

Process
{
    Write-Host ([String]::Empty)
    Write-Host ([String]::Empty)
    Write-Host -ForegroundColor Cyan "New-AaddsResourceForest"
    Write-Host ([String]::Empty)
    Write-Host -ForegroundColor White "This cmdlet creates a Azure AD Domain Services resource forest. You will need to authenticate two times."
    Write-Host ([String]::Empty)        
    Write-Host -ForegroundColor White "1. Use Azure AD Global Adminstrator credentials from your Azure AD for the first authentication."
    Write-Host -ForegroundColor White "This creates the service principal, group and group memberships needed for the managed domain."
    Write-Host -ForegroundColor White "2. For the second authetnication, use credentials that allow you to create resources in the"
    Write-host -ForegroundColor white "provided subscription id. This is the subscription that will host your Azure AD Domain Services instance."
    Write-Host ([String]::Empty)
    Write-Host -ForegroundColor Green "Type 'Yes' to continue or 'No' to quit"
    
    $answer = Read-Host
    if("Yes" -cne $answer)
    {
        Write-Host "User canceled."
        Return 
    }


    $scriptStart = Get-Date

    
    # The constructed Azure AD Domain Services resource id.
    $aaddsResourceId = `
    "/subscriptions/$AzureSubscriptionId/resourceGroups/$aaddsResourceGroupName/providers/Microsoft.AAD/DomainServices/$aaddsDomainName"


    #
    # Authenticate to Azure to create AAD DC Administrators group and group memberships
    Write-Host ([string]::Empty)
    Write-Host ([string]::Empty)
    Write-Host -ForegroundColor White "First authentication..."
    Write-Host "Authenticating to Azure... " -NoNewline
    $azSession = Connect-AzureAD
    if($null -eq $azSession)
    {
        # Authentication failed
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not authenticate to Azure. Check your credentials and try again."
        Return
    }

    Write-Host -ForegroundColor Green "[Successs!]"
    Write-Host "INFO: Authenticated to Azure as $($azSession.Account.Id)..."
    

    #
    # Create the delegated administration group for Azure AD Domain Services (AAD DC Administrators group)
    Write-Host "Searching Azure AD for an existsing AAD DC Administrators group in Azure AD... " -NoNewline
    $aaddsAdminGroup = $null
    $aaddsAdminGroup = Get-AzureADGroup |Where-Object -Property DisplayName -eq "AAD DC Administrators" -ErrorAction SilentlyContinue
    if($null -eq $aaddsAdminGroup)
    {
        Write-Host -ForegroundColor Yellow "[Not Found!]"
        
        Write-Host "Creating the AAD DC Administrators group in Azure AD... " -NoNewline
        $aaddsAdminGroup = New-AzureADGroup `
         -DisplayName "AAD DC Administrators" `
         -SecurityEnabled $true `
         -MailEnabled $false `
         -MailNickName "AADDCAdministrators" -ErrorAction SilentlyContinue
         if($null -eq $aaddsAdminGroup)
         {
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-Host -ForegroundColor Red "FAILURE: Could not create AAD DC Administrators group."
            Return         
         }
         else
         {
            Write-Host -ForegroundColor Green "[Successs!]"            
         }    
     }
     else
     {
        Write-Host -ForegroundColor Green "[Found!]"
        if(1 -eq $aaddsAdminGroup.Count)
        {
            Write-Host "INFO: Using the existing group."
        }
        else
        {
            Write-Host -ForegroundColor Red "ERROR: There is more than one AAD DC Administrators group."
            Write-Host -ForegroundColor Red "ERROR: Delete one or more groups and try the operation again."
            Return
        }
     }


    #
    # Get an instance of the Azure AD Domain Services admin user
    $skipUser = $false
    Write-Host "Searching Azure AD for the Azure AD Domain Services delegated admin user... " -NoNewline    

    $aaddsAdmin = Get-AzureADUser -Filter "UserPrincipalName eq '$aaddsAdminUser'" 
    
    if($null -eq $aaddsAdmin)
    {
        # Skip if the named user account is not found in Azure AD
        Write-Host -ForegroundColor Yellow "[Not Found!]"
        Write-Host -ForegroundColor Yellow "WARNING: $aaddsAdminUser not found. Skipping. Add user manually."
        $skipUser = $true        
    }    
    else
    {        
        # Account Found. Check if it's already a member of the group
        Write-Host -ForegroundColor Green "[Found!]"

        Write-Host "Checking Group Membership for the delegated user $($aaddsAdmin.UserPrincipalName) in $($aaddsAdminGroup.DisplayName)..." -NoNewline
        $memberOf = Get-AzureADGroupMember -ObjectId $aaddsAdminGroup.ObjectId |`
         Where-Object -Property ObjectId -eq $aaddsAdmin.ObjectId
         if($null -eq $memberOf)
         {
            # Not a member of the group. Add.
            Write-Host -ForegroundColor Yellow "[Not Found!]"
            Write-Host "INFO: Adding user to group..." -NoNewline
            
            Add-AzureADGroupMember -ObjectId $aaddsAdminGroup.ObjectId -RefObjectId $aaddsAdmin.ObjectId
            $memberOf = $null
            $memberOf = Get-AzureADGroupMember -ObjectId $aaddsAdminGroup.ObjectId |`
                Where-Object -Property ObjectId -eq $aaddsAdmin.ObjectId
            if($null -eq $memberOf)
            {
                Write-Host -ForegroundColor Yellow "[Failed!]"
                Write-Host -ForegroundColor Yellow "WARNING: Manually add $($aaddsAdmin.UserPrincipalName) to $($aaddsAdminGroup.DisplayName)"
            }
            else
            {
                Write-Host -ForegroundColor Green "[Success!]"
            }
         }
         else
         {
            # Already a member of the group
            Write-Host -ForegroundColor Green "[Found!]"
            Write-Host "INFO: $($aaddsAdmin.UserPrincipalName) is already a member of $($aaddsAdminGroup.DisplayName). Skipping!"
         }               
    }   
    
    # Add the currently signed in User to the Group
    $tempUser = $($azSession.Account)
    Write-Host "Searching Azure AD for the current user: $tempUser..." -NoNewline 
    $currentUser = Get-AzureADUser -Filter "UserPrincipalName eq '$tempUser'"     
    
    if($null -eq $currentUser)
    {
        Write-Host -ForegroundColor Yellow "[Not Found!]"
        if($true -eq $skipUser)
        {
            Write-HOst -ForegroundColor Yellow "WARNING: The AAD DC Administrators group is empty. Add users manually using Azure AD."
        }
        else
        {
            Write-Host -ForegroundColor White "INFO: The current user $tempUser was not added to the AAD DC Administratrors group."
        }
    }
    else
    {
        # Account Found. Check if it's already a member of the group
        Write-Host -ForegroundColor Green "[Found!]"

        Write-Host "Checking Group Membership for the current user $($currentUser.UserPrincipalName) in $($aaddsAdminGroup.DisplayName)..." -NoNewline
        $memberOf = $null
        $memberOf = Get-AzureADGroupMember -ObjectId $aaddsAdminGroup.ObjectId |`
         Where-Object -Property ObjectId -eq $currentUser.ObjectId
         if($null -eq $memberOf)
         {
            # Not a member of the group. Add.
            Write-Host -ForegroundColor Yellow "[Not Found!]"
            Write-Host "INFO: Adding user to group..." -NoNewline
            
            Add-AzureADGroupMember -ObjectId $aaddsAdminGroup.ObjectId -RefObjectId $currentUser.ObjectId
            $memberOf = $null
            $memberOf = Get-AzureADGroupMember -ObjectId $aaddsAdminGroup.ObjectId |`
            Where-Object -Property ObjectId -eq $currentUser.ObjectId            
            if($null -eq $memberOf)
            {
                Write-Host -ForegroundColor Yellow "[Failed!]"
                Write-Host -ForegroundColor Yellow "WARNING: Manually add $($currentUser.UserPrincipalName) to $($aaddsAdminGroup.DisplayName)"
            }
            else
            {
                Write-Host -ForegroundColor Green "[Success!]"
            }
         }
         else
         {
            # Already a member of the group
            Write-Host -ForegroundColor Green "[Found!]"
            Write-Host "INFO: $($currentUser.UserPrincipalName) is already a member of $($aaddsAdminGroup.DisplayName). Skipping!"
         }                
    }
       
    #
    # Create the service principal for Azure AD Domain Services, if it does not exist.
    Write-Host "Checking for the Azure AD Domain Services Service Principal..." -NoNewline
    $rv = $null
    $rv = Get-AzureADServicePrincipal | Where-Object -Property AppId -eq "2565bd9d-da50-47d4-8b85-4c97f669dc36"
    if($null -eq $rv)
    {
        Write-Host -ForegroundColor Yellow "[Not Found!]"
        Write-Host "Creating Azure AD Domain Services Service Principal..." -NoNewline
        $rv = $null
        $rv = New-AzureADServicePrincipal -AppId "2565bd9d-da50-47d4-8b85-4c97f669dc36"
        if($null -eq $rv)
        {
           Write-Host -ForegroundColor Red "[Failed!]"
           Write-Host -ForegroundColor Red "ERROR: Failed to create the service principal for Azure AD Domain Services."
           Return
        }

        Write-Host -ForegroundColor Green "[Success!]"
    }
    else
    {
        # Service principal was found
        Write-Host -ForegroundColor Green "[Found!]"
        Write-Host "INFO: Azure AD Domain Services service principal exists. Skipping!"
    }

    

    #
    # Authenticate to Azure Resource Manager
    Write-Host ([string]::Empty)
    Write-Host ([string]::Empty)    
    Write-Host -ForegroundColor White "Second authentication (Azure Resource Manager)..." -NoNewline     
    $armSession = Connect-AzAccount
    if($null -eq $armSession)
    {
        # Authentication failed
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not authenticate to Azure Resource Manager. Check your credentials and try again."
        Return
    }
    

    Write-Host -ForegroundColor Green "[Successs!]"
    Write-Host "INFO: Authenticated to Azure as $($armSession.Context.Account.Id)..."

    Set-AzContext $azureSubscriptionId | Out-Null


    #
    # Azure AD Domain Services Resource Group
    Write-Host "Checking for the resource group $aaddsResourceGroupName in $aaddsLocation..." -NoNewline
    $aaddsResourceGroup = Get-AzResourceGroup -Name $aaddsResourceGroupName -Location $aaddsLocation -ErrorAction SilentlyContinue
    if($null -eq $aaddsResourceGroup)
    {
        # not found; create
        Write-Host -ForegroundColor Yellow "[Not Found!]"
        Write-Host "Creating resource group $aaddsResourceGroupName in $aaddsLocation..." -NoNewline

        $aaddsResourceGroup = New-AzResourceGroup `
         -Name $aaddsResourceGroupName `
         -Location $aaddsLocation -ErrorAction SilentlyContinue
        if($null -eq $aaddsResourceGroup)
        {
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-Host -ForegroundColor Red "ERROR: Failed creating the resource group $aaddsResourceGroupName."
            Return
        }
        else
        {
            Write-Host -ForegroundColor Green "[Success!]"
        }

    }
    else
    {
        Write-Host -ForegroundColor Green "[Found!]"
        Write-Host "INFO: Reusing existing resouce group ->$($aaddsResourceGroup.ResourceGroupName)"
    }

    
    #
    #
    # Azure AD Domain Services Virtual Network
    Write-Host "Checking for the $aaddsVnetName virtual network..." -NoNewline
    $aaddsVirtualNetwork = Get-AzVirtualNetwork -Name $aaddsVnetName -ResourceGroupName $aaddsResourceGroupName -ErrorAction SilentlyContinue
    if($null -eq $aaddsVirtualNetwork)
    {
        
        Write-Host -ForegroundColor Yellow "[Not Found!]"
        
        # Check if the virtual Network CIDR address space was provided
        if( ($null -eq $aaddsVnetCIDRAddressSpace) -or ("" -eq $aaddsVnetCIDRAddressSpace))
        {
            Write-Host -ForegroundColor Red "ERROR: Missing the virtual address space information."
            Write-Host -ForegroundColor Red "ERROR: Run the cmdlet again with the -aaddsVnetCIDRAddressSpace parameter and the appropriate value."
            Return 
        }        

        Write-Host "Creating $aaddsVnetName virtual network..." -NoNewline

        #
        # Create a virtual network to host Azure AD Domain Services
        $aaddsVirtualNetwork = New-AzVirtualNetwork `
         -ResourceGroupName $aaddsResourceGroupName `
         -Location $aaddsLocation `
         -Name $aaddsVnetName `
         -AddressPrefix $aaddsVnetCIDRAddressSpace -ErrorAction SilentlyContinue
        if($null -eq $aaddsVirtualNetwork)
        {
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-host -ForegroundColor Red "ERROR: Failed creating the $aaddsVnetName virtual network."
        }
        else
        {
            Write-Host -ForegroundColor Green "[Success!]"            
        }
        
    }
    else
    {
        write-Host -ForegroundColor Green "[Found!]"
        Write-Host "INFO: Reusing existing virtual network ->$($aaddsVirtualNetwork.Name)"
    }


    #
    #
    # Search the subnet, the script MUST create the Azure AD Domain Services subnet
    # Create a dedicated subnet to host Azure AD Domain Services
    # Get the Azure AD Domain Services subnet from the virtual network
    Write-Host "Checking for the $aaddsSubnetName subnet in $($aaddsVirtualNetwork.Name)..." -NoNewline
    $aaddsSubnet = Get-AzVirtualNetworkSubnetConfig `
     -Name $aaddsSubnetName `
     -VirtualNetwork $aaddsVirtualNetwork -ErrorAction SilentlyContinue
    if($null -ne $aaddsSubnet)
    {
        # Subnet Exists
        # Do not allow the reuse of a subnet
        Write-Host -ForegroundColor Red "[Found!]"
        Write-Host -ForegroundColor Red "ERROR: A subnet with the name $($aaddsSubnet.Name) exists in the $($aaddsVirtualNetwork.Name) virtual network."
        Write-Host -ForegroundColor Red "ERROR: Choose a different name or delete the subnet."
        Return
    }
    else
    {
        Write-Host -ForegroundColor Green "[Not Found!]"
        Write-Host "Creating the $aaddsSubnetName subnet and adding it to the $($aaddsVirtualNetwork.Name) virtual network..." -NoNewline
        
        $rv = $null
        $rv = Add-AzVirtualNetworkSubnetConfig `
            -Name $aaddsSubnetName `
            -VirtualNetwork $aaddsVirtualNetwork `
            -AddressPrefix $aaddsSubnetCIRDAddressRange -ErrorAction SilentlyContinue
        
        $aaddsVirtualNetwork = Set-AzVirtualNetwork -VirtualNetwork $aaddsVirtualNetwork -ErrorAction SilentlyContinue
        
        $aaddsSubnet = Get-AzVirtualNetworkSubnetConfig `
            -Name $aaddsSubnetName `
            -VirtualNetwork $aaddsVirtualNetwork -ErrorAction SilentlyContinue
        
        
        if( ($null -eq $rv) -or ($null -eq $aaddsVirtualNetwork) -or ($null -eq $aaddsSubnet) )
        {
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-Host -ForegroundColor REd "ERROR: Could not create the $aaddsSubnetName subnet."
            Return
        }
        else
        {
            Write-Host -ForegroundColor Green "[Successs!]"
        }
    }    


    #
    # Workload subnet detection and creation

    if($createWorkloadSubnet)
    {
        Write-Host "INFO: Create Workload subnet detected"
        Write-Host "Checking for the $workloadSubnetName subnet in $($aaddsVirtualNetwork.Name)..." -NoNewline
        $workloadSubnet = Get-AzVirtualNetworkSubnetConfig `
            -Name $workloadSubnetName `
            -VirtualNetwork $aaddsVirtualNetwork -ErrorAction SilentlyContinue
        
        if($null -ne $workloadSubnet)
        {
            # Subnet Exists
            Write-Host -ForegroundColor Yellow "[Found!]"
            Write-Host "INFO: A subnet with the name $($workloadSubnet.Name) exists in the $($aaddsVirtualNetwork.Name) virtual network. Skipping!"            
        }
        else
        {
            Write-Host -ForegroundColor Green "[Not Found!]"
            Write-Host "Creating the $workloadSubnetName subnet and adding it to the $($aaddsVirtualNetwork.Name) virtual network..." -NoNewline
        
            $rv = $null
            $rv = Add-AzVirtualNetworkSubnetConfig `
                -Name $workloadSubnetName `
                -VirtualNetwork $aaddsVirtualNetwork `
                -AddressPrefix $workloadSubnetCIRDAddressRange -ErrorAction SilentlyContinue
            
            $aaddsVirtualNetwork = Set-AzVirtualNetwork -VirtualNetwork $aaddsVirtualNetwork -ErrorAction SilentlyContinue
        
        
            if( ($null -eq $rv) -or ($null -eq $aaddsVirtualNetwork) )
            {
                Write-Host -ForegroundColor Red "[Failed!]"
                Write-Host -ForegroundColor Yellow "WARNING: Could not create the $workloadSubnetName subnet."
                Write-Host "INFO: Skipping workload subnet creation. Please create manually."
            }
            else
            {
                Write-Host -ForegroundColor Green "[Successs!]"
            }
        }
    }
    
    #
    # Get the start time
    $domainCreateStart = Get-Date

    Write-Host ([string]::Empty)
    Write-Host "Sending request to Azure. This action may take 45 and 60 minutes to complete. Please wait..."        
    
    #
    # Enable Azure AD Domain Services for the directory.
    $aaddsResource = New-AzResource `
        -ResourceId $aaddsResourceId `
        -Location $aaddsLocation `
        -ApiVersion "2017-06-01" `
        -Properties @{"DomainName"=$aaddsDomainName; `
        "domainConfigurationType" = "ResourceTrusting"; `
        "SubnetId"=$aaddsSubnet.Id;} `
        -Force
  
    #
    # Get the stop time
    $scriptStop = Get-Date

    Write-Host ([String]::Empty)
    Write-Host "Script Elapsed Time: " ($scriptStop - $scriptStart)

    Write-Host "Azure AD Domain Services Creation Elapsed Time: " ($scriptStop - $domainCreateStart)


}
# SIG # Begin signature block
# MIInMgYJKoZIhvcNAQcCoIInIzCCJx8CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAKGiZT3N6BX46n
# KiItxtwI+A5ZxMkLjghjXlJgB7fcqqCCEW8wggiBMIIHaaADAgECAhM2AAABDBla
# ELMo09izAAEAAAEMMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH
# QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe
# Fw0yMDAyMDkxMzI1MDFaFw0yMTAyMDgxMzI1MDFaMC8xLTArBgNVBAMTJE1pY3Jv
# c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAJL4kx4D2erD4cliqomE3dMX+gvfMz/ovrjRwJqG80Kl
# kGP+kOn35E80o/Ua/SdfQq3gjLNJSJpa6Yn0ph8FOf7U4NT7a8+zrwBTpZ/7llv9
# /jGf037eKxEWsCtMTRfL1dKBOQhn1lHAZvjKdgIgJAFG7ydg1oKsn0wfGBXSgile
# g1IWbTNpR5luLpuHPWRspqDtXCXif/+rjukP5tvDqZmxYP0tQXER4I1eUXiJIXHf
# 7dFZR7VxjZ4BP1rEUU8Gk+BMGpTJTTB21MjwtEjF2U5WAv1KeUpxxlYPKEYGgr2/
# lCXgkoWmPWqSLMbLjcX5uLfMP9j/IW/UnpoaReR1gVsCAwEAAaOCBYIwggV+MCkG
# CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE
# AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D
# AgFkAgEOMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy
# MENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt
# ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw
# MSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ
# MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYI
# KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwga0GCCsGAQUFBzAChoGg
# bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy
# MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
# QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm
# aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQUkku2i4tvXu/fb2UHKKZiDd81U7Aw
# DgYDVR0PAQH/BAQDAgeAMFAGA1UdEQRJMEekRTBDMSkwJwYDVQQLEyBNaWNyb3Nv
# ZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEWMBQGA1UEBRMNMjM2MTY5KzQ1Nzc5
# NTCCAdQGA1UdHwSCAcswggHHMIIBw6CCAb+gggG7hjxodHRwOi8vY3JsLm1pY3Jv
# c29mdC5jb20vcGtpaW5mcmEvQ1JML0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0
# dHA6Ly9jcmwyLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0
# dHA6Ly9jcmwzLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0
# dHA6Ly9jcmw0LmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGgbps
# ZGFwOi8vL0NOPUFNRSUyMENTJTIwQ0ElMjAwMSxDTj1CWTJQS0lDU0NBMDEsQ049
# Q0RQLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNv
# bmZpZ3VyYXRpb24sREM9QU1FLERDPUdCTD9jZXJ0aWZpY2F0ZVJldm9jYXRpb25M
# aXN0P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwHwYDVR0j
# BBgwFoAUG2aiGfyb66XahI8YmOkQpMN7kr0wHwYDVR0lBBgwFgYKKwYBBAGCN1sD
# AQYIKwYBBQUHAwMwDQYJKoZIhvcNAQELBQADggEBAFdWLRaOg25JZG+Hm01zB/zB
# oSC3MUJ7lWHPIE44xH/7Ek9n0KnzXthnL345WNBcnW3pNbqHGVeLx7SlYJFbsiLi
# vKm3+FUc71F5AQvySUTOpRvHRmEBgzuZo9t6n211l2GQLWdGMGvzrIaeV81wsP2r
# W0G++acIHvczziw0mDTM3UYNeyxI6rFwsZsdfbvzbmsqcZuK9B699sEQoWQO19Fu
# 0sIkj3WPKlATUk9dAAhHkwl2dcPckrvhBvwa9rYPLPAjWsFTZLdRTBubE9ukikdd
# PDTqTM+9FhlPwo7PGMKyBngj9jp4WsfIyDfVfE1W/LgtDa+0SN7mPPNNbW5SKcMw
# ggjmMIIGzqADAgECAhMfAAAAFLTFH8bygL5xAAAAAAAUMA0GCSqGSIb3DQEBCwUA
# MDwxEzARBgoJkiaJk/IsZAEZFgNHQkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxEDAO
# BgNVBAMTB2FtZXJvb3QwHhcNMTYwOTE1MjEzMzAzWhcNMjEwOTE1MjE0MzAzWjBB
# MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRUwEwYD
# VQQDEwxBTUUgQ1MgQ0EgMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDVV4EC1vn60PcbgLndN80k3GZh/OGJcq0pDNIbG5q/rrRtNLVUR4MONKcWGyae
# VvoaQ8J5iYInBaBkaz7ehYnzJp3f/9Wg/31tcbxrPNMmZPY8UzXIrFRdQmCLsj3L
# cLiWX8BN8HBsYZFcP7Y92R2VWnEpbN40Q9XBsK3FaNSEevoRzL1Ho7beP7b9FJlK
# B/Nhy0PMNaE1/Q+8Y9+WbfU9KTj6jNxrffv87O7T6doMqDmL/MUeF9IlmSrl088b
# oLzAOt2LAeHobkgasx3ZBeea8R+O2k+oT4bwx5ZuzNpbGXESNAlALo8HCf7xC3hW
# qVzRqbdnd8HDyTNG6c6zwyf/AgMBAAGjggTaMIIE1jAQBgkrBgEEAYI3FQEEAwIB
# ATAjBgkrBgEEAYI3FQIEFgQUkfwzzkKe9pPm4n1U1wgYu7jXcWUwHQYDVR0OBBYE
# FBtmohn8m+ul2oSPGJjpEKTDe5K9MIIBBAYDVR0lBIH8MIH5BgcrBgEFAgMFBggr
# BgEFBQcDAQYIKwYBBQUHAwIGCisGAQQBgjcUAgEGCSsGAQQBgjcVBgYKKwYBBAGC
# NwoDDAYJKwYBBAGCNxUGBggrBgEFBQcDCQYIKwYBBQUIAgIGCisGAQQBgjdAAQEG
# CysGAQQBgjcKAwQBBgorBgEEAYI3CgMEBgkrBgEEAYI3FQUGCisGAQQBgjcUAgIG
# CisGAQQBgjcUAgMGCCsGAQUFBwMDBgorBgEEAYI3WwEBBgorBgEEAYI3WwIBBgor
# BgEEAYI3WwMBBgorBgEEAYI3WwUBBgorBgEEAYI3WwQBBgorBgEEAYI3WwQCMBkG
# CSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjASBgNVHRMBAf8E
# CDAGAQH/AgEAMB8GA1UdIwQYMBaAFCleUV5krjS566ycDaeMdQHRCQsoMIIBaAYD
# VR0fBIIBXzCCAVswggFXoIIBU6CCAU+GI2h0dHA6Ly9jcmwxLmFtZS5nYmwvY3Js
# L2FtZXJvb3QuY3JshjFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEv
# Y3JsL2FtZXJvb3QuY3JshiNodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9hbWVyb290
# LmNybIYjaHR0cDovL2NybDMuYW1lLmdibC9jcmwvYW1lcm9vdC5jcmyGgapsZGFw
# Oi8vL0NOPWFtZXJvb3QsQ049QU1FUk9PVCxDTj1DRFAsQ049UHVibGljJTIwS2V5
# JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1BTUUs
# REM9R0JMP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFz
# cz1jUkxEaXN0cmlidXRpb25Qb2ludDCCAasGCCsGAQUFBwEBBIIBnTCCAZkwNwYI
# KwYBBQUHMAKGK2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0FNRVJPT1RfYW1lcm9v
# dC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lp
# bmZyYS9jZXJ0cy9BTUVST09UX2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRw
# Oi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJvb3QuY3J0MDcGCCsGAQUF
# BzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJvb3QuY3J0
# MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8vQ049YW1lcm9vdCxDTj1BSUEsQ049UHVi
# bGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlv
# bixEQz1BTUUsREM9R0JMP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1j
# ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4ICAQAot0qGmo8f
# pAFozcIA6pCLygDhZB5ktbdA5c2ZabtQDTXwNARrXJOoRBu4Pk6VHVa78Xbz0OZc
# 1N2xkzgZMoRpl6EiJVoygu8Qm27mHoJPJ9ao9603I4mpHWwaqh3RfCfn8b/NxNhL
# Gfkrc3wp2VwOtkAjJ+rfJoQlgcacD14n9/VGt9smB6j9ECEgJy0443B+mwFdyCJO
# 5OaUP+TQOqiC/MmA+r0Y6QjJf93GTsiQ/Nf+fjzizTMdHggpTnxTcbWg9JCZnk4c
# C+AdoQBKR03kTbQfIm/nM3t275BjTx8j5UhyLqlqAt9cdhpNfdkn8xQz1dT6hTnL
# iowvNOPUkgbQtV+4crzKgHuHaKfJN7tufqHYbw3FnTZopnTFr6f8mehco2xpU8bV
# KhO4i0yxdXmlC0hKGwGqdeoWNjdskyUyEih8xyOK47BEJb6mtn4+hi8TY/4wvuCz
# cvrkZn0F0oXd9JbdO+ak66M9DbevNKV71YbEUnTZ81toX0Ltsbji4PMyhlTg/669
# BoHsoTg4yoC9hh8XLW2/V2lUg3+qHHQf/2g2I4mm5lnf1mJsu30NduyrmrDIeZ0l
# dqKzHAHnfAmyFSNzWLvrGoU9Q0ZvwRlDdoUqXbD0Hju98GL6dTew3S2mcs+17Dgs
# dargsEPm6I1lUE5iixnoEqFKWTX5j/TLUjGCFRkwghUVAgEBMFgwQTETMBEGCgmS
# JomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMGA1UEAxMMQU1F
# IENTIENBIDAxAhM2AAABDBlaELMo09izAAEAAAEMMA0GCWCGSAFlAwQCAQUAoIGu
# MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor
# BgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCCLn9XgRI6uY1x+CVKXQSNW8iKCP0Td
# jaYWN8xnU14YbjBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBm
# AHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3DQEBAQUABIIB
# AF8/Nf5aDyPslUMl2fBAKcA8SE/QiqrKYzLTEG3kHwTcLVABuo4id41VYBYSh/JY
# F1piKanVI9guH6+THpc/5WTB6d5QL3+7ybpiBEUxcJshoNqmcaZZRGgyRb0vx9n2
# 8Xblk2G+zjgFc560JylUvy9r9/ftlRRQPWGfYdUD0/LMhgY8aOrCinGkN38H6BWb
# dlyEHkwXVaOgzdCuQyWgeLDdtsjsQiguz+buA/RML891FX4vFu7Y5/YntnWURFup
# gZ6XZzbzj7ddchqYfjgclL3/TZ/x8Qmk+BxdGANMoNZVuk/PXCUpnsnsn1k2W8e3
# kXr1c52C0CFIy8DEB/Mc6/yhghLhMIIS3QYKKwYBBAGCNwMDATGCEs0wghLJBgkq
# hkiG9w0BBwKgghK6MIIStgIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBUAYLKoZIhvcN
# AQkQAQSgggE/BIIBOzCCATcCAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEF
# AAQgohesMRGTkR36B07hc550x8m7gTz9ZgHYwKK/8b67f+0CBl8V/u5o8BgSMjAy
# MDA3MjgwNDE5MjUuMTJaMASAAgH0oIHQpIHNMIHKMQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP
# cGVyYXRpb25zMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjozQkJELUUzMzgtRTlB
# MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCDjkwggTx
# MIID2aADAgECAhMzAAABHcLCCK4+uq5IAAAAAAEdMA0GCSqGSIb3DQEBCwUAMHwx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p
# Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTE5MTExMzIxNDAzOVoXDTIx
# MDIxMTIxNDAzOVowgcoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNV
# BAsTHVRoYWxlcyBUU1MgRVNOOjNCQkQtRTMzOC1FOUExMSUwIwYDVQQDExxNaWNy
# b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
# MIIBCgKCAQEAnIUB+qF+9ZgKHPlQgCkog4JxE7nDBGiccHUtx3G4Dmf7Sq1xPxbY
# hj47XjszH4ko6Hpd9FogVJLRMdXOs/+At1zCGh1jY+/yEeg/We+4torptCryEChr
# H5hfWuijIINh1jOESX852lVrR/U+SryLRdrBygw3Hjv3O4VAGiMy6lQjTBNq+la+
# 5GHyJ7uTRx9KpIDiBmVvQVYJraXqVmaErl3Bphfx9THN9jfyr/LF1f4WJRN004As
# wPLObTaL7KKYcw/V9AHLLDbCdKkamwO7v7K9yWbUGs4z7Y38NcBr4dVDCd5XJq4G
# ncJZZUcNtSs49VzRLvjWKfIszyO6r6D85QIDAQABo4IBGzCCARcwHQYDVR0OBBYE
# FBdeWhRg3sjyCL4rQ2oIz8Ctm8KpMB8GA1UdIwQYMBaAFNVjOlyKMZDzQ3t8RhvF
# M2hahW1VMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNv
# bS9wa2kvY3JsL3Byb2R1Y3RzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNybDBa
# BggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2kvY2VydHMvTWljVGltU3RhUENBXzIwMTAtMDctMDEuY3J0MAwGA1Ud
# EwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQELBQADggEB
# AGCMkZ2Q8AzLOODQFevh+mz54xvfUV8OEXinY9EkjuSHcAhRIzC5Dx38/ZXuVd4Q
# AYWuvPOhDMb90tvcn6VB1uamwrSwp/AsnYmfHsjSnBR7iphJsOrMlquFP7Vjh4+O
# bwBadetdlSN//m2dJ4PNgHTeo54ypbsP8E37arRuiHP7TTWOsbalUfmWXKvKDBJy
# n2I96L7NoluPC9u8hrVg/ReobiUkSLiGyttzNL6IUTns+bZ51ky1C6NXEY/LZmnU
# y03FTnM4H7t2c2tMxbhQW1H5BGdIDButZya5BZ14pcl4feBYev/SMBRsg6aGB/Cd
# wQFKf1oW3gX60Mk1VhvMSTAwggZxMIIEWaADAgECAgphCYEqAAAAAAACMA0GCSqG
# SIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkg
# MjAxMDAeFw0xMDA3MDEyMTM2NTVaFw0yNTA3MDEyMTQ2NTVaMHwxCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBU
# aW1lLVN0YW1wIFBDQSAyMDEwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
# AQEAqR0NvHcRijog7PwTl/X6f2mUa3RUENWlCgCChfvtfGhLLF/Fw+Vhwna3PmYr
# W/AVUycEMR9BGxqVHc4JE458YTBZsTBED/FgiIRUQwzXTbg4CLNC3ZOs1nMwVyaC
# o0UN0Or1R4HNvyRgMlhgRvJYR4YyhB50YWeRX4FUsc+TTJLBxKZd0WETbijGGvmG
# gLvfYfxGwScdJGcSchohiq9LZIlQYrFd/XcfPfBXday9ikJNQFHRD5wGPmd/9WbA
# A5ZEfu/QS/1u5ZrKsajyeioKMfDaTgaRtogINeh4HLDpmc085y9Euqf03GS9pAHB
# IAmTeM38vMDJRF1eFpwBBU8iTQIDAQABo4IB5jCCAeIwEAYJKwYBBAGCNxUBBAMC
# AQAwHQYDVR0OBBYEFNVjOlyKMZDzQ3t8RhvFM2hahW1VMBkGCSsGAQQBgjcUAgQM
# HgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1Ud
# IwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0
# dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0Nl
# ckF1dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKG
# Pmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0
# XzIwMTAtMDYtMjMuY3J0MIGgBgNVHSABAf8EgZUwgZIwgY8GCSsGAQQBgjcuAzCB
# gTA9BggrBgEFBQcCARYxaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL1BLSS9kb2Nz
# L0NQUy9kZWZhdWx0Lmh0bTBABggrBgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBQ
# AG8AbABpAGMAeQBfAFMAdABhAHQAZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsF
# AAOCAgEAB+aIUQ3ixuCYP4FxAz2do6Ehb7Prpsz1Mb7PBeKp/vpXbRkws8LFZslq
# 3/Xn8Hi9x6ieJeP5vO1rVFcIK1GCRBL7uVOMzPRgEop2zEBAQZvcXBf/XPleFzWY
# JFZLdO9CEMivv3/Gf/I3fVo/HPKZeUqRUgCvOA8X9S95gWXZqbVr5MfO9sp6AG9L
# MEQkIjzP7QOllo9ZKby2/QThcJ8ySif9Va8v/rbljjO7Yl+a21dA6fHOmWaQjP9q
# Yn/dxUoLkSbiOewZSnFjnXshbcOco6I8+n99lmqQeKZt0uGc+R38ONiU9MalCpaG
# pL2eGq4EQoO4tYCbIjggtSXlZOz39L9+Y1klD3ouOVd2onGqBooPiRa6YacRy5rY
# DkeagMXQzafQ732D8OE7cQnfXXSYIghh2rBQHm+98eEA3+cxB6STOvdlR3jo+KhI
# q/fecn5ha293qYHLpwmsObvsxsvYgrRyzR30uIUBHoD7G4kqVDmyW9rIDVWZeodz
# OwjmmC3qjeAzLhIp9cAvVCch98isTtoouLGp25ayp0Kiyc8ZQU3ghvkqmqMRZjDT
# u3QyS99je/WZii8bxyGvWbWu3EQ8l1Bx16HSxVXjad5XwdHeMMD9zOZN+w2/XU/p
# nR4ZOC+8z1gFLu8NoFA12u8JJxzVs341Hgi62jbb01+P3nSISRKhggLLMIICNAIB
# ATCB+KGB0KSBzTCByjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEmMCQGA1UE
# CxMdVGhhbGVzIFRTUyBFU046M0JCRC1FMzM4LUU5QTExJTAjBgNVBAMTHE1pY3Jv
# c29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAEQjn0R34rNH
# bg1CEPwsfWkeOCdCoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh
# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw
# MTAwDQYJKoZIhvcNAQEFBQACBQDiybeNMCIYDzIwMjAwNzI4MDQyOTAxWhgPMjAy
# MDA3MjkwNDI5MDFaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAOLJt40CAQAwBwIB
# AAICEHQwBwIBAAICEZgwCgIFAOLLCQ0CAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYK
# KwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQUF
# AAOBgQBNeQEmffqtdBPhIHNhaDat8kE7+9pwPX4DaimX7dqFCWwbTeVJk8E+eikT
# jlxPfpC1hcDy1+CeZKoPsrPULZeMrGDCJmKyQ32JoCFWpFtP6wymW9pjVa4L4V6Z
# ikwhDRMVdmbheHc7dvE4DUKgmMgfj713GsbP9VPJAmKz3ztgrTGCAw0wggMJAgEB
# MIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV
# BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABHcLCCK4+uq5I
# AAAAAAEdMA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcN
# AQkQAQQwLwYJKoZIhvcNAQkEMSIEINUmnJU4rn+ykf5ZurVSDcVbtJau9gTjv+Of
# 9j4hO63qMIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgAr4Mw0Kfd3yHC65s
# 6QntiApCRe1xG1Je3XJG6WXvmpMwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt
# cCBQQ0EgMjAxMAITMwAAAR3CwgiuPrquSAAAAAABHTAiBCC3hl1X8ooZDkyxLvgu
# H3KVdNZnPK3GW/AUxX66aWROnTANBgkqhkiG9w0BAQsFAASCAQBx79+ywNjNifsA
# XcMAZyK8klsDs1My6jcpT6STWTRp2Wuka0x7b1+krpw/UcjFmO52womCgFphCkKV
# 0E+1LIEwfyb1GzxVgc5Jkp1/hkKc4ld0bJysJy5ZywW4KlCnRxUOW/9yw2Q0UIvE
# jjc53RTBowRz0sRdyz/x+OnfZAXYIw11QrBoSsaIXU0HNZJAqq0+AGUeuRzI48Ms
# HadmE1HOLufL0EqScOdEx+VN7ViihyapgZb5zGDs/9zR6eLWRfTmvtuop+DCzyCC
# 9mzN6jH6s+1YAWAJlAeunYWqbT4jxmFqWaMatk0CTZycrp3jXGbXWNdPBWDK/EIK
# yjinHbP3
# SIG # End signature block