Private/Tests/New-AvmBicepTestTemplate.ps1
|
function New-AvmBicepTestTemplate { [CmdletBinding(SupportsShouldProcess)] [OutputType([pscustomobject])] param( [Parameter(Mandatory)] [string] $SourcePath, [Parameter(Mandatory)] [string] $DestinationPath, [Parameter(Mandatory)] [string] $BicepPath, [Parameter(Mandatory)] [System.Collections.Generic.Dictionary[string, string]] $Tokens, [System.Collections.Generic.Dictionary[string, string]] $ScopedTokens, [switch] $RequireScopedTokens, [string] $OwnedGroupRunId, [string] $SourceRoot, [switch] $DeferResourceLocation, [switch] $DeferTokens ) Set-StrictMode -Version 3.0 $ErrorActionPreference = 'Stop' $arguments = @('build', '--stdout', $SourcePath) if ($env:AVM_OFFLINE -eq '1') { $arguments += '--no-restore' } $build = Invoke-AvmProcess -FilePath $BicepPath -ArgumentList $arguments -IgnoreExitCode if ($build.ExitCode -ne 0 -or [string]::IsNullOrWhiteSpace($build.StdOut)) { $message = Add-AvmProcessFailureDetail ` -Message "Bicep test compilation failed for '$SourcePath' (exit $($build.ExitCode))." ` -StdErr $build.StdErr throw [AvmProcessException]::new($message) } $template = ConvertFrom-AvmStrictJson -Json ([string]$build.StdOut) if ($template -isnot [System.Collections.IDictionary]) { throw [AvmConfigurationException]::new("Bicep test compilation did not return an ARM object: $SourcePath") } $schema = [string]$template['$schema'] $schemaPrefix = '^https://schema\.management\.azure\.com/schemas/\d{4}-\d{2}-\d{2}/' $scope = switch -Regex ($schema) { "${schemaPrefix}deploymentTemplate\.json#?$" { 'group'; break } "${schemaPrefix}subscriptionDeploymentTemplate\.json#?$" { 'sub'; break } "${schemaPrefix}managementGroupDeploymentTemplate\.json#?$" { 'mg'; break } "${schemaPrefix}tenantDeploymentTemplate\.json#?$" { 'tenant'; break } default { throw [AvmConfigurationException]::new( "Bicep test '$SourcePath' compiled to an unsupported ARM template schema: $schema") } } if ($RequireScopedTokens -and $scope -ne 'group' -and $null -eq $ScopedTokens) { throw [AvmConfigurationException]::new( "Bicep e2e test '$SourcePath' requires an explicit GUID -TenantId for $scope scope.") } $effectiveTokens = if ($scope -ne 'group' -and $null -ne $ScopedTokens) { $ScopedTokens } else { $Tokens } $content = [string]$build.StdOut if (-not $DeferTokens) { $content = Resolve-AvmBicepTestToken -Content $content ` -SourcePath $SourcePath -Tokens $effectiveTokens -DeferResourceLocation:$DeferResourceLocation } $template = ConvertFrom-AvmStrictJson -Json $content $hasGroupDeployment = $false if ($scope -eq 'sub' -and -not [string]::IsNullOrWhiteSpace($OwnedGroupRunId)) { if ([string]::IsNullOrWhiteSpace($SourceRoot)) { throw [AvmConfigurationException]::new( 'Bicep e2e group staging requires the module source root.') } $relative = [System.IO.Path]::GetRelativePath( [System.IO.Path]::GetFullPath($SourceRoot), [System.IO.Path]::GetFullPath($DestinationPath)) $parentPrefix = '..' + [System.IO.Path]::DirectorySeparatorChar if ($relative -eq '.' -or (-not [System.IO.Path]::IsPathRooted($relative) -and $relative -ne '..' -and -not $relative.StartsWith($parentPrefix, [System.StringComparison]::Ordinal))) { throw [AvmConfigurationException]::new( "Bicep e2e group template must be staged outside module source: $DestinationPath") } $ownership = Set-AvmBicepTestGroupOwnership -Template $template ` -RunId $OwnedGroupRunId -SourcePath $SourcePath -Confirm:$false $hasGroupDeployment = $ownership.HasGroupDeployment if ($ownership.Tagged) { $content = ConvertTo-Json -InputObject $template -Depth 100 -Compress ` -WarningAction Stop -ErrorAction Stop $template = ConvertFrom-AvmStrictJson -Json $content } } if (-not $PSCmdlet.ShouldProcess($DestinationPath, 'Write temporary ARM test template')) { throw [AvmConfigurationException]::new("Temporary ARM test template creation was declined: $DestinationPath") } [System.IO.File]::WriteAllText($DestinationPath, $content, [System.Text.UTF8Encoding]::new($false)) return [pscustomobject]@{ Path = $DestinationPath Scope = $scope Template = $template CompiledContent = [string]$build.StdOut HasGroupDeployment = $hasGroupDeployment } } # SIG # Begin signature block # MIInQAYJKoZIhvcNAQcCoIInMTCCJy0CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC/xveJZPweAjed # HApczSUAXJswnAwgyd6Z/RM2UerGzaCCDLowggX1MIID3aADAgECAhMzAAACHU0Z # yE7XD1dIAAAAAAIdMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD # b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQzWhcNMjcwNDE1MTg1 # OTQzWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD # VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDQvewXxx9gZZFC6Ys1WBay8BJ8kGA4JQnH5CMafqOASlTpK9H8 # o5ZXTXt0caVQTNMUPt445wXYD+dFtaKWTwDn1I52oUSrC9vJin1Gsqt+zyKJL5Dg # 3eQXbQNR61DmMy20GLTIO3SFed9Rfi/ophgCLGFLDR3r0KvHjwMb/jYWS0celV/4 # Lz27LfAekm8v9E5IXaeiXbAUYZKK090n4CVl3JBtbN+9DtI9SNu/yjvozW52/u7R # X/Ttpa/KDlpuokZ+Zcbvmtd9ur9gFLvZzh41o9MsE/clQtdaFWGvuo6Jua/ntpgk # ey3E5/vBFe+MJPG6phdnuo6r57ZudCudiI1bAgMBAAGjggGbMIIBlzAOBgNVHQ8B # Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O # BBYEFH6QuMwqcPG0hQlQ6c5jCtTTLrVeMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQL # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzMDAxMis1MDc1NTkw # HwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEwYAYDVR0fBFkwVzBVoFOg # UYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0 # JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNybDBtBggrBgEFBQcBAQRh # MF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv # Y2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy # dDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQBKTbYOjzwTG/DXGaz9 # s6+fQeaTtDcFmMY+5UyVFCyj7Pv+5i37qfX8lSL/tBIfYQfWsMuBQlfZurJD6r4H # VJ2CeH+1fgiq8dcHdVKoZ3Sa2qXoX3cq9iS8cVb06B7+5/XJ7I0OxHH9fDsvJ3T3 # w5V/ZtAIFmLrl+P0CtG+92uzRsn0nTbdFjOkLMLWPLAU3THohKRlSEMgFJpPkm5n # 5UAZ35xX6FWCrDLsSKb555bTifwa8mJBwdlof0bmfYidH+dxZ1FdDxvLnNl9zeKs # A4kejaaIqqIPguhwAti5Ql7BlTNoJNwxCvBmqW2MQLnCkYN/VVUsR3V2x/rcTNzo # Bf/Z/SpROvdaA2ZOOd1uioXJt3tdLQ7vHpqpib0KfWr/FWXW10q38VxfCnRQBqzb # SuztR7nEMuzX7Ck+B/XaPDXd1qh72+QYyB0Z2VzWmO9zsnb9Uq/dwu8LGeQqnyu6 # 7SDGACvnXii2fb9+US492VTnXSnFKyqwgzUyFMtZK1/sHYTv6bG4TtQUygQxTN+Z # V+aJIlKO2MqZ7bKrAnOzS9m6NgoTdWOq11bTOZwKlIEV/EhV9SWkDmdpR/hPPT2v # 6TEj4F8PT/zHjRezIU5c/DGlt/VhY/pK0XkJtEyMmmS1BMtjU/rqBZVMIm3dnxQs # /TBByr+Cf8Z1r7aifQVQ+WSqzjCCBr0wggSloAMCAQICEzMAAAA5O7Y3Gb8GHWcA # AAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRl # IEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoXDTM2MDMyMjIyMTMwNFow # VzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEo # MCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAyNDCCAiIwDQYJ # KoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeqlRYHNa265v4IY9fH8TKh # emHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo0dtS/EW6I/yEL/bLSY8h # KpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATvQVL4tcf03aTycsz8QeCd # M0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a1uv1zerOYMnsneRRwCbp # yW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1FyQfK0fVkaya8SmVHQ/t # Of23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfOGSWHIIV4YrTJTT6PNty5 # REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7ttOu1bVnXfHaqPYl2rPs # 20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJuz2MXMCt7iw7lFPG9LXK # Gjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxSCwyoGIq0PhaA7Y+VPct5 # pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOmVQop36wUVUYklUy++vDW # eEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3SkE/xIkgpfl22MM1itkZ # 35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGC # NxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPXLQaUEggxMBkGCSsGAQQB # gjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU # ci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2Ny # bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0MjAx # MV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0MjAx # MV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOCAgEAFJQfOChP7onn6fLI # MKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D5W4wMwYeLystcEqfkjz4 # NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBYnbu0+THSuVHTe0VTTPVh # ily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSIvgn0JksVBVMYVI5QFu/q # hnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6aR9y34aiM1qmxaxBi6OU # nyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4wPKC5OmHm1DQIt/MNokbb # H3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7RTX8AdBPo0I6OEojf39z # uFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK/fg8B2qjW88MT/WF5V5u # vZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSKYBv0VisCzfxgeU+dquXW # 9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkwYTu/9dLeH2pDqeJZAABV # DWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVTQl0v4q8J/AUmQN5W4n10 # 1cY2L4A7GTQG1h32HHAvfQESWP0xghncMIIZ2AIBATBuMFcxCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jv # c29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIdTRnITtcPV0gAAAAAAh0w # DQYJYIZIAWUDBAIBBQCggZAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJ # KoZIhvcNAQkEMSIEIFqyxWWQsPW+lYldHovRMKiNqO3Svj5PykU3QetE1BOeMEIG # CisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAyM1/m5eKxyGHXVCO # Bx/aCqRQ0aJ0/Jwdgtuhg5a4sCbPa0y0UOlF/divgCltG9DDh7wy7G6CmiyhMO3p # h1bottqRt08lu03C+WEKYrocCP28h3TLVaefi3FsjnBvLnhhqYfS/2QIx6RnT849 # qctfsfDyOBBoLVuATknQa0y9R5wu889hqsAdoXzPVg2v9MAlhInQatLfJqDCrg7h # ToVkLVrvTz+J7XTROZUCebw9+FaYe8/lJ3bxXjdc+0vZHeXRapbd8ncCvYwe3xdb # CgWR0/44cDNdlsQblmqeaFcTfpz0SLCbzlAzEuQFC0BQSv2zcFuikltJ1e+zkrXR # YmYgzKGCF6wwgheoBgorBgEEAYI3AwMBMYIXmDCCF5QGCSqGSIb3DQEHAqCCF4Uw # gheBAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFZBgsqhkiG9w0BCRABBKCCAUgEggFE # MIIBQAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCA+jH/PG6YubuZ8 # BocpDgt/1v8votQxvs9pUHv5aTeHsQIGauvci1FdGBIyMDI2MTExMDExMjAzNi4z # NFowBIACAfSggdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGlt # aXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjJEMUEtMDVFMC1EOTQ3MSUw # IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR+zCCBygwggUQ # oAMCAQICEzMAAAI3pB13SYKcdwYAAQAAAjcwDQYJKoZIhvcNAQELBQAwfDELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z # b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjYxMDE1MTgzNzQ2WhcNMjgwMTEx # MTgzNzQ2WjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEt # MCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScw # JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046MkQxQS0wNUUwLUQ5NDcxJTAjBgNVBAMT # HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCzM1ua7N8pyIf1IsNZAND3JWx4CXWsdp3tAL/N0cQFBH5p # n1xYnfzgzhz7yg4FzNTdxwQC5YaUrVsux/24wBQZ2q16ET3xBKcaWQ5nhpjVmDzF # qslsDlpLu5iboTOPiwkYUhl+9jti5u+L1xgBtO4728y/YI4QPNtB0RYD2mVu6Cp7 # AnztsfNZFB15wFCBtPQQxHa0gTxJ8gL5RBYuo02HwgKcOw9VW1PvakEkGGaKHrP4 # AflbpqrboVD+dEOJ8DTGf8wB/7JiLT0C+yo4WbpyjSqmRER/LFWgANV9b/qbyXOH # cy06y/e/uyQJwlphiXk/9Ovksv2GYACG8nNcUonXEl9rnE1cH/l4IWk4FeizWxYh # sRdJUIbRiKY5+VR8PsVdJ3CvpMUeIoyLWfWzA0bE9In+DUWQCY4+4/i8H6nIevXy # sHQPxnvGSE58bdbQIXySdx0zmH7EI0m/+7iA5SPh11rPLsC5+LveEiMFhMt7H4vA # LSyE0wUE9jQjrwhafkznzEt3y8ofe1b7iSTJitiX06l2p1pAVynMfwWYxF/QffN0 # m9ayi32IuDyvVygySnpWN40jTiTNaDSSNGrXLPV07lBb9wU7J4o0h4bDc9oSnLt8 # rwOeeXmH7GmWU5TV5c1yTTXjxY7Svvnuis8PSmxJBU14vxUOLkvA6+n+TYBWBwID # AQABo4IBSTCCAUUwHQYDVR0OBBYEFFmYj+wQ9N6dmWoI3vQJUYSC2cPEMB8GA1Ud # IwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRp # bWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYI # KwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMv # TWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1Ud # EwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeA # MA0GCSqGSIb3DQEBCwUAA4ICAQBzrBoMHtMEcT7ep5/FGFV/ByTeBrgzIaKxeI4V # 74HMlS5ACxBDssg7IyCijvf/a9ZQRz+KS25owvRu5/tQAGvkgm6C2NwnxrbmmlES # 3sGR8SW4nSkrOlI3KgV47TUnDg4NQQnmyaa5oQ1/Zg0nVpeIqcJXBmLaSTPGvVUL # GT0DPw7Z4UsxcwnLHCgUknPknYuSVsAH9/8K0hUwgwcIN0SYKdGD+RO8Nqx31TH5 # SrBJjK3qPN+r4kj2Jp2zeQJiT4EH+LOt0ZB0YW9eBq0TRtF+C7FmzsO6gw4SN6Rb # YKWoZ8wXmAzENg71BOUXtYBljW9yDdp0gKCGDC+f/IEyv2J04DGv87qtXdZnZ8rZ # WJsLIF+9WOx3CoGl3tXcTrn2cca2raGuEfokeGgda+cQNmvvRtARyZTryGSpm79+ # scZHdPAqj35fupKbEzIXh9CnxLGt3/QwpNCdHyMTOHDr+L9dUFIwBYoroz6G4+J6 # XStAvMINP4mS+KwX03oUIjAYCW8dNmoM8TkwMbgMp2BnZRC92u494shqOl/o3T2o # Eh8Ce1kfOxVPpFqbPCfx+YX96IKy5doDl9OhKPFlGBIYFCChsngAjJq2wVMxK3X2 # RWWBtX0N7Jx93jeutzt/sZfB2zLdBTdTs+YMqtfJuUpUhk4doZ425dDMWozDcOjE # 1jKjpDCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcN # AQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAw # BgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEw # MB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk # 4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9c # T8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWG # UNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6Gnsz # rYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2 # LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLV # wIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTd # EonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0 # gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFph # AXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJ # YfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXb # GjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJ # KwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnP # EP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMw # UQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggr # BgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYw # DwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoY # xDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp # L2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYB # BQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v # cGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0B # AQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U5 # 18JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgAD # sAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo # 32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZ # iefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZK # PmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RI # LLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgk # ujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9 # af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzba # ukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/ # OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNWMIIC # PgIBATCCAQGhgdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGlt # aXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjJEMUEtMDVFMC1EOTQ3MSUw # IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4D # AhoDFQDvgH4FlWKdx0o0N9f/BDuvjdy1eKCBgzCBgKR+MHwxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l # LVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA7pzx9TAiGA8yMDI2MTEx # MDAxMjkyNVoYDzIwMjYxMTExMDEyOTI1WjB0MDoGCisGAQQBhFkKBAExLDAqMAoC # BQDunPH1AgEAMAcCAQACAhpoMAcCAQACAhJKMAoCBQDunkN1AgEAMDYGCisGAQQB # hFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAw # DQYJKoZIhvcNAQELBQADggEBABVwQqzs/YbRZLT/WdUI8rP4TlgCGVPIxXj6vM+G # cggwkM0Y4uINWm8RmrnlefFASIUPms+K0WozHrUUGM3YuhDhWd4QKi5CDujk7jbr # Ftd6HBVwL1GlXx5/q/E+S8g8OtD9YQT/v/kmTteS1FILh7UahTCMdyoOTVUUm4rb # mKWnLqDoUt7Ct93A1y8Lk+eUZnhl5gLK/47pN4XTMmEJxhQtvsiPzk1AyxyMx55k # ODcdntF7z7ZooxMMMGVkaKmdI4OaDS+OakasXWAHPbzLWfOcSTDxBUpn0EhPHvnS # MQgSPihNMPzVCVzdcQKarDUs9L4y+rcM7DB84dqRe9T37eIxggQNMIIECQIBATCB # kzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAjekHXdJgpx3BgAB # AAACNzANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJ # EAEEMC8GCSqGSIb3DQEJBDEiBCB42+30nY4jxXmUBW9fWrWJl/vvUTQPTE94TF45 # 6jEzTTCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIFBPSgCtY8ZMN84d4pMo # BurMr1YNsbAtCtSPffC16vX1MIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTACEzMAAAI3pB13SYKcdwYAAQAAAjcwIgQgjuQfTtmqB5hGHDkKJ603 # UD2IRVLgh1WprdNhNFpM+RQwDQYJKoZIhvcNAQELBQAEggIAOq/pAc7kUOsLwy0T # O43bnkrqQL1igdvQMH4LPV92vFWwgAwZjqu69eRqRIhtd7FC9aU9IsWhLscvKXbg # nki8KUhn0q08QqG9TqoraRDfgLmtP8TkPLr5xs9m9K3Oqc+Rk3vm/nLXdsyB32t3 # 7guG+wlcs+6q0wPEdSxyAtvn7ljOAT1KE3cTUFVJM/wyvwUcwnsC3OXePqXqzfhW # txK9xc1KT9/BoRzq6ac2ZebzE30NC13guTLoSferJDJagbF/sA+8AAmkhQmsCxKS # V1nVEtqUsKanisjaSxXGeaysfwkfdHbYXMuypAmgvBstGSLnVh9scbhIE8THv8K3 # XmnBATki3okJLUoeR8lIPjkL58AiPIkNvFu0piOi5Aw5/rZ1EPIdn2CSqTw+Zjr4 # bPsq6mFdNnz2orJIJWyr1dIINR1LvDjYc/vyanJbpZws+/xxxzmTaPJ3duFa0yUE # Jmlw+dpls30uuiiqaCBBh1+1Tl5y9oCiHQBdjYnCOqCoqRGlunjqcYHASydgQIc2 # HfdbBhileFOZq1s7GZP2xyUzgqDCWFY/0ndgYM8+J8gkp9+w+JvSuwf5rNUfEhcX # rmkVOtsJ0dooNOT+x82LGUm4eNs/8A3YOA/jcGn7p0ZN7WDT+8+RYThobHxAxRYv # AJYzjMGVmamve1lo0jo0tuUjwo4= # SIG # End signature block |