FastTrack-SecretManagement.psm1

Function Get-Secrets {
    param([string] $TenantId, [string] $ProjectIdentifier, [string] $VaultIdentifier)

    $response = Invoke-GetRequest -Uri `
                                  "$global:v3BaseUrl/Internal/Customer/$tenantId/Project/$ProjectIdentifier/Vault/$VaultIdentifier/Secret" `
                                  -Headers $global:v3Headers

    return $response
}

Function Get-Secret {
    param([string] $TenantId, [string] $ProjectIdentifier, [string] $VaultIdentifier, [string] $SecretName)

    $secrets = Get-Secrets -TenantId $TenantId -ProjectIdentifier $ProjectIdentifier -VaultIdentifier $VaultIdentifier
    
    return $secrets | Where-Object { $_.SecretName -eq $SecretName }
}

Function Add-NewSecret {
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')]
    param(
        [string] $TenantId, 
        [string] $ProjectIdentifier, 
        [string] $VaultIdentifier, 
        [string] $SecretName, 
        [string] $SecretValue, 
        [string] $CredentialTypeIdentifier,
        [string] $CredentialTypeName,
        [string] $CredentialType,
        [string] $Comments)    

    $header = @{ }
    $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())
    $header.Add("TENANT_ID", $global:MsoAdminProperties["MSO-CompanyTenantInfo"])

    $now = (Get-Date).ToUniversalTime() 
    $seventyDaySpan = New-TimeSpan -Days 70
    $seventyDaysFromNow = $now + $seventyDaySpan

    $secretObject = New-Object PSObject |
        Add-Member -PassThru NoteProperty ProjectIdentifier $ProjectIdentifier |
        Add-Member -PassThru NoteProperty VaultIdentifier $VaultIdentifier |
        Add-Member -PassThru NoteProperty CredentialTypeIdentifier $CredentialTypeIdentifier |
        Add-Member -PassThru NoteProperty CredentialTypeName $CredentialTypeName |
        Add-Member -PassThru NoteProperty CredentialType $CredentialType |
        Add-Member -PassThru NoteProperty SecretName $SecretName |
        Add-Member -PassThru NoteProperty SecretValue $SecretValue |
        Add-Member -PassThru NoteProperty CredentialExpirationDate $seventyDaysFromNow |
        Add-Member -PassThru NoteProperty LastUpdatedDate $now |
        Add-Member -PassThru NoteProperty Comments $Comments | 
        Add-Member -PassThru NoteProperty SourceApplication 'CSI'

    $serializedJson = $secretObject | ConvertTo-Json

    $response = Invoke-PostRequest -Uri "$global:v3BaseUrl/Internal/Customer/$TenantId/Project/$ProjectIdentifier/Vault/$VaultIdentifier/Secret" -Headers $global:v3Headers -Body $serializedJson

    if ($response.SecretIdentifier) {
        return $true;
    }
    else {
        Write-Error $response;
        return $false;
    }
}

