pester/apikey-manager.tests.ps1

Import-Module $PSScriptRoot\..\AkamaiPowershell.psm1 -DisableNameChecking -Force
# Setup shared variables
$Script:EdgeRCFile = $env:PesterEdgeRCFile
$Script:SafeEdgeRCFile = $env:PesterSafeEdgeRCFile
$Script:Section = 'default'
$Script:TestContract = '1-1NC95D'
$Script:TestGroupID = 131831
$Script:TestCollectionName = "Akamai PowerShell"
$Script:TestCollectionBody = "{
    `"contractId`": `"$TestContract`",
    `"groupId`": $TestGroupID,
    `"name`": `"$TestCollectionName`"
}"

$Script:TestAPIEndpointID = 817948
$Script:TestKey = (New-Guid).Guid
$Script:ImportKeys = '[{"value":"7131e629-41fa-4dfb-9ab9-5e556221b8d5","label":"premium","tags":["external","premium"]}]'
$Script:TestCounterName = 'Akamai PowerShell counter'
$Script:TestCounterBody = "{
    `"enabled`": true,
    `"groupId`": $TestGroupID,
    `"name`": `"$TestCounterName`",
    `"throttling`": 1000,
    `"contractId`": `"$TestContract`",
    `"onOverLimit`": `"DENY`"
}"


