FastTrack-KeyVaultRequests.psm1

Add-Type -AssemblyName System.Web -ErrorAction SilentlyContinue
Function Get-ResponseError {
    param([System.Net.HttpWebResponse]$Response)
    $streamReader = New-Object System.IO.StreamReader($Response.GetResponseStream())
    $streamReader.BaseStream.Position = 0
    $streamReader.DiscardBufferedData()
    $body = ConvertFrom-Json($streamReader.ReadToEnd())
    if([string]::IsNullOrEmpty($body))
    {
        $body = ConvertFrom-Json("{}")        
    }
    Add-Member -InputObject $body -MemberType NoteProperty -Name "StatusCode" -Value $_.Exception.Response.StatusCode
    $body
}
Function Invoke-GetRequest {
    param([String]$Uri, [hashtable]$Headers)
    $response = try {
        Invoke-RestMethod -Method GET -Uri $Uri -ContentType 'application/json' -Headers $Headers
    } catch {
        Get-ResponseError $_.Exception.Response
    }

    return $response
}
Function Invoke-PostRequest {
    param([String]$Uri, [hashtable]$Headers, [String]$Body)
    $response = try {
    Invoke-RestMethod -Method POST -Uri $Uri -ContentType 'application/json' -Headers $Headers -Body $Body
    } catch {
    Get-ResponseError $_.Exception.Response
    }

    return $response
}
Function Invoke-PutRequest {
    param([String]$Uri, [hashtable]$Headers, [String]$Body)
    $response = try {
    Invoke-RestMethod -Method PUT -Uri $Uri -ContentType 'application/json' -Headers $Headers -Body $Body
    } catch {
    Get-ResponseError $_.Exception.Response
    }

    return $response
}
Function Invoke-DeleteRequest {
    param([String]$Uri, [hashtable]$Headers, [String]$Body)
    $response = try {
    Invoke-RestMethod -Method DELETE -Uri $Uri -ContentType 'application/json' -Headers $Headers -Body $Body
    } catch {
    Get-ResponseError $_.Exception.Response
    }

    return $response
}

Function Waiting-TransactionComplete() {
    param([string] $TransactionID = $(throw "Transaction ID unable to find, Please try again."), [string] $EnvironmentMode)

    [array]$FinalResults = "Completed","Failed"

    $current = $previous = 1;
    do {
        $Transaction = Get-FastTrackMigrationTransactionStatus -TransactionID $TransactionID -EnvironmentMode $EnvironmentMode

        for ($j = 1; (!$FinalResults.Contains($Transaction.Status) -and $j -le $current); $j++) {
            sleep -Milliseconds 1000
            Write-Progress -Id 1 -Activity Waiting -Status 'Next attempt will start ' -PercentComplete ($j/$current*100) -SecondsRemaining ($current-$j)
        }
        $current,$previous = ($current + $previous),$current

    } while ($current -lt 60 -and !$FinalResults.Contains($Transaction.Status))
    return $Transaction
} 