Function Update-Secret {
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')]
    param(
        [string] $TenantId, 
        [string] $ProjectIdentifier, 
        [string] $VaultIdentifier, 
        [string] $SecretName, 
        [string] $SecretValue, 
        [string] $SecretIdentifier,
        [string] $CredentialTypeIdentifier,
        [string] $CredentialTypeName,
        [string] $CredentialType,
        [string] $Comments)    
    
    $header = @{ }
    $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())
    $header.Add("TENANT_ID", $global:MsoAdminProperties["MSO-CompanyTenantInfo"])

    $now = (Get-Date).ToUniversalTime() 
    $seventyDaySpan = New-TimeSpan -Days 70
    $seventyDaysFromNow = $now + $seventyDaySpan
    
    $secretObject = New-Object PSObject |
        Add-Member -PassThru NoteProperty ProjectIdentifier $ProjectIdentifier |
        Add-Member -PassThru NoteProperty VaultIdentifier $VaultIdentifier |
        Add-Member -PassThru NoteProperty SecretIdentifier $SecretIdentifier |
        Add-Member -PassThru NoteProperty CredentialTypeIdentifier $CredentialTypeIdentifier |
        Add-Member -PassThru NoteProperty CredentialTypeName $CredentialTypeName |
        Add-Member -PassThru NoteProperty CredentialType $CredentialType |
        Add-Member -PassThru NoteProperty SecretName $SecretName |
        Add-Member -PassThru NoteProperty SecretValue $SecretValue |
        Add-Member -PassThru NoteProperty CredentialExpirationDate $seventyDaysFromNow |
        Add-Member -PassThru NoteProperty LastUpdatedDate $now |
        Add-Member -PassThru NoteProperty Comments $Comments | 
        Add-Member -PassThru NoteProperty SourceApplication 'CSI'
    
    $serializedJson = $secretObject | ConvertTo-Json
    
    $response = Invoke-PutRequest -Uri "$global:v3BaseUrl/Internal/Customer/$TenantId/Project/$ProjectIdentifier/Vault/$VaultIdentifier/Secret/$SecretIdentifier" `
        -Headers $global:v3Headers -Body $serializedJson

    if ($response.SecretIdentifier) {
        return $true;
    }
    else {
        Write-Error $response;
        return $false;
    }
}

Function Remove-Secret {
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')]
    param(
        [string] $TenantId, 
        [string] $ProjectIdentifier, 
        [string] $VaultIdentifier, 
        [string] $SecretIdentifier
    )    
  
    $response = Invoke-DeleteRequest -Uri `
                                    "$global:v3BaseUrl/Internal/Customer/$TenantId/Project/$ProjectIdentifier/Vault/$VaultIdentifier/Secret/$SecretIdentifier" `
                                    -Headers $global:v3Headers 
}

function Remove-FastTrackMigrationSecret {
    <#
    .SYNOPSIS
        Remove an existing FastTrack Migration secret
    .DESCRIPTION
        The Remove-FastTrackMigrationSecret cmdlet invokes the REST API to remove a secret from the customer's secrets in keyvault. Remove-FastTrackMigrationSecret calls Waiting-TransactionComplete to repeat until a "completed" or "failed" transaction is returned from the REST API.
 
        In order to use this cmdlet, you must first login using the Login-FastTrackAccount cmdlet.
    .PARAMETER SecretName
        Unique name for already existing secret.
    .PARAMETER Region
        Region of migration.
    .PARAMETER MigrationType
        The type of migration.
    .EXAMPLE
        Remove-FastTrackMigrationSecret -SecretName:"SecretValueName" -Region:"Region" -MigrationType:"Mig-ExHybrid"
        This will remove the SecretValueName.
    .INPUTS
        System.String
    .OUTPUTS
        System.Management.Automation.PSObject
            This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID.
    .LINK
        New-FastTrackMigrationSecret
        Set-FastTrackMigrationSecret
        Get-FastTrackMigrationSecrets
    #>

    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $SecretName,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $Region,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateSet("Mig-ExHybrid", "Mig-ExSimpleMRS", "Mig-ExCutover", "Mig-ExStaged", "Mig-IMAP", "Mig-GmailCutover", "Mig-GmailStaged", "Mig-GroupWise", "Mig-GoogleDrive", "Mig-GoogleSites", "Mig-Box", "Mig-FileSharesToOneDrive", "Mig-FileSharesToTeamSites", "Mig-Domino-BAM", "Mig-Domino-ODME", "MIG-SPOnPrem")]
        [string] $MigrationType
    )
    $project = Get-Project -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectName $Region -ProjectType $MigrationType.Replace('-', '')

    if (!$project) {
        Write-Warning 'That Region does not exist for this customer/migration type.'
        return
    }

    $vault = Get-Vault -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectIdentifier $project.ProjectIdentifier

    if (!$vault) {
        Write-Warning 'A Vault does not exist for this customer/migration type.'
        return
    }

    $secret = Get-Secret -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectIdentifier $project.ProjectIdentifier `
        -VaultIdentifier $vault.VaultIdentifier -SecretName $SecretName

    if (!$secret) {
        Write-Warning 'There is no credential with that name for this region and migration type.'
        return
    }
                                    
    Remove-Secret -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectIdentifier $project.ProjectIdentifier -VaultIdentifier $vault.VaultIdentifier -SecretIdentifier $secret.SecretIdentifier
    Write-Output 'Your credential has been deleted.'
}

