MSCommerce.Tests.ps1

# Pester smoke tests for the MSCommerce PowerShell module.
#
# Scope: fast smoke coverage to fail early on MSAL upgrade regressions,
# accidental public-API changes, and broken WAM dependency wiring.
# Does NOT exercise live authentication or mock IPublicClientApplication.
#
# Run locally:
# Invoke-Pester .\MSCommerce.Tests.ps1
#
# Tested with Pester 5.x on Windows.

BeforeDiscovery {
    $script:ExpectedFunctions = @(
        'Connect-MSCommerce',
        'Get-MSCommercePolicies',
        'Get-MSCommercePolicy',
        'Get-MSCommerceProductPolicies',
        'Get-MSCommerceProductPolicy',
        'Update-MSCommerceProductPolicy'
    )
}

BeforeAll {
    $script:ModuleRoot = $PSScriptRoot
    $script:ManifestPath = Join-Path $script:ModuleRoot 'MSCommerce.psd1'
}

Describe 'MSCommerce module loading' {
    It 'manifest file exists' {
        Test-Path $script:ManifestPath | Should -Be $true
    }

    It 'passes Test-ModuleManifest (catches missing PowerShellVersion when CompatiblePSEditions is set, PS Gallery publish validation)' {
        { Test-ModuleManifest $script:ManifestPath -ErrorAction Stop } | Should -Not -Throw
    }

    It 'imports without error' {
        Get-Module MSCommerce | Remove-Module -Force -ErrorAction SilentlyContinue
        { Import-Module $script:ManifestPath -Force -ErrorAction Stop } | Should -Not -Throw
    }

    It 'is re-importable in the same session (idempotent Add-Type)' {
        Import-Module $script:ManifestPath -Force -ErrorAction Stop
        { Import-Module $script:ManifestPath -Force -ErrorAction Stop } | Should -Not -Throw
    }

    It 'reports the expected ModuleVersion' {
        Import-Module $script:ManifestPath -Force -ErrorAction Stop
        (Get-Module MSCommerce).Version.ToString() | Should -BeLike '3.*'
    }

    It 'advertises both Desktop and Core editions' {
        Import-Module $script:ManifestPath -Force -ErrorAction Stop
        $editions = (Get-Module MSCommerce).CompatiblePSEditions
        $editions | Should -Contain 'Desktop'
        $editions | Should -Contain 'Core'
    }
}

Describe 'WAM dependency types resolve' {
    BeforeAll {
        Import-Module $script:ManifestPath -Force -ErrorAction Stop
    }

    It 'Microsoft.Identity.Client.BrokerOptions is loaded' {
        { [Microsoft.Identity.Client.BrokerOptions] } | Should -Not -Throw
    }

    It 'Microsoft.Identity.Client.Broker.BrokerExtension is loaded' {
        { [Microsoft.Identity.Client.Broker.BrokerExtension] } | Should -Not -Throw
    }

    It 'Microsoft.Identity.Client.PublicClientApplicationBuilder is loaded' {
        { [Microsoft.Identity.Client.PublicClientApplicationBuilder] } | Should -Not -Throw
    }

    It 'MSCommerceNativeMethods P/Invoke type is loaded' {
        { [MSCommerceNativeMethods] } | Should -Not -Throw
    }

    It 'MSCommerceNativeMethods.GetConsoleOrTerminalWindow exists' {
        [MSCommerceNativeMethods].GetMethod('GetConsoleOrTerminalWindow') | Should -Not -BeNullOrEmpty
    }
}

Describe 'Public API contract' {
    BeforeAll {
        Import-Module $script:ManifestPath -Force -ErrorAction Stop
    }

    It 'exports <_>' -ForEach $ExpectedFunctions {
        Get-Command -Module MSCommerce -Name $_ -ErrorAction SilentlyContinue | Should -Not -BeNullOrEmpty
    }

    It 'Connect-MSCommerce no longer accepts -RedirectUri (SR13 mitigation, ICM 796868403)' {
        (Get-Command Connect-MSCommerce).Parameters.ContainsKey('RedirectUri') | Should -Be $false
    }

    It 'Connect-MSCommerce exposes -ClientId' {
        (Get-Command Connect-MSCommerce).Parameters.ContainsKey('ClientId') | Should -Be $true
    }

    It 'Connect-MSCommerce exposes -Resource' {
        (Get-Command Connect-MSCommerce).Parameters.ContainsKey('Resource') | Should -Be $true
    }
}

