ZPki-Functions.ps1
<#PSScriptInfo
.VERSION 0.1.9.4 .GUID c5309bd6-c9e1-44de-a259-de7d3601ab18 .AUTHOR Anders Runesson .COMPANYNAME ZampleWorks .COPYRIGHT (c) Anders Runesson .TAGS .LICENSEURI .PROJECTURI https://github.com/zampleworks/ZPki .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES .PRIVATEDATA #> <# .DESCRIPTION Private functions for ZPki module #> Function Get-HttpUri { Param( $HostFQDN ,$Path ,$Document ) If($null -ne $Path) { $Path = $Path.Trim('/') } Else { $Path = "" } If($Path.Length -gt 0) { $Path = "/$Path/" } Else { $Path = "/" } Write-Output "http://$($HostFQDN)$($Path)$($Document)" } Function Get-LdapUri { Param( [switch] $IsAIA ) If($IsAIA) { Write-Output "ldap:///CN=%7,CN=AIA,CN=Public Key Services,CN=Services,%6%11" } Else { Write-Output "ldap:///CN=%7%8,CN=%7,CN=CDP,CN=Public Key Services,CN=Services,%6%10" } } Function Get-FileUri { Param( $Path, [switch] $IsAIA ) If($IsAIA) { Write-Output "file:///$Path\%3%4.crt" } Else { Write-Output "file:///$Path\%7%8%9.crl" } } Function New-ADCSPath { [CmdletBinding(ConfirmImpact='Medium', SupportsShouldProcess=$true)] Param( [string] $PathName, [string] $Path ) If(-Not (Test-Path $Path -PathType Any) -And ($PSCmdlet.ShouldProcess($PathName, "Create ADCS directory"))) { Write-Verbose "Creating ADCS Directory [$PathName] at [$Path]" New-Item $Path -ItemType Directory | Out-Null } Elseif(Test-Path $Path -PathType Leaf) { Write-Error "ADCS Directory exists, but is a file. Cannot continue. [$PathName]: [$Path]" } } Function Get-CaPolicyFileTemplate { Param( [Parameter(Mandatory=$True)] $CAType ) If($CAType -like "*root*") { Get-Content .\CAPolicy-root.inf } Else { Get-Content .\CAPolicy-sub.inf } } Function Get-CaPolicyHeaderSection { Write-Output "[Version]`r`nSignature=`"`$Windows NT`$`" `r`n" } Function Get-CaPolicyCertSrvSection { Param( $Keylength, $CACertValidityPeriod, $CACertValidityPeriodUnits, $CRLPeriod, $CRLPeriodUnits, $DeltaPeriod, $DeltaPeriodUnits, $LoadDefaultTemplates, $AltSignatureAlgorithm, $ForceUTF8, $ClockSkewMinutes, $EnableKeyCounting ) $ldt = [int] $LoadDefaultTemplates $asa = [int] $AltSignatureAlgorithm $futf = [int] $ForceUTF8 $ekc = [int] $EnableKeyCounting Write-Output (("[Certsrv_Server]", "RenewalKeyLength = $Keylength", "RenewalValidityPeriod = $CACertValidityPeriod", "RenewalValidityPeriodUnits = $CACertValidityPeriodUnits", "CRLPeriod = $CRLPeriod", "CRLPeriodUnits = $CRLPeriodUnits", "CRLDeltaPeriod = $DeltaPeriod", "CRLDeltaPeriodUnits = $DeltaPeriodUnits", "LoadDefaultTemplates = $ldt", "AlternateSignatureAlgorithm = $asa", "ForceUTF8 = $futf", "ClockSkewMinutes = $ClockSkewMinutes", "EnableKeyCounting = $ekc") -join "`r`n") } Function Get-CaPolicyPolicySection { Param( $PolicyName, $PolicyOid, $PolicyNotice, $PolicyUrl ) If([string]::IsNullOrWhiteSpace($PolicyName)) { Write-Error "Get-CaPolicyPolicySection(): Policy name cannot be empty." } If([string]::IsNullOrWhiteSpace($PolicyOid)) { Write-Error "Get-CaPolicyPolicySection(): Policy OID cannot be empty. Policy name: [$PolicyName]" } If([string]::IsNullOrWhiteSpace($PolicyName) -And [string]::IsNullOrWhiteSpace($PolicyNotice) -and [string]::IsNullOrWhiteSpace($PolicyUrl)) { Write-Error "Get-CaPolicyPolicySection(): Policy Notice and Url cannot both be empty. Policy name: [$PolicyName]" } $Section = "" $Section = "[$PolicyName]`r`nOID=$PolicyOid`r`n" If(-Not [string]::IsNullOrWhiteSpace($PolicyNotice)) { $Section = "$($Section)Notice=$PolicyNotice`r`n" } If(-Not [string]::IsNullOrWhiteSpace($PolicyUrl)) { $Section = "$($Section)URL=$PolicyUrl`r`n" } Write-Output $Section } Function Get-CaPolicyPolicyExtensionsSection { Param( [string] $Sections ) If(-Not [string]::IsNullOrWhiteSpace($Sections)) { Write-Output "[PolicyStatementExtension] `r`n Policies=$Sections`r`n" } } Function Get-CaPolicyBasicConstraintsSection { Param( [string] $PathLength, [bool] $Critical ) $Crit = If($Critical) { "Yes" } Else { "No" } $Pl = "" If($PathLength -ne "None") { $Pl = "PathLength = $PathLength" } Write-Output (("[BasicConstraintsExtension]", $Pl, "Critical = $Crit`r`n") -join "`r`n") } Function Get-CaPolicyEkuSection { Param( [string[]] $Oids, [switch] $Critical ) $Crit = If($Critical) { "Yes" } Else { "No" } Write-Output (( & { Write-Output "[EnhancedKeyUsageExtension]" Write-Output "Critical = $Crit" Foreach($e in $Oids) { Write-Output "OID = $e" } Write-Output "`r`n" }) -join "`r`n") } Function New-AdcsBackupDir { [CmdletBinding(ConfirmImpact="Medium", SupportsShouldProcess=$true)] Param( [string] $Path, [string] $Name ) $FullPath = "$Path\$Name" Write-Verbose "Creating $FullPath" If(Test-Path $FullPath -PathType Leaf) { Write-Error "Target directory [$FullPath] already exists, but is a file. Please remove the file or use a different path." } If(-Not (Test-Path $FullPath) -And ($PSCmdlet.ShouldProcess($FullPath, "Create backup directory"))) { mkdir $FullPath | Out-Null } If(-Not (Test-Path $FullPath)) { Write-Error "Failed to create target directory [$FullPath]." } } Function Test-IsAdmin { [CmdletBinding()] Param() $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) Write-Output $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } # SIG # Begin signature block # MIIc8QYJKoZIhvcNAQcCoIIc4jCCHN4CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBU3AQkWQIbw42Q # hRQNij4L+rJGr4Ox0RgGO25OXTtRJqCCFxIwggQHMIIDrKADAgECAhMxAAAABqKD # l7IlZGgkAAAAAAAGMAoGCCqGSM49BAMCMEgxCzAJBgNVBAYTAlNFMRQwEgYDVQQK # EwtaYW1wbGVXb3JrczEjMCEGA1UEAxMaWmFtcGxlV29ya3MgSW50ZXJuYWwgQ0Eg # djMwHhcNMjIwNjIzMTcxODAyWhcNMjMwNjIzMTcxODAyWjAaMRgwFgYDVQQDEw9B # bmRlcnMgUnVuZXNzb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDn # vRwXGLqtbYHWSMXu91+l+zJQLSBzO2Q0Y6xZ1BBZLLIg5Brs+P+K9r2ok6leAYIp # WYjklUPSHdQd0MG5Ouxhnao1mIpdClrfL6hYOMWfFTC5bqY8a/Yv3y0bcbWt4g1w # 898khuUdzdSqquPOAoynHzCKNcLT7MppFvyCnxquDCq/V1URmQQaNKiLzphq5EAt # YEjRnYWmXOAtINwVgwV4TORrbS9Tjaw7c86t0/4E3paiK/zuHTgF6lwV2Shi1u7M # kMJ8DbCDBz0DQOcNscKCNu2aRxEZyQk7NeHtI3Kl7H74Me9BMIqCfYZmSazHk252 # nPT1oRiNZEKW7jk6PZ85AgMBAAGjggHWMIIB0jA+BgkrBgEEAYI3FQcEMTAvBicr # BgEEAYI3FQiFvfVOgvm6E4a9lx6Hx5oph4vfRIFkhviqFYSi0VcCAWUCAQIwEwYD # VR0lBAwwCgYIKwYBBQUHAwMwDgYDVR0PAQH/BAQDAgeAMBsGCSsGAQQBgjcVCgQO # MAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFN+NkDlLljJH1lz/CdH3jR1chI2+MB8G # A1UdIwQYMBaAFNycnL/2+NQJIWqe3QaNutQBPBQ2MGIGCCsGAQUFBwEBBFYwVDBS # BggrBgEFBQcwAoZGaHR0cDovL3BraS5vcC56d2tzLnh5ei9SZXBvc2l0b3J5L1ph # bXBsZVdvcmtzJTIwSW50ZXJuYWwlMjBDQSUyMHYzLmNydDBbBgNVHREEVDBSoC8G # CisGAQQBgjcUAgOgIQwfQW5kZXJzLlJ1bmVzc29uQHphbXBsZXdvcmtzLmNvbYEf # QW5kZXJzLlJ1bmVzc29uQHphbXBsZXdvcmtzLmNvbTBNBgkrBgEEAYI3GQIEQDA+ # oDwGCisGAQQBgjcZAgGgLgQsUy0xLTUtMjEtMTY5MDA3NTU0LTU2MTU1NTU4My0z # NDY1ODcwMDY1LTE1MTYwCgYIKoZIzj0EAwIDSQAwRgIhAIQ3dJNTQUHZxjoNohJz # lxvkbtg4n/jDIMFEF9Zq2chpAiEAl9qWDx45hlSYQW43hl6tLMhc/SE5zqTMWNEr # fmODQ4EwggWNMIIEdaADAgECAhAOmxiO+dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEB # DAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNV # BAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQg # SUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJ # BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k # aWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL/mkHNo3rvkXUo8MCIwaTPs # wqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/zG6Q4FutWxpdtHauyefLKEdLk # X9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZanMylNEQRBAu34LzB4TmdDtt # ceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7sWxq868nPzaw0QF+xembud8hI # qGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2 # scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm # 2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3JFxGj2T3wWmIdph2PVldQnaH # iZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3cAORFJYm2mkQZK37AlLTSYW3r # M9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqxYxhElRp2Yn72gLD76GSmM9GJ # B+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0viastkF13nqsX40/ybzTQRES # W+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aLT8LWRV+dIPyhHsXAj6Kxfgom # mfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0G # A1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLL # gjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMCAYYweQYIKwYBBQUHAQEEbTBrMCQG # CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKG # N2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJv # b3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDARBgNVHSAECjAIMAYGBFUd # IAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0NcVec4X6CjdBs9thbX979XB72arKGH # LOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnovLbc47/T/gLn4offyct4kvFIDyE7Q # Kt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65ZyoUi0mcudT6cGAxN3J0TU53/oWajw # vy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFWjuyk1T3osdz9HNj0d1pcVIxv76FQ # Pfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPFmCLBsln1VWvPJ6tsds5vIy30fnFq # I2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9ztwGpn1eqXijiuZQwggauMIIElqAD # AgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYT # AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy # dC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAz # MjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQK # Ew5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBS # U0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDM # g/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOx # s+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09ns # ad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtA # rF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149z # k6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6 # OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qh # HGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1 # KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX # 6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0 # sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQID # AQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2F # L3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08w # DgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEB # BGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsG # AQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz # dGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgG # BmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+Y # qUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjY # C+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0 # FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6 # WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGj # VoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzp # SwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwd # eDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o # 08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n # +2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y # 3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIO # K+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIGwDCCBKigAwIBAgIQDE1pckuU+jwq # Sj0pB4A9WjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO # RGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNB # NDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIyMDkyMTAwMDAwMFoXDTMz # MTEyMTIzNTk1OVowRjELMAkGA1UEBhMCVVMxETAPBgNVBAoTCERpZ2lDZXJ0MSQw # IgYDVQQDExtEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMiAtIDIwggIiMA0GCSqGSIb3 # DQEBAQUAA4ICDwAwggIKAoICAQDP7KUmOsap8mu7jcENmtuh6BSFdDMaJqzQHFUe # HjZtvJJVDGH0nQl3PRWWCC9rZKT9BoMW15GSOBwxApb7crGXOlWvM+xhiummKNuQ # Y1y9iVPgOi2Mh0KuJqTku3h4uXoW4VbGwLpkU7sqFudQSLuIaQyIxvG+4C99O7HK # U41Agx7ny3JJKB5MgB6FVueF7fJhvKo6B332q27lZt3iXPUv7Y3UTZWEaOOAy2p5 # 0dIQkUYp6z4m8rSMzUy5Zsi7qlA4DeWMlF0ZWr/1e0BubxaompyVR4aFeT4MXmaM # Ggokvpyq0py2909ueMQoP6McD1AGN7oI2TWmtR7aeFgdOej4TJEQln5N4d3CraV+ # +C0bH+wrRhijGfY59/XBT3EuiQMRoku7mL/6T+R7Nu8GRORV/zbq5Xwx5/PCUsTm # FntafqUlc9vAapkhLWPlWfVNL5AfJ7fSqxTlOGaHUQhr+1NDOdBk+lbP4PQK5hRt # ZHi7mP2Uw3Mh8y/CLiDXgazT8QfU4b3ZXUtuMZQpi+ZBpGWUwFjl5S4pkKa3YWT6 # 2SBsGFFguqaBDwklU/G/O+mrBw5qBzliGcnWhX8T2Y15z2LF7OF7ucxnEweawXjt # xojIsG4yeccLWYONxu71LHx7jstkifGxxLjnU15fVdJ9GSlZA076XepFcxyEftfO # 4tQ6dwIDAQABo4IBizCCAYcwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAw # FgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJ # YIZIAYb9bAcBMB8GA1UdIwQYMBaAFLoW2W1NhS9zKXaaL3WMaiCPnshvMB0GA1Ud # DgQWBBRiit7QYfyPMRTtlwvNPSqUFN9SnDBaBgNVHR8EUzBRME+gTaBLhklodHRw # Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hB # MjU2VGltZVN0YW1waW5nQ0EuY3JsMIGQBggrBgEFBQcBAQSBgzCBgDAkBggrBgEF # BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFgGCCsGAQUFBzAChkxodHRw # Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRSU0E0MDk2 # U0hBMjU2VGltZVN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQBVqioa # 80bzeFc3MPx140/WhSPx/PmVOZsl5vdyipjDd9Rk/BX7NsJJUSx4iGNVCUY5APxp # 1MqbKfujP8DJAJsTHbCYidx48s18hc1Tna9i4mFmoxQqRYdKmEIrUPwbtZ4IMAn6 # 5C3XCYl5+QnmiM59G7hqopvBU2AJ6KO4ndetHxy47JhB8PYOgPvk/9+dEKfrALpf # So8aOlK06r8JSRU1NlmaD1TSsht/fl4JrXZUinRtytIFZyt26/+YsiaVOBmIRBTl # Clmia+ciPkQh0j8cwJvtfEiy2JIMkU88ZpSvXQJT657inuTTH4YBZJwAwuladHUN # PeF5iL8cAZfJGSOA1zZaX5YWsWMMxkZAO85dNdRZPkOaGK7DycvD+5sTX2q1x+Dz # BcNZ3ydiK95ByVO5/zQQZ/YmMph7/lxClIGUgp2sCovGSxVK05iQRWAzgOAj3vgD # pPZFR+XOuANCR+hBNnF3rf2i6Jd0Ti7aHh2MWsgemtXC8MYiqE+bvdgcmlHEL5r2 # X6cnl7qWLoVXwGDneFZ/au/ClZpLEQLIgpzJGgV8unG1TnqZbPTontRamMifv427 # GFxD9dAq6OJi7ngE273R+1sKqHB+8JeEeOMIA11HLGOoJTiXAdI/Otrl5fbmm9x+ # LMz/F0xNAKLY1gEOuIvu5uByVYksJxlh9ncBjDGCBTUwggUxAgEBMF8wSDELMAkG # A1UEBhMCU0UxFDASBgNVBAoTC1phbXBsZVdvcmtzMSMwIQYDVQQDExpaYW1wbGVX # b3JrcyBJbnRlcm5hbCBDQSB2MwITMQAAAAaig5eyJWRoJAAAAAAABjANBglghkgB # ZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJ # AzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8G # CSqGSIb3DQEJBDEiBCDU5IXNwYhaYL7t3vbuDL3XCHFPt0w+X2Lk+gpraSjF/TAN # BgkqhkiG9w0BAQEFAASCAQDTqTY072vSLmk8gqxWfQuMKdduLbwZZTBoyYJz+29B # da2Ku0b5+dzNNvziGIQoGmR5l1TSLneD23mLwix4EbKVWdCj1yYUvBXcRM1MWRM3 # zGPvn18aJYjI8/flzQt26MvIWKEbqGOqRu6Me6fAXtKDkZBMVQVWQBwIjVviL4Oe # n4zV0jG49vQFPBYZFvM0VN4m++urxVtI1rZMtAoqTtW8NLEuwLBEIgBdIBvobI+E # ehF9UmPf7b3CgPImYojQR8dBgklrIXejiTuKmbFZSoeeuy8/nYefpWazZtaXY7LC # PdgpJQlkDl+HcajudZAoMiNgyKwC9xADPnU60jhI7kbooYIDIDCCAxwGCSqGSIb3 # DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD # ZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYg # U0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQDE1pckuU+jwqSj0pB4A9WjANBglghkgB # ZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF # MQ8XDTIzMDQwMzEwMDUwOFowLwYJKoZIhvcNAQkEMSIEIM0Eg5N0ryZLaLHn03PT # w143EWhuqyLJPQxR9CSv7ferMA0GCSqGSIb3DQEBAQUABIICAMeOMOahZlOMiwl4 # tKgCRAjLh23DZfwxM4IV1UuhUnFJuLSjvQ35Qo/QEtLEogAPU+JHufsCcPDNOLW4 # nfVUsVm6fEICkppEjF8esQ8Q5ysWOsc6Ujus5uj1lAbcOR04zzxruzfizhRyZCfE # O7ybohhOc9ztMJc7aucM1/ChNMGBZLy5fq6V+P63Slugxag1DjjTfbXZ0yHwsk/9 # enrmt6hj9PAWVWjzLrQpsmIdfEh39jQUk2d+cqVMtwfdnxfA0RQgWtUJ3BU23mX9 # EG1vJXY6gM7msVuOY6cuX7+tNA583IuwRDGDnzJhFRpZ75ucQuamddbVnlZiHjVG # gxu1lXmU6HE8wH5Ds2RtoHwLzuPSkrZZOtJRrVUR/D1fJ90dewTg1wNKO7BPqSnh # M06czRFVT4WaFEwkWE5g1cCUZDiuuUuHuOZ8wbH4f8RZ4xTCSYvhB8ig+xKlZYrv # vf7N8JKWOTJhVjxKRCJDQrfle3Lgv7uGmTwFnXwVG+srmc7nkDwXbpx0ypl5qvSL # JIq7vgbiEnEsWAv5l2OuLaxpx6UuV25dLp1jOpEtppIbE325kXOlw6QFusJHSp/I # 7HkxQs8TCy3zLd9rBC+68kV8n30Ixt9RbU9opx7fIc/YaokqKo1TXNz5rnfL2Q8/ # lI/jDijhAroQoSBTo2wo4g9BZIaR # SIG # End signature block |