function Set-FastTrackMigrationSecret {
    <#
    .SYNOPSIS
        Update an existing FastTrack Migration Secret
    .DESCRIPTION
        The New-FastTrackMigrationSecret cmdlet is utilized to update a keyvault secret for the FastTrack account. The secret is defined by the SecretValue paramter and is placed in the keyvault using the key defined by the SecretName parameter.
 
        In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet.
 
        Please Note: Passwords should contain at least 1 lower case letter.
                     Passwords should contain at least 1 upper case letter.
                     Passwords should contain at least 1 number.
                     Passwords should contain at least 3 special characters.
                     Passwords must be at least 15 characters long.
 
        Access Notes: RDG and VPN credentials can only be created/accessed/modified through the Fast Track Migration Portal / AKV tab.
    .PARAMETER SecretCredential
        PS Credential object that contains:
            Unique name for new Secret.
            Value for new Secret.
    .PARAMETER Region
        Region of migration.
    .PARAMETER MigrationType
        The type of migration.
    .PARAMETER CredentialType
        The type of credential.
        Valid options are:
            Admin,
            Certificate,
            Migration_Account,
            Mig_Sched,
            Sharepoint,
            SAS,
            VPN,
            Encrypted,
            PowerBI
    .PARAMETER Comment
        Any comment related to credential.
    .EXAMPLE
        [PSCredential] $credential = [PSCredential]::new("SecretValueName", ("NewSecretValue" | ConvertTo-SecureString -AsPlainText -Force))
        Set-FastTrackMigrationSecret -SecretCredential $credential -Region:"Region" -MigrationType:"Mig-ExHybrid" -CredentialType "Admin"
        This will update the value of SecretValueName as ChangedSecretValue.
    .INPUTS
        System.String
    .OUTPUTS
        System.Management.Automation.PSObject
            This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID.
    .LINK
        New-FastTrackMigrationSecret
        Remove-FastTrackMigrationSecret
        Get-FastTrackMigrationSecrets
    #>

    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $SecretName,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $SecretValue,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $Region,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateSet("Mig-ExHybrid", "Mig-ExSimpleMRS", "Mig-ExCutover", "Mig-ExStaged", "Mig-IMAP", "Mig-GmailCutover", "Mig-GmailStaged", "Mig-GroupWise", "Mig-GoogleDrive", "Mig-GoogleSites", "Mig-Box", "Mig-FileSharesToOneDrive", "Mig-FileSharesToTeamSites", "Mig-Domino-BAM", "Mig-Domino-ODME", "MIG-SPOnPrem")]
        [string] $MigrationType,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "Sharepoint", "SAS", "VPN", "Encrypted")]
        [string] $CredentialType,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $Comment
    )

    New-FastTrackMigrationSecret -SecretName $SecretName -Region $Region -SecretValue $SecretValue -MigrationType $MigrationType -CredentialType $CredentialType -Comment $Comment -Override
}

