Set-ManagedByTenantForAadds.ps1

<#PSScriptInfo
 
.VERSION 1.0
 
.GUID ab5fb1d9-e8dd-42c9-9a58-552e06e97bdb
 
.AUTHOR aaddsfb@microsoft.com
 
.COMPANYNAME Microsoft Corporation
 
.COPYRIGHT (c) Microsoft Corporation
 
.TAGS Azure-AD-Domain-Services Migration
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    02/18/2023 - Initial release
 
#>


<#
 
.SYNOPSIS
    Uses AzureLighthouse to set up the subscription to be managed by the tenant in order
    to temporarily resolve tenant-subscription mismatch scenario. This allows the classic
    AADDS resource to be migrated to ARM.
 
.DESCRIPTION
    Uses AzureLighthouse to set up the subscription to be managed by the tenant in order
    to temporarily resolve tenant-subscription mismatch scenario. This allows the classic
    AADDS resource to be migrated to ARM.
 
.PARAMETER managedByTenantId [MANDATORY]
    The tenant id of the AADDS instance.
 
.PARAMETER VirtualSubnetName [MANADATORY]
    The subscription id of the AADDS instance.
 
#>


[CmdletBinding()]
Param (
    [Parameter(Mandatory=$true)]
    [string] $managedByTenantId,

    [Parameter(Mandatory=$true)]
    [string] $subscriptionId
)

$VerbosePreference = 'Continue'

# Constants
$armServiceAppId = "443155a6-77f3-45e3-882b-22b3a8d431fb"
$armOpsAppId = "abba844e-bc0e-44b0-947a-dc74e5d09022"
$managedServices = "Microsoft.ManagedServices"
$contributorRoleName = "Contributor"
$contributorRoleId = "b24988ac-6180-42a0-ab88-20f7382dd24c"

$subscriptionScope = "/subscriptions/$subscriptionId"

Write-Verbose "Log on to the Azure AD tenant specified by the AADDS resource's tenant id '$managedByTenantId'"
$context = Connect-AzureAD -TenantId $managedByTenantId

$principalIds = @()
$principalNames = @()

# Obtain admin user's object id
$logonUser = Get-AzureADUser -Filter "userPrincipalName eq '$($context.Account.Id)'" -ErrorAction Ignore
if ($null -eq $logonUser)
{
    Write-Error "Cannot retrieve the object id of the logon user in the tenant '$managedByTenantId'."
    return
}
$adminObjectId = $logonUser.ObjectId
$principalIds += $adminObjectId
$principalNames += "user $($context.Account.Id)"

# Obtain a couple of DCaaS service principals
$appIds = @($armServiceAppId, $armOpsAppId)
foreach ($appId in $appIds)
{
    $app = Get-AzureADServicePrincipal -Filter "AppId eq '$appId'" -ErrorAction Ignore
    if ($null -eq $app)
    {
        Write-Error "Service principal for AppId '$appId' not found."
        return
    }
    $principalIds += $app.ObjectId
    $principalNames += "application $appId"
}

Write-Verbose "Log on to the subscription '$subscriptionId' which contains the AADDS resource"
Connect-AzAccount | Out-Null
Set-AzContext -SubscriptionId $subscriptionId -ErrorAction Stop | Out-Null

$managedServicesRps = Get-AzResourceProvider -ProviderNamespace $managedServices
$registered = $null -ne $managedServicesRps -and ($managedServicesRps | Where-Object { $_.RegistrationState -ne 'Registered'}).Count -eq 0
if ($registered -eq $false)
{
    Write-Verbose "Registering $managedServices ..."
    Register-AzResourceProvider -ProviderNamespace $managedServices -ErrorAction Stop
    Write-Verbose "Registered $managedServices."
}

