scripts/Export-IdentityNowConfig.ps1

function Export-IdentityNowConfig {
    <#
.SYNOPSIS
    Export IdentityNow configuration items
 
.DESCRIPTION
    Exports IdentityNow Access Profiles, APIClients, Applications, Cert Campaigns, Email Templates, Governance Groups, Identity Attributes, Identity Profiles, OAuth API Clients, Roles, Rules, Sources, Transforms, VAClusters, to files to make comparisons or check into source control
 
.PARAMETER path
    (Required - string) folder path to export configuration items
 
.PARAMETER Items
    (optional - custom list array) if not specified, all items will be assumed, if specified you can list all items to be exported
 
.PARAMETER NullDynamicValues
    (optional - custom list) if included, will null frequently changing values
    Full = more thurough in nulling values
    Minimal = will leave in some values such as VA version, identity count, account count
     
.EXAMPLE
    Export-IdentityNowConfig -path 'c:\repos\IDN-Prod'
 
.EXAMPLE
    Export-IdentityNowConfig -path 'c:\repos\IDN-Prod' -Items Rules,Roles
 
.EXAMPLE
    Set-IdentityNowOrg myCompanyProd
    Export-IdentityNowConfig -path "C:\repos\IDNConfig\$((Get-IdentityNowOrg).'Organisation Name')"
    Set-IdentityNowOrg myCompanySandbox
    Export-IdentityNowConfig -path "C:\repos\IDNConfig\$((Get-IdentityNowOrg).'Organisation Name')"
 
.EXAMPLE
    #check in changes to git repository, change path to fit your local git repo
    foreach ($org in @('contoso','contosotest')){
        Set-IdentityNowOrg $org
        $path="C:\scripts\IdentityNow\IdentityNow\$((Get-IdentityNowOrg).'Organisation Name')"
        if (-not (test-path $path)){mkdir $path}
        Remove-Item -Path "$path\*" -Recurse
        Export-IdentityNowConfig -path $path -NullDynamicValues Full
    }
    git add .
    git commit -m "auto $((get-date).ToString())"
    git push
 
.LINK
    http://darrenjrobinson.com/sailpoint-identitynow
 
#>


    [cmdletbinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$path,
        [Parameter(Mandatory = $false)]
        [ValidateSet('Minimal', 'Full')]
        [string]$NullDynamicValues,
        [ValidateSet('AccessProfile', 'APIClients', 'Applications', 'CertCampaigns', 'EmailTemplates', 'GovernanceGroups', 'IdentityAttributes', 'IdentityProfiles', 'OAuthAPIClients', 'Roles', 'Rules', 'Sources', 'Transforms', 'VAClusters')]
        [string[]]$Items
    )
    
    if ($PSVersionTable.PSVersion.Major -le 5) { 
        $outputpath = Get-ItemProperty -Path $path 
        if ($outputpath.mode -ne 'd-----') { Write-Error "provided path is not a directory: $outputpath"; break }
    }
    elseif ($PSVersionTable.PSVersion.Major -gt 5) { 
        [System.IO.FileInfo]$outputpath = $path
        if ($outputpath.mode -ne 'd----') { Write-Error "provided path is not a directory: $outputpath"; break }
    }

    if ($null -eq $Items) {
        $Items = @('AccessProfile', 'APIClients', 'Applications', 'CertCampaigns', 'EmailTemplates', 'GovernanceGroups', 'IdentityAttributes', 'IdentityProfiles', 'OAuthAPIClients', 'Roles', 'Rules', 'Sources', 'Transforms', 'VAClusters')
    }
    if ($outputpath.fullname.lastindexof('\') -eq $outputpath.fullname.length - 1) { [System.IO.FileInfo]$outputpath = $outputpath.FullName.Substring(0, $outputpath.FullName.length - 1) }
    if ($Items -contains 'AccessProfile') {
        write-progress -activity 'AccessProfile'
        $AccessProfile = Get-IdentityNowAccessProfile
        if ($NullDynamicValues) {
            #no dynamic values in this output
        }
        #"set-content $($outputpath.FullName)\AccessProfile.json"
        $AccessProfile | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\AccessProfile.json"
    }
    if ($Items -contains 'APIClients') {
        write-progress -activity 'APIClients'
        $APIClients = Get-IdentityNowAPIClient
        $detailedAPIClients = @()
        foreach ($client in $APIClients) {
            $client = Get-IdentityNowAPIClient -ID $client.id
            $detailedAPIClients += $client
        }
        if ($NullDynamicValues) {
            foreach ($client in $detailedAPIClients) {
                if ($client.configuration.cookbook) {
                    $client.configuration.cookbook = $null
                }
                if ($client.configuration.jobType) {
                    $client.configuration.jobType = $null
                }
                if ($client.configuration.va_version) {
                    $client.configuration.va_version = $null
                }
                if ($client.lastSeen) {
                    $client.lastSeen = $null
                }
                if ($client.maintenance) {
                    $client.maintenance.windowStartTime = $null
                    $client.maintenance.windowClusterTime = $null
                    $client.maintenance.windowFinishTime = $null
                }
                if ($client.pollingPeriodTimestamp) {
                    $client.pollingPeriodTimestamp = $null
                }
                if ($client.sinceLastSeen) {
                    $client.sinceLastSeen = $null
                }
                if ($client.clusterJobCount -or $client.clusterJobCount -eq 0) {
                    $client.clusterJobCount = $null
                }
                if ($client.jobs) {
                    $client.jobs = @()
                }
                if ($NullDynamicValues -eq 'Full') {
                    if ($client.va_version) {
                        $client.va_version = $null
                    }
                }
            }
        }
        #"set-content $($outputpath.FullName)\APIClients.json"
        $detailedAPIClients | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\APIClients.json"
    }
    if ($Items -contains 'Applications') {
        write-progress -activity 'Applications'
        $Applications = Get-IdentityNowApplication
        $detailedApplications = @()
        foreach ($app in $Applications) {
            $app = Get-IdentityNowApplication -appID $app.id
            $detailedApplications += $app
        }
        if ($NullDynamicValues) {
            foreach ($app in $detailedApplications) {
                if ($app.health.lastChanged) {
                    $app.health.lastChanged = $null
                }
            }
        }
        #"set-content $($outputpath.FullName)\Applications.json"
        $detailedApplications | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\Applications.json"
    }
    if ($Items -contains 'CertCampaigns') {
        write-progress -activity 'CertCampaigns'
        $CertCampaigns = Get-IdentityNowCertCampaign -completed $true
        $activeCertCampaigns = Get-IdentityNowCertCampaign -completed $false 
        $CertCampaigns += $activeCertCampaigns
        if ($NullDynamicValues) {
            foreach ($campaign in $CertCampaigns) {
                if ($campaign.completedEntities) { $campaign.completedEntities = $null }
                if ($campaign.completedItems) { $campaign.completedItems = $null }
                if ($campaign.finished) { $campaign.finished = $null }
                if ($campaign.percentComplete) { $campaign.percentComplete = $null }
                if ($campaign.phase) { $campaign.phase = $null }
                if ($campaign.status) { $campaign.status = $null }
                if ($campaign.completedCertifications) { $campaign.completedCertifications = $null }
                if ($campaign.totalCertifications) { $campaign.totalCertifications = $null }
            }
        }
        #"set-content $($outputpath.FullName)\CertCampaigns.json"
        $CertCampaigns | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\CertCampaigns.json"
    }
    if ($Items -contains 'EmailTemplates') {
        write-progress -activity 'EmailTemplates'
        $EmailTemplates = Get-IdentityNowEmailTemplate
        if ($NullDynamicValues) {
            foreach ($template in $EmailTemplates) {
                if ($NullDynamicValues -eq 'Full') {
                    if ($template.meta.modified) {
                        $template.meta.modified = $null
                    }
                }                
            }
        }
        #"set-content $($outputpath.FullName)\EmailTemplates.json"
        $EmailTemplates | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\EmailTemplates.json"
    }
    if ($Items -contains 'GovernanceGroups') {
        write-progress -activity 'GovernanceGroups'
        $GovernanceGroups = Get-IdentityNowGovernanceGroup
        if ($NullDynamicValues) {
            foreach ($gGroup in $GovernanceGroups) {
                if ($gGroup.modified) {
                    $gGroup.modified = $null 
                }
            }
        }
        #"set-content $($outputpath.FullName)\GovernanceGroups.json"
        $GovernanceGroups | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\GovernanceGroups.json"
    }
    if ($Items -contains 'IdentityAttributes') {
        write-progress -activity 'IdentityAttributes'
        $IdentityAttributes = Get-IdentityNowIdentityAttribute
        if ($NullDynamicValues) {
            #no dynamic values in this output
        }
        #"set-content $($outputpath.FullName)\IdentityAttributes.json"
        $IdentityAttributes | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\IdentityAttributes.json"
    }
    if ($Items -contains 'IdentityProfiles') {
        write-progress -activity 'IdentityProfiles'
        $idp = Get-IdentityNowProfile
        $detailedIDP = @()
        foreach ($singleidp in $idp) {
            $singleidp = Get-IdentityNowProfile -ID $singleidp.id
            $detailedIDP += $singleidp
        }
        if ($NullDynamicValues) {
            foreach ($singleidp in $detailedIDP) {
                if ($singleidp.source.lastAggregated) {
                    $singleidp.source.lastAggregated = $null                
                }
                if ($singleidp.source.sinceLastAggregated) {
                    $singleidp.source.sinceLastAggregated = $null
                }
                if ($singleidp.report.date) {
                    $singleidp.report.date = $null
                }
                if ($singleidp.report.duration) {
                    $singleidp.report.duration = $null
                }
                if ($singleidp.report.id) {
                    $singleidp.report.id = $null
                }
                if ($NullDynamicValues -eq 'Full') {
                    if ($singleidp.identityCount -or $singleidp.identityCount -eq 0) {
                        $singleidp.identityCount = $null
                    }
                    if ($singleidp.report) {
                        $singleidp.report = $null
                    }
                    foreach ($state in $singleidp.configuredStates) {
                        if ($state.identitycount) {
                            $state.identitycount = $null
                        }
                    }
                }
            }
        }
        #"set-content $($outputpath.FullName)\IdentityProfiles.json"
        $detailedIDP | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\IdentityProfiles.json"
    }
    if ($Items -contains 'OauthAPIClients') {
        write-progress -activity 'OauthAPIClients'
        $OauthAPIClients = Get-IdentityNowOAuthAPIClient
        if ($NullDynamicValues) {
            #need to sort properties
            $proporder = ('id', 'name', 'description', 'enabled', 'type')
            $sortedOauthAPIClients = @()
            foreach ($oauthapi in $OauthAPIClients) {
                $sortedOauthAPIClients += $oauthapi | Select-Object -Property ($proporder + ($oauthapi | Get-Member -MemberType NoteProperty).name.where{ $_ -notin $proporder }  )
            }
            $OauthAPIClients = $SortedOauthAPIClients
        }
        #"set-content $($outputpath.FullName)\OAuthAPIClients.json"
        $OauthAPIClients | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\OAuthAPIClients.json"
    }
    if ($Items -contains 'Roles') {
        write-progress -activity 'Roles'
        $roles = Get-IdentityNowRole
        $detailedroles = @()
        foreach ($role in $roles) {
            $temp = Get-IdentityNowRole -roleID $role.id
            $role | Add-Member -NotePropertyName selector -NotePropertyValue $temp.selector -Force
            $role | Add-Member -NotePropertyName approvalSchemes -NotePropertyValue $temp.approvalSchemes -Force
            $role | Add-Member -NotePropertyName deniedCommentsRequired -NotePropertyValue $temp.deniedCommentsRequired -Force
            $role | Add-Member -NotePropertyName identityCount -NotePropertyValue $temp.identityCount -Force
            $role | Add-Member -NotePropertyName revokeRequestApprovalSchemes -NotePropertyValue $temp.revokeRequestApprovalSchemes -Force
            $detailedroles += $role
        }
        if ($NullDynamicValues) {
            #need to sort roles
            $sortedRoles = $detailedroles | Sort-Object -prop id
            $detailedroles = $sortedRoles
            foreach ($role in $detailedroles) {
                if ($role.synced) {
                    $role.synced = $null
                }
                if ($NullDynamicValues -eq 'Full') {
                    if ($role.modified) {
                        $role.modified = $null
                    }
                    if ($role.identityCount -or $role.identityCount -eq 0) {
                        $role.identityCount = $null
                    }
                }
            }
        }
        #"set-content $($outputpath.FullName)\Roles.json"
        $detailedroles | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\Roles.json"
    }
    if ($Items -contains 'Rules') {
        write-progress -activity 'Rules'
        $rules = Get-IdentityNowRule
        if ($NullDynamicValues) {
            #no dynamic values in this output
        }
        #"set-content $($outputpath.FullName)\Rules.json"
        $rules | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\Rules.json"
    }
    if ($Items -contains 'Sources') {
        write-progress -activity 'Sources'
        $sources = Get-IdentityNowSource
        $detailedsources = @()
        foreach ($source in $sources) {
            Write-Verbose "$($source.name)($($source.id))"
            write-progress -activity "Sources" -status "$($source.name)($($source.id)) details"
            do {
                $temp = $null
                $temp = Get-IdentityNowSource -sourceID $source.id
                Start-Sleep -Milliseconds 100
            }until($null -ne $temp)
            $source = $temp
            Write-Verbose "getting account profiles"
            write-progress -activity "Sources" -status "$($source.name)($($source.id)) account profiles"
            $source | Add-Member -NotePropertyName 'accountProfiles' -NotePropertyValue (Get-IdentityNowSource -sourceID $source.id -accountProfiles) -Force
            Write-Verbose "getting schema"
            write-progress -activity "Sources" -status "$($source.name)($($source.id)) schema"
            $source | Add-Member -NotePropertyName 'Schema' -NotePropertyValue (Get-IdentityNowSourceSchema -sourceID $source.id) -Force
            $detailedsources += $source
        }
        if ($NullDynamicValues) {
            $detailedsources | Add-Member -NotePropertyName hasFullAggregationCompleted -NotePropertyValue $null -Force
            foreach ($source in $detailedsources) {
                if ($source.health.since) {
                    $source.health.since = $null
                }
                if ($source.health.lastSeen) {
                    $source.health.lastSeen = $null
                }
                if ($source.health.hostname) {
                    $source.health.hostname = $null
                }
                if ($source.health.lastChanged) {
                    $source.health.lastChanged = $null
                }
                if ($source.cloudCacheUpdate) {
                    $source.cloudCacheUpdate = $null
                }
                if ($source.groupDeltaLink) {
                    $source.groupDeltaLink = $null
                }
                if ($source.accountDeltaLink) {
                    $source.accountDeltaLink = $null
                }
                if ($source.acctAggregationStart) {
                    $source.acctAggregationStart = $null
                }
                if ($source.acctAggregationEnd) {
                    $source.acctAggregationEnd = $null
                }
                if ($source.lastAggrgationDateTime) {
                    $source.lastAggrgationDateTime = $null
                }
                if ($source.access_token) {
                    $source.access_token = $null
                }
                if ($source.access_token_create_time) {
                    $source.access_token_create_time = $null
                }
                if ($source.entitlementsCount -or $source.entitlementsCount -eq 0) {
                    $source.entitlementsCount = $null
                }
                if ($source.deltaAggregation) {
                    $source.deltaAggregation = $null
                }
                if ($source.expires_in) {
                    $source.expires_in = $null
                }
                if ($source.health.type) {
                    $source.health.type = $null
                }
                foreach ($sku in $source.subscribedSkus) {
                    if ($sku.consumedUnits -or $sku.consumedUnits -eq 0) {
                        $sku.consumedUnits = $null
                    }
                    if ($NullDynamicValues -eq 'Full') {
                        if ($sku.prepaidUnits.enabled -or $sku.prepaidUnits.enabled -eq 0) {
                            $sku.prepaidUnits.enabled = $null
                        }
                        if ($sku.prepaidUnits.suspended -or $sku.prepaidUnits.suspended -eq 0) {
                            $sku.prepaidUnits.suspended = $null
                        }
                        if ($sku.prepaidUnits.warning -or $sku.prepaidUnits.warning -eq 0) {
                            $sku.prepaidUnits.warning = $null
                        }
                    }
                }
                if ($NullDynamicValues -eq 'Full') {
                    if ($source.userCount -or $source.userCount -eq 0) {
                        $source.userCount = $null
                    }
                    if ($source.accountsCount -or $source.accountsCount -eq 0) {
                        $source.accountsCount = $null
                    }
                    if ($source.uncorrelatedAccountsFileFeedHistory) {
                        $source.uncorrelatedAccountsFileFeedHistory = @()
                    }
                }
            }
        }
        #"set-content $($outputpath.FullName)\Sources.json"
        $detailedsources | convertto-json -depth 12 | Set-Content "$($outputpath.FullName)\Sources.json"
    }    
    if ($Items -contains 'Transforms') {
        write-progress -activity 'Transforms'
        $transforms = Get-IdentityNowTransform
        if ($NullDynamicValues) {
            #no dynamic values in this output
        }
        #"set-content $($outputpath.FullName)\Transforms.json"
        $transforms | convertto-json -depth 12 | Set-Content "$($outputpath.FullName)\Transforms.json"
    }
    if ($Items -contains 'VAClusters') {
        write-progress -activity 'VAClusters'
        $VAClusters = Get-IdentityNowVACluster
        if ($NullDynamicValues) {
            foreach ($vac in $VAClusters) {
                if ($vac.pollingPeriodTimestamp) {
                    $vac.pollingPeriodTimestamp = $null
                }
                if ($vac.configuration.va_version) {
                    $vac.configuration.va_version = $null
                }
                if ($vac.configuration.jobType) {
                    $vac.configuration.jobType = $null
                }
                if ($vac.configuration.cookbook) {
                    $vac.configuration.cookbook = $null
                }
                if ($vac.va_version) {
                    $vac.va_version = $null
                }
                if ($vac.maintenance.windowStartTime) {
                    $vac.maintenance.windowStartTime = $null
                }
                if ($vac.maintenance.windowClusterTime) {
                    $vac.maintenance.windowClusterTime = $null
                }
                if ($vac.maintenance.windowFinishTime) {
                    $vac.maintenance.windowFinishTime = $null
                }
                if ($vac.jobs) {
                    $vac.jobs = @()
                }
                if ($vac.clients) {
                    $vac.clients = $vac.clients | Sort-Object -Property id
                }
            }
        }
        #"set-content $($outputpath.FullName)\VAClusters.json"
        $VAClusters | convertto-json -depth 10 | Set-Content "$($outputpath.FullName)\VAClusters.json"
    }
}
# SIG # Begin signature block
# MIINSwYJKoZIhvcNAQcCoIINPDCCDTgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUJjQBHAjxiG6F95ag7mW4wWWQ
# VZygggqNMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1U0O1b5VQCDANBgkqhkiG9w0B
# AQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk
# IElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcNMjgxMDIyMTIwMDAwWjByMQsw
# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
# ZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQg
# Q29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
# +NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid2zLXcep2nQUut4/6kkPApfmJ
# 1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sjlOSRI5aQd4L5oYQjZhJUM1B0
# sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjfDPXiTWAYvqrEsq5wMWYzcT6s
# cKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzLfnQ5Ng2Q7+S1TqSp6moKq4Tz
# rGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR93O8vYWxYoNzQYIH5DiLanMg
# 0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckwEgYDVR0TAQH/BAgwBgEB/wIB
# ADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMweQYIKwYBBQUH
# AQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYI
# KwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz
# c3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmw0
# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaG
# NGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RD
# QS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0
# dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMwHQYDVR0OBBYE
# FFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6en
# IZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1aJLPzItEVyCx8JSl2qB1dHC06
# GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUPUbRupY5a4l4kgU4QpO4/cY5j
# DhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1UcKNJK4kxscnKqEpKBo6cSgC
# PC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjFEmifz0DLQESlE/DmZAwlCEIy
# sjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM1ekN3fYBIM6ZMWM9CBoYs4Gb
# T8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhsRDKyZqHnGKSaZFHvMIIFVTCC
# BD2gAwIBAgIQDOzRdXezgbkTF+1Qo8ZgrzANBgkqhkiG9w0BAQsFADByMQswCQYD
# VQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGln
# aWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29k
# ZSBTaWduaW5nIENBMB4XDTIwMDYxNDAwMDAwMFoXDTIzMDYxOTEyMDAwMFowgZEx
# CzAJBgNVBAYTAkFVMRgwFgYDVQQIEw9OZXcgU291dGggV2FsZXMxFDASBgNVBAcT
# C0NoZXJyeWJyb29rMRowGAYDVQQKExFEYXJyZW4gSiBSb2JpbnNvbjEaMBgGA1UE
# CxMRRGFycmVuIEogUm9iaW5zb24xGjAYBgNVBAMTEURhcnJlbiBKIFJvYmluc29u
# MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwj7PLmjkknFA0MIbRPwc
# T1JwU/xUZ6UFMy6AUyltGEigMVGxFEXoVybjQXwI9hhpzDh2gdxL3W8V5dTXyzqN
# 8LUXa6NODjIzh+egJf/fkXOgzWOPD5fToL7mm4JWofuaAwv2DmI2UtgvQGwRhkUx
# Y3hh0+MNDSyz28cqExf8H6mTTcuafgu/Nt4A0ddjr1hYBHU4g51ZJ96YcRsvMZSu
# 8qycBUNEp8/EZJxBUmqCp7mKi72jojkhu+6ujOPi2xgG8IWE6GqlmuMVhRSUvF7F
# 9PreiwPtGim92RG9Rsn8kg1tkxX/1dUYbjOIgXOmE1FAo/QU6nKVioJMNpNsVEBz
# /QIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoKo6XqcQPAYPkt9mV1Dlgw
# HQYDVR0OBBYEFOh6QLkkiXXHi1nqeGozeiSEHADoMA4GA1UdDwEB/wQEAwIHgDAT
# BgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWgM6Axhi9odHRwOi8vY3Js
# My5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcxLmNybDA1oDOgMYYvaHR0
# cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1nMS5jcmwwTAYD
# VR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cu
# ZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsGAQUFBwEBBHgwdjAkBggr
# BgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME4GCCsGAQUFBzAChkJo
# dHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyQXNzdXJlZElE
# Q29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOC
# AQEANWoHDjN7Hg9QrOaZx0V8MK4c4nkYBeFDCYAyP/SqwYeAtKPA7F72mvmJV6E3
# YZnilv8b+YvZpFTZrw98GtwCnuQjcIj3OZMfepQuwV1n3S6GO3o30xpKGu6h0d4L
# rJkIbmVvi3RZr7U8ruHqnI4TgbYaCWKdwfLb/CUffaUsRX7BOguFRnYShwJmZAzI
# mgBx2r2vWcZePlKH/k7kupUAWSY8PF8O+lvdwzVPSVDW+PoTqfI4q9au/0U77UN0
# Fq/ohMyQ/CUX731xeC6Rb5TjlmDhdthFP3Iho1FX0GIu55Py5x84qW+Ou+OytQcA
# FZx22DA8dAUbS3P7OIPamcU68TGCAigwggIkAgEBMIGGMHIxCzAJBgNVBAYTAlVT
# MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
# b20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25p
# bmcgQ0ECEAzs0XV3s4G5ExftUKPGYK8wCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcC
# AQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYB
# BAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFC2l3u+cllWv
# nGRGL7g/hZcfWP87MA0GCSqGSIb3DQEBAQUABIIBALjt8wQkGa/dXqBjzhrN1zOp
# 9uuldci+467Dj4L4qWVT8VV6B3CaPn5z2T3ylA2dmmzw0NFR1WY2DTasaHbWjNqi
# lJFu0OfCEhshbYyCtKlbB/hwMgXuUs8OB3E7a4i8xiiOV2Y10UbC5+2FyP41LM58
# /ZzuZKxiCRfhZ0CFDuYjdcdUwGh6g3N/CFRcmj0BVys/+KrVwKxgY69xxq4cTfmy
# 7U1Ylkdf7jOPR5tbTnqmCT26D/U7/ZBElotIgU7R5pld0Iyk3hhxwyslX9VnCdB7
# Gv9hXK1WKIdD+V2Uq55pfXSJvOonn6I7s6SCJjmzS9xaUAzdSBuFzCzh5W5jnU0=
# SIG # End signature block