function New-FastTrackMigrationSecret {
<#
    .SYNOPSIS
         Create a new FastTrack Migration secret
    .DESCRIPTION
        The New-FastTrackMigrationSecret cmdlet invokes the REST API to add a secret to the customer's secrets in keyvault. New-FastTrackMigrationSecret calls Waiting-TransactionComplete to repeat until a "completed" or "failed" transaction is returned from the REST API.
 
        In order to use this cmdlet, you must first login using the Login-FastTrackAccount cmdlet.
 
        Please Note: Passwords should contain at least 1 lower case letter.
                     Passwords should contain at least 1 upper case letter.
                     Passwords should contain at least 1 number.
                     Passwords should contain at least 3 special characters.
                     Passwords must be at least 15 characters long.
 
        Access Notes: RDG and VPN credentials can only be created/accessed/modified through the Fast Track Migration Portal / AKV tab.
    .PARAMETER SecretCredential
        PS Credential object that contains:
            Unique name for new Secret.
            Value for new Secret.
    .PARAMETER Region
        Region of migration.
    .PARAMETER MigrationType
        The type of migration.
    .PARAMETER CredentialType
        The type of credential.
        Valid options are:
            Admin,
            Certificate,
            Migration_Account,
            Mig_Sched,
            Sharepoint,
            SAS,
            VPN,
            Encrypted
    .PARAMETER Comment
        Any comment related to credential.
    .EXAMPLE
        [PSCredential] $credential = [PSCredential]::new("SecretValueName", ("NewSecretValue" | ConvertTo-SecureString -AsPlainText -Force))
        New-FastTrackMigrationSecret -SecretCredential $credential -Region:"Region" -MigrationType:"Mig-ExHybrid" -CredentialType "Admin"
        This will create a new Secret named as NewSecret and value as NewSecretValue.
    .INPUTS
        System.String
    .OUTPUTS
        System.Management.Automation.PSObject
            This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID.
    .LINK
        Set-FastTrackMigrationSecret
        Remove-FastTrackMigrationSecret
        Get-FastTrackMigrationSecrets
    #>

    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $SecretName,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $SecretValue,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $Region,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateSet("Mig-ExHybrid", "Mig-ExSimpleMRS", "Mig-ExCutover", "Mig-ExStaged", "Mig-IMAP", "Mig-GmailCutover", "Mig-GmailStaged", "Mig-GroupWise", "Mig-GoogleDrive", "Mig-GoogleSites", "Mig-Box", "Mig-FileSharesToOneDrive", "Mig-FileSharesToTeamSites", "Mig-Domino-BAM", "Mig-Domino-ODME", "MIG-SPOnPrem")]
        [string] $MigrationType,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "Sharepoint", "SAS", "VPN", "Encrypted")]
        [string] $CredentialType,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $Comment,
        [Parameter(Mandatory = $false, ValueFromPipeline = $true)]
        [switch] $Override
    )

    if ($global:MsoAdminProperties.Count -eq 0) {
        Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function."
        return
    }

    $project = Get-Project -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectName $Region -ProjectType $MigrationType.Replace('-', '')

    if (!$project) {
        Write-Warning 'That Region does not exist for this customer/migration type.'
        return
    }

    $vault = Get-Vault -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectIdentifier $project.ProjectIdentifier

    if (!$vault) {
        Write-Warning 'A Vault does not exist for this customer/migration type.'
        return
    }

    $subTypes = Get-CredentialSubType -MigrationType $MigrationType.Replace('-', '') -CredentialType $CredentialType

    $exists = Get-Secret -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectIdentifier $project.ProjectIdentifier `
        -VaultIdentifier $vault.VaultIdentifier -SecretName $SecretName

    if ($exists) {
        if (!$Override) {
            Write-Warning 'That credential already exists. If you want to override it, execute the same command with -Override parameter.'
            return
        }
        else {
            $exists.SecretValue = $SecretValue
            $exists.Comments = $Comment

            $update = Update-Secret -CredentialType $subTypes.CredentialType -CredentialTypeIdentifier $subTypes.CredentialTypeIdentifier `
                -CredentialTypeName $subTypes.CredentialTypeName -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] `
                -ProjectIdentifier $project.ProjectIdentifier -VaultIdentifier $vault.VaultIdentifier `
                -SecretName $SecretName -SecretValue $SecretValue -Comments $Comment -SecretIdentifier $exists.SecretIdentifier

            if ($update) {
                Write-Output 'Successfully updated your credential.'
            }
            else {
                Write-Warning 'There was an error updating your secret.'
            }
        }
    }
    else {
        $new = Add-NewSecret -CredentialType $subTypes.CredentialType -CredentialTypeIdentifier $subTypes.CredentialTypeIdentifier `
            -CredentialTypeName $subTypes.CredentialTypeName -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] `
            -ProjectIdentifier $project.ProjectIdentifier -VaultIdentifier $vault.VaultIdentifier `
            -SecretName $SecretName -SecretValue $SecretValue -Comments $Comment

        if ($new) {
            Write-Output 'Successfully added your credential.'
        }
        else {
            Write-Warning 'There was an error updating your secret.'
        }
    }
}

function Get-FastTrackMigrationSecrets {
    <#
    .SYNOPSIS
        Get a list of secrets for a FastTrack migration customer
    .DESCRIPTION
        The Get-FastTrackMigrationSecrets cmdlet invokes the REST API to retrieve the customer's secrets from keyvault, as a list. Get-FastTrackMigrationSecrets returns recovered secrets as a json-object that is returned to the caller.
 
        This cmdlet is used by customers to retrieve a list of secret names.
 
        In order to use this cmdlet, you must first login using the Login-FastTrackAccount cmdlet.
 
        Access Notes: RDG and VPN credentials can only be created/accessed/modified through the Fast Track Migration Portal / AKV tab.
    .PARAMETER Region
        Region of migration.
    .PARAMETER MigrationType
        Type of migration.
        Mig-ExHybrid
            Exchange to Exchange hybrid migration
        Mig-ExSimpleMRS
            Exchange to Exchange hybrid migration
        Mig-ExCutover
            Cutover Migration
        Mig-ExStaged
            Staged Migration
        Mig-IMAP
            IMAP Migration
        Mig-GmailCutover
            Gmail Cutover Migration
        Mig-GmailStaged
            Gmail staged Migration
        Mig-GroupWise
            GroupWise Migration
        Mig-GoogleDrive
            Google drive to OneDrive migration
        Mig-GoogleSites
            GoogleSites Migration
        Mig-Box
            Box drive to OneDrive migration
        Mig-FileSharesToOneDrive
            FileShare to OneDrive migration
        Mig-FileSharesToTeamSites
            FileShare to TeamSite migration
        Mig-Domino-BAM
            Notes user documents into BAM (Binary Tree Application Manager) migration
        Mig-Domino-ODME
            Notes user documents into ODME migration
        MIG-SPOnPrem
            Sharepoint Migration
    .PARAMETER CredentialType
        The type of credential.
        Valid options are:
            Admin,
            Certificate,
            Migration_Account,
            Mig_Sched,
            Sharepoint,
            SAS,
            VPN,
            Encrypted,
            PowerBI,
            All
    .EXAMPLE
        Get-FastTrackMigrationSecrets -Region "India" -MigrationType "Mig-ExCutover" -CredentialType "Admin"
    .INPUTS
        System.String
    .OUTPUTS
        System.Management.Automation.PSObject
            This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID.
    .LINK
        New-FastTrackMigrationSecret
        Remove-FastTrackMigrationSecret
        Set-FastTrackMigrationSecret
    #>

    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $Region,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateSet("Mig-ExHybrid", "Mig-ExSimpleMRS", "Mig-ExCutover", "Mig-ExStaged", "Mig-IMAP", "Mig-GmailCutover", "Mig-GmailStaged", "Mig-GroupWise", "Mig-GoogleDrive", "Mig-GoogleSites", "Mig-Box", "Mig-FileSharesToOneDrive", "Mig-FileSharesToTeamSites", "Mig-Domino-BAM", "Mig-Domino-ODME", "MIG-SPOnPrem")]
        [string] $MigrationType,
        [Parameter(Mandatory = $false, ValueFromPipeline = $true)]
        [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "Sharepoint", "SAS", "VPN", "Encrypted", "PowerBI", "All")]
        [string] $CredentialType = "All"
    )

    if ($global:MsoAdminProperties.Count -eq 0) {
        Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function."
        return
    }

    $project = Get-Project -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectName $Region -ProjectType $MigrationType.Replace('-', '')

    if (!$project) {
        Write-Warning 'That Region does not exist for this customer/migration type.'
        return
    }

    $vault = Get-Vault -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] -ProjectIdentifier $project.ProjectIdentifier

    if (!$vault) {
        Write-Warning 'A Vault does not exist for this customer/migration type.'
        return
    }

    $secrets = Get-Secrets -TenantId $global:MsoAdminProperties["MSO-CompanyTenantInfo"] `
        -ProjectIdentifier $project.ProjectIdentifier `
        -VaultIdentifier $vault.VaultIdentifier

    if (!$secrets) {
        Write-Host "No Secrets Found"

    }
    else {
        $secrets
    }
}
# SIG # Begin signature block
# MIIkcwYJKoZIhvcNAQcCoIIkZDCCJGACAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAeKQgUOJl2MTX/
# 10RrUm/NRaqLIsO8ljm7It7aj1+AwKCCDYEwggX/MIID56ADAgECAhMzAAABUZ6N
# j0Bxow5BAAAAAAFRMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMTkwNTAyMjEzNzQ2WhcNMjAwNTAyMjEzNzQ2WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQCVWsaGaUcdNB7xVcNmdfZiVBhYFGcn8KMqxgNIvOZWNH9JYQLuhHhmJ5RWISy1
# oey3zTuxqLbkHAdmbeU8NFMo49Pv71MgIS9IG/EtqwOH7upan+lIq6NOcw5fO6Os
# +12R0Q28MzGn+3y7F2mKDnopVu0sEufy453gxz16M8bAw4+QXuv7+fR9WzRJ2CpU
# 62wQKYiFQMfew6Vh5fuPoXloN3k6+Qlz7zgcT4YRmxzx7jMVpP/uvK6sZcBxQ3Wg
# B/WkyXHgxaY19IAzLq2QiPiX2YryiR5EsYBq35BP7U15DlZtpSs2wIYTkkDBxhPJ
# IDJgowZu5GyhHdqrst3OjkSRAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUV4Iarkq57esagu6FUBb270Zijc8w
# UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1
# ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDU0MTM1MB8GA1UdIwQYMBaAFEhu
# ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu
# bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w
# Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx
# MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAWg+A
# rS4Anq7KrogslIQnoMHSXUPr/RqOIhJX+32ObuY3MFvdlRElbSsSJxrRy/OCCZdS
# se+f2AqQ+F/2aYwBDmUQbeMB8n0pYLZnOPifqe78RBH2fVZsvXxyfizbHubWWoUf
# NW/FJlZlLXwJmF3BoL8E2p09K3hagwz/otcKtQ1+Q4+DaOYXWleqJrJUsnHs9UiL
# crVF0leL/Q1V5bshob2OTlZq0qzSdrMDLWdhyrUOxnZ+ojZ7UdTY4VnCuogbZ9Zs
# 9syJbg7ZUS9SVgYkowRsWv5jV4lbqTD+tG4FzhOwcRQwdb6A8zp2Nnd+s7VdCuYF
# sGgI41ucD8oxVfcAMjF9YX5N2s4mltkqnUe3/htVrnxKKDAwSYliaux2L7gKw+bD
# 1kEZ/5ozLRnJ3jjDkomTrPctokY/KaZ1qub0NUnmOKH+3xUK/plWJK8BOQYuU7gK
# YH7Yy9WSKNlP7pKj6i417+3Na/frInjnBkKRCJ/eYTvBH+s5guezpfQWtU4bNo/j
# 8Qw2vpTQ9w7flhH78Rmwd319+YTmhv7TcxDbWlyteaj4RK2wk3pY1oSz2JPE5PNu
# Nmd9Gmf6oePZgy7Ii9JLLq8SnULV7b+IP0UXRY9q+GdRjM2AEX6msZvvPCIoG0aY
# HQu9wZsKEK2jqvWi8/xdeeeSI9FN6K1w4oVQM4Mwggd6MIIFYqADAgECAgphDpDS
# AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0
# ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla
# MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT
# H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG
# OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S
# 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz
# y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7
# 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u
# M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33
# X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl
# XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP
# 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB
# l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF
# RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM
# CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ
# BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud
# DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO
# 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0
# LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
# Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
# Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw
# cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA
# XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY
# 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj
# 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd
# d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ
# Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf
# wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ
# aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j
# NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B
# xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96
# eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7
# r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I
# RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIWSDCCFkQCAQEwgZUwfjELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z
# b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAVGejY9AcaMOQQAAAAABUTAN
# BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgnZQdWJps
# 2WUUpGm6RgKMZP2w/ZJq6Sgbru2xE/oDpLkwQgYKKwYBBAGCNwIBDDE0MDKgFIAS
# AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN
# BgkqhkiG9w0BAQEFAASCAQBZUFyt7HzQaSXZjx8wPXenENtxkVFYvRmM7RR3od6S
# SnOtJYOSRylxxcSE26sJ5gK3duk7NGHlbnyx7j5zL/ehBg4o0x9Dto/cqpaO5I8r
# UMAqqgcJdkg6nZ/tnZYNPopC+q6dMiUT7cZ9tUMm7EE14pB1hz3HNLDy3oWqf32C
# KbwaakB0uwgzGNqf3V4noQZcKl5nE6UyhN9mpnL8WecMzvzE8qIGYxzcInVuC+kK
# j3b1WorxR/0h8gvd6mOKqFm86M2wBoGsJrpyhaocpHLCR8LLGqzyBzzGrG/M25lH
# QxP4QeYyHg6vQX+uYOuFC4F+q73udyrfjR0VWPJLxYOEoYIT0jCCE84GCisGAQQB
# gjcDAwExghO+MIITugYJKoZIhvcNAQcCoIITqzCCE6cCAQMxDzANBglghkgBZQME
# AgEFADCCAVgGCyqGSIb3DQEJEAEEoIIBRwSCAUMwggE/AgEBBgorBgEEAYRZCgMB
# MDEwDQYJYIZIAWUDBAIBBQAEIJ6eYIvH8fntpqwnOl+NFXJVwetCsDX2R9HRUVx1
# XfUZAgZdiMpowB4YEzIwMTkxMDA0MTgyMjUxLjQ2NlowBwIBAYACAfSggdSkgdEw
# gc4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsT
# IE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFs
# ZXMgVFNTIEVTTjo5OEZELUM2MUUtRTY0MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgU2VydmljZaCCDyIwggT1MIID3aADAgECAhMzAAAA++CUDxRBhNvF
# AAAAAAD7MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
# MDEwMB4XDTE5MDkwNjIwNDEwNloXDTIwMTIwNDIwNDEwNlowgc4xCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29mdCBP
# cGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo5
# OEZELUM2MUUtRTY0MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
# dmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKAhY+5J8HXlmAVU
# +70WH7Tm4GcoAWQzzKyzLYgQjL+mViTGe5p0zbwF49ZJcdXgwQkDM/uA2j8xj0or
# y2Uh5CefDW/AUHz9R2qkIe5AbjbjLADgCKg6U3SAlWfz8NoKNE8xu2Uy/8zpLDcV
# c0jw4B36Kq6Yjm8xXcsyxjObbaVzIicl23bsuJgkkCD1sathSBFrwDVEYQHk8R1Y
# wgFE8NB/ngp+4P02rAmuNpcc1wBOyvTyEbS8l1mirMFhT9VbDftN6s1zd0Mlp+Hr
# p5U0NGPwS+mEHilvjabY67LBK3BZLYgmUcitV46XontBCBv9K+5oPtpRrdbPVu2g
# e2THNecCAwEAAaOCARswggEXMB0GA1UdDgQWBBSQPADvO9LEi5oW6lyRMkqJD6tN
# jDAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEug
# SaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9N
# aWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG
# AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Rp
# bVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG
# CCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IBAQBD2sGnRfoXWNGCeqAhw+SMyp8z
# SS7zFkOoGnH8IQtXLY2wMezdaD3O8NVB2+1J4jfygw7XiBkFQt40i+85x8ig+oUn
# Zl1F+f3l6TKbCLIeAlpvfRT2USLHO+4PIUX9wYViqOF7FXlP2DJC/1ga/bGhF5mc
# KxlcPo4BWk8cuO3BCjXabNCs5oHbNHVfxUI9xVKYUBN3GNDl+72j50bE11Jg8ZgV
# wI2Syw1j7UiC7ZHYzZ7GCNyuH3z9qGIXWgr6Nb/il5pPfsOWRI1bQbL0/oc/Q4TP
# 9tqhvCi57T+59NYz+33KAGx0SghLBcg6grUKyI6cgNf+fOUb/FQR+8Ph2SAyMIIG
# cTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0
# IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzAxMjEzNjU1
# WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCC
# ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkdDbx3EYo6IOz8E5f1+n9p
# lGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5mK1vwFVMnBDEfQRsalR3OCROOfGEw
# WbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcmgqNFDdDq9UeBzb8kYDJYYEbyWEeG
# MoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5hoC732H8RsEnHSRnEnIaIYqvS2SJ
# UGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/VmwAOWRH7v0Ev9buWayrGo8noqCjHw
# 2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQBwSAJk3jN/LzAyURdXhacAQVPIk0C
# AwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTVYzpcijGQ
# 80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8E
# BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2U
# kFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j
# b20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmww
# WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBoAYD
# VR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMwgYEwPQYIKwYBBQUHAgEWMWh0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYI
# KwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AUABvAGwAaQBjAHkAXwBTAHQAYQB0
# AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAAfmiFEN4sbgmD+BcQM9
# naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJat/15/B4vceoniXj+bzta1RXCCtR
# gkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1mCRWS3TvQhDIr79/xn/yN31aPxzy
# mXlKkVIArzgPF/UveYFl2am1a+THzvbKegBvSzBEJCI8z+0DpZaPWSm8tv0E4XCf
# Mkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/amJ/3cVKC5Em4jnsGUpxY517IW3D
# nKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqWhqS9nhquBEKDuLWAmyI4ILUl5WTs
# 9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua2A5HmoDF0M2n0O99g/DhO3EJ3110
# mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46PioSKv33nJ+YWtvd6mBy6cJrDm77MbL
# 2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqHczsI5pgt6o3gMy4SKfXAL1QnIffI
# rE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw07t0MkvfY3v1mYovG8chr1m1rtxE
# PJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P6Z0eGTgvvM9YBS7vDaBQNdrvCScc
# 1bN+NR4Iuto229Nfj950iEkSoYIDsDCCApgCAQEwgf6hgdSkgdEwgc4xCzAJBgNV
# BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
# HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29m
# dCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVT
# Tjo5OEZELUM2MUUtRTY0MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaIlCgEBMAkGBSsOAwIaBQADFQAV9O+PCUZ4KHTCMuuXBK/6zr9CMaCB
# 3jCB26SB2DCB1TELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEp
# MCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xJzAlBgNV
# BAsTHm5DaXBoZXIgTlRTIEVTTjo0REU5LTBDNUUtM0UwOTErMCkGA1UEAxMiTWlj
# cm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkqhkiG9w0BAQUFAAIF
# AOFBT4MwIhgPMjAxOTEwMDQxMjU2MzVaGA8yMDE5MTAwNTEyNTYzNVowdzA9Bgor
# BgEEAYRZCgQBMS8wLTAKAgUA4UFPgwIBADAKAgEAAgIBUgIB/zAHAgEAAgIWwjAK
# AgUA4UKhAwIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMBoAowCAIB
# AAIDFuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IBAQBm1Ot6k/Jgu+kQ
# cVB7iYTnEon1uOfPQISA8QQ5AGx2kiiHEY04wW/T9n2hNaTQbz61Nw3iQUYTXPri
# EK27kg5jUmMqZLz6pmY6ilfBGRLvgiEN9E8fol2EmUhTkIgQ9KmRXkco5AKFs7eU
# IJutBPp2SYBmuRkliBF1UYcSSxl1rKYOuIfkfuPFOfkcxJWwjkq6O7ABPuLq5nMf
# 5Q+sWVmEg/ov7iK/KJzGbwxjxWw9shtvtPPXHBZc3M1JaJGvTDfWKdCq6U67hjtS
# 6vDUqMfDphH5QRkVo5/yVtMlp2BwXxSevBK3IWkHFUEEWa58u5cpyYsktO0SYl4N
# 3fSh3ojLMYIDDTCCAwkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh
# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw
# MTACEzMAAAD74JQPFEGE28UAAAAAAPswDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqG
# SIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg+w+UjuA9PZK8
# DlEIf4h8HQ5A6y8CN+wNXKEqpV6zrtgwgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHk
# MIG9BCBu8fQjDOJ6yHyR/w+/uqCScFrrBeJLrXDO9BpMK7r+3TCBmDCBgKR+MHwx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p
# Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAA++CUDxRBhNvFAAAAAAD7
# MCIEIGhGYbMyo6XONTZVkN7S/49zYNPeDV7OGQ/iV5feGoohMA0GCSqGSIb3DQEB
# CwUABIIBAJiABFRZNVTlbXZ+2KfH6L+3Y0zkuVr9zM8KVyKTndli/d7bFsrmBA/h
# fj08xoORgtF/EWFd8vqR6XNg5B/h74aj2+IjoOntQtYXYTmryW5QVFtnbBUNmN7H
# MsNvYI400OOL/DYn7Bc11yXD5fLoVf/2xCP004Z0KEsgVwz5Np3S0C4YLncXqSy8
# ufmgFpg1Q+kTVMkgP68kgBMPuHnd0cWg0FOSSjG3ogLksdoJcUdOOjaZi+LsR0rz
# QxNTd4m/4xKUEykB7LJ+nNrVxBiKptc+KPQsYAAI8+Sgg16Jh/EVOS5jBu9l9R+Q
# CHaLkFNhhPWgYDmr+nY6Pu/vlxkNg4w=
# SIG # End signature block