for ($i = 0; $i -lt $principalIds.Count; $i++)
{
    $principalId = $principalIds[$i]
    $principalName = $principalNames[$i]

    Write-Verbose "Checking ManagedServicesAssignment for $principalName ..."

    $assignment = Get-AzManagedServicesAssignment -Name $principalId -ErrorAction Ignore
    if ($null -eq $assignment)
    {
        $definition = Get-AzManagedServicesDefinition -Name $principalId -ErrorAction Ignore
        if ($null -eq $definition)
        {
            Write-Verbose "Creating ManagedServicesDefinition for $principalName ..."

            $auth = New-AzManagedServicesAuthorizationObject -PrincipalId $principalId -RoleDefinitionId $contributorRoleId
            $definition = New-AzManagedServicesDefinition `
                -Name $principalId `
                -RegistrationDefinitionName "$principalId as $contributorRoleName" `
                -ManagedByTenantId $managedByTenantId `
                -Authorization $auth `
                -Scope $subscriptionScope `
                -Description "$principalName ($principalId) as $contributorRoleName" `
                -ErrorAction Stop
            Write-Verbose "Created ManagedServicesDefinition for $principalName : $($definition.Id)."
        }

        Write-Verbose "Creating ManagedServicesAssignment for $principalName ..."
        $assignment = New-AzManagedServicesAssignment -Name $principalId -RegistrationDefinitionId $definition.Id -ErrorAction Stop
        Write-Verbose "Created ManagedServicesAssignment for $principalName : $($assignment.Id)."
    }
    else
    {
        Write-Verbose "Found ManagedServicesAssignment for $principalName."
    }
}
# SIG # Begin signature block
# MIIrWgYJKoZIhvcNAQcCoIIrSzCCK0cCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBfYzuNOGkkhE0P
# nZjLIgwRGz4J9Trphs2TkwkqYCOMjaCCEXgwggiIMIIHcKADAgECAhM2AAABrtGg
# awyYSKRjAAIAAAGuMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH
# QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe
# Fw0yMjA2MTAxODI3MDRaFw0yMzA2MTAxODI3MDRaMC8xLTArBgNVBAMTJE1pY3Jv
# c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBALKu+NphKS+D7sydHrBfyKPPze6NFPivnznPzn0744z/
# N8+g1/Ta2S/OX1G+6wxfalLcxUOHg+AvojK73NW9m4azxoPBmzavK0BH0bqdESZr
# zOx/XR8LZPZFF+qtn5egvKlX1IWZUKCmEACjphupjlIbZq6mngG7hfPWlS3naegL
# I96m10lTMgek3B8tKVIcu9X/fiS5Br0GEtIOfRuPZMqE1CR+nlCI8cEFSYy1D71b
# IcOOof/7tSQipnYMUNd77+sx+rTPNtvsVqOfJajAd03OrvYjtikJbpdKtFtael4S
# tIUTJrEB/FkTMsY6YjwcxwcUHAVO9IUhU4DS7fC0XTkCAwEAAaOCBYkwggWFMCkG
# CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE
# AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D
# AgFkAgEOMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy
# MENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt
# ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw
# MSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ
# MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYI
# KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwga0GCCsGAQUFBzAChoGg
# bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy
# MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
# QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm
# aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQU2qSRZ/U4+8zhu4qj+cefLecAfY8w
# DgYDVR0PAQH/BAQDAgeAMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQLExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzNjE2OSs0NzA4NjYwggHmBgNVHR8E
# ggHdMIIB2TCCAdWgggHRoIIBzYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
# aWluZnJhL0NSTC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRwOi8vY3Js
# MS5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRwOi8v
# Y3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRw
# Oi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFo
# dHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3Js
# hoG9bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEoMiksQ049QlkyUEtJQ1ND
# QTAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNl
# cyxDTj1Db25maWd1cmF0aW9uLERDPUFNRSxEQz1HQkw/Y2VydGlmaWNhdGVSZXZv
# Y2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50
# MB8GA1UdIwQYMBaAFJZRhOBrb3v+2Aarw/KF5imuavnUMB8GA1UdJQQYMBYGCisG
# AQQBgjdbAwEGCCsGAQUFBwMDMA0GCSqGSIb3DQEBCwUAA4IBAQBHvlNi7Gk6Vqrf
# hyFijoE7EW8Sm3vZVK8Sdz/FuwGlqdL6zuWiL39Ljcl84Za88Sr5F9ybWSq9OmvP
# pC3dyIkAinpGd5K5i19kKYiGgKzLZZ1AsAy7M0f05UcdNb6A3LLw5MrHJU3GjQfL
# Zb4fWlfxVVOzfuhm9bk4/50r/u3a3yrM+2HhqdtJhqhYSuTYEo6EMwyV+UsIWZDb
# qphHduHtmRZjFr1mdubeyd25xucXz95Djg/2IP+7iEqvL3NKKRPMlA4YJs2yaDy/
# XnHqIAmjl09J/J79uBqk+K04OELQFgmFqqaXOPHg7BBGuSO2gIv3JWCN5+GkT80P
# p0KonbVWMIII6DCCBtCgAwIBAgITHwAAAFHqj/accwyoOwAAAAAAUTANBgkqhkiG
# 9w0BAQsFADA8MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYD
# QU1FMRAwDgYDVQQDEwdhbWVyb290MB4XDTIxMDUyMTE4NDQxNFoXDTI2MDUyMTE4
# NTQxNFowQTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FN
# RTEVMBMGA1UEAxMMQU1FIENTIENBIDAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
# MIIBCgKCAQEAyZpSCX0Bno1W1yqXMhT6BUlJZWpa4p3xFeiTHO4vm2Q6C/azR5xw
# xnyYHrkSGDtS2P9X+KDE64V20mmEQkubxnPNeOVnE2RvdPGxgwlq+BhS3ONdVsQP
# j79q7XgHM9HhzB9+qk0PC9KN1zm9p/seyiRS6JF1dbOqRf1pUl7FAVxmgiCFgV8h
# HIb/rDPXig7FDi3S0yEx2CUDVpIq8jEhG8anUFE1WYxM+ni0S5KHwwKPKV4qyGDo
# DO+9AmDoma3Chyu5WDlW5cdtqXTWsGPE3umtnX6AmlldUFLms4OVR4guKf+n5LIB
# CC6bTiocfXPomqYjYTKx7AGMfaVLaaXmhQIDAQABo4IE3DCCBNgwEgYJKwYBBAGC
# NxUBBAUCAwIAAjAjBgkrBgEEAYI3FQIEFgQUEmgkQiFHy9RrvjHPIKTACyN/P0cw
# HQYDVR0OBBYEFJZRhOBrb3v+2Aarw/KF5imuavnUMIIBBAYDVR0lBIH8MIH5Bgcr
# BgEFAgMFBggrBgEFBQcDAQYIKwYBBQUHAwIGCisGAQQBgjcUAgEGCSsGAQQBgjcV
# BgYKKwYBBAGCNwoDDAYJKwYBBAGCNxUGBggrBgEFBQcDCQYIKwYBBQUIAgIGCisG
# AQQBgjdAAQEGCysGAQQBgjcKAwQBBgorBgEEAYI3CgMEBgkrBgEEAYI3FQUGCisG
# AQQBgjcUAgIGCisGAQQBgjcUAgMGCCsGAQUFBwMDBgorBgEEAYI3WwEBBgorBgEE
# AYI3WwIBBgorBgEEAYI3WwMBBgorBgEEAYI3WwUBBgorBgEEAYI3WwQBBgorBgEE
# AYI3WwQCMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAS
# BgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFCleUV5krjS566ycDaeMdQHR
# CQsoMIIBaAYDVR0fBIIBXzCCAVswggFXoIIBU6CCAU+GMWh0dHA6Ly9jcmwubWlj
# cm9zb2Z0LmNvbS9wa2lpbmZyYS9jcmwvYW1lcm9vdC5jcmyGI2h0dHA6Ly9jcmwy
# LmFtZS5nYmwvY3JsL2FtZXJvb3QuY3JshiNodHRwOi8vY3JsMy5hbWUuZ2JsL2Ny
# bC9hbWVyb290LmNybIYjaHR0cDovL2NybDEuYW1lLmdibC9jcmwvYW1lcm9vdC5j
# cmyGgapsZGFwOi8vL0NOPWFtZXJvb3QsQ049QU1FUm9vdCxDTj1DRFAsQ049UHVi
# bGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlv
# bixEQz1BTUUsREM9R0JMP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9v
# YmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludDCCAasGCCsGAQUFBwEBBIIB
# nTCCAZkwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lp
# bmZyYS9jZXJ0cy9BTUVSb290X2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRw
# Oi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJvb3QuY3J0MDcGCCsGAQUF
# BzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJvb3QuY3J0
# MDcGCCsGAQUFBzAChitodHRwOi8vY3JsMS5hbWUuZ2JsL2FpYS9BTUVSb290X2Ft
# ZXJvb3QuY3J0MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8vQ049YW1lcm9vdCxDTj1B
# SUEsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29u
# ZmlndXJhdGlvbixEQz1BTUUsREM9R0JMP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmpl
# Y3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4IC
# AQBQECO3Tw/o317Rrd7yadqcswPx1LvIYymkaTN6KcmuRt6HKa0Xe73Ux2/AQ30T
# fgA9GBJngweRykKBusRzyOU17iIubJvy3gA21dwtqtB0DsoEv1U/ptVu2v++doTC
# J/i+GbssVXkgaX8H+6EOGEmT4evp4GbwR4HwWlc+Dvf8HH8PdUA2Z04CvcwIfckS
# ipbNm84jxJ8XjmTFTWscldL9edj2NsY6iGnyJFIyur2PS7VRYyV3p1VAJp91gj1j
# RQtWEyCB8P5g9nE3z8u0ANaU/hjwEQCrdGyravWgnf2JtG+bT26YAokbc8m+32zU
# tXRO+NK3tAjhOu2FdsG3qNrF4sc7y37R/C+7Pcb/cFfhttqsirepZii4xStcjMOD
# YuXzGm3IJs0b0owHG6oKd7ZOGvHpmmh9K8/DLriD/sq8bURD10qi/wuW8zM7IpLg
# 1vcR9dIK2mc0pj44pc6UX0XbttP/VEJgu3lT2eI9VjWtaKjx38xE9woSMyekPRtz
# TwgfuysF9DkJisr+yA4po/FPxpbBw9c/hBf32DH/GFxteS2pmjgKIbMP8sDukmEq
# 3lVvuWNJsybrZwQvQpvaM49fv+JKpLK5YWYEfwksYRR9wU8Hh/ID9hRCEkbUoQ2W
# 7mMpsp2Nbp/kcn4ivfolUy3Q9Yf0scsQ6WTLYpm+AoCUJTGCGTgwghk0AgEBMFgw
# QTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMG
# A1UEAxMMQU1FIENTIENBIDAxAhM2AAABrtGgawyYSKRjAAIAAAGuMA0GCWCGSAFl
# AwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
# AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCAGWyl96582HQmimQnt
# dl2it+uVZ2Cp7x/2BJK/nm63mTBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMA
# cgBvAHMAbwBmAHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3
# DQEBAQUABIIBAGqH1WQLzUkdCDwxRwANiVYb6DunBFHSN/dmRJ4Uk+xVaUCxUfcx
# QoVheyhJZ8vaMA05u8eOqxM5feylIqxfkBHov4eP/jj9M9lNaa2CzarO4+Ym06B6
# S0qO62KiLbF7XR/sOkG/DoSZ0eqn97UIfPqGrE6WDr7WA+JyF7d0upVZe5GwWqez
# aJ3W25zcAkyTwvFS58rvQ58Ffp5Hgula3loIlnMCf242Vwpy7RTMEE6rj2pdB5Go
# 1ulxfKvUNMCsscNWU3zIfIuzpbR4ohB2+urMjjAJidfkX7GVkI7i70TAMJe3qBYh
# Bpc2zMLIrodUiy4q+WEcvIsFRnNHIwPBfo6hghcAMIIW/AYKKwYBBAGCNwMDATGC
# FuwwghboBgkqhkiG9w0BBwKgghbZMIIW1QIBAzEPMA0GCWCGSAFlAwQCAQUAMIIB
# UQYLKoZIhvcNAQkQAQSgggFABIIBPDCCATgCAQEGCisGAQQBhFkKAwEwMTANBglg
# hkgBZQMEAgEFAAQgLZOQMZBJEUpYY8NLbikE2Z3hc9wt364Wz2wzD8JYqgUCBmPu
# H8jXkxgTMjAyMzAyMjMxOTAzNDguODY1WjAEgAIB9KCB0KSBzTCByjELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0
# IEFtZXJpY2EgT3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046M0JC
# RC1FMzM4LUU5QTExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZp
# Y2WgghFXMIIHDDCCBPSgAwIBAgITMwAAAcYwzS7W06HA9AABAAABxjANBgkqhkiG
# 9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw
# JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yMjExMDQx
# OTAxMzRaFw0yNDAyMDIxOTAxMzRaMIHKMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRp
# b25zMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjozQkJELUUzMzgtRTlBMTElMCMG
# A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcN
# AQEBBQADggIPADCCAgoCggIBAO+9Ijq+r+B5NZt0mY/tQUf4rqH7/n+nlW+x3NtW
# McwM66OBupClxeO2ALBIK1lk9aIL6dCK6BZvAnUWU3/w5UNH2zTTvaQgNNSidN8x
# /NgpZpPc3va9YzydWSWjJ7GZgMu1aWPZjal/XYT751tf2cW24h7+6sMIMPVNkk+Z
# n3KT7rbCP0K/4CwumkyN1AmM4lT2f0H2oPDUISpKR2Ttyq+a/N3Mu48+Dlj8uTNl
# orVr+WySeawU1udfEDxMxcM6vHvD+9tglimSRYzfHrQYLCtOYB3h2jfZJpaWCSS/
# OL/SYml+zRSZDkYQKRBWYlCGmaC8SbeKXAQ83/lg/VAI0SgqwLHif3JM0Lzp/eV+
# DreGrJzrjYXAnXEFnK2aMpBZhGqGJK7A+5/+JxRR8CQylGgWGWS8D4+7sePEtWHv
# nDHHDMXUUo7qBuK6iaqRHeoM389t/b9+i/i7TpUIXy+XJ3JYTUlnZisNUx8npB/e
# kTbTqSBO3PvU57L9WhPYaYXoyzicX7F05MsNBSHYpXNAj+881LKmghhdphV0cC+I
# 319Ucle0BihHjqbxmakCix1WWyw99s7VvC37/fcUNuHf0yMTvS0Xrh7J8KLZ/vAb
# Aq87vv9uLznAPV3KXe5CHluM5lMYRbL+Cgn4qjKbWYYTAANEqg7o9t3I9dLJl0Ti
# 1J4VAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUcV/5R4koRAqdZ9pTGuhtbi7zYJQw
# HwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKg
# UIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0
# JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAw
# XjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# ZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQw
# DAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsF
# AAOCAgEAC8xe9uI17oA1OPOjzAWEewnOmh69pyQ5xrJ5KsGWJo0YtvKr+ktS8u+9
# s8JuQyNfPc4AEPfcYRI1urmJK1+VK7VbuyVED+mwQQSffHNvBQCDyCt35EDQr9q8
# UY30DCUnXMLCXkyuy3dPTrgOYWOD1ggYCaX2O9S3Gl89xUfADTxV+s3CmG4GDma3
# oLaQ7m9+DdEIUe8HPxXJlfoOCNyHUwKDA9v1iOWbHyk8wVJ/1NwKVITcGzpeWEgv
# n/UtS0rW2S8D8zEvnyz1yVEnu0kr7KX0rK/1RHtKEIZmkfub3KvuzC8POtVgVYWK
# Se0weWAUuTkTvV3SG3KWwRcHBz5m/ImakiKlvSaYBu+vuTUFCz1c2e+c+VtkeWYs
# kJLYh6TMI19jjtvWfPp08NrTrFQnMMx/S6BC3nb9z43KW8Dsi47ZtU+Fx2Hd6m3f
# Q16AYzWJEo3Yt+6TaefLvqyE5bSyjo40AicI9RaZ7gWPNuQeQtLgvzWBEhCrE4nB
# I4Uv+LowVy3DRg4VQZdrxxOqmP2FuJMtb3Mqb1K7BvNYKb9vvP4oTsIOMEyzu16o
# pHiIlN2VgFAKDqU5deLXnUKsWx0w73iWEdzlNMigdscH/OxFggG9AiYpoQ5skGih
# L0ldHy1vYlciNMGHBuFdmlTek62eJq/n32qg0A/Rfh6T4T9KZQMwggdxMIIFWaAD
# AgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv
# ZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIy
# MjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5
# vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64
# NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhu
# je3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl
# 3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPg
# yY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I
# 5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2
# ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/
# TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy
# 16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y
# 1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6H
# XtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMB
# AAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQW
# BBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30B
# ATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYB
# BAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMB
# Af8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBL
# oEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv
# TWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggr
# BgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS
# b29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1Vffwq
# reEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27
# DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pv
# vinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9Ak
# vUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWK
# NsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2
# kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+
# c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep
# 8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+Dvk
# txW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1Zyvg
# DbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/
# 2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYICzjCCAjcCAQEwgfihgdCkgc0w
# gcoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsT
# HE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBU
# U1MgRVNOOjNCQkQtRTMzOC1FOUExMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T
# dGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQAtNcrmJiFb7KJEmnCZlnvDLtkB
# baCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3
# DQEBBQUAAgUA56HYKDAiGA8yMDIzMDIyMzIwMTg0OFoYDzIwMjMwMjI0MjAxODQ4
# WjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDnodgoAgEAMAoCAQACAgXYAgH/MAcC
# AQACAhJqMAoCBQDnoymoAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkK
# AwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEFBQADgYEABEur
# cLlrznJMdpIaKdS84sxuTX2jm+dnozKxxggvNnjDyn8dcT3qeZsZUGOTFs0WBg2H
# ajfIYxsWpzMZLz+DsnaceZfbHC7Nme9yEX3ZFzAZxbxBid8X0UVLsMN3vPdp1pwn
# WUL5MMMM1SyaNaupzAuE7ZJwyOCrDQ7pD5Quio0xggQNMIIECQIBATCBkzB8MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNy
# b3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAcYwzS7W06HA9AABAAABxjAN
# BglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8G
# CSqGSIb3DQEJBDEiBCAz+hH4XY+sJNWIqmo+BJsHqInENEDRgQIQBI/s4JyzTzCB
# +gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIFYxE1xVyb2YKcYmapPwcA1gOT8c
# OoXoVC6ZBa/a468tMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh
# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw
# MTACEzMAAAHGMM0u1tOhwPQAAQAAAcYwIgQgK5F1VJNSVXsb7s/sEYJDqs1rLfF/
# a+ZX5RdO3wtlJgAwDQYJKoZIhvcNAQELBQAEggIAIMKzI2j2FeRf23ePw76S/K7h
# iM9JOFzhHCqJedCJnj6J30voC+YF5gCHH/7o3ObahqKUe3BQdgYEGfoXxj0A1lyQ
# 4mKyaBRMT6t2xvfXzOpF3rDYdMU5dtRB2LJhMMgBVxwrKz5EDriN8ySF4HmnujhT
# xKl9YeW2IeC0xfHp9oExQQ1FgtrmBB4AhQNvdz//Km5ZHyjC2HfefuxxgNtq1c7N
# bop964q81U48YfdQwEC4tb67WKFhgVa4gqc6y8OB8FxJmiOVtFw4OTlgwdzp19HU
# iJuatCODNqVS665AOGmHCZCQHNX/KSzMeOozd3Vas5NLmw+5qeYNblUbVjmWCzxg
# oG5a3HjWGau6fWbe0nQ3mSCg8EqdA/Exza/h0tcNkbbD68gEOLZY+r2g8z1mIZVR
# pdTwjLWoUHMbwRsjatF3c/Ac2OmGOGCg3zSOwqtYnEWo0RdyW5N8OzkLzPEZNUAr
# NvCizY4F9GDABWWnlX9JvIkGMm56NEnxrWGwpc5+X5Q0S9oK/4Ln8mX+EC+gp197
# Wi3dDfyGJWwUUigzFKhFuN7LYB2HPds1FIiSf14XJCofYydmGqwDyIpcqupShXiq
# uC183P0B9x1Njn0Hwkwev8htWRUdRbcL4a96vILdBkJMz692WS3Gxs6ryMnYHqfQ
# o7d6yASLjUlR4OYTnQY=
# SIG # End signature block