Function SetBaseRequestValues{
    param
    (
        [string] $TenantID,
        [string] $CompanyName,
        [string] $LogonUserEmail
    )
        $TransactionId = New-Guid

        $CustomerIdentity = (New-Object PSObject |
        Add-Member -PassThru NoteProperty TenantId $TenantID |
        Add-Member -PassThru NoteProperty CompanyName $CompanyName |
        Add-Member -PassThru NoteProperty LogOnUserEmail $LogonUserEmail)

        $CustomerObject = (New-Object PSObject |
        Add-Member -PassThru NoteProperty TransactionId $TransactionId |
        Add-Member -PassThru NoteProperty Customer $CustomerIdentity)

        return $CustomerObject
}
Function SetKvRequestValues{
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [PSObject] $RequestObject,
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string] $KeyVaultSecretName,
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string] $KeyVaultSecretValue,
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string] $MigrationType = "Notes",
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [PSObject] $Region
    )

    return ($RequestObject |
                Add-Member -PassThru NoteProperty Name $KeyVaultSecretName |
                Add-Member -PassThru NoteProperty Value $KeyVaultSecretValue |
                Add-Member -PassThru NoteProperty Region $Region |
                Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov |
                Add-Member -PassThru NoteProperty MigrationType $MigrationType)
}
Function SetKvNewUpdateRequestValues{
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [PSObject] $RequestObject,
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string] $KeyVaultSecretName,
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string] $KeyVaultSecretValue,
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string] $MigrationType = "Notes",
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string] $Region,
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string] $Comment = $null,
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string] $CredType
    )

    $CredTypeob =(New-Object PSObject |
                Add-Member -PassThru NoteProperty CredType $CredType |
                Add-Member -PassThru NoteProperty Comments $Comment)

    $result = ($RequestObject |
                Add-Member -PassThru NoteProperty Name $KeyVaultSecretName |
                Add-Member -PassThru NoteProperty Value $KeyVaultSecretValue |
                Add-Member -PassThru NoteProperty Region $Region |
                Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov |
                Add-Member -PassThru NoteProperty MigrationType $MigrationType |
                Add-Member -PassThru NoteProperty CredType $CredTypeob)

    return $result
}
Function SetKvGetRequestValues{
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [PSObject] $RequestObject,
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string] $MigrationType = "Notes",
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string] $Region,
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string] $CredType
    )

    $result = ($RequestObject |
                Add-Member -PassThru NoteProperty Region $Region |
                Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov |
                Add-Member -PassThru NoteProperty MigrationType $MigrationType |
                Add-Member -PassThru NoteProperty CredType $CredType)

    return $result
}

