new-runtimepoc/Pester.RSpec.ts.ps1
param ([switch] $PassThru) Get-Module Pester.Runtime, Pester.Utility, P, Pester, Axiom, Stack | Remove-Module Import-Module $PSScriptRoot\p.psm1 -DisableNameChecking Import-Module $PSScriptRoot\..\Dependencies\Axiom\Axiom.psm1 -DisableNameChecking Import-Module $PSScriptRoot\..\Pester.psd1 $global:PesterPreference = @{ Debug = @{ ShowFullErrors = $true WriteDebugMessages = $false WriteDebugMessagesFrom = "Mock" ReturnRawResultObject = $true } Output = @{ Verbosity = "None" } } $PSDefaultParameterValues = @{} i -PassThru:$PassThru { b "Running generated tests" { # # automation id is no-longer relevant I think # t "generating simple tests from foreach with external Id" { # $sb = { # Describe "d1" { # foreach ($id in 1..10) { # It "it${id}" { $true } -AutomationId $id # } # } # } # $result.Containers[0].Blocks[0].ErrorRecord | Verify-Null # $result.Containers[0].Blocks[0].Tests.Count | Verify-Equal 10 # $result.Containers[0].Blocks[0].Tests[0].Passed | Verify-True # } # t "generating parametrized tests from foreach with external id" { # $sb = { # Describe "d1" { # foreach ($id in 1..10) { # It "it$id-<value>" -TestCases @( # @{ Value = 1} # @{ Value = 2} # @{ Value = 3} # ) { # $true # } -AutomationId $id # } # } # } # $result.Containers[0].Blocks[0].ErrorRecord | Verify-Null # $result.Containers[0].Blocks[0].Tests.Count | Verify-Equal 30 # $result.Containers[0].Blocks[0].Tests[0].Passed | Verify-True # } t "generating simple tests from foreach without external Id" { $sb = { Describe "d1" { foreach ($id in 1..10) { It "it$id" { $true } } } } $result = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $result.Containers[0].Blocks[0].ErrorRecord | Verify-Null $result.Containers[0].Blocks[0].Tests.Count | Verify-Equal 10 $result.Containers[0].Blocks[0].Tests[0].Passed | Verify-True } t "generating parametrized tests from foreach without external id" { $sb = { Describe "d1" { foreach ($id in 1..10) { It "it-$id-<value>" -TestCases @( @{ Value = 1} @{ Value = 2} @{ Value = 3} ) { $true } } } } $result = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $result.Containers[0].Blocks[0].ErrorRecord | Verify-Null $result.Containers[0].Blocks[0].Tests.Count | Verify-Equal 30 $result.Containers[0].Blocks[0].Tests[0].Passed | Verify-True } t "generating multiple parametrized tests from foreach without external id" { $sb = { Describe "d1" { foreach ($id in 1..10) { It "first-it-$id-<value>" -TestCases @( @{ Value = 1} @{ Value = 2} @{ Value = 3} ) { $true } It "second-it-$id-<value>" -TestCases @( @{ Value = 1} @{ Value = 2} @{ Value = 3} ) { $true } } } } $result = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $result.Containers[0].Blocks[0].ErrorRecord | Verify-Null $result.Containers[0].Blocks[0].Tests.Count | Verify-Equal 60 $result.Containers[0].Blocks[0].Tests[0].Passed | Verify-True } # automationId is not relevant right now # t "generating multiple parametrized tests from foreach with external id" { # $sb = { # Describe "d1" { # foreach ($id in 1..10) { # It "first-it-$id-<value>" -TestCases @( # @{ Value = 1} # @{ Value = 2} # @{ Value = 3} # ) { # $true # } -AutomationId $Id # It "second-it-$id-<value>" -TestCases @( # @{ Value = 1} # @{ Value = 2} # @{ Value = 3} # ) { # $true # } -AutomationId $id # } # } # } # $result.Containers[0].Blocks[0].ErrorRecord | Verify-Null # $result.Containers[0].Blocks[0].Tests.Count | Verify-Equal 60 # $result.Containers[0].Blocks[0].Tests[0].Passed | Verify-True # } } b "BeforeAll paths" { t "`$PSScriptRoot in BeforeAll has the same value as in the script that calls it" { $container = [PSCustomObject]@{ InScript = $null InBeforeAll = $null } $sb = { $container.InScript = $PSScriptRoot BeforeAll { $container.InBeforeAll = $PSScriptRoot } Describe "a" { It "b" { # otherwise the container would not run $true } } } $null = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $container.InBeforeAll | Verify-Equal $container.InScript }` } b "Invoke-Pester parameters" { try { $path = $pwd $c = 'Describe "d1" { It "i1" -Tag i1 { $true }; It "i2" -Tag i2 { $true }}' $tempDir = Join-Path ([IO.Path]::GetTempPath()) "dir" New-Item -ItemType Directory -Path $tempDir -Force $file1 = Join-Path $tempDir "file1.Tests.ps1" $file2 = Join-Path $tempDir "file2.Tests.ps1" $c | Set-Content $file1 $c | Set-Content $file2 cd $tempDir t "Running without any params runs all files from the local folder" { $result = Invoke-Pester $result.Containers.Count | Verify-Equal 2 $result.Containers[0].Path.FullName | Verify-Equal $file1 $result.Containers[1].Path.FullName | Verify-Equal $file2 } t "Running tests from Paths runs them" { $result = Invoke-Pester -Path $file1, $file2 $result.Containers.Count | Verify-Equal 2 $result.Containers[0].Path.FullName | Verify-Equal $file1 $result.Containers[1].Path.FullName | Verify-Equal $file2 } t "Exluding full path excludes it tests from Paths runs them" { $result = Invoke-Pester -Path $file1, $file2 -ExcludePath $file2 $result.Containers.Count | Verify-Equal 1 $result.Containers[0].Path | Verify-Equal $file1 } t "Including tag runs just the test with that tag" { $result = Invoke-Pester -Path $file1 -Tag i1 $result.Containers[0].Blocks[0].Tests[0].Executed | Verify-True $result.Containers[0].Blocks[0].Tests[1].Executed | Verify-False } t "Excluding tag skips the test with that tag" { $result = Invoke-Pester -Path $file1 -ExcludeTag i1 $result.Containers[0].Blocks[0].Tests[0].Executed | Verify-False $result.Containers[0].Blocks[0].Tests[1].Executed | Verify-True } t "Scriptblock invokes inlined test" { $result = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ Path = $file1 ; ScriptBlock = { Describe "d1" { It "i1" { $true } } } } }) $result.Containers[0].Blocks[0].Tests[0].Executed | Verify-True } t "Result object is output by default" { $result = Invoke-Pester -Path $file1 $result | Verify-NotNull } # t "CI generates code coverage and xml output" { # $temp = [IO.Path]::GetTempPath() # $path = "$temp/$([Guid]::NewGuid().Guid)" # $pesterPath = (Get-Module Pester).Path # try { # New-Item -Path $path -ItemType Container | Out-Null # $job = Start-Job { # param ($PesterPath, $File, $Path) # Import-Module $PesterPath # Set-Location $Path # Invoke-Pester $File -CI -Output None # } -ArgumentList $pesterPath, $file1, $path # $job | Wait-Job # Test-Path "$path/testResults.xml" | Verify-True # Test-Path "$path/coverage.xml" | Verify-True # } # finally { # Remove-Item -Recurse -Force $path # } # } } finally { cd $path Remove-Item $tempDir -Recurse -Force -Confirm:$false -ErrorAction Stop } } b "Terminating and non-terminating Should" { t "Non-terminating assertion fails the test after running to completion" { $sb = { Describe "d1" { It "i1" { $PSDefaultParameterValues = @{ 'Should:ErrorAction' = 'Continue' } 1 | Should -Be 2 # just write this error "but still output this" } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $test = $r.Containers[0].Blocks[0].Tests[0] $test | Verify-NotNull $test.Result | Verify-Equal "Failed" $test.ErrorRecord[0].TargetObject.Terminating | Verify-False $test.ErrorRecord[0].Exception | Verify-NotNull $test.ErrorRecord[0].ScriptStackTrace | Verify-NotNull $test.ErrorRecord[0].DisplayErrorMessage | Verify-NotNull $test.ErrorRecord[0].DisplayStackTrace | Verify-NotNull $test.StandardOutput | Verify-Equal "but still output this" } t "Assertion does not fail immediately when ErrorActionPreference is set to Stop" { $sb = { Describe "d1" { It "i1" { $PSDefaultParameterValues = @{ 'Should:ErrorAction' = 'Continue' } $ErrorActionPreference = 'Stop' 1 | Should -Be 2 # throw because of eap "but still output this" } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $test = $r.Containers[0].Blocks[0].Tests[0] $test | Verify-NotNull $test.Result | Verify-Equal "Failed" $test.ErrorRecord[0].TargetObject.Terminating | Verify-False $test.ErrorRecord[0].Exception | Verify-NotNull $test.ErrorRecord[0].ScriptStackTrace | Verify-NotNull $test.ErrorRecord[0].DisplayErrorMessage | Verify-NotNull $test.ErrorRecord[0].DisplayStackTrace | Verify-NotNull $test.StandardOutput | Verify-Equal "but still output this" } t "Assertion fails immediately when -ErrorAction is set to Stop" { $sb = { Describe "d1" { It "i1" { 1 | Should -Be 2 -ErrorAction Stop "do not output this" } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } Should = @{ ErrorAction = 'Continue' } }) $test = $r.Containers[0].Blocks[0].Tests[0] $test | Verify-NotNull $test.Result | Verify-Equal "Failed" $test.ErrorRecord[0].TargetObject.Terminating | Verify-True $test.ErrorRecord[0].Exception | Verify-NotNull $test.ErrorRecord[0].ScriptStackTrace | Verify-NotNull $test.ErrorRecord[0].DisplayErrorMessage | Verify-NotNull $test.ErrorRecord[0].DisplayStackTrace | Verify-NotNull $test.StandardOutput | Verify-Null } t "Assertion fails immediately when ErrorAction is set to Stop via Default Parameters" { $sb = { Describe "d1" { It "i1" { $PSDefaultParameterValues = @{ 'Should:ErrorAction' = 'Stop' } 1 | Should -Be 2 "do not output this" } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $test = $r.Containers[0].Blocks[0].Tests[0] $test | Verify-NotNull $test.Result | Verify-Equal "Failed" $test.ErrorRecord[0].TargetObject.Terminating | Verify-True $test.ErrorRecord[0].Exception | Verify-NotNull $test.ErrorRecord[0].ScriptStackTrace | Verify-NotNull $test.ErrorRecord[0].DisplayErrorMessage | Verify-NotNull $test.ErrorRecord[0].DisplayStackTrace | Verify-NotNull $test.StandardOutput | Verify-Null } t "Assertion fails immediately when ErrorAction is set to Stop via global configuration" { $sb = { Describe "d1" { It "i1" { 1 | Should -Be 2 "do not output this" } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $test = $r.Containers[0].Blocks[0].Tests[0] $test | Verify-NotNull $test.Result | Verify-Equal "Failed" $test.ErrorRecord[0].TargetObject.Terminating | Verify-True $test.ErrorRecord[0].Exception | Verify-NotNull $test.ErrorRecord[0].ScriptStackTrace | Verify-NotNull $test.ErrorRecord[0].DisplayErrorMessage | Verify-NotNull $test.ErrorRecord[0].DisplayStackTrace | Verify-NotNull $test.StandardOutput | Verify-Null } t "Guard assertion" { $sb = { Describe "d1" { It "User with guard" { $user = $null # we failed to get user $user | Should -Not -BeNullOrEmpty -ErrorAction Stop -Because "otherwise this test makes no sense" $user.Name | Should -Be Jakub $user.Age | Should -Be 31 } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } Should = @{ ErrorAction = 'Continue' } }) $test = $r.Containers[0].Blocks[0].Tests[0] $test | Verify-NotNull $test.Result | Verify-Equal "Failed" $test.ErrorRecord[0].TargetObject.Terminating | Verify-True $test.ErrorRecord[0].Exception.Message | Verify-Equal "Expected a value, because otherwise this test makes no sense, but got `$null or empty." $test.ErrorRecord[0].ScriptStackTrace | Verify-NotNull $test.ErrorRecord[0].DisplayErrorMessage | Verify-NotNull $test.ErrorRecord[0].DisplayStackTrace | Verify-NotNull $test.StandardOutput | Verify-Null } t "Chaining assertions" { $sb = { Describe "d1" { It "User with guard" { $user = [PSCustomObject]@{ Name = "Tomas"; Age = 22 } $user | Should -Not -BeNullOrEmpty -ErrorAction Stop -Because "otherwise this test makes no sense" $user.Name | Should -Be Jakub $user.Age | Should -Be 31 } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } Should = @{ ErrorAction = 'Continue' } }) $test = $r.Containers[0].Blocks[0].Tests[0] $test | Verify-NotNull $test.Result | Verify-Equal "Failed" $test.ErrorRecord.Count | Verify-Equal 2 } t "Should throws when called outside of Pester" { $PesterPreference = [PesterConfiguration]@{ Should = @{ ErrorAction = 'Continue' }} $err = { 1 | Should -Be 2 } | Verify-Throw $err.Exception.Message | Verify-Equal "Expected 2, but got 1." } } b "-Skip on Describe, Context and It" { t "It can be skipped" { $sb = { Describe "a" { It "b" -Skip { $true } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $r.Containers[0].Blocks[0].Tests[0].Result | Verify-Equal "Skipped" } t "Describe can be skipped" { $sb = { Describe "a" -Skip { It "b" { $true } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $r.Containers[0].Blocks[0].Tests[0].Result | Verify-Equal "Skipped" } t "Context can be skipped" { $sb = { Context "a" -Skip { It "b" { $true } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $r.Containers[0].Blocks[0].Tests[0].Result | Verify-Equal "Skipped" } t "Skip will propagate through multiple levels" { $sb = { Describe "a" -Skip { Describe "a" { Describe "a" { It "b" { $true } } } } } $r = Invoke-Pester -Configuration ([PesterConfiguration]@{ Run = @{ ScriptBlock = $sb } }) $r.Containers[0].Blocks[0].Blocks[0].Blocks[0].Tests[0].Result | Verify-Equal "Skipped" } } } # SIG # Begin signature block # MIIcVgYJKoZIhvcNAQcCoIIcRzCCHEMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUhCiZieJ6GHao7HKDKY+bp9vo # 0AyggheFMIIFDjCCA/agAwIBAgIQCIQ1OU/QbU6rESO7M78utDANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTIwMDEzMTAwMDAwMFoXDTIxMDEw # NTEyMDAwMFowSzELMAkGA1UEBhMCQ1oxDjAMBgNVBAcTBVByYWhhMRUwEwYDVQQK # DAxKYWt1YiBKYXJlxaExFTATBgNVBAMMDEpha3ViIEphcmXFoTCCASIwDQYJKoZI # hvcNAQEBBQADggEPADCCAQoCggEBALYF0cDtFUyYgraHpHdObGJM9dxjfRr0WaPN # kVZcEHdPXk4bVCPZLSca3Byybx745CpB3oejDHEbohLSTrbunoSA9utpwxVQSutt # /H1onVexiJgwGJ6xoQgR17FGLBGiIHgyPhFJhba9yENh0dqargLWllsg070WE2yb # gz3m659gmfuCuSZOhQ2nCHvOjEocTiI67mZlHvN7axg+pCgdEJrtIyvhHPqXeE2j # cdMrfmYY1lq2FBpELEW1imYlu5BnaJd/5IT7WjHL3LWx5Su9FkY5RwrA6+X78+j+ # vKv00JtDjM0dT+4A/m65jXSywxa4YoGDqQ5n+BwDMQlWCzfu37sCAwEAAaOCAcUw # ggHBMB8GA1UdIwQYMBaAFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB0GA1UdDgQWBBRE # 05R/U5mVzc4vKq4rvKyyPm12EzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI # KwYBBQUHAwMwdwYDVR0fBHAwbjA1oDOgMYYvaHR0cDovL2NybDMuZGlnaWNlcnQu # Y29tL3NoYTItYXNzdXJlZC1jcy1nMS5jcmwwNaAzoDGGL2h0dHA6Ly9jcmw0LmRp # Z2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3JsMEwGA1UdIARFMEMwNwYJ # YIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNv # bS9DUFMwCAYGZ4EMAQQBMIGEBggrBgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0 # dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2Vy # dHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5n # Q0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBADAk7PRuDcdl # lPZQSfZ1Y0jeItmEWPMNcAL0LQaa6M5Slrznjxv1ZiseT9SMWTxOQylfPvpOSo1x # xV3kD7qf7tf2EuicKkV6dBgGiHb0riWZ3+wMA6C8IK3cGesJ4jgpTtYEzbh88pxT # g2MSzpRnwyXHhrgcKSps1z34JmmmHP1lncxNC6DTM6yEUwE7XiDD2xNoeLITgdTQ # jjMMT6nDJe8+xL0Zyh32OPIyrG7qPjG6MmEjzlCaWsE/trVo7I9CSOjwpp8721Hj # q/tIHzPFg1C3dYmDh8Kbmr21dHWBLYQF4P8lq8u8AYDa6H7xvkx7G0i2jglAA4YK # i1V8AlyTwRkwggUwMIIEGKADAgECAhAECRgbX9W7ZnVTQ7VvlVAIMA0GCSqGSIb3 # DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAX # BgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3Vy # ZWQgSUQgUm9vdCBDQTAeFw0xMzEwMjIxMjAwMDBaFw0yODEwMjIxMjAwMDBaMHIx # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJ # RCBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQD407Mcfw4Rr2d3B9MLMUkZz9D7RZmxOttE9X/lqJ3bMtdx6nadBS63j/qSQ8Cl # +YnUNxnXtqrwnIal2CWsDnkoOn7p0WfTxvspJ8fTeyOU5JEjlpB3gvmhhCNmElQz # UHSxKCa7JGnCwlLyFGeKiUXULaGj6YgsIJWuHEqHCN8M9eJNYBi+qsSyrnAxZjNx # PqxwoqvOf+l8y5Kh5TsxHM/q8grkV7tKtel05iv+bMt+dDk2DZDv5LVOpKnqagqr # hPOsZ061xPeM0SAlI+sIZD5SlsHyDxL0xY4PwaLoLFH3c7y9hbFig3NBggfkOItq # cyDQD2RzPJ6fpjOp/RnfJZPRAgMBAAGjggHNMIIByTASBgNVHRMBAf8ECDAGAQH/ # AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzB5BggrBgEF # BQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBD # BggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2Ny # bDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDig # NoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v # dENBLmNybDBPBgNVHSAESDBGMDgGCmCGSAGG/WwAAgQwKjAoBggrBgEFBQcCARYc # aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAKBghghkgBhv1sAzAdBgNVHQ4E # FgQUWsS5eyoKo6XqcQPAYPkt9mV1DlgwHwYDVR0jBBgwFoAUReuir/SSy4IxLVGL # p6chnfNtyA8wDQYJKoZIhvcNAQELBQADggEBAD7sDVoks/Mi0RXILHwlKXaoHV0c # LToaxO8wYdd+C2D9wz0PxK+L/e8q3yBVN7Dh9tGSdQ9RtG6ljlriXiSBThCk7j9x # jmMOE0ut119EefM2FAaK95xGTlz/kLEbBw6RFfu6r7VRwo0kriTGxycqoSkoGjpx # KAI8LpGjwCUR4pwUR6F6aGivm6dcIFzZcbEMj7uo+MUSaJ/PQMtARKUT8OZkDCUI # QjKyNookAv4vcn4c10lFluhZHen6dGRrsutmQ9qzsIzV6Q3d9gEgzpkxYz0IGhiz # gZtPxpMQBvwHgfqL2vmCSfdibqFT+hKUGIUukpHqaGxEMrJmoecYpJpkUe8wggZq # MIIFUqADAgECAhADAZoCOv9YsWvW1ermF/BmMA0GCSqGSIb3DQEBBQUAMGIxCzAJ # BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k # aWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMTAe # Fw0xNDEwMjIwMDAwMDBaFw0yNDEwMjIwMDAwMDBaMEcxCzAJBgNVBAYTAlVTMREw # DwYDVQQKEwhEaWdpQ2VydDElMCMGA1UEAxMcRGlnaUNlcnQgVGltZXN0YW1wIFJl # c3BvbmRlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKNkXfx8s+CC # NeDg9sYq5kl1O8xu4FOpnx9kWeZ8a39rjJ1V+JLjntVaY1sCSVDZg85vZu7dy4Xp # X6X51Id0iEQ7Gcnl9ZGfxhQ5rCTqqEsskYnMXij0ZLZQt/USs3OWCmejvmGfrvP9 # Enh1DqZbFP1FI46GRFV9GIYFjFWHeUhG98oOjafeTl/iqLYtWQJhiGFyGGi5uHzu # 5uc0LzF3gTAfuzYBje8n4/ea8EwxZI3j6/oZh6h+z+yMDDZbesF6uHjHyQYuRhDI # jegEYNu8c3T6Ttj+qkDxss5wRoPp2kChWTrZFQlXmVYwk/PJYczQCMxr7GJCkawC # wO+k8IkRj3cCAwEAAaOCAzUwggMxMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E # AjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMIIBvwYDVR0gBIIBtjCCAbIwggGh # BglghkgBhv1sBwEwggGSMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2Vy # dC5jb20vQ1BTMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAA # bwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMA # dABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgA # ZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgA # ZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4A # dAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAA # YQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIA # ZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG/WwDFTAf # BgNVHSMEGDAWgBQVABIrE5iymQftHt+ivlcNK2cCzTAdBgNVHQ4EFgQUYVpNJLZJ # Mp1KKnkag0v0HonByn0wfQYDVR0fBHYwdDA4oDagNIYyaHR0cDovL2NybDMuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEQ0EtMS5jcmwwOKA2oDSGMmh0dHA6 # Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3JsMHcG # CCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu # Y29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln # aUNlcnRBc3N1cmVkSURDQS0xLmNydDANBgkqhkiG9w0BAQUFAAOCAQEAnSV+GzNN # siaBXJuGziMgD4CH5Yj//7HUaiwx7ToXGXEXzakbvFoWOQCd42yE5FpA+94GAYw3 # +puxnSR+/iCkV61bt5qwYCbqaVchXTQvH3Gwg5QZBWs1kBCge5fH9j/n4hFBpr1i # 2fAnPTgdKG86Ugnw7HBi02JLsOBzppLA044x2C/jbRcTBu7kA7YUq/OPQ6dxnSHd # FMoVXZJB2vkPgdGZdA0mxA5/G7X1oPHGdwYoFenYk+VVFvC7Cqsc21xIJ2bIo4sK # HOWV2q7ELlmgYd3a822iYemKC23sEhi991VUQAOSK2vCUcIKSK+w1G7g9BQKOhvj # jz3Kr2qNe9zYRDCCBs0wggW1oAMCAQICEAb9+QOWA63qAArrPye7uhswDQYJKoZI # hvcNAQEFBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ # MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNz # dXJlZCBJRCBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTIxMTExMDAwMDAwMFow # YjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ # d3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgQXNzdXJlZCBJRCBD # QS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6IItmfnKwkKVpYBz # QHDSnlZUXKnE0kEGj8kz/E1FkVyBn+0snPgWWd+etSQVwpi5tHdJ3InECtqvy15r # 7a2wcTHrzzpADEZNk+yLejYIA6sMNP4YSYL+x8cxSIB8HqIPkg5QycaH6zY/2DDD # /6b3+6LNb3Mj/qxWBZDwMiEWicZwiPkFl32jx0PdAug7Pe2xQaPtP77blUjE7h6z # 8rwMK5nQxl0SQoHhg26Ccz8mSxSQrllmCsSNvtLOBq6thG9IhJtPQLnxTPKvmPv2 # zkBdXPao8S+v7Iki8msYZbHBc63X8djPHgp0XEK4aH631XcKJ1Z8D2KkPzIUYJX9 # BwSiCQIDAQABo4IDejCCA3YwDgYDVR0PAQH/BAQDAgGGMDsGA1UdJQQ0MDIGCCsG # AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCDCC # AdIGA1UdIASCAckwggHFMIIBtAYKYIZIAYb9bAABBDCCAaQwOgYIKwYBBQUHAgEW # Lmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5odG0w # ggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgA # aQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQA # ZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcA # aQBDAGUAcgB0ACAAQwBQAC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwA # eQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkA # YwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEA # cgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIA # eQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wCwYJYIZIAYb9bAMVMBIGA1UdEwEB/wQI # MAYBAf8CAQAweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz # cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj # ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgw # OqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ # RFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdp # Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwHQYDVR0OBBYEFBUAEisTmLKZB+0e36K+ # Vw0rZwLNMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3 # DQEBBQUAA4IBAQBGUD7Jtygkpzgdtlspr1LPUukxR6tWXHvVDQtBs+/sdR90OPKy # XGGinJXDUOSCuSPRujqGcq04eKx1XRcXNHJHhZRW0eu7NoR3zCSl8wQZVann4+er # Ys37iy2QwsDStZS9Xk+xBdIOPRqpFFumhjFiqKgz5Js5p8T1zh14dpQlc+Qqq8+c # dkvtX8JLFuRLcEwAiR78xXm8TBJX/l/hHrwCXaj++wc4Tw3GXZG5D2dFzdaD7eeS # DY2xaYxP+1ngIw/Sqq4AfO6cQg7PkdcntxbuD8O9fAqg7iwIVYUiuOsYGk38KiGt # STGDR5V3cdyxG0tLHBCcdxTBnU8vWpUIKRAmMYIEOzCCBDcCAQEwgYYwcjELMAkG # A1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRp # Z2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENv # ZGUgU2lnbmluZyBDQQIQCIQ1OU/QbU6rESO7M78utDAJBgUrDgMCGgUAoHgwGAYK # KwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB # BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU # pWCjOzyzul+civZ3CFf5UP74ogkwDQYJKoZIhvcNAQEBBQAEggEAPfy/iLDAlyHf # HcaoiHjaQtM32n1M+w9dAOn8TD8NkaFSdmty1jqBBPzWWJhxE7aj/6iY6U8MViBs # yXcH8aVJAYeqKZ1sBqaCc4PJkRL8V4PUdS5LWRqGPqiWxkcehf80JirwXvjbi64b # RT9oTc/ROm1sB0obnGTejnyOuAWA+a0lhdhWHm1duYs7z6nSo7eHe5GV/jdTImdO # 22cpx1D7H5L+vowNkhszhqUhTkJZ9eL7rWqqp8rbEf2DMX44qwsc6X7m+HthXXCM # W8f+Be59/NLVYUtouVxxV2IDD1XyjCQeN+e8DoBPFpuH9SUNaKD7zcPo9JQTlfHh # PGYzg572w6GCAg8wggILBgkqhkiG9w0BCQYxggH8MIIB+AIBATB2MGIxCzAJBgNV # BAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdp # Y2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMQIQAwGa # Ajr/WLFr1tXq5hfwZjAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3 # DQEHATAcBgkqhkiG9w0BCQUxDxcNMjAwNDA0MTc1MTQzWjAjBgkqhkiG9w0BCQQx # FgQUBODUx3VWMhdYIiFMfrcePtCI4ZkwDQYJKoZIhvcNAQEBBQAEggEAYqaihkL2 # JWTZWrg4aAdJbQ3WtDGnfXcQdQmyE7ApFEyKJDpoMnYSRQj5xh+xry9rULeOFIze # G05tX/DBX3MpvNm/kqTMGvofsuFEBwXSHrgjV7sJtwKq0HTVcZnaCpxGAqb4AMnP # Gz1lVWt6RGX4N6aTzOG37QCaMWPtkWYkp4r76opvO4IWGoTLWI5kbc80ZBycQfLC # UXJqukRz0yQoKXUOU0Pvd+AwUei/6/4Wpw304+tQTBTe3xSRPl7+mmfO+Ryh5N8H # v6a4fhYEEwy8SB0bwZBefsQxtQzdNsbVAhvF5QpKp0j74q5Q5XZPMrCSuon0tt7g # OvcLrJMOFDQRhw== # SIG # End signature block |