# SIG # Begin signature block
# MIIo2QYJKoZIhvcNAQcCoIIoyjCCKMYCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBFgN9A3DP3dM/h
# uTWGVZxJ0ZWE5P7YpD8g4cafuBjIjKCCDcMwggatMIIElaADAgECAhMzAAAA0wKI
# 2Gm93wIJAAAAAADTMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMzAxBgNVBAMTKkF6dXJlIFJTQSBQ
# dWJsaWMgU2VydmljZXMgQ29kZSBTaWduaW5nIFBDQTAeFw0yNjAzMDUxOTA2MTla
# Fw0yNzAzMDMxOTA2MTlaMIGCMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSwwKgYDVQQDEyNBenVyZSBQdWJsaWMgU2VydmljZXMgUlNBIENvZGUg
# U2lnbjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMmsOxnEYc0FiPlE
# +RHIYQgZmVwJCSoTtJ0ZrpzYU8Awa7Ukuoe6vyo1aNHmzB6QwyfRZLPb5ATRzzjz
# Ae+pVUulZX5SfdDTUOfLOOJ9p7iH6TOFBNQiFfaspBsYd2oF7stfIKCR8OtM0tew
# jXEBcDADjYCv4+lV3WS2otKwzqnCqsz8UV8SLOX2HmC2sQhk4On6Oj28RLEq8can
# 8h9xrt78iW4N4l98/gwT98W1TNQIsf8jB66CJRyxpOZ7BKfLih1gu2Zkr/OkG4+M
# ZMulSefgczJZctRI4WWC8WssoI9nFs3FfEGjkRSq7OsVumD02ZBWKklCwoNIo0eW
# 5PA2Jwi0WlmmI8xztjYsbXV00CKXfIkQEsUxD/lGpCm1xaaBIqgbxPHvH5EJhCPh
# KOXbIm37g7KRWf3+RDnCjq/pOYgcdmwp2aAiQwIoG4hFwHYVobAtj5QYw/XGaLAh
# p6SCNSBXBdfwq//ZJgj1deuPJQwTg0uPQlMEg7thfbTWBhg4vwIDAQABo4IBuTCC
# AbUwDgYDVR0PAQH/BAQDAgeAMB8GA1UdJQQYMBYGCCsGAQUFBwMDBgorBgEEAYI3
# WwEBMB0GA1UdDgQWBBToMh9qoEACbff9AUkZiJ9lR5AHcDBFBgNVHREEPjA8pDow
# ODEeMBwGA1UECxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMRYwFAYDVQQFEw00Njk5
# ODErNTA3MTgxMB8GA1UdIwQYMBaAFPEvupEWfN59Uicx9Xr71VhZaTo9MG8GA1Ud
# HwRoMGYwZKBioGCGXmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js
# L0F6dXJlJTIwUlNBJTIwUHVibGljJTIwU2VydmljZXMlMjBDb2RlJTIwU2lnbmlu
# ZyUyMFBDQS5jcmwwfAYIKwYBBQUHAQEEcDBuMGwGCCsGAQUFBzAChmBodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL0F6dXJlJTIwUlNBJTIwUHVi
# bGljJTIwU2VydmljZXMlMjBDb2RlJTIwU2lnbmluZyUyMFBDQS5jcnQwDAYDVR0T
# AQH/BAIwADANBgkqhkiG9w0BAQwFAAOCAgEAokRajG6jg8NQ4+ul6plkF1wQGMih
# hBmNK8QgxN3R9x/z2tY39+vpxsCzd9m1HUtDaRFajaZiLGYBCmbqKMBi7dCD780g
# eh++I5UIOoeZpAYSLCKgGxvsS31XsH2uqySwmyVPIIlQli4hdoq/fuy48LtwWldp
# pZo0ufSO7PWw8p2SW9M7bd/BxqGBE72ep32BOL2Pp3D+cQlRFajfZ2X6vF3KWe5F
# 3pEemQkp2U9VdGuv9kvyxvJqSgJQ3jM1WK9QwuZSylhEkhXZOmRmidCeuZObpOlc
# ZWAKOPnp25PNVr8ZEAotUEc2byN7p6yOCizC/p4eZiSaAlGO9n54c2Wgudd+oHKD
# cLEnQZ36eNrlFNq9imUhz3N86Co2Dl7o1bwTRD8AjXXlZ+kz6dxZ6dap0+zVguKf
# JR1EPGINOaFhPI3WncWiMa3Iz6atBUi8LaXzNCv8s0JO/P92PaFaqwX/tIOcrjAT
# zXZgCnqk9+C2voF9UPQswm76zp/Y9d6guyQDgBzY+gnPk3sWZ5jtafmyFkF/iE6o
# Imyx3lkGlRu0ZiHeIKdBIk/0SiSjFXF7sPkeaSpNE2deogNDnNbpsvdIMJgUQbkR
# a2pX1i13QyOmXH+zn7DVOdhtcgps/OLgedvdevSbxicy5XKGbEbIdnYKMylByWCh
# yzZA2w7Kvt68sYMwggcOMIIE9qADAgECAhMzAAAAArLEk4h4WezTAAAAAAACMA0G
# CSqGSIb3DQEBDAUAMFsxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xLDAqBgNVBAMTI01pY3Jvc29mdCBSU0EgU2VydmljZXMgUm9v
# dCBDQSAyMDIxMB4XDTIxMDkwMjE3NDExOVoXDTM2MDkwMjE3NTExOVowYjELMAkG
# A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEzMDEGA1UE
# AxMqQXp1cmUgUlNBIFB1YmxpYyBTZXJ2aWNlcyBDb2RlIFNpZ25pbmcgUENBMIIC
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApd39LL3WcWCx5Uk4WB5GFXGt
# xqHKnVgZI3QWk4SARERVvc0P9CAjsjTJ3tcbo4TxWiavkUzG8rxO8ngtzos/0EPP
# YZJrUzQuXMcpfvnv/bgLRmd3NxwDWpCLTT4GaY6vimWbFHNMW/g+F3DzIE8X0YO8
# KWpXwBK+9uK1+NoPt1U84Utvs3t++3+paiAY3l6KzQVcKpUl2Y9llpfaHiIbSi2w
# CF+rzK9KUnRjA7iLkYN4tDBOww3VF/ZQAdAoJRiQWwtJDSaptpFsNmEH7akUv+r9
# zZrqGUcudqljJ/CU0VeQOHAAVYTN/AUcRHahHjZRrJ8322w7+na1aTfcKucd2d0k
# OshnqhDcP42CiX9NHwECBcIgzqx7piUsNOzFHCH1BQOrspWErLnwcYolSrCAhbQT
# ty+XNSXQd+395uEAtnIUOSGh/0LkKrhz/jzpcuNCrSdu4qwU2FBTTK8AFHd6iHDr
# cqmzrpSZrjygTQmao7GbOs++shNhyycHIqV6Ief7jKr5Oz8qu2qRDBBy6KQw+tnB
# cK2xiTExTJSfyCvyh7DbZYN4hAQIAzULP1Nx0lp2ytOgqpdBrZsCf8AAEBjKiA88
# 418a+iNMjcOVgPjZ60xr+A95klq9f7PvHx3/h5gGcn1YVKL2rS/68s4Zzd/IzYpC
# 2rl5VsdfmtXJZzpsnfkCAwEAAaOCAcIwggG+MBAGCSsGAQQBgjcVAQQDAgEAMB0G
# A1UdDgQWBBTxL7qRFnzefVInMfV6+9VYWWk6PTBUBgNVHSAETTBLMEkGBFUdIAAw
# QTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9E
# b2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsG
# A1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFA4MsWRpvS2x
# 1WsmpkfqVk6Aw+2KMGYGA1UdHwRfMF0wW6BZoFeGVWh0dHA6Ly93d3cubWljcm9z
# b2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFJTQSUyMFNlcnZpY2VzJTIw
# Um9vdCUyMENBJTIwMjAyMS5jcmwwcwYIKwYBBQUHAQEEZzBlMGMGCCsGAQUFBzAC
# hldodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m
# dCUyMFJTQSUyMFNlcnZpY2VzJTIwUm9vdCUyMENBJTIwMjAyMS5jcnQwDQYJKoZI
# hvcNAQEMBQADggIBAGKfs8wGdeOcgnTH74ue50sNZadnx1mYnXgO5l9Syz92hROE
# sAzhyusdpNsmi6VRQQs13YCc6lf9ni16dQxPeyNgh09jIl8hhY9Gp8jo1vP4lUrt
# FG+faeXkQQwi5ETpQpL1kYFt/TZruxvTgT/sE382GGua1L+1UWN9GutWH3NeS7jm
# upa4LBRPODcSrEpDw4Zu2MFC2r9LJv9yWbkEeyiHdeEydv1Uu/cbV241/3QUvn+j
# zxdngvXyfHWV+TLaeWVjgcgDw8rwBquoBbiIpJMDcQaqfyz/jta1ApP6oQPZhtld
# U5gv4vu9AMKcVvCGADHq5y4zPsB7WuqJuDcCOwLtTkzegD++oAcMoMDeZ0zkPov9
# kR1CBobbQeFQ5JD4KJAPdPIdKJUJ9Uy5O/zciIoKeLctb/be0cLa1s3nuuWExyjK
# MiL4hV3uPuzjUwUFoPAmuZ9ef9gz6VH/lCq87vNYBtuv9dTnfW/eOv+MGKWauq3p
# T9vvLxNfID2djFX2JIwWZxvIiLbGB1wAeHGeldy9y/IVYRPpiImLJ5IlnDAm/yDB
# eIEX5mHQgcCuXopWxsB2wBO4/VMIQGk/KddmaS+IgRY+2e/fXlmNMLuc+g6lKc5V
# o7vBnO2s559m6cjl8HHDuYbWjKhGcANlrCIWxWj0n9wO7XkStEJ8NBGHBKIFMYIa
# bDCCGmgCAQEweTBiMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMTMwMQYDVQQDEypBenVyZSBSU0EgUHVibGljIFNlcnZpY2VzIENv
# ZGUgU2lnbmluZyBQQ0ECEzMAAADTAojYab3fAgkAAAAAANMwDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINiCOOEdlu7bhSRsA9wwSFQx
# nY0AZB0jRrb1HuhCGLAYMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggGAqH8le850wb/vPg9SRQ3DxnupBfbfSrsYh3PaqX9C+aM8tb3qo5EREYTq
# wlav8htKRSCntg4RYic5LMm/FYMNFUjaPBRfvazLkNX1eOinNko+6nmmARssWTTh
# 0JenQONevwoRsQ6FzaPkKy01w/tBdV7cvh9M5K6mqMKrzINXZ4MNfjGErQGArobv
# n5UvjBbB3rw5NbmS4x8BHgrU1MOmUypIWJb9a234Zjx7hNuK1PRKMUfPL+ERbDo5
# rxucW7NgqvN7DDEu/6SFfQ+JTkWqJ7zlTHQ/q5a3VStxaFwWMJElmL7yuormykDL
# 7fXpejL7rLdl28UfjruleVN4IVxrFYv+P04q8uy22Pfosvpx0w2TYMwITi4LpDeu
# dotjR/Hkbrq9tW/eNM0Bauo7x6Ycw4V/U84JfzT5cMPoneSMNNfA9MKfXyImH085
# 84ofXiGimjr5kmgEq6OQYtOJqxo3pjSCHJ1hoXgzuVhtzKnwkJDElfyFpIIDpX5H
# U+G/mCZwoYIXkzCCF48GCisGAQQBgjcDAwExghd/MIIXewYJKoZIhvcNAQcCoIIX
# bDCCF2gCAQMxDzANBglghkgBZQMEAgEFADCCAVEGCyqGSIb3DQEJEAEEoIIBQASC
# ATwwggE4AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIMYf8gpU+i6t
# zbe1zI1aXb8Z95kJk3XDmKNavWCqLgcWAgZqF1D4+ZkYEjIwMjYwNjA0MjA0MzU5
# Ljc2WjAEgAIB9KCB0aSBzjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkUwMDItMDVFMC1EOTQ3MSUwIwYDVQQD
# ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR6jCCByAwggUIoAMCAQIC
# EzMAAAIpDtVkKrSX8hoAAQAAAikwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMC
# VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgUENBIDIwMTAwHhcNMjYwMjE5MTk0MDA3WhcNMjcwNTE3MTk0MDA3
# WjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UE
# CxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVs
# ZCBUU1MgRVNOOkUwMDItMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt
# ZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# niLRauM9aAmEplGZqWA7GyVhLvvtW23PzM+z2tyNGV+RDjfloqwdBb5xpchUVMpc
# zuUyV2X1PEBTzlPeT9WNTmfCfqrgORvgFkgTq/+PLHJdLPUQaaoEzKv5W8qgc+Aj
# Jr1UdkHrwIFaeGtYW5jpvRu2FnsuvDeRea0g2FdMDJYOCMvGEbhYETdngaVV7fSL
# xWhZgZ0C2X6Ntimdy/D1hB1IV1OXSzkmaE36qkPwfnXluegAjJ5x4z8WbvrMx4WT
# C1KzFk4LPSewp/A7XpXCo/WjPtGau7ZEgxwq8KOngkn8N3JZLV0Ua3ZrHHGpfEQg
# 4jRRYGbMqcBdmhgBepIONfkJfrYV6ZzjFB+JjwgCWVqdMw1qMLCv2KOYxy9aU/wI
# Gy9xaAMuHG4TiOD29XkBRvo0+7JEthf2/mQAlANRA2fN9CvgbtMsPhaUhsvLaXdb
# M5N3FGIyKcyBuM96BTZokiTfGHTXeEh7BEeQ5LOW8Yim6b5n6zgN/Y02+xFtk0+8
# kloCSEn703s7i5kLE1UszbL2qVZR4RNswag8ONPZ7zrYrQhW54YVzX2rc29vhn9r
# V9rOmAWtedQgv/Pnpib73oF21jbnc2LfHBUaJtD2fnyUYYQX3Uqgqq/EHjhifFWJ
# ZsRV6sdUnQ0pEwkoKbLJBqmcIf+rpgNYOC+83hgTZ4ECAwEAAaOCAUkwggFFMB0G
# A1UdDgQWBBQnTUWki/QFvEL2kNtVo0QFyjeDOzAfBgNVHSMEGDAWgBSfpxVdAF5i
# XYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENB
# JTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRp
# bWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1Ud
# JQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsF
# AAOCAgEAPcHO9pX/3Mw4adPU9zxgDDkIcZf8dOI6RO7d/RXqkEp9lKeg1c4YMJ8w
# qmNzSIS7VGlq3ezcb64WQ3GvieMc760UDTx3kUKZyVXh7Mk7ud4EwZVAdU0SOjp2
# bfwFZkfaDCfzQTqgfnfkjm/D8es0YEcJOtrBZDpAeZYoPwzJ2BHkf2plvR3aPL13
# Cpmmvw20jgB0nX2RbfoqjGXzZZBDp+9f0QCkzb+EKav9hYXIzDJkpCIbIQXQVQdF
# Y5pMBX4VVH+U07iyfbA0eBMgrzmSdweoOyMOlo0McnI8JH87FTE6X7rCeUsHThy/
# Mhj1mTnj48GvCEl1rOpIlSv+ktPyVW9S6cacmCkREI51P+TnnCrdjl5R3cBVma8A
# IvfET2WuhBMXG/yxi39dLTR47tXk5aIWNI8zWUNAQ4ErjGYDFPvBBI7TEDCA55Tx
# hFDjeyx1xx9Ci9BQNNTxFlWSq6/y1Drrg0zRc8OeNxTzKeIJAiBZSnUbnIkdSFzp
# Pl7Huq4/bSRWIFZ/uOAR6Ltl0HuUV99Hn9wEFmtJschg6icxrFd1+fmzUHjFfPIl
# rpST6ubIJxhvTvx9fxx+B7DvWShl/1qyaUJhbkK0zkePV473mgtMWhZhrDYPkYW7
# Q+ak5J/iEg78NCCfxP1VzXc/8loKJeq+dO4U/LADLqZ4ZBdrsNQwggdxMIIFWaAD
# 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/
# 2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDTTCCAjUCAQEwgfmhgdGkgc4w
# gcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsT
# HE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQg
# VFNTIEVTTjpFMDAyLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUt
# U3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAt7/YkjttsaG+2cTeXVwhKvvS
# L/+ggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG
# 9w0BAQsFAAIFAO3MWkowIhgPMjAyNjA2MDQyMDEwNTBaGA8yMDI2MDYwNTIwMTA1
# MFowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA7cxaSgIBADAHAgEAAgIZYTAHAgEA
# AgIVVTAKAgUA7c2rygIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMC
# oAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQDNteQt
# xHxY9z5/t5ueRuwM+YTMC6TgTctE80pLdy7EtNBEEGsCbZbcSFPh/uVta7uG31XE
# pGL6a2KGqVcbRg111UGBiuXngl6cI43FWEKdbjbudNAGhdhpbg3TOGe6+YZHidMF
# i7V/f1PGrycxJgW/L3BDMo81PtH+8tRM62uVGE1LZDa1+If7va92yfgeIKcMMAMZ
# ZctLbZ6vQ4WmwWa33ETyw+4rDZ6U6oICS4VdC4hbkw7vWFzdmpieVag78eixkQ2f
# 9c5ejnEt+MQKaT4B7D1/dDjifSgFFD65xiEzjRVHRl/6NNHTIUnId6XrqkgK+HGd
# AsnKyWKv8wCCUlYfMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# UENBIDIwMTACEzMAAAIpDtVkKrSX8hoAAQAAAikwDQYJYIZIAWUDBAIBBQCgggFK
# MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgSa0E
# RNZ1SkCcxE0bjjYCbemwApLwuQ74HK/ZXkNqgwYwgfoGCyqGSIb3DQEJEAIvMYHq
# MIHnMIHkMIG9BCC3yj3xIrbw/5UrxLpsaj5JHjhLYJJihRFTLnpfaDq6kjCBmDCB
# gKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV
# BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAACKQ7VZCq0l/Ia
# AAEAAAIpMCIEIGNvLreC9lyxOTWSHuSRToCDLusAMwg9dgXq3iv+sAmbMA0GCSqG
# SIb3DQEBCwUABIICADQKwfnXCwSdn+zkBzMoaQ4TrlXSlar2W6JR7yWB1X/yBP9Z
# 5/gYVbmzcP99r1+pm11q1YFbyTvJLLmxqdY+ObR1j4zWEpRrTNG0kT7F4DNi2g6k
# YnZ1HWvrv88n60fuaG6yeDUKwIXNeKM+gXkGKZ/O95EVUDDl7UeSQxHMKdhnruj5
# 7xGT3bJ0xq9XlxQxawmSb8qzR2Faj/4Ntv+narDwCgsedfk9T6hY+5T8t3ifev7s
# wuOm2RMA9mITUI8iD0J8x/AiHC2iJIw7cgUMpezz/YWM9MzvJmLNFRQ9ntf+lPCq
# cG4UHqxz609U7EyOG4WA/okpK8JgRN758eNvRA625LsKRjcMwHmTg9dq3XtkmASn
# QdLyC2+Gug9/f7Nrs3cnIQbsnnlpbbeOWllHr1K0CctMPLa0EWRMlsc4VIP7FARB
# 3LsmReU39rY43xg2zSpxv4A2VE9cIi7FL6LmkdLp+k3cN9QMPYipT8goTRMQezem
# yWPs0X9SL9s84HwE2WbLWSn06AqemJqgOt4eM8RTKyn88YgFSpN5OAztOmn1np3r
# 4YPSp7D2oZz2kvW3CCT9eQCJtrbAoSydROSUiGODY5PjyAR6m5EYL8lQV2QBXbeq
# R39LKw4D1+w0YXRv7Pe/rftF37Cr8n7b1tR/KQCJwSEEos6ngHHGS20t+HLj
# SIG # End signature block