function New-FastTrackMigrationSecret {
    <#
    .SYNOPSIS
        Create a new FastTrack Migration secret
    .DESCRIPTION
        This cmdlet is used for customers who are Global Administrators to create a new FastTrack Migration Secret.
 
        In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
    .PARAMETER SecretName
        Unique name for new Secret.
    .PARAMETER SecretValue
        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,
            RDG,
            Sharepoint,
            SAS,
            VPN,
            Encrypted
    .PARAMETER Comment
        Any comment related to credential.
    .PARAMETER EnvironmentMode
        DO NOT USE. INTERNAL USE ONLY
    .EXAMPLE
        New-FastTrackMigrationSecret -SecretName:"NewSecret" -SecretValue:"NewSecretValue" -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
    #>

    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)]
            [string] $MigrationType,
            [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
            [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "RDG", "Sharepoint", "SAS", "VPN", "Encrypted")]
            [string] $CredentialType,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $Comment,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [ValidateSet("dev","uat","prod")]
            [string] $EnvironmentMode = "prod"
        )

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

    $jsonObj = SetBaseRequestValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"]  `
                                -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName `
                                -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account

    $updateJsonObj = SetKvNewUpdateRequestValues -RequestObject:$jsonObj `
                                        -KeyVaultSecretName:$SecretName `
                                        -KeyVaultSecretValue:$SecretValue `
                                        -Region:$Region `
                                        -MigrationType:$MigrationType `
                                        -Comment: $Comment `
                                        -CredType $CredentialType

    $serializedJson = $updateJsonObj | ConvertTo-Json -Compress: $true    

    $header = @{}
    $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)
    $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
    Write-Host "Sending Secret Create Request..."

    if($EnvironmentMode.Equals("UAT", [System.StringComparison]::CurrentCultureIgnoreCase))
    {
        $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-csi-{0}.azurewebsites.net/api/KeyVault/Set",$EnvironmentMode)) -Headers $header -Body $serializedJson
    }
    else
    {
        $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/KeyVault/Set",$EnvironmentMode)) -Headers $header -Body $serializedJson
    }

    if($JsonResult.StatusCode -ne $null)
    {
        Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
    }
    else
    {
        Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId) -EnvironmentMode $EnvironmentMode
    }
    
}
function Set-FastTrackMigrationSecret {
    <#
    .SYNOPSIS
        Update an existing FastTrack Migration Secret
    .DESCRIPTION
        This cmdlet is used for customers who are Global Administrators to update already existing KeyVault secret.
         
        In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet.
    .PARAMETER SecretName
        Unique name for already existing Secret.
    .PARAMETER SecretValue
        New value for specified 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,
            RDG,
            Sharepoint,
            SAS,
            VPN,
            Encrypted
    .PARAMETER Comment
        Any comment related to credential.
    .PARAMETER EnvironmentMode
        DO NOT USE. INTERNAL USE ONLY
    .EXAMPLE
        Set-FastTrackMigrationSecret -SecretName:"SecretValueName" -SecretValue:"ChangedSecretValue" -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
    #>

    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)]
            [string] $MigrationType,
            [Parameter(Mandatory=$true,ValueFromPipeline=$true)]        
            [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "RDG", "Sharepoint", "SAS", "VPN", "Encrypted")]
            [string] $CredentialType,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $Comment,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [ValidateSet("dev","uat","prod")]
            [string] $EnvironmentMode = "prod"
        )

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

    $jsonObj = SetBaseRequestValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"]  `
                                -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName `
                                -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account

    $updateJsonObj = SetKvNewUpdateRequestValues -RequestObject:$jsonObj `
                                        -KeyVaultSecretName:$SecretName `
                                        -KeyVaultSecretValue:$SecretValue `
                                        -Region:$Region `
                                        -MigrationType:$MigrationType `
                                        -Comment: $Comment `
                                        -CredType $CredentialType

    $serializedJson = $updateJsonObj | ConvertTo-Json -Compress: $true

    $header = @{}
    $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)
    $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
    Write-Host "Sending Secret Update Request..."
    if($EnvironmentMode.Equals("UAT", [System.StringComparison]::CurrentCultureIgnoreCase))
    {
        $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-csi-{0}.azurewebsites.net/api/KeyVault/Set",$EnvironmentMode)) -Headers $header -Body $serializedJson
    }
    else
    {
        $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/KeyVault/Set",$EnvironmentMode)) -Headers $header -Body $serializedJson
    }
            
    if($JsonResult.StatusCode -ne $null)
    {
        # Error?
        Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
    }
    else
    {
        Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId) -EnvironmentMode $EnvironmentMode
    }
    
}
function Remove-FastTrackMigrationSecret {
    <#
    .SYNOPSIS
        Remove an existing FastTrack Migration secret
    .DESCRIPTION
        This cmdlet is used for customers who are Global Administrators to remove already existing FastTrack Migration Secret.
 
        In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
    .PARAMETER SecretName
        Unique name for already existing secret.
    .PARAMETER Region
        Region of migration.
    .PARAMETER MigrationType
        The type of migration.
    .PARAMETER EnvironmentMode
        DO NOT USE. INTERNAL USE ONLY
    .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)]
            [string] $MigrationType,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [ValidateSet("dev","uat","prod")]
            [string] $EnvironmentMode = "prod"
        )

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

    $jsonObj = SetBaseRequestValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"]  `
                                -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName `
                                -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account

    $deleteJson = SetKvRequestValues -RequestObject:$jsonObj `
                                        -KeyVaultSecretName:$SecretName `
                                        -Region:$Region `
                                        -MigrationType:$MigrationType
                            
    $serializedJson = $deleteJson | ConvertTo-Json -Compress: $true

    $header = @{}
    $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)
    $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
    Write-Host "Sending KeyVault Delete Request..."
    if($EnvironmentMode.Equals("UAT", [System.StringComparison]::CurrentCultureIgnoreCase))
    {
        $JsonResult = Invoke-DeleteRequest -Uri ([System.String]::Format("https://msft-csi-{0}.azurewebsites.net/api/KeyVault",$EnvironmentMode)) -Headers $header -Body $serializedJson
    }
    else
    {
        $JsonResult = Invoke-DeleteRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/KeyVault",$EnvironmentMode)) -Headers $header -Body $serializedJson
    }
            
    if($JsonResult.StatusCode -ne $null)
    {
        # Error?
        Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
    }
    else
    {
        Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId) -EnvironmentMode $EnvironmentMode
    }

}
function Get-FastTrackMigrationSecrets {
    <#
    .SYNOPSIS
        Get a list of secrets for a FastTrack migration customer
    .DESCRIPTION
        This cmdlet is used for customers who are Global Administrators to retrieve a list of secret names.
         
        In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
    .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-DominoBAM
            Notes user documents into BAM (Binary Tree Application Manager) migration
        Mig-DominoODME
            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,
            RDG,
            Sharepoint,
            SAS,
            VPN,
            Encrypted,
            All
    .PARAMETER EnvironmentMode
        DO NOT USE. INTERNAL USE ONLY
    .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
    #>

    param(
            [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
            [string] $Region,
            [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
            [string] $MigrationType,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]        
            [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "RDG", "Sharepoint", "SAS", "VPN", "Encrypted", "All")]
            [string] $CredentialType = "All",
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [ValidateSet("dev","uat","prod")]
            [string] $EnvironmentMode = "prod"
        )

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

    $jsonObj = SetBaseRequestValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"]  `
                                -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName `
                                -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account

    $updateJsonObj = SetKvGetRequestValues -RequestObject:$jsonObj `
                                        -Region:$Region `
                                        -MigrationType:$MigrationType `
                                        -CredType $CredentialType

    $serializedJson = $updateJsonObj | ConvertTo-Json -Compress: $true

    $header = @{}
    $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)
    $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
    Write-Host "Fetching Secrets ..."
    if($EnvironmentMode.Equals("UAT", [System.StringComparison]::CurrentCultureIgnoreCase))
    {
        $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-csi-{0}.azurewebsites.net/api/KeyVault/List",$EnvironmentMode)) -Headers $header -Body $serializedJson
    }
    else
    {
        $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/KeyVault/List",$EnvironmentMode)) -Headers $header -Body $serializedJson
    }
            
    if($JsonResult.StatusCode -ne $null)
    {
        # Error?
        Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
    }
    else
    {
      if($JsonResult.Secrets.Count -eq 0)
        {
            Write-Host "No Secrets Found"
            
        }
        else
        {
            Write-Host "`nSecrets`n-------"
            return $JsonResult.Secrets
        }        
    }            
}