Describe 'Safe API Key Manager Tests' {

    BeforeDiscovery {
        
    }

    ### List-APIKeyCollections
    $Script:KeyCollections = List-APIKeyCollections -EdgeRCFile $EdgeRCFile -Section $Section
    it 'List-APIKeyCollections returns a list' {
        $KeyCollections.count | Should -Not -BeNullOrEmpty
    }

    ### New-APIKeyCollection
    $Script:NewCollection = New-APIKeyCollection -Body $TestCollectionBody -EdgeRCFile $EdgeRCFile -Section $Section
    it 'New-APIKeyCollection creates successfully' {
        $NewCollection.name | Should -Be $TestCollectionName
    }

    ### Get-APIKeyCollection
    $Script:Collection = Get-APIKeyCollection -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Get-APIKeyCollection returns the collection collection' {
        $Collection.name | Should -Be $TestCollectionName
    }

    ### Set-APIKeyCollection by pipeline
    $Script:CollectionByPipeline = ( $NewCollection | Set-APIKeyCollection -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section )
    it 'Set-APIKeyCollection by pipeline updates successfully' {
        $CollectionByPipeline.name | Should -Be $TestCollectionName
    }

    ### Set-APIKeyCollection by body
    $Script:CollectionByBody = Set-APIKeyCollection -CollectionID $NewCollection.id -Body (ConvertTo-Json -depth 100 $NewCollection) -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Set-APIKeyCollection by body updates successfully' {
        $CollectionByBody.name | Should -Be $TestCollectionName
    }

    ### Set-APIKeyCollectionACL by pipeline
    $Script:ACLByPipeline = Set-APIKeyCollectionACL -CollectionID $NewCollection.id -ACL @("ENDPOINT-$TestAPIEndpointID") -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Set-APIKeyCollectionACL by pipeline updates successfully' {
        $ACLByPipeline.dirtyACL | Should -Contain "ENDPOINT-$TestAPIEndpointID"
    }

    ### Set-APIKeyCollectionACL by body
    $Script:ACLByBody = Set-APIKeyCollectionACL -CollectionID $NewCollection.id -Body "[`"ENDPOINT-$TestAPIEndpointID`"]" -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Set-APIKeyCollectionACL by body updates successfully' {
        $ACLByBody.dirtyACL | Should -Contain "ENDPOINT-$TestAPIEndpointID"
    }

    $EnabledQuota = $NewCollection.quota
    $EnabledQuota.enabled = $true
    ### Set-APIKeyCollectionQuota by pipeline
    $Script:QuotaByPipeline = ($EnabledQuota | Set-APIKeyCollectionQuota -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section)
    it 'Set-APIKeyCollectionQuota by pipeline updates successfully' {
        $QuotaByPipeline.quota.enabled | Should -Be $true
    }

    ### Set-APIKeyCollectionQuota by body
    $Script:QuotaByBody = Set-APIKeyCollectionQuota -CollectionID $NewCollection.id -Body (ConvertTo-Json -Depth 100 $EnabledQuota) -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Set-APIKeyCollectionQuota by body updates successfully' {
        $QuotaByBody.quota.enabled | Should -Be $true
    }

    ### List-APIKeyCollectionEndpoints
    $Script:Endpoints = List-APIKeyCollectionEndpoints -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section
    it 'List-APIKeyCollectionEndpoints returns a list' {
        $Endpoints.count | Should -Not -Be 0
    }

    ### New-APIKey
    $Script:NewKey = New-APIKey -CollectionID $NewCollection.id -Value $TestKey -Label "Create single" -EdgeRCFile $EdgeRCFile -Section $Section
    it 'New-APIKey creates successfully' {
        $NewKey.value | Should -Be $TestKey
    }

    ### Get-APIKey
    $Script:GetKey = Get-APIKey -KeyID $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Get-APIKey returns the correct key' {
        $GetKey.value | Should -Be $TestKey
    }

    ### Set-APIKey by pipeline
    $Script:SetKeyByPipeline = ($NewKey | Set-APIKey -KeyID $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section)
    it 'Set-APIKey by pipeline returns the correct key' {
        $SetKeyByPipeline.value | Should -Be $TestKey
    }

    ### Set-APIKey by body
    $Script:SetKeyByBody = Set-APIKey -KeyID $NewKey.id -Body (ConvertTo-Json -Depth 100 $NewKey) -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Set-APIKey by body returns the correct key' {
        $SetKeyByBody.value | Should -Be $TestKey
    }

    ### New-APIKeys
    it 'New-APIKey creates successfully' {
        { New-APIKeys -CollectionID $NewCollection.id -Count 2 -Label "Create multiple" -IncrementLabel -EdgeRCFile $EdgeRCFile -Section $Section } | Should -Not -Throw
    }

    ### List-APIKeys
    $Script:Keys = List-APIKeys -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section
    it 'List-APIKeys returns a list of keys' {
        $Keys.items.count | Should -BeGreaterThan 0
    }

    ### Import-APIKey
    it 'Import-APIKey completes successfully' {
        {Import-APIKey -CollectionID $NewCollection.id -Content $ImportKeys -Filename sample.json -EdgeRCFile $EdgeRCFile -Section $Section} | Should -Not -Throw
    }

    ### Reset-APIKeyQuota
    it 'Reset-APIKeyQuota completes successfully' {
        {Reset-APIKeyQuota -Keys $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section} | Should -Not -Throw
    }

    ### Revoke-APIKey
    it 'Revoke-APIKey completes successfully' {
        {Revoke-APIKey -Keys $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section} | Should -Not -Throw
    }

    ### Restore-APIKey
    it 'Restore-APIKey completes successfully' {
        {Restore-APIKey -Keys $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section} | Should -Not -Throw
    }

    ### List-APITags
    $Script:Tags = List-APITags -EdgeRCFile $EdgeRCFile -Section $Section
    it 'List-APIKeys returns a list' {
        $Tags.count | Should -Not -BeNullOrEmpty
    }

    ### List-APIThrottlingCounters
    $Script:Counters = List-APIThrottlingCounters -EdgeRCFile $EdgeRCFile -Section $Section
    it 'List-APIThrottlingCounters returns a list' {
        $Counters.count | Should -Not -BeNullOrEmpty
    }

    ### New-APIThrottlingCounter
    $Script:NewCounter = New-APIThrottlingCounter -Body $TestCounterBody -EdgeRCFile $EdgeRCFile -Section $Section
    it 'New-APIThrottlingCounter creates successfully' {
        $NewCounter.name | Should -Be $TestCounterName
    }

    ### Get-APIThrottlingCounter
    $Script:Counter = Get-APIThrottlingCounter -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Get-APIThrottlingCounter finds the correct counter' {
        $Counter.name | Should -Be $TestCounterName
    }

    ### Set-APIThrottlingCounter by pipeline
    $Script:CounterByPipeline = ($NewCounter | Set-APIThrottlingCounter -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section)
    it 'Set-APIThrottlingCounter by pipeline updates correctly' {
        $CounterByPipeline.name | Should -Be $TestCounterName
    }

    ### Set-APIThrottlingCounter by body
    $Script:CounterByBody = Set-APIThrottlingCounter -CounterID $NewCounter.id -Body (ConvertTo-Json -Depth 100 $NewCounter) -EdgeRCFile $EdgeRCFile -Section $Section
    it 'Set-APIThrottlingCounter by body updates correctly' {
        $CounterByBody.name | Should -Be $TestCounterName
    }

    ### List-APIThrottlingCounterEndpoints
    $Script:CounterEndpoints = List-APIThrottlingCounterEndpoints -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section
    it 'List-APIThrottlingCounterEndpoints returns a list' {
        $CounterEndpoints.count | Should -Not -BeNullOrEmpty
    }

    ### List-APIThrottlingCounterKeys
    $Script:CounterKeys = List-APIThrottlingCounterKeys -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section
    it 'List-APIThrottlingCounterKeys returns a list' {
        $CounterKeys.count | Should -Not -BeNullOrEmpty
    }

    ### Remove-APIThrottlingCounter
    it 'Remove-APIThrottlingCounter removes successfully' {
        { $Script:RemoveCounter = Remove-APIThrottlingCounter -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section } | Should -Not -Throw
    }

    ### Remove-APIKeyCollection
    it 'Remove-APIKeyCollection removes successfully' {
        { $Script:RemoveCollection = Remove-APIKeyCollection -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section } | Should -Not -Throw
    }

    AfterAll {
        
    }
    
}

Describe 'Unsafe API Key Manager Tests' {
    ### Generate-APIKeyReport
    $Script:Report = Generate-APIKeyReport -ReportType rapidkey-by-time -Version 1 -Start 2022-08-13T00:00:00Z -End 2022-08-14T00:00:00Z -Interval HOUR -EdgeRCFile $SafeEdgeRCFile -Section $Section
    it 'Generate-APIKeyReport returns data' {
        $Report.data | Should -Not -BeNullOrEmpty
    }
    
}
# SIG # Begin signature block
# MIIp2AYJKoZIhvcNAQcCoIIpyTCCKcUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA6AAoWNyhveAvC
# I4be9QgkAMEjVZl9BN9bl8PmqyX9TKCCDsEwggawMIIEmKADAgECAhAIrUCyYNKc
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
# yK+p/pQd52MbOoZWeE4wgggJMIIF8aADAgECAhAHIszIesP43uahmQLOEsTtMA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjIwMzEwMDAwMDAwWhcNMjMwMzAx
# MjM1OTU5WjCB3jETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgEC
# EwhEZWxhd2FyZTEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEDAOBgNV
# BAUTBzI5MzM2MzcxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRz
# MRIwEAYDVQQHEwlDYW1icmlkZ2UxIDAeBgNVBAoTF0FrYW1haSBUZWNobm9sb2dp
# ZXMgSW5jMSAwHgYDVQQDExdBa2FtYWkgVGVjaG5vbG9naWVzIEluYzCCAiIwDQYJ
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBALiCVhyjVWQnarv6/Pdf97vrz6idrh6v
# hHMOEaB6CxEnjSEn+ukSkOo1Yuq700EIF3zNtOYNssWNMWHkDMv6HRd4SUgWqObR
# UnsxYIcwuiqBZ7lAJ0tnfDv/I4mnSD0WTmOJyMuyBzhQIPErwgDaYZNwKY8z5r8i
# XLa5LVampC97cm69gQMh7xqeXG5xXkTm84lQ0Ub0l2s6GsFR6EP5NbiufFqhbECs
# sedLu0y788juJZwZuxtfTJ7oAmfnrhZ5nzImGfTmvLVsfnztdf5J4wJqiROTtr/x
# 5qDd7zQEnAwMxIH8K75tUclPmfVw/RHCTHBdjBilFajVghSDsFhYB3gN+MFQwPq8
# tXvyCVtv6tMaxtQ5IlDWcVbde1WrM7Y+F0NYUR37kngc1g19+81068Xf5upoFk+s
# k1nL5lR7Ppl2Rx/CbOAktuDXOjPGpamZDfL6BMpHYC0He1FAnn0urIif014E2wlh
# /6C6Lz3Z7cMq3na/uRZs770bHUDzW5iPqKfviO6It44DvNh3jY0cnUzBq5jbzfVY
# u0yyIg2R8CJro3EWnRwViFVvVGTiToUX2DeAoM/eOYtTVDOZNyKC2XscvuoZiT1H
# FO1RJA+aLsv2J8xVHrnRuKXGstJgJce90z9ONa7hw4ZAJiFkiOKfyJ93jYfMnDGr
# 6Ne9/Z2A+Q/lAgMBAAGjggI1MIICMTAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5h
# ewiIZfROQjAdBgNVHQ4EFgQUwv2lfAnAr+YF8AVrOUgJbp0qCEkwLgYDVR0RBCcw
# JaAjBggrBgEFBQcIA6AXMBUME1VTLURFTEFXQVJFLTI5MzM2MzcwDgYDVR0PAQH/
# BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+G
# TWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVT
# aWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3Js
# NC5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQw
# OTZTSEEzODQyMDIxQ0ExLmNybDA9BgNVHSAENjA0MDIGBWeBDAEDMCkwJwYIKwYB
# BQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYIKwYBBQUHAQEE
# gYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBcBggr
# BgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1
# c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQwDAYDVR0T
# AQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEApw9nsvZn9pJnIuDUfGrB4zLqszHo
# 7B4MkNI/mYXHOXSTtan6JMTReBpef1FeGR1k9NLV0gw5brI0OJEcEmvvaisK7o9s
# G0fI5783FyS/sTEnRrsVVie3+h7THYPHNc/2frleWoZ1BgnfQk+ssK42nO2yJGac
# ucuNh4hP5J9HDRY1FRyv+EVu0ez/P/lopbi3FaWF2uON4JWhj9YfHHmvySHCsSOL
# EzKt+f8C2UzhdvTl1k/HPYZ80gD8tkX+7XFDFbZte7t0AELvSS7AAoli1uk1LAtg
# hJcop2m4izJ6iONfc/jVXeswsOORaNcaQA9VcyuVNgxPpXll4W6haBn20IU+86vo
# 6MDJSpisbJvZ7s+0dhyZhy2nrteAFoLATehF2kWinPejeRKy0HV2a1TNaIUh13fu
# yIaNghUdStF+CoGNXe7h2yQX1qmZWnZWZRQumU44Vq1Wew0tgHGSMUAxwioafojX
# QrEa8S8pYG/675jxqjEXwTt5WoCCWDoSfYkku9qANLxkg1f6ZM5v612w8PEdbJpo
# FtwmfLRA57KZ50IcxCk/yUWyFQkvSyupfRurRTjVFDD0OLYr4JdQVpFzZj8z6Quh
# pxbUv+GUtlRIRe4sfyam/VRhblyXMA3Uea8cveWiwjuEDppEPgsIs4G4WBn7RuFV
# mKw3mUwz0p7xjQIxghptMIIaaQIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQK
# Ew5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBD
# b2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEAcizMh6w/je5qGZ
# As4SxO0wDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG
# 9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIB
# FTAvBgkqhkiG9w0BCQQxIgQgmXgSgEigsQElMztR1iSa+8WASi+mEGED/DnvGmxx
# VxMwDQYJKoZIhvcNAQEBBQAEggIAmBeIsGJ6J73HEmVVhUrEvT2W7I4+By+EqA4m
# 2MyhThjWZPAevEGKUH22aGOd9tn1rlST1Cti+pg6VMShT3zrHUvTiCeBCLvehy28
# 25tVYVHWml7ioVdreU1Jod5A6t7ov4ncSvigRs+Z057jIy/Gqri3TEbMJxINv9NS
# MzI4b8Ccfyc1xTNY7UnAcFMAxm6puuPO0SYYA1WORZUMSfPUaDFZh1o5zwUJwwp2
# LwFJxhOehw3XP+hfMF4kmC/AuvdfMMIJX5cGVtAS+hWE8U+TlMJjlNKygsxq/LGD
# VurQVAHUcFQEiNJEWrocUq9ADG0xs9bGguVMJqLeGVB+gIC4KKRZ2b7NBdYfXIes
# sz+KdkERs/mwVgZhpH7oaFIBC31KAGv7+HFjD8q+goCzuJjQDopDosto1iygJQCa
# 2X8gvThH309cwrtj0ojon/PnWhsgOj9xrKZnf3ivJLSmaOcqT5W4Bfi0ZL+EaG90
# jz7ulbhJPlJBFaPc5CEoPSL4O8Mj7qmN0cJ7X/IZG24gGgiPG2qHfhMLjEklHAP2
# fJ4i6nuErTODZYS55Ejh+zGyifHF4JvPA0vsKY3S98kf7YsraPwVQZVB7bbQiGfR
# culazIxHNszSDeFUYlay+4dwxZsUbhkyM6pQGiOSQqRReijmL8O1XcEqplQ6pOjz
# 3AJEyP+hghdDMIIXPwYKKwYBBAGCNwMDATGCFy8wghcrBgkqhkiG9w0BBwKgghcc
# MIIXGAIBAzEPMA0GCWCGSAFlAwQCAQUAMHcGCyqGSIb3DQEJEAEEoGgEZjBkAgEB
# BglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQgzZoFiPmotWxZGQEVmhpxvEa3
# oO04MfncHlTLS70SAFQCEG4MJp3Rg0ps8Ar6v6GqWTAYDzIwMjIwOTE1MTg0NzE3
# WqCCEw0wggbGMIIErqADAgECAhAKekqInsmZQpAGYzhNhpedMA0GCSqGSIb3DQEB
# CwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkG
# A1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3Rh
# bXBpbmcgQ0EwHhcNMjIwMzI5MDAwMDAwWhcNMzMwMzE0MjM1OTU5WjBMMQswCQYD
# VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJDAiBgNVBAMTG0RpZ2lD
# ZXJ0IFRpbWVzdGFtcCAyMDIyIC0gMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBALkqliOmXLxf1knwFYIY9DPuzFxs4+AlLtIx5DxArvurxON4XX5cNur1
# JY1Do4HrOGP5PIhp3jzSMFENMQe6Rm7po0tI6IlBfw2y1vmE8Zg+C78KhBJxbKFi
# JgHTzsNs/aw7ftwqHKm9MMYW2Nq867Lxg9GfzQnFuUFqRUIjQVr4YNNlLD5+Xr2W
# p/D8sfT0KM9CeR87x5MHaGjlRDRSXw9Q3tRZLER0wDJHGVvimC6P0Mo//8ZnzzyT
# lU6E6XYYmJkRFMUrDKAz200kheiClOEvA+5/hQLJhuHVGBS3BEXz4Di9or16cZjs
# Fef9LuzSmwCKrB2NO4Bo/tBZmCbO4O2ufyguwp7gC0vICNEyu4P6IzzZ/9KMu/dD
# I9/nw1oFYn5wLOUrsj1j6siugSBrQ4nIfl+wGt0ZvZ90QQqvuY4J03ShL7BUdsGQ
# T5TshmH/2xEvkgMwzjC3iw9dRLNDHSNQzZHXL537/M2xwafEDsTvQD4ZOgLUMalp
# oEn5deGb6GjkagyP6+SxIXuGZ1h+fx/oK+QUshbWgaHK2jCQa+5vdcCwNiayCDv/
# vb5/bBMY38ZtpHlJrYt/YYcFaPfUcONCleieu5tLsuK2QT3nr6caKMmtYbCgQRgZ
# Tu1Hm2GV7T4LYVrqPnqYklHNP8lE54CLKUJy93my3YTqJ+7+fXprAgMBAAGjggGL
# MIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAK
# BggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYD
# VR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFI1kt4kh/lZY
# RIRhp+pvHDaP3a8NMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2lj
# ZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBp
# bmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8v
# b2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3Rh
# bXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAA0tI3Sm0fX46kuZPwHk9gzk
# rxad2bOMl4IpnENvAS2rOLVwEb+EGYs/XeWGT76TOt4qOVo5TtiEWaW8G5iq6Gzv
# 0UhpGThbz4k5HXBw2U7fIyJs1d/2WcuhwupMdsqh3KErlribVakaa33R9QIJT4LW
# pXOIxJiA3+5JlbezzMWn7g7h7x44ip/vEckxSli23zh8y/pc9+RTv24KfH7X3pjV
# KWWJD6KcwGX0ASJlx+pedKZbNZJQfPQXpodkTz5GiRZjIGvL8nvQNeNKcEiptucd
# YL0EIhUlcAZyqUQ7aUcR0+7px6A+TxC5MDbk86ppCaiLfmSiZZQR+24y8fW7OK3N
# wJMR1TJ4Sks3KkzzXNy2hcC7cDBVeNaY/lRtf3GpSBp43UZ3Lht6wDOK+EoojBKo
# c88t+dMj8p4Z4A2UKKDr2xpRoJWCjihrpM6ddt6pc6pIallDrl/q+A8GQp3fBmiW
# /iqgdFtjZt5rLLh4qk1wbfAs8QcVfjW05rUMopml1xVrNQ6F1uAszOAMJLh8Ugse
# mXzvyMjFjFhpr6s94c/MfRWuFL+Kcd/Kl7HYR+ocheBFThIcFClYzG/Tf8u+wQ5K
# byCcrtlzMlkI5y2SoRoR/jKYpl0rl+CL05zMbbUNrkdjOEcXW28T2moQbh9Jt0Rb
# tAgKh1pZBHYRoad3AhMcMIIGrjCCBJagAwIBAgIQBzY3tyRUfNhHrP0oZipeWzAN
# BgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg
# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2Vy
# dCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcNMzcwMzIyMjM1OTU5
# WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNV
# BAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1w
# aW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxoY1BkmzwT1y
# SVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+kiPNo+n3znIkLf50f
# ng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+vaPcQXf6sZKz5C3GeO
# 6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RBidx8ald68Dd5n12s
# y+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn7w6lY2zkpsUdzTYN
# XNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAxE6lXKZYnLvWHpo9O
# dhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB3iIU2YIqx5K/oN7j
# PqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNCaJ+2RrOdOqPVA+C/
# 8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklSUPRR8zZJTYsg0ixX
# NXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP015LdhJRk8mMDDtb
# iiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXiYKNYCQEoAA6EVO7O
# 6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQI
# MAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCPnshvMB8GA1UdIwQY
# MBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUE
# DDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6
# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMu
# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDww
# OjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3Rl
# ZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0G
# CSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULhsBguEE0TzzBTzr8Y
# +8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAlNDFnzbYSlm/EUExi
# HQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XNQ1/tYLaqT5Fmniye
# 4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ8NWKcXZl2szwcqMj
# +sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDnmPv7pp1yr8THwcFq
# cdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsdCEkPlM05et3/JWOZ
# Jyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcma+Q4c6umAU+9Pzt4
# rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+8kaddSweJywm228V
# ex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6KYawmKAr7ZVBtzrV
# FZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAjfwAL5HYCJtnwZXZC
# pimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucTDh3bNzgaoSv27dZ8
# /DCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAw
# ZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ
# d3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBS
# b290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UE
# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj
# ZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjAN
# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUu
# ySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8
# Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0M
# G+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldX
# n1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVq
# GDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFE
# mjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6
# SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXf
# SwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b23
# 5kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ
# 6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRp
# L5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
# BBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1R
# i6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYB
# BQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0
# cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB
# LmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADAN
# BgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVe
# qRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3vot
# Vs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum
# 6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJ
# aISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/
# ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3YwggNyAgEBMHcw
# YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD
# EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu
# ZyBDQQIQCnpKiJ7JmUKQBmM4TYaXnTANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG
# 9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIyMDkxNTE4NDcx
# N1owKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUhQjzhlFcs9MHfba0t8B/G0peQd4w
# LwYJKoZIhvcNAQkEMSIEIGiTfMgIxAzQWFGpUx3r9cig1rnSuxYyOElexTvhX6kU
# MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIJ2mkBXDScbBiXhFujWCrXDIj6QpO9tq
# vpwr0lOSeeY7MA0GCSqGSIb3DQEBAQUABIICAGIISP7yQaBTJq5ekK9AtbdET4+R
# WymZwxOu4HQpb5VT15KU7LtZBBMi8kA+dc9Z8lEHZLRrwe5jcX0YqgDMGaneMZ0h
# a35TmBF5e0JphigZMxTUAIux5Y7BzI7STtup7KMph4n94iX1P/j1FyQIa8xI3ucb
# 4enYuFqouW4T8TCJ/bK4Qi27Mg2yi9yRcL19yKvofyA1q9ZQLY9H0zxFyNiIlQiF
# XvMXrLNvSqqOjVzgyGb9Dzd/o8SgWsY1pI+7eBO2AvbYraBGo9PfAp0cO6nB5q2B
# kDv568eJH3QSt80W1qRySh/SRmNyHjQakJDaxeiPMoZQ/aMMZd7Y2aQ1hciXsBtu
# RgO4qnkhSnIkFIb90bMXxX2GUngi8qVPtitU2Qual6rcPkqekMEpEug+v1C1gKUT
# RJNXSN2fbjqRNoGcSRlNy6hbzfMgJ0qlaSlzfcgeO3rYmshoXFMY4g5pP/wj0tAl
# 3WWiXefg8a2gHYbh8uN1M8OWb5w+nnZHDMwRt0Eh/1Xojmq1NxkFmpAvcvzX/iX9
# U783ukeBeppJKLihVPuhFHfd3s/G3zq7LzQC64xJIDmiqspw/jvwmwayy+a5bkJW
# mHNi/kgk1+r8O7SjzmgSnSaQuvG9RtEQe05WqXQSs9kA9A5jsfDdsObG6s5bhINW
# G6wCdx7l8WLWCSCs
# SIG # End signature block