New-AaddsResourceForest.ps1

<#PSScriptInfo
 
.VERSION 1.2.0
 
.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
    01/09/2024 - Rebrand to Microsoft Entra Domain Services
#>


<#
 
.SYNOPSIS
    Creates a Microsoft Entra Domain Services resource forest instance.
 
.DESCRIPTION
    Creates a Microsoft Entra Domain Services resource forest instance.
 
.PARAMETER azureSubscriptionId
    The subscription ID used for Microsoft Entra 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 Microsoft Entra Domain Services administrator
    This user and the user running this script will be Microsoft Entra Domain Services Administrators
    This parameter is MANDATORY
 
.PARAMETER aaddsDomainName
    The FQDN of the Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra Domain Services resource forest. You will need to authenticate two times."
    Write-Host ([String]::Empty)        
    Write-Host -ForegroundColor White "1. Use Entra ID Global Adminstrator credentials from your Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra Domain Services (AAD DC Administrators group)
    Write-Host "Searching Entra ID for an existsing AAD DC Administrators group in Entra ID... " -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 Entra ID... " -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 Microsoft Entra Domain Services admin user
    $skipUser = $false
    Write-Host "Searching Entra ID for the Microsoft Entra 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 Entra ID
        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 Entra ID 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 Entra ID."
        }
        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 Microsoft Entra Domain Services, if it does not exist.
    Write-Host "Checking for the Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra Domain Services."
           Return
        }

        Write-Host -ForegroundColor Green "[Success!]"
    }
    else
    {
        # Service principal was found
        Write-Host -ForegroundColor Green "[Found!]"
        Write-Host "INFO: Microsoft Entra 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


    #
    # Microsoft Entra 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)"
    }

    
    #
    #
    # Microsoft Entra 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 Microsoft Entra 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 Microsoft Entra Domain Services subnet
    # Create a dedicated subnet to host Microsoft Entra Domain Services
    # Get the Microsoft Entra 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 Microsoft Entra 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 "Microsoft Entra Domain Services Creation Elapsed Time: " ($scriptStop - $domainCreateStart)


}
# SIG # Begin signature block
# MIIrhQYJKoZIhvcNAQcCoIIrdjCCK3ICAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDiiRybAOV4TnAw
# KX2z3igXu9FZgaLAo8ZreGhqur9/tqCCEXgwggiIMIIHcKADAgECAhM2AAABzxvV
# hIv3HFTwAAIAAAHPMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH
# QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe
# Fw0yMzAzMjAyMDAwMzJaFw0yNDAzMTkyMDAwMzJaMC8xLTArBgNVBAMTJE1pY3Jv
# c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAOREEBJi/WoqvCPTpdI+NM1fM/zljtamVZMTJaEFhALS
# 3v0oF6vWx7zJy9McdDOyA9wY8x75/uBmwl1n8d5l/cLSD+PExSnU1o/zDyr80He+
# K1yZlVCdYSYsoWDsOeYCI0+sf6O6U2Y2kp+pIVLSf1j7amZd+vkbjHCbxRA28njz
# MCxv66EZS2Sh5yTH+uFi+RzUWMaJltkPurDraCRNKKubmOpAmqbtaPu+FEIs+nyn
# +xzFwefTOGNanTyOs2wmxBJ8VkQGU9tlRlbNrURi/5TtdktoTnM0Vn4M/2MbPlYC
# QBcJtVadNVheejpKNhinXiZw8i9TsGHDOJvuz05Hl7UCAwEAAaOCBYkwggWFMCkG
# CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE
# AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D
# AgFkAgEOMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy
# MENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt
# ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw
# MSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ
# MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYI
# KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwga0GCCsGAQUFBzAChoGg
# bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy
# MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
# QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm
# aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQUF8EGJdg3VCco3OMElEnYjfOsKQAw
# DgYDVR0PAQH/BAQDAgeAMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQLExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzNjE2OSs1MDAzNjQwggHmBgNVHR8E
# ggHdMIIB2TCCAdWgggHRoIIBzYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
# aWluZnJhL0NSTC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRwOi8vY3Js
# MS5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRwOi8v
# Y3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRw
# Oi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFo
# dHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3Js
# hoG9bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEoMiksQ049QlkyUEtJQ1ND
# QTAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNl
# cyxDTj1Db25maWd1cmF0aW9uLERDPUFNRSxEQz1HQkw/Y2VydGlmaWNhdGVSZXZv
# Y2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50
# MB8GA1UdIwQYMBaAFJZRhOBrb3v+2Aarw/KF5imuavnUMB8GA1UdJQQYMBYGCisG
# AQQBgjdbAwEGCCsGAQUFBwMDMA0GCSqGSIb3DQEBCwUAA4IBAQAy72n19XEpbA0F
# OW2VYlwvvLf8AVlRHgV5AnFegvbNSGIlfvbTizxYyHrzzldeW/xZxpLMOfnU8Ymo
# Oe3cpJYN6qX99cL50D2F0QibG6eJ4XpVNKDbt1YbaR+ekLgHoATohGFqAeI0LHO8
# jIQBJaICrYeLNXRcP8kXV0BrLtKXPsUojlvSxHzaECg7F2fhKt7WQkVZexhZB6QO
# VGj/VQY9TjWsHi6D5evjT3o819ZINUG1mCKbBFL1pFHMDjFICKlPDFIt9oL2QbZZ
# 27gH2HHcOqCIWeFlrz3qcH+dwcVGEOHz6j5SDMSIWBpS3pebi5kb0jnOu7m6uAz0
# Q8ksXFl/MIII6DCCBtCgAwIBAgITHwAAAFHqj/accwyoOwAAAAAAUTANBgkqhkiG
# 9w0BAQsFADA8MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYD
# QU1FMRAwDgYDVQQDEwdhbWVyb290MB4XDTIxMDUyMTE4NDQxNFoXDTI2MDUyMTE4
# NTQxNFowQTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FN
# RTEVMBMGA1UEAxMMQU1FIENTIENBIDAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
# MIIBCgKCAQEAyZpSCX0Bno1W1yqXMhT6BUlJZWpa4p3xFeiTHO4vm2Q6C/azR5xw
# xnyYHrkSGDtS2P9X+KDE64V20mmEQkubxnPNeOVnE2RvdPGxgwlq+BhS3ONdVsQP
# j79q7XgHM9HhzB9+qk0PC9KN1zm9p/seyiRS6JF1dbOqRf1pUl7FAVxmgiCFgV8h
# HIb/rDPXig7FDi3S0yEx2CUDVpIq8jEhG8anUFE1WYxM+ni0S5KHwwKPKV4qyGDo
# DO+9AmDoma3Chyu5WDlW5cdtqXTWsGPE3umtnX6AmlldUFLms4OVR4guKf+n5LIB
# CC6bTiocfXPomqYjYTKx7AGMfaVLaaXmhQIDAQABo4IE3DCCBNgwEgYJKwYBBAGC
# NxUBBAUCAwIAAjAjBgkrBgEEAYI3FQIEFgQUEmgkQiFHy9RrvjHPIKTACyN/P0cw
# HQYDVR0OBBYEFJZRhOBrb3v+2Aarw/KF5imuavnUMIIBBAYDVR0lBIH8MIH5Bgcr
# BgEFAgMFBggrBgEFBQcDAQYIKwYBBQUHAwIGCisGAQQBgjcUAgEGCSsGAQQBgjcV
# BgYKKwYBBAGCNwoDDAYJKwYBBAGCNxUGBggrBgEFBQcDCQYIKwYBBQUIAgIGCisG
# AQQBgjdAAQEGCysGAQQBgjcKAwQBBgorBgEEAYI3CgMEBgkrBgEEAYI3FQUGCisG
# AQQBgjcUAgIGCisGAQQBgjcUAgMGCCsGAQUFBwMDBgorBgEEAYI3WwEBBgorBgEE
# AYI3WwIBBgorBgEEAYI3WwMBBgorBgEEAYI3WwUBBgorBgEEAYI3WwQBBgorBgEE
# AYI3WwQCMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAS
# BgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFCleUV5krjS566ycDaeMdQHR
# CQsoMIIBaAYDVR0fBIIBXzCCAVswggFXoIIBU6CCAU+GMWh0dHA6Ly9jcmwubWlj
# cm9zb2Z0LmNvbS9wa2lpbmZyYS9jcmwvYW1lcm9vdC5jcmyGI2h0dHA6Ly9jcmwy
# LmFtZS5nYmwvY3JsL2FtZXJvb3QuY3JshiNodHRwOi8vY3JsMy5hbWUuZ2JsL2Ny
# bC9hbWVyb290LmNybIYjaHR0cDovL2NybDEuYW1lLmdibC9jcmwvYW1lcm9vdC5j
# cmyGgapsZGFwOi8vL0NOPWFtZXJvb3QsQ049QU1FUm9vdCxDTj1DRFAsQ049UHVi
# bGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlv
# bixEQz1BTUUsREM9R0JMP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9v
# YmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludDCCAasGCCsGAQUFBwEBBIIB
# nTCCAZkwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lp
# bmZyYS9jZXJ0cy9BTUVSb290X2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRw
# Oi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJvb3QuY3J0MDcGCCsGAQUF
# BzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJvb3QuY3J0
# MDcGCCsGAQUFBzAChitodHRwOi8vY3JsMS5hbWUuZ2JsL2FpYS9BTUVSb290X2Ft
# ZXJvb3QuY3J0MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8vQ049YW1lcm9vdCxDTj1B
# SUEsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29u
# ZmlndXJhdGlvbixEQz1BTUUsREM9R0JMP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmpl
# Y3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4IC
# AQBQECO3Tw/o317Rrd7yadqcswPx1LvIYymkaTN6KcmuRt6HKa0Xe73Ux2/AQ30T
# fgA9GBJngweRykKBusRzyOU17iIubJvy3gA21dwtqtB0DsoEv1U/ptVu2v++doTC
# J/i+GbssVXkgaX8H+6EOGEmT4evp4GbwR4HwWlc+Dvf8HH8PdUA2Z04CvcwIfckS
# ipbNm84jxJ8XjmTFTWscldL9edj2NsY6iGnyJFIyur2PS7VRYyV3p1VAJp91gj1j
# RQtWEyCB8P5g9nE3z8u0ANaU/hjwEQCrdGyravWgnf2JtG+bT26YAokbc8m+32zU
# tXRO+NK3tAjhOu2FdsG3qNrF4sc7y37R/C+7Pcb/cFfhttqsirepZii4xStcjMOD
# YuXzGm3IJs0b0owHG6oKd7ZOGvHpmmh9K8/DLriD/sq8bURD10qi/wuW8zM7IpLg
# 1vcR9dIK2mc0pj44pc6UX0XbttP/VEJgu3lT2eI9VjWtaKjx38xE9woSMyekPRtz
# TwgfuysF9DkJisr+yA4po/FPxpbBw9c/hBf32DH/GFxteS2pmjgKIbMP8sDukmEq
# 3lVvuWNJsybrZwQvQpvaM49fv+JKpLK5YWYEfwksYRR9wU8Hh/ID9hRCEkbUoQ2W
# 7mMpsp2Nbp/kcn4ivfolUy3Q9Yf0scsQ6WTLYpm+AoCUJTGCGWMwghlfAgEBMFgw
# QTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMG
# A1UEAxMMQU1FIENTIENBIDAxAhM2AAABzxvVhIv3HFTwAAIAAAHPMA0GCWCGSAFl
# AwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
# AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBmWyTpfgSU2qwuUmNl
# 7wob7LX1wX/D0BbeDFagrwMIxjBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMA
# cgBvAHMAbwBmAHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3
# DQEBAQUABIIBAIyREDBkO8MRcHKMOvgR2mBLzXC9NLev9Ao0ljmryUoB//mOECga
# 6Ot1rrF6oGYlpnFHUD2VKirDm4FqGVjuYsA073ra8/UUI295TpOpdC9KZ0MwXTHG
# yPck6KjAKQnxsqf0YjCUXeb2BL1et/MTQuwXhWSCgFBhuHZ2vvxJn1uPWaqzg7vD
# 0/gt0QCRjpW51F1/TeWHU3ZeOpNmPvR2VRe30ycT8FRL4/fWA3OHs0lEbxhCOhAn
# BKzPDGGVw0kh6Fz4Ej/TelVd6xtvteU9nLl0lnctsah2gAT365++3/cWZDPdeO+5
# RH7MSDCyti5li5GCCxAIjkeIeY2o1EEPKcqhghcrMIIXJwYKKwYBBAGCNwMDATGC
# FxcwghcTBgkqhkiG9w0BBwKgghcEMIIXAAIBAzEPMA0GCWCGSAFlAwQCAQUAMIIB
# WAYLKoZIhvcNAQkQAQSgggFHBIIBQzCCAT8CAQEGCisGAQQBhFkKAwEwMTANBglg
# hkgBZQMEAgEFAAQgT0q2THZoE8bNUkGDwxkwSHXgD+9G/ODPuGlCE7suKfcCBmWD
# NDW9hBgSMjAyNDAxMTUwNzIzNTQuNDZaMASAAgH0oIHYpIHVMIHSMQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQg
# SXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1Mg
# RVNOOkZDNDEtNEJENC1EMjIwMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt
# cCBTZXJ2aWNloIIRezCCBycwggUPoAMCAQICEzMAAAHimZmV8dzjIOsAAQAAAeIw
# DQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
# b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcN
# MjMxMDEyMTkwNzI1WhcNMjUwMTEwMTkwNzI1WjCB0jELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQg
# T3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjpGQzQx
# LTRCRDQtRDIyMDElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vydmlj
# ZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALVjtZhV+kFmb8cKQpg2
# mzisDlRI978Gb2amGvbAmCd04JVGeTe/QGzM8KbQrMDol7DC7jS03JkcrPsWi9Wp
# VwsIckRQ8AkX1idBG9HhyCspAavfuvz55khl7brPQx7H99UJbsE3wMmpmJasPWpg
# F05zZlvpWQDULDcIYyl5lXI4HVZ5N6MSxWO8zwWr4r9xkMmUXs7ICxDJr5a39SSe
# PAJRIyznaIc0WzZ6MFcTRzLLNyPBE4KrVv1LFd96FNxAzwnetSePg88EmRezr2T3
# HTFElneJXyQYd6YQ7eCIc7yllWoY03CEg9ghorp9qUKcBUfFcS4XElf3GSERnlzJ
# sK7s/ZGPU4daHT2jWGoYha2QCOmkgjOmBFCqQFFwFmsPrZj4eQszYxq4c4HqPnUu
# 4hT4aqpvUZ3qIOXbdyU42pNL93cn0rPTTleOUsOQbgvlRdthFCBepxfb6nbsp3fc
# ZaPBfTbtXVa8nLQuMCBqyfsebuqnbwj+lHQfqKpivpyd7KCWACoj78XUwYqy1HyY
# nStTme4T9vK6u2O/KThfROeJHiSg44ymFj+34IcFEhPogaKvNNsTVm4QbqphCykn
# rwByqorBCLH6bllRtJMJwmu7GRdTQsIx2HMKqphEtpSm1z3ufASdPrgPhsQIRFkH
# ZGuihL1Jjj4Lu3CbAmha0lOrAgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQURIQOEdq+
# 7QdslptJiCRNpXgJ2gUwHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIw
# XwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
# cy9jcmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3Js
# MGwGCCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3Nv
# ZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENB
# JTIwMjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEF
# BQcDCDAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAORURDGrVRTb
# nulfsg2cTsyyh7YXvhVU7NZMkITAQYsFEPVgvSviCylr5ap3ka76Yz0t/6lxuczI
# 6w7tXq8n4WxUUgcj5wAhnNorhnD8ljYqbck37fggYK3+wEwLhP1PGC5tvXK0xYom
# U1nU+lXOy9ZRnShI/HZdFrw2srgtsbWow9OMuADS5lg7okrXa2daCOGnxuaD1IO+
# 65E7qv2O0W0sGj7AWdOjNdpexPrspL2KEcOMeJVmkk/O0ganhFzzHAnWjtNWneU1
# 1WQ6Bxv8OpN1fY9wzQoiycgvOOJM93od55EGeXxfF8bofLVlUE3zIikoSed+8s61
# NDP+x9RMya2mwK/Ys1xdvDlZTHndIKssfmu3vu/a+BFf2uIoycVTvBQpv/drRJD6
# 8eo401mkCRFkmy/+BmQlRrx2rapqAu5k0Nev+iUdBUKmX/iOaKZ75vuQg7hCiBA5
# xIm5ZIXDSlX47wwFar3/BgTwntMq9ra6QRAeS/o/uYWkmvqvE8Aq38QmKgTiBnWS
# S/uVPcaHEyArnyFh5G+qeCGmL44MfEnFEhxc3saPmXhe6MhSgCIGJUZDA7336nQD
# 8fn4y6534Lel+LuT5F5bFt0mLwd+H5GxGzObZmm/c3pEWtHv1ug7dS/Dfrcd1sn2
# E4gk4W1L1jdRBbK9xwkMmwY+CHZeMSvBMIIHcTCCBVmgAwIBAgITMwAAABXF52ue
# AptJmQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm
# aWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgz
# MjI1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD
# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcN
# AQEBBQADggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxO
# dcjKNVf2AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQ
# GOhgfWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq
# /XJprx2rrPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVW
# Te/dvI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7
# mka97aSueik3rMvrg0XnRm7KMtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De
# +JKRHh09/SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM
# 9ituqBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEz
# OUyOArxCaC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2
# ZItboKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqv
# UAV6bMURHXLvjflSxIUXk8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q
# 4i6tAgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcV
# AgQWBBQqp1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXS
# ZacbUzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcC
# ARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRv
# cnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1
# AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaA
# FNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j
# cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8y
# MDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAt
# MDYtMjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8
# qW/qXBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7p
# Zmc6U03dmLq2HnjYNi6cqYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2C
# DPVtI1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BA
# ljis9/kpicO8F7BUhUKz/AyeixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJ
# eBTpkbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1
# MMU0sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz
# 138eW0QBjloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1
# V1QJsWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLB
# gqJ7Fx0ViY1w/ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0l
# lOZ0dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFx
# BmoQtB1VM1izoXBm8qGCAtcwggJAAgEBMIIBAKGB2KSB1TCB0jELMAkGA1UEBhMC
# VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IEly
# ZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVT
# TjpGQzQxLTRCRDQtRDIyMDElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaIjCgEBMAcGBSsOAwIaAxUAFpuZafp0bnpJdIhfiB1d8pTohm+ggYMw
# gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD
# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUF
# AAIFAOlPTsMwIhgPMjAyNDAxMTUxNDI3MTVaGA8yMDI0MDExNjE0MjcxNVowdzA9
# BgorBgEEAYRZCgQBMS8wLTAKAgUA6U9OwwIBADAKAgEAAgIGiwIB/zAHAgEAAgIU
# RDAKAgUA6VCgQwIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow
# CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBAHagmeEHNNBT
# B8Fn2Jl2YxbNIqdL7s3rWyGwLgthf5yn2RYIj6MrZlOqWQmKaJ89Vjybg0EqAFjl
# iDJa6E/5X8769B3shq6YAcs35qOj36B8MNaX7DgJ/GKRuCYDs5foYMLwf4pH4yPh
# E0blg8+4iwcZI4R26TjakxNF/nJ2AwpbMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0
# IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAHimZmV8dzjIOsAAQAAAeIwDQYJYIZI
# AWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG
# 9w0BCQQxIgQg+9s+jjWnYbDfFfS2wR7/blbf9SzHa+s4BNN6KSpG2ZIwgfoGCyqG
# SIb3DQEJEAIvMYHqMIHnMIHkMIG9BCAriSpKEP0muMbBUETODoL4d5LU6I/bjucI
# ZkOJCI9//zCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMz
# AAAB4pmZlfHc4yDrAAEAAAHiMCIEIHw1xnEAFBzyOqRt91kHXHu2QqYfFo57m9nr
# 7y6XwyGzMA0GCSqGSIb3DQEBCwUABIICAI979f4fEJPJOxlP8tCSnH3xadZkXfNC
# qeimpW29TRwphqrrK/hRPAmDCgFXBOAT/aPOJ/1dxYJIX+hRUndkLAs6YtKcMrxS
# bXJJ5XUB8RUKCT0rcF8GYitt5Bxz5FE03pD2k9wxwtW8Nu2ZZ7hme8c15CoSK4UH
# HUTethEeJsov+gm2XxFK48ztTbVGLOW1LbwUU469OdeplIMHfHyG/V7ZJptW+KfO
# tQI7TluLRrEVCqUBfjUtmjBA1DhMSx2d23aiHJtm9JUAoWrzxxOZFCZP2tEo1idB
# vGigFH4DMqv80/3RQfj5vxLA1Xq7tQbra7Lo9FJMU+RDvNwzklaRSs4v5AZTgK77
# /a8TO8i+ZOWJE1I3Wo2VkkVij+g5/JLsew8I7TXhKgQ3JDgRCAybNjlHe+lb79au
# L+vPIdvc0TlSEtNU3GuuPE2b3FMjzllL83DpTZuvsBE0LuuJoszibMF1jgaLhK0A
# FqkIolIsatzMZH2JA9VqEZeLFxil7WsXblkR56dH588vilTKV3Rg7VdQLAlde0Tn
# qgO12CBZISNl1I+ItqcjQ9ajOARoGBLpn68VTPeDPAHuVtFcD7LU7O1GRgbtO71+
# vqgfnXHEf4+X3Or80Ri+srSNBCex7yZzfBmSVZtaUOub9hWAifRryKuTk4P4z4k0
# gqpbkeXkId+t
# SIG # End signature block