# SIG # Begin signature block
# MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCed2kJUhkNbpFc
# RVxS6vpC2gdRf6ug/YCAOZClJ7uVLaCCDYEwggX/MIID56ADAgECAhMzAAABA14l
# HJkfox64AAAAAAEDMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMTgwNzEyMjAwODQ4WhcNMTkwNzI2MjAwODQ4WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDRlHY25oarNv5p+UZ8i4hQy5Bwf7BVqSQdfjnnBZ8PrHuXss5zCvvUmyRcFrU5
# 3Rt+M2wR/Dsm85iqXVNrqsPsE7jS789Xf8xly69NLjKxVitONAeJ/mkhvT5E+94S
# nYW/fHaGfXKxdpth5opkTEbOttU6jHeTd2chnLZaBl5HhvU80QnKDT3NsumhUHjR
# hIjiATwi/K+WCMxdmcDt66VamJL1yEBOanOv3uN0etNfRpe84mcod5mswQ4xFo8A
# DwH+S15UD8rEZT8K46NG2/YsAzoZvmgFFpzmfzS/p4eNZTkmyWPU78XdvSX+/Sj0
# NIZ5rCrVXzCRO+QUauuxygQjAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUR77Ay+GmP/1l1jjyA123r3f3QP8w
# UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1
# ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDM3OTY1MB8GA1UdIwQYMBaAFEhu
# ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu
# bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w
# Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx
# MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAn/XJ
# Uw0/DSbsokTYDdGfY5YGSz8eXMUzo6TDbK8fwAG662XsnjMQD6esW9S9kGEX5zHn
# wya0rPUn00iThoj+EjWRZCLRay07qCwVlCnSN5bmNf8MzsgGFhaeJLHiOfluDnjY
# DBu2KWAndjQkm925l3XLATutghIWIoCJFYS7mFAgsBcmhkmvzn1FFUM0ls+BXBgs
# 1JPyZ6vic8g9o838Mh5gHOmwGzD7LLsHLpaEk0UoVFzNlv2g24HYtjDKQ7HzSMCy
# RhxdXnYqWJ/U7vL0+khMtWGLsIxB6aq4nZD0/2pCD7k+6Q7slPyNgLt44yOneFuy
# bR/5WcF9ttE5yXnggxxgCto9sNHtNr9FB+kbNm7lPTsFA6fUpyUSj+Z2oxOzRVpD
# MYLa2ISuubAfdfX2HX1RETcn6LU1hHH3V6qu+olxyZjSnlpkdr6Mw30VapHxFPTy
# 2TUxuNty+rR1yIibar+YRcdmstf/zpKQdeTr5obSyBvbJ8BblW9Jb1hdaSreU0v4
# 6Mp79mwV+QMZDxGFqk+av6pX3WDG9XEg9FGomsrp0es0Rz11+iLsVT9qGTlrEOla
# P470I3gwsvKmOMs1jaqYWSRAuDpnpAdfoP7YO0kT+wzh7Qttg1DO8H8+4NkI6Iwh
# SkHC3uuOW+4Dwx1ubuZUNWZncnwa6lL2IsRyP64wggd6MIIFYqADAgECAgphDpDS
# 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/BvW1taslScxMNelDNMYIWLTCCFikCAQEwgZUwfjELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z
# b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAQNeJRyZH6MeuAAAAAABAzAN
# BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgO5GeTbTp
# bywvHZHVFtX7uDQU0EoG+b4WKu5rCT8aCcgwQgYKKwYBBAGCNwIBDDE0MDKgFIAS
# AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN
# BgkqhkiG9w0BAQEFAASCAQBD3vOma8JRFwDZTYuycDk0RjgzcSxPOL13adKWUNp4
# ssMSumbh+xgo0yq6islWzZ1fS549Q6KClsTluHBKb3GXnrHliN0Y1zAfINCArjGb
# Ssw1JNIxBTWMOMwQDcXtNHYoqLzECCwoGK9DEZ0+TEOZ7qnfVcIw/r0I/lLRyvLm
# pk+9BOOKUW0cCRPUr8WeboiB+1HSIn4STLZqpSti9kVZ1QHf5d7FyLn6SPYbe9bB
# 6ZSnfekpNxlFnQbWMNTTTK/UWFw2pMztTIHsgrsli8OhZJw+lrwUofluI36Jxy7h
# JXz+r/2PoMCF3oRhxVPuN2BtwjpofUC/8/zP2RvSewPpoYITtzCCE7MGCisGAQQB
# gjcDAwExghOjMIITnwYJKoZIhvcNAQcCoIITkDCCE4wCAQMxDzANBglghkgBZQME
# AgEFADCCAVgGCyqGSIb3DQEJEAEEoIIBRwSCAUMwggE/AgEBBgorBgEEAYRZCgMB
# MDEwDQYJYIZIAWUDBAIBBQAEIOif6cuNRWMsu+p2JO1SKreeK7jPa912cTQ/F0Rg
# VjVWAgZbiBcFkn4YEzIwMTgwOTExMTQ0NzAyLjMzN1owBwIBAYACAfSggdSkgdEw
# gc4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsT
# IE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFs
# ZXMgVFNTIEVTTjpCMUI3LUY2N0YtRkVDMjElMCMGA1UEAxMcTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgU2VydmljZaCCDx8wggT1MIID3aADAgECAhMzAAAA0rjjWm3EWxp3
# AAAAAADSMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
# MDEwMB4XDTE4MDgyMzIwMjYzNFoXDTE5MTEyMzIwMjYzNFowgc4xCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29mdCBP
# cGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjpC
# MUI3LUY2N0YtRkVDMjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
# dmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL6qlCgdibSaobrq
# BKjOOMdrBs+/2QwgzuuPOfmdCTBQuNs7pWysQ39PEGqEpHRY0iGUGYNgpnzPnlG2
# MUmMiGaxnOkvW7/F9dOkM2YsCVZGakzO4filhUPoBJKcScTugOG5o43C3Vtl+zbi
# ux2lsjTFk0w3jFIf9FUD15+sskWZ0cOfhHe2BQfWaTpJj0s3aS4STsWm3S2VVhbX
# 6lZmtjqod7o8Wx8PpCVpGAygKTQMNpNgVKqV27U3DYYhhmhidBLviqzgfA30tUDO
# z9bXMrg29Ma0pvFaflIAVnWoNAZVcYqrGXd7yla4I6s7MwqwcisN00RKlXVnMr6S
# lbo4l0UCAwEAAaOCARswggEXMB0GA1UdDgQWBBTsrDhxdfqXySP5UnJlSeA9onfg
# zjAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEug
# SaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9N
# aWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG
# AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Rp
# bVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG
# CCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IBAQBGz0MpcRwOvTZ3QXq9FWewgAJy
# KiaSFpgoufls+WX4AyPQmD/LnB+ZcJR5LQnoHvdWeQizH9lW8SnbiStsnH1mVPIc
# 45Nh7PvKHLjdrke3Ky4Ht5VicKAZu18vdL3xU42eUOkMG4F6nL5nJByDTTp51vxO
# T/W/WS12PZZmcwNs6nZKrTT/TmG0QXNkZ0KL5kpF/CR7/TtO8PVQ9ciCOl/+2tnp
# Hpwj8U3XsvLaKAck9RzpoWHQ4dF3zeRKWXA7qW6pexvFX6nmJ/KFJsftRAVwZ/Z5
# mC+LOIcJlln4ZTEAKEW+HPfyjl+BS5yIl3dqhnVFukt5QLsWlKNUQKT5fNn7MIIG
# 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+NR4Iuto229Nfj950iEkSoYIDrTCCApUCAQEwgf6hgdSkgdEwgc4xCzAJBgNV
# BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
# HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29m
# dCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVT
# TjpCMUI3LUY2N0YtRkVDMjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaIlCgEBMAkGBSsOAwIaBQADFQBw+Ch/1VIzmUVpODcOv+U5mO7zwqCB
# 3jCB26SB2DCB1TELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEp
# MCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xJzAlBgNV
# BAsTHm5DaXBoZXIgTlRTIEVTTjo1N0Y2LUMxRTAtNTU0QzErMCkGA1UEAxMiTWlj
# cm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkqhkiG9w0BAQUFAAIF
# AN9ByYMwIhgPMjAxODA5MTExMjU2MzVaGA8yMDE4MDkxMjEyNTYzNVowdDA6Bgor
# BgEEAYRZCgQBMSwwKjAKAgUA30HJgwIBADAHAgEAAgIAwzAHAgEAAgIbgTAKAgUA
# 30MbAwIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMBoAowCAIBAAID
# FuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IBAQBzp+UcxDG97qyLWVTp
# SgbfFi5jDwy9Jii0iRRnzcJI3gLGjOS855qhuKg8sNaKfbcDDXZCkKQApl/fJixy
# 0Rbti3j56vrfEPe4QFJy9XxE38cwGT9NaPPff87BhHhdVWUpDyKNAIaSKzE5MqNK
# VhoWc+CPJWPUB2S2Uv1gz03ewDnT4IQYewYVLf9xZ4/g/oHTclyu57SgN/ZGCwlK
# oB5bdbHSZwXRJgH9GCg7OyMZ+8K8mjAXl5NFC2z8ADCeX96+KJcaula/jiL6mKXp
# 6l8w4e3OWJyOtb5e5I62ZQwyqqOgrRRXubTnwpDHzKPfZ8GWRBmV50rjEg4uBLWg
# RtjEMYIC9TCCAvECAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAC
# EzMAAADSuONabcRbGncAAAAAANIwDQYJYIZIAWUDBAIBBQCgggEyMBoGCSqGSIb3
# DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgGDTJ7+Xu5tIap73i
# kOYWxNm1bodsavar6m+WfP3NacYwgeIGCyqGSIb3DQEJEAIMMYHSMIHPMIHMMIGx
# BBRw+Ch/1VIzmUVpODcOv+U5mO7zwjCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0
# YW1wIFBDQSAyMDEwAhMzAAAA0rjjWm3EWxp3AAAAAADSMBYEFCsC05SXi13MgewU
# yDGKf6Kr9RviMA0GCSqGSIb3DQEBCwUABIIBAEXA96a7WLkF1jC3M5mx7MeFvzWJ
# gQ7Yy6qNZh3vOa7YLkwefUekBklcwreEMKGTE9Ng/DtGtp7L0gKyczxLgoGa8ZHj
# MItDFHjvoTVNj5Go1HM719wQtfRo4Ppx3p1aGw+O5mI9cSvV6lYnHOkv9aMefizr
# rwTH1ifnZ/o5KTSsNSHwtZ/JN2TwESYp3Z++7QyBA2bvKhly3AJMdJS3JFt71Oaw
# cipDUMHWVC5/5Gt6K4BMYvLojqowXvBgtIWX/wG6MNGH1lE425U6+R/A5aqCcver
# krIS/IwoZAb/RlvPpqQiA2q+PGBZCfMnhJAINyZzA/HXvnUOhFQG+WWtSLg=
# SIG # End signature block