FastTrack-RecipientManagement.psm1

Add-Type -AssemblyName System.Web -ErrorAction SilentlyContinue

Function Get-ResponseError {
<#
.SYNOPSIS
    Get-ResponseError converts HtmlWebResponse error to HtmlWebResponseObject for output
.DESCRIPTION
    Get-ResponseError inputs HtmlWebResponse error and converts to HtmlWebResponseObject for output
.PARAMETER
    Response is the error response returned from webrequest
.EXAMPLE
    Get-ResponseError $_.Exception.Response
.INPUTS
    System.Net.HttpWebResponse
.OUTPUTS
    HtmlWebResponseObject
.LINK
#>

    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 {
<#
.SYNOPSIS
    Call Rest API with input variables to retrieve appropriate response
.DESCRIPTION
    The Invoke-GetRequest cmdlet utilizes the header parameter to perform the REST API call to modify a FastTrack migration. The REST API is defined in the URI parameter and returns the API's webresponse.
.PARAMETER
    Uri as the endpoint HTML address for the REST API
    Headers is a collection of header keys and values required by the API to return results
.EXAMPLE
    $JsonResult = Invoke-GetRequest -Uri ([System.String]::Format("{0}/{1}/DSR/Status/TransactionId/{2}?{3}", $global:CsiApiBaseUriFormat, $TenantId, $TransactionId, $query)) -Headers $header
.INPUTS
    System.String
    System.Collections.Hashtable
.OUTPUTS
    HtmlWebResponseObject
.LINK
#>

    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 {
<#
.SYNOPSIS
    Call Rest API with input variables to retrieve appropriate response
.DESCRIPTION
    The Invoke-PostRequest cmdlet utilizes the body and header parameters to perform the REST API call to modify a FastTrack migration. The REST API is defined in the URI parameter and returns the API's webresponse.
.PARAMETER
    Uri as the endpoint HTML address for the REST API
    Headers is a collection of header keys and values required by the API to return results
    Body is the collected form data required by the API to return results
.EXAMPLE
.INPUTS
    System.String
    System.Collections.Hashtable
.OUTPUTS
    HtmlWebResponseObject
.LINK
#>

    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 {
<#
.SYNOPSIS
    Call Rest API with input variables to retrieve appropriate response
.DESCRIPTION
    The Invoke-DeleteRequest cmdlet utilizes the body and header parameters to perform the REST API call to delete a FastTrack migration. The REST API is defined in the URI parameter and returns the API's webresponse.
.PARAMETER
    Uri as the endpoint HTML address for the REST API
    Headers is a collection of header keys and values required by the API to return results
    Body is the collected form data required by the API to return results
.EXAMPLE
.INPUTS
    System.String
    System.Collections.Hashtable
.OUTPUTS
    HtmlWebResponseObject
.LINK
#>

    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 {
<#
.SYNOPSIS
    Call Rest API with delete request input
.DESCRIPTION
    The Invoke-DeleteRequest cmdlet utilizes the body and header parameters to perform the REST API call to delete a FastTrack migration. The REST API is defined in the URI parameter and returns the API's webresponse.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.PARAMETER Uri of endpont for REST API
.PARAMETER Header to include in REST API call
.PARAMETER Body and Form data to include in REST API call
.EXAMPLE
    $JsonResult = Invoke-DeleteRequest -Uri ([System.String]::Format("{0}/{1}/DSR/Status/TransactionId/{2}?{3}", $global:CsiApiBaseUriFormat, $TenantId, $TransactionId, $query)) -Headers $header
.INPUTS
    System.String
    System.Collections.Hashtable
.OUTPUTS
    HtmlWebRequestResponse
.LINK
#>

    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() {
<#
.SYNOPSIS
    Find status of Transaction
.DESCRIPTION
    The Waiting-TransactionComplete cmdlet takes a TransactionId, as a string object, invoking the REST API to retrieve the transaction's status. While the status of the transaction is not "completed" or "failed," the Get-FastTrackMigrationTransactionStatus is called and checked for an updated status. Once comleted or failed, the transaction is returned to the caller.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.PARAMETER
    TransactionId is the GUID representing the specified transaction
.EXAMPLE
    Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId)
.INPUTS
    System.String
.OUTPUTS
    System.Management.Automation.PSObject
        This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID.
.LINK
#>

    param([string] $TransactionID = $(throw "Transaction ID unable to find, Please try again."))

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

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

        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 SetBaseRecipientValues {
<#
.SYNOPSIS
    Set recipient identity values
.DESCRIPTION
    The SetBaseRecipientValues cmdlet, for Global Administrators, is utilized to set recipient identity details. These details are the name, email adress, and description of the recipient account. Once created, the recipient information is returned to the caller.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.PARARMETER First name of customer
.PARARMETER Last name of customer
.PARARMETER Email address of customer
.PARARMETER Description of distribution list
.EXAMPLE
    $jsonObj = SetBaseRecipientValues -FirstName $FirstName -LastName $LastName -EmailAddress $EmailAddress -Description $Description
.INPUTS
    System.String
.OUTPUTS
    PSObject Recipient
.LINK
#>

    param
    (
        [string] $FirstName,
        [string] $LastName,
        [string] $EmailAddress,
        [string] $Description
    )

    $Recipient = (New-Object PSObject |
        Add-Member -PassThru NoteProperty FirstName $FirstName |
        Add-Member -PassThru NoteProperty LastName $LastName |
        Add-Member -PassThru NoteProperty EmailAddress $EmailAddress |
        Add-Member -PassThru NoteProperty Description $Description)

    return $Recipient
}

Function SetIdentityRecipientValues {
<#
.SYNOPSIS
    Set recipient identity
.DESCRIPTION
    The SetIdentityRecipientValues cmdlet is used to create customer identity details from input parameters. Once created, the customer details are returned to the caller.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.EXAMPLE
    $CustomerIdentity = SetIdentityRecipientValues
.INPUTS
    None
.OUTPUTS
    PSObject Identity
.LINK
#>

    [string] $TenantID =  $global:MsoAdminProperties['MSO-CompanyTenantInfo']
    [string] $CompanyName = $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName
    [string] $LogonUserEmail = $global:MsoAdminProperties["MSO-LoggedOnUser"].Account

    $Identity = (New-Object PSObject |
        Add-Member -PassThru NoteProperty TenantId $TenantID |
        Add-Member -PassThru NoteProperty CompanyName $CompanyName |
        Add-Member -PassThru NoteProperty LogonUserEmail $LogonUserEmail |
        Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov )

    return $Identity
}

Function SetCreateRequestValues {
<#
.SYNOPSIS
    Create recipient request
.DESCRIPTION
    This cmdlet is intended for customers who are Global Administrators to create customer configuration details object for creating request.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.PARARMETER First name of customer
.PARARMETER Last name of customer
.PARARMETER Email address of customer
.PARARMETER Description of distribution list
.EXAMPLE
    $jsonObj = SetCreateRequestValues -FirstName: $FirstName -LastName: $LastName -EmailAddress: $EmailAddress -Description $Description
.INPUTS
    System.String
.OUTPUTS
    PSobject CustomerObject
.LINK
#>

    param
    (
        [string] $FirstName,
        [string] $LastName,
        [string] $EmailAddress,
        [string] $Description
    )

        $CustomerIdentity =  SetIdentityRecipientValues

        $Recipient = (New-Object PSObject |
                        Add-Member -PassThru NoteProperty FirstName $FirstName |
                        Add-Member -PassThru NoteProperty LastName $LastName |
                        Add-Member -PassThru NoteProperty EmailAddress $EmailAddress |
                        Add-Member -PassThru NoteProperty Description $Description)

        $RecipientArray = @()
        $RecipientArray += $Recipient

        $CustomerObject = (New-Object PSObject |
        Add-Member -PassThru NoteProperty Identity $CustomerIdentity |
        Add-Member -PassThru NoteProperty Recipient $RecipientArray |
        Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov )

        return $CustomerObject
}

Function SetUpdateRequestValues {
<#
.SYNOPSIS
    Update recipient request
.DESCRIPTION
    The SetUpdateRequestValues cmdlet, intended for Global Administrator, is used to create customer details from input parameters. Once created, the customer request-object is returned to the caller.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.PARARMETER First name of customer
.PARARMETER Last name of customer
.PARARMETER Email address of customer
.PARARMETER Description of distribution list
.EXAMPLE
    $jsonObj = SetUpdateRequestValues -RecipientId $RecipientId -FirstName $FirstName -LastName $LastName -EmailAddress $EmailAddress -Description $Description
.INPUTS
    System.String
.OUTPUTS
    PSObject CustomerObject
.LINK
#>

    param
    (
        [string] $FirstName,
        [string] $LastName,
        [string] $EmailAddress,
        [string] $Description
    )

        $CustomerIdentity = SetIdentityRecipientValues

        $CustomerObject = (New-Object PSObject |
        Add-Member -PassThru NoteProperty Identity $CustomerIdentity |
        Add-Member -PassThru NoteProperty FirstName $FirstName |
        Add-Member -PassThru NoteProperty LastName $LastName |
        Add-Member -PassThru NoteProperty EmailAddress $EmailAddress |
        Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov |
        Add-Member -PassThru NoteProperty Description $Description)

        return $CustomerObject
}

function Get-FastTrackMigrationRecipient {
<#
.SYNOPSIS
    Get list of customers recipients
.DESCRIPTION
    The Get-FastTrackMigrationRecipient cmdlet is used to retrieve a list of FastTrack migration recipients, invoking the REST API to retrieve the resulting migration. Get-FastTrackMigrationRecipient returns the webresponse object as a json-object.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.EXAMPLE
    Get-FastTrackMigrationRecipient
.INPUTS
    None
.OUTPUTS
    System.Management.Automation.PSObject
        This cmdlet generates a System.Management.Automation.PSObject object that represents the list of Customer configuration Details.
.LINK
    New-FastTrackMigrationRecipient
    Set-FastTrackMigrationRecipient
    Remove-FastTrackMigrationRecipient
#>

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

        [string]$CustomerId = $global:MsoAdminProperties["MSO-CompanyTenantInfo"]
        $query += "environmentType=$global:MsoComOrGov"

        $header = @{}
        if($global:v2FeatureFlag -eq $true){
        $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())}
        else{
        $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)}
        $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
        Write-Host "Sending Recipient List Request..."

        $JsonResult = Invoke-GetRequest -Uri ([System.String]::Format("{0}{1}/Recipient?$($query)",$global:CsiApiBaseUriFormat,$CustomerId)) -Headers $header

        if($JsonResult.StatusCode -ne $null)
        {
            Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
        }
        else
        {
            Write-Host "Get request completed"
            if($JsonResult.Recipients -ne $null)
            {
                return $JsonResult.Recipients
            }
        }

        return $JsonResult
    }
    catch
    {
        Write-Warning -Message: $_.Exception.Message
        Write-Host "Press the [enter] key to close this process"
        Read-Host
    }
}

function New-FastTrackMigrationRecipient {
<#
.SYNOPSIS
    Creates an new recipient for a FastTrack migration customer
.DESCRIPTION
    The New-FastTrackMigrationRecipient cmdlet is used to create a new FastTrack migration instance with recipient details, invoking the REST API to retrieve the resulting migration once the migration enters "completed" or "failed" status.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.PARAMETER FirstName
    First Name of the customer
.PARAMETER LastName
    Last Name of the customer
.PARAMETER Description
    Description of distribution list
.PARAMETER EmailAddress
    Email Address of the customer
.EXAMPLE
     New-FastTrackMigrationRecipient -FirstName "abc" -LastName "xyz" -EmailAddress "pattif@contoso.net"
     New-FastTrackMigrationRecipient -Description "distribution list" -EmailAddress "pattif@contoso.net"
.INPUTS
    System.String
.OUTPUTS
    System.Management.Automation.PSObject
        This cmdlet generates a System.Management.Automation.PSObject object that represents the Transaction ID .
.LINK
    Get-FastTrackMigrationRecipient
    Set-FastTrackMigrationRecipient
    Remove-FastTrackMigrationRecipient
 
#>

    param(
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $FirstName,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $LastName,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $Description,
            [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
            [string] $EmailAddress
        )

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

        $jsonObj = SetCreateRequestValues -FirstName: $FirstName `
                                    -LastName: $LastName `
                                    -EmailAddress: $EmailAddress `
                                    -Description $Description

        $serializedJson = $jsonObj | ConvertTo-Json -Compress: $true
        $header = @{}
        if($global:v2FeatureFlag -eq $true){
        $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())}
        else{
        $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)}
        $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
        Write-Host "Sending Recipient Create Request..."

        $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("{0}Recipient/Create",$global:CsiApiBaseUriFormat)) -Headers $header -Body $serializedJson

        if($JsonResult.StatusCode -ne $null)
        {
            Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
        }
        else
        {
            Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId)
        }

    }
    catch
    {
        Write-Warning -Message: $_.Exception.Message
        Write-Host "Press the [enter] key to close this process"
        Read-Host
    }

}

function Set-FastTrackMigrationRecipient {
<#
.SYNOPSIS
    Updates a FastTrack migration customer's recipient
.DESCRIPTION
    The Set-FastTrackMigrationRecipient cmdlet is used to create an UpdateRequest object. Once the object is created, the REST API is invoked by Invoke-PutRequest to update the FastTrack migration.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet.
.PARAMETER RecipientId
    An unique GUID that identifies a specific customer configuration.
.PARAMETER FirstName
    First Name of the customer.
.PARAMETER LastName
    Last Name of the customer.
.PARAMETER Description
    Description of distribution list
.PARAMETER EmailAddress
    Email Address of the customer
.EXAMPLE
    Set-FastTrackMigrationRecipient -RecipientId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -FirstName "abc" -LastName "xyz" -EmailAddress "pattif@contoso.net"
    Set-FastTrackMigrationRecipient -RecipientId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -Description "distribution list" -EmailAddress "pattif@contoso.net"
.INPUTS
    System.String
.OUTPUTS
    System.Management.Automation.PSObject
        This cmdlet generates a System.Management.Automation.PSObject object that represents the Transaction ID .
.LINK
    Get-FastTrackMigrationRecipient
    New-FastTrackMigrationRecipient
    Remove-FastTrackMigrationRecipient
#>

    param(
            [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
            [string] $RecipientId,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $FirstName,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $LastName,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $Description,
            [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
            [string] $EmailAddress
        )

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

        try {
            $isError = [GUID]::Parse($RecipientId)
        }
        catch {
            Write-Warning "RecipientId is not a valid GUID format. To obtain the RecipientId , please run 'Get-FastTrackMigrationRecipient' to retrieve a list of all recipients."
            return
        }

        $jsonObj = SetUpdateRequestValues -RecipientId $RecipientId -FirstName $FirstName -LastName $LastName -EmailAddress $EmailAddress -Description $Description

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

        $header = @{}
        if($global:v2FeatureFlag -eq $true){
        $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())}
        else{
        $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)}
        $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
        Write-Host "Sending Recipient Update Request..."

        $JsonResult = Invoke-PutRequest -Uri ([System.String]::Format("{0}Recipient/{1}",$global:CsiApiBaseUriFormat,$RecipientId)) -Headers $header -Body $serializedJson

        if($JsonResult.StatusCode -ne $null)
        {
            Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
        }
        else
        {
            Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId)
        }

    }
    catch
    {
        Write-Warning -Message: $_.Exception.Message
        Write-Host "Press the [enter] key to close this process"
        Read-Host
    }
}

function Remove-FastTrackMigrationRecipient {
<#
.SYNOPSIS
    Removes a recipient from a FastTrack migration customer
.DESCRIPTION
    The Remove-FastTrackMigrationRecipient cmdlet invokes the REST API to remove a recipient from the migration transaction. Waiting-TransactionComplete is invoked to return a "completed" or "failed" status of the REST API transaction request and is returned to the caller.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet.
.PARAMETER RecipientId
    An unique GUID that identifies a specific customer configuration.
.EXAMPLE
    Remove-FastTrackMigrationRecipient -RecipientId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
.INPUTS
    System.String
.OUTPUTS
    System.Management.Automation.PSObject
        This cmdlet generates a System.Management.Automation.PSObject object that represents the Transaction ID .
.LINK
    New-FastTrackMigrationRecipient
    Set-FastTrackMigrationRecipient
    Get-FastTrackMigrationRecipient
 
#>

       param(
                     [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
                     [string] $RecipientId
              )
    try
    {
        try {
            $isError = [GUID]::Parse($RecipientId)
        }
        catch {
            Write-Warning "RecipientId is not a valid GUID format. To obtain the RecipientId, please run Get-FastTrackMigrationRecipient to retrieve a list of all recipients."
            return
        }

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

        $jsonObj = SetIdentityRecipientValues
        $serializedJson = $jsonObj | ConvertTo-Json -Compress: $true

        $header = @{}
        if($global:v2FeatureFlag -eq $true){
        $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())}
        else{
        $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)}
        $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
        Write-Host "Sending Recipient Delete Request..."

        $JsonResult = Invoke-DeleteRequest -Uri ([System.String]::Format("{0}Recipient/{1}", $global:CsiApiBaseUriFormat, $RecipientId)) -Headers $header -Body $serializedJson

        if($JsonResult.StatusCode -ne $null)
        {
            Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
        }
        else
        {
            Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId)
        }

    }
    catch
    {
        Write-Warning -Message: $_.Exception.Message
        Write-Host "Press the [enter] key to close this process"
        Read-Host
    }

}

function Clear-FastTrackMigrationRecipients{
    <#
         .SYNOPSIS
            Allow for the deletion of multiple recipients
        .DESCRIPTION
            This PowerShell is to allow a user to select and delete multiple recipients for a customer
    #>


    $recipientIdentifier = ( Get-FastTrackMigrationRecipient | Out-GridView -Title "Select recipient(s) to remove (Cancel to abort)" -PassThru).RecipientIdentifier
    foreach ($recipientUser in $recipientIdentifier) {Remove-FastTrackMigrationRecipient -RecipientId $recipientUser }
}
# SIG # Begin signature block
# MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCHEsYqLY9K2jPK
# 0vd75UX3nKj8A4wcAJoiEF+EC+EOj6CCDYEwggX/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
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQg34TOnV8M
# 686sinhHvWA9PtjcmvTovuxGEdquITK9he8wQgYKKwYBBAGCNwIBDDE0MDKgFIAS
# AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN
# BgkqhkiG9w0BAQEFAASCAQCBg9JtKhOrnQ03e3+Qn6jdRwWh+G/xwn3hfSnNdTxy
# Ks6Kcc1XdD9QX6HfwE38iuFwpoie9DOoTZUh/CQq11wa9Q4dQR9WuzFRB/eGnfve
# Z8qbW1PPK9xNmriJkW3Q6H6giyeklZdbVqOaip1v2CfgGxG1Xh2Vsmml3uzSLy6q
# ilRvLK5fL4NWooq9EYANd3Aue1oajOeD4pxs44UHJ2+ywzgCadwSjXSuH6EvpbhT
# OryP7/ARKeZQQuZhaHjR/v31+pweVG4DhTuD/b5rmF6WmIphvHdojXiuqdzzm1lA
# HxyzIQF28E4eZooNqq8eaqItoapnss/a/obtxAfDTQBQoYITtzCCE7MGCisGAQQB
# gjcDAwExghOjMIITnwYJKoZIhvcNAQcCoIITkDCCE4wCAQMxDzANBglghkgBZQME
# AgEFADCCAVgGCyqGSIb3DQEJEAEEoIIBRwSCAUMwggE/AgEBBgorBgEEAYRZCgMB
# MDEwDQYJYIZIAWUDBAIBBQAEIG+sOO3o35mIKKnJ7nY0Pvcf7zNHwj7El4jPKw3S
# NFZlAgZcSi285GAYEzIwMTkwMjA2MTgzMDU1LjUyMVowBwIBAYACAfSggdSkgdEw
# gc4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsT
# IE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFs
# ZXMgVFNTIEVTTjozMUM1LTMwQkEtN0M5MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgU2VydmljZaCCDx8wggT1MIID3aADAgECAhMzAAAAzabbOK+9LUEA
# AAAAAADNMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
# MDEwMB4XDTE4MDgyMzIwMjYyNloXDTE5MTEyMzIwMjYyNlowgc4xCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29mdCBP
# cGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjoz
# MUM1LTMwQkEtN0M5MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
# dmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALIajsUUtFeCVgqu
# 0PezmWTxSr1SBomjYc5Xeo1FuiVJKzZSkluQOg+OV2oZFN9lAEfgg/IMs0DgKzcC
# uOOmSj5op694z7bo8knqBC5VHeoMYkqjtkeeYvoRnCr+ZyQZp4KTZmsisyQQgkqy
# AWcjSt4P3a+jZ4DBTXzi6p2sUCiVyU0lQM0kqrBahXMI+aEHdVoGciFCVH6O4iTJ
# 9NuQqykOtOXbyJlbsUtrlIwkvfpVHQWxZ01vW9l3UG3CMI+EgLdItETnTskAktJP
# EPUvs98XfjVxgVRquXbhQpXKi4ECFZCzbym7H1axvPtoHnLGc/+avXtPcXvcQIQ5
# yBbbsdsCAwEAAaOCARswggEXMB0GA1UdDgQWBBS4HfRi4voKkipXIDEE2dC+yfIC
# DjAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEug
# SaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9N
# aWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG
# AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Rp
# bVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG
# CCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IBAQBCQgAqKI99wPi5IOcedjU8nrBa
# QgXQYfjwLEM97A8I7l5Ai6IFywbXku39yQFrON0nBCrbSTULrLy/CuNJU7SGvyr6
# fPp3UFagLxeLKZNApqgZR8YE9mTO9jLSqmPuCGjrJHR4oiNGvqmPIrFstX2l0gcd
# +xFG1nvyQt+BmlHTAwLr7w+HaGTstsQT+ckpaplkOTV0dXfRYo+iRLXb5aKbCimg
# qih0G2TK90Z1DcdbNhAXD1reTve1N5TUrTnyBeVpeaEmGn8uwRRMDpdJMWkYfn5W
# JOBZPDJxcAe53rytSKheRqHvhMNM7b/fzlJ1NlrbR9ad+7vwIGw5yH2q1B+dMIIG
# 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
# TjozMUM1LTMwQkEtN0M5MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaIlCgEBMAkGBSsOAwIaBQADFQCA9et0fWDvdjapvx/uKopPPxqnI6CB
# 3jCB26SB2DCB1TELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEp
# MCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xJzAlBgNV
# BAsTHm5DaXBoZXIgTlRTIEVTTjo0REU5LTBDNUUtM0UwOTErMCkGA1UEAxMiTWlj
# cm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkqhkiG9w0BAQUFAAIF
# AOAFSQAwIhgPMjAxOTAyMDYxOTUyMzJaGA8yMDE5MDIwNzE5NTIzMlowdDA6Bgor
# BgEEAYRZCgQBMSwwKjAKAgUA4AVJAAIBADAHAgEAAgICpjAHAgEAAgIcnDAKAgUA
# 4AaagAIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMBoAowCAIBAAID
# FuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IBAQBA0ENjaNxNI1yzzqM4
# T8Oi+YIBU3NlsNwCD9JhfXeI6NiZv1zwzNxS2M3KlLrN118uewTk3a9STlntCwuV
# aROXkTXjofbvxVq8CmvuMtWFUrHdupBNsCiO/1TV6EFdlktuyyCoufR51p4RYs55
# GaKJr0ljVHolB5C4Qy/P5buV4mZLHt5ROANeoTK9kKxMA1aAUgBjDyDwXlx+TBnF
# OfrKDMqdYknj+jICyDlVf1I9/RgnkvixWFswckNfSUd7sbqcemN8nRXF/seiNmky
# qVwNFnX7WRGX11zvCHhmb0Y6R1kBkgZj6qTFICYDxZSdcaK7ghW+nU+Ivt7bLQAL
# C1psMYIC9TCCAvECAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAC
# EzMAAADNpts4r70tQQAAAAAAAM0wDQYJYIZIAWUDBAIBBQCgggEyMBoGCSqGSIb3
# DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg7cQWByqzXPC9uViC
# Wd6sTc2xbI6bngdr8ErluLk1x5wwgeIGCyqGSIb3DQEJEAIMMYHSMIHPMIHMMIGx
# BBSA9et0fWDvdjapvx/uKopPPxqnIzCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0
# YW1wIFBDQSAyMDEwAhMzAAAAzabbOK+9LUEAAAAAAADNMBYEFKzqnWmkBWHKdSIl
# 0bNmAv+HC5daMA0GCSqGSIb3DQEBCwUABIIBAHlnPgKu0dcU7W4avCBlftKLwPjY
# YPx0yqXUXzasLlSaNiUIB7HqIb3hyNHEGbpiLGp4qjEPFYcB8gV3v2wpi1r07fpY
# tKCyRM8NXRQ90g5SeLKexZSoN1EX/SiZf7IzmtsFdvCUvFcjO3eW51GQBsu7Ancb
# pCdk2AeSMdK+5l6nbMKtpVG3W8u5H9CLQ7HsDCghwzB7oIJ1YF3pVSIxcxraVjon
# +XB3tsvDZbEhqF8KLdKISkjv4O7H1xY6q3cbClToJ7sP7ZS0QEvymhWPCXyFj+PE
# oB3D4NXcqFq+tANMDk/PvKnWw/K13l90YJXx8cgcuWYIV7i7FjevTWzF1h8=
# SIG # End signature block