Public/New-ADFSTkInstitutionConfiguration.ps1
#Requires -Version 5.1 function New-ADFSTkInstitutionConfiguration { [cmdletbinding()] Param ( ) #Get All paths and assert they exist if ([string]::IsNullOrEmpty($Global:ADFSTkPaths)) { $Global:ADFSTkPaths = Get-ADFSTKPaths } $CompatibleConfigVersion = "1.3" try { $mainConfiguration = Get-ADFSTkConfiguration } catch { #inform that we need a main config and that we will call that now Write-ADFSTkHost -WriteLine -AddSpaceAfter Write-ADFSTkHost confNeedMainConfigurationMessage -Style Info -AddSpaceAfter $mainConfiguration = New-ADFSTkConfiguration -Passthru } Write-ADFSTkHost confCreateNewConfigurationFile -Style Info -AddLinesOverAndUnder # Use a default template from to start with #$mainConfiguration.FederationConfig.Federation $federationName = $mainConfiguration.FederationConfig.Federation.FederationName if ([string]::IsNullOrEmpty($federationName)) { $defaultConfigFile = $Global:ADFSTkPaths.defaultConfigFile #[xml]$config = Get-Content $Global:ADFSTkPaths.defaultConfigFile } else { $defaultFederationConfigDir = Join-Path $Global:ADFSTkPaths.federationDir $federationName #Check if the federation dir exists and if not, create it ADFSTk-TestAndCreateDir -Path $defaultFederationConfigDir -PathName "$federationName config directory" #Check if we already have any Federation defaults file(s) $defaultFederationConfigFiles = Get-ChildItem -Path $defaultFederationConfigDir -Filter "*_defaultConfigFile.xml" if ([string]::IsNullOrEmpty($defaultFederationConfigFiles)) { Write-ADFSTkHost confCopyFederationDefaultFolderMessage -Style Info -AddSpaceAfter -f $Global:ADFSTkPaths.federationDir Read-Host (Get-ADFSTkLanguageText cPressEnterKey) | Out-Null $defaultFederationConfigFiles = Get-ChildItem -Path $defaultFederationConfigDir -Filter "*_defaultConfigFile.xml" } if ([string]::IsNullOrEmpty($defaultFederationConfigFiles)) { $defaultConfigFile = $null } elseif ($defaultFederationConfigFiles -is [System.IO.FileSystemInfo]) { $defaultConfigFile = $defaultFederationConfigFiles.FullName #[xml]$config = Get-Content $defaultFederationConfigFiles.FullName } elseif ($defaultFederationConfigFiles -is [System.Array]) { $defaultConfigFile = $defaultFederationConfigFiles | Out-GridView -Title "Select the default federation configuration file you want to use" -OutputMode Single | Select -ExpandProperty FullName } else { #We should never be here... } if ([string]::IsNullOrEmpty($defaultConfigFile)) { if (Get-ADFSTkAnswer (Get-ADFSTkLanguageText confFederationDefaultConfigNotFoundQuestion -f $federationName) -DefaultYes) { $defaultConfigFile = $Global:ADFSTkPaths.defaultConfigFile #[xml]$config = Get-Content $Global:ADFSTkPaths.defaultConfigFile } else { Write-ADFSTkLog (Get-ADFSTkLanguageText confFederationDefaultConfigNotFound) -MajorFault } } } try { [xml]$defaultConfig = Get-Content $defaultConfigFile if ($defaultConfig.configuration.ConfigVersion -ne $CompatibleConfigVersion) { Write-ADFSTkLog (Get-ADFSTkLanguageText confDefaultConfigIncorrectVersion -f $defaultConfigFile,$defaultConfig.configuration.ConfigVersion,$CompatibleConfigVersion) -MajorFault } } catch { Write-ADFSTkLog (Get-ADFSTkLanguageText confCouldNotOpenFederationDefaultConfig -f $defaultConfigFile,$_) -MajorFault } [xml]$newConfig = $defaultConfig.Clone() Write-ADFSTkHost confStartMessage -Style Info -AddSpaceAfter Write-ADFSTkHost -WriteLine Set-ADFSTkConfigItem -XPath "configuration/metadataURL" ` -ExampleValue 'https://metadata.federationOperator.org/path/to/metadata.xml' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/signCertFingerprint" ` -ExampleValue '0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/MetadataPrefix" ` -ExampleValue 'ADFSTk/CANARIE/INCOMMON/SWAMID' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/staticValues/co" ` -ExampleValue 'Canada, Sweden, USA' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/staticValues/c" ` -ExampleValue 'CA, SE, US' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/staticValues/o" ` -ExampleValue 'University Of Example' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/staticValues/schacHomeOrganization" ` -ExampleValue 'universityofexample.edu' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/staticValues/norEduOrgAcronym" ` -ExampleValue 'UoE' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/staticValues/ADFSExternalDNS" ` -ExampleValue 'adfs.universityofexample.edu' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig Set-ADFSTkConfigItem -XPath "configuration/eduPersonPrincipalNameRessignable" ` -ExampleValue 'false' ` -DefaultConfig $defaultConfig ` -NewConfig $newConfig #Adding eduPersonScopedAffiliation based on eduPersonAffiliation added with @schackHomeOrganization $epa = $newConfig.configuration.attributes.attribute | ? type -eq "urn:mace:dir:attribute-def:eduPersonAffiliation" $epsa = $newConfig.configuration.attributes.attribute | ? type -eq "urn:mace:dir:attribute-def:eduPersonScopedAffiliation" $epa.ChildNodes | % { $node = $_.Clone() $node.InnerText += "@$($newConfig.configuration.staticValues.schacHomeOrganization)" $epsa.AppendChild($node) | Out-Null } # various useful items for minting our configuration # user entered $myPrefix = (Select-Xml -Xml $newConfig -XPath "configuration/MetadataPrefix").Node.InnerText # For the ADFSTk functionality, we desire to associate certain cache files to certain things and bake a certain default location #(Select-Xml -Xml $config -XPath "configuration/WorkingPath").Node.'#text' = "$myADFSTkInstallDir" #Do we really need this? (Select-Xml -Xml $newConfig -XPath "configuration/SPHashFile").Node.InnerText = "$myPrefix-SPHashfile.xml" (Select-Xml -Xml $newConfig -XPath "configuration/MetadataCacheFile").Node.InnerText = "$myPrefix-metadata.cached.xml" $newConfigFile = Join-Path $Global:ADFSTkPaths.institutionDir "config.$myPrefix.xml" if (Test-path $newConfigFile) { #Should we recommend to do an upgrade instead? if (Get-ADFSTkAnswer -Caption (Get-ADFSTkLanguageText confConfigurationAlreadyExistsCaption) ` -Message (Get-ADFSTkLanguageText confOverwriteConfiguration) ` -DefaultYes) { $newConfigFileObject = Get-ChildItem $newConfigFile $myConfigFileBkpName = Join-Path $Global:ADFSTkPaths.institutionBackupDir ("{0}.{1}{2}" -f $newConfigFileObject.BaseName, (get-date -Format o).Replace(':','.'), $newConfigFileObject.Extension) Write-ADFSTkHost confCreatingNewConfigHere -f $newConfigFile -Style Value Write-ADFSTkHost confOldConfigurationFile -f $myConfigFileBkpName -Style Value Move-Item -Path $newConfigFile -Destination $myConfigFileBkpName $newConfig.Save($newConfigFile) } else { Write-ADFSTkLog (Get-ADFSTkLanguageText confDontOverwriteFileExit) -MajorFault } } else { Write-ADFSTkHost confInstConfigCreated -f $newConfigFile -Style Value $newConfig.Save($newConfigFile) } #Add $configFile to Main Config File Write-ADFSTkHost confAddFileToMainConfigMessage -Style Info -AddLinesOverAndUnder Add-ADFSTkConfigurationItem -ConfigurationItem $newConfigFile Write-ADFSTkHost -WriteLine -AddSpaceAfter Write-ADFSTkHost confConfigurationFileSavedHere -f $newConfigFile -Style Value #region get-ADFSTkLocalManualSpSettings.ps1 Write-ADFSTkHost confLocalManualSettingsMessage -Style Info -AddLinesOverAndUnder # Prepare our template for ADFSTkManualSPSettings to be copied into place, safely of course, after directories are confirmed to be there. #$myADFSTkManualSpSettingsDistroTemplateFile = Join-Path $Global:ADFSTkPaths.modulePath -ChildPath "config\default\en-US\get-ADFSTkLocalManualSpSettings-dist.ps1" $myADFSTkManualSpSettingsInstallTemplateFile = Join-Path $Global:ADFSTkPaths.institutionDir -ChildPath "get-ADFSTkLocalManualSpSettings.ps1" if (Test-path $myADFSTkManualSpSettingsInstallTemplateFile ) { if (Get-ADFSTkAnswer -Caption (Get-ADFSTkLanguageText confInstLocalSPFileExistsCaption) ` -Message (Get-ADFSTkLanguageText confOverwriteInstLocalSPFileMessage -f $myADFSTkManualSpSettingsInstallTemplateFile)) { $myADFSTkManualSpSettingsInstallTemplateFileObject = Get-ChildItem $myADFSTkManualSpSettingsInstallTemplateFile Write-ADFSTkHost confOverwriteInstLocalSPFileConfirmed -f $myADFSTkManualSpSettingsInstallTemplateFile -Style Value $mySPFileBkpName = Join-Path $Global:ADFSTkPaths.institutionBackupDir ("{0}.{1}{2}" -f $myADFSTkManualSpSettingsInstallTemplateFileObject.BaseName, (get-date -Format o).Replace(':','.'), $myADFSTkManualSpSettingsInstallTemplateFileObject.Extension) Write-ADFSTkHost confCreateNewInstLocalSPFile -f $Global:ADFSTkPaths.defaultInstitutionLocalSPFile -Style Value Write-ADFSTkHost confOldInstLocalSPFile -f $mySPFileBkpName -Style Value # Make backup Move-Item -Path $myADFSTkManualSpSettingsInstallTemplateFile -Destination $mySPFileBkpName Copy-item -Path $Global:ADFSTkPaths.defaultInstitutionLocalSPFile -Destination $myADFSTkManualSpSettingsInstallTemplateFile } else { Write-ADFSTkHost confDontOverwriteFileJustProceed -Style Info -AddSpaceAfter } } else { Write-ADFSTkHost confNoExistingFileSaveTo -f $myADFSTkManualSpSettingsInstallTemplateFile -Style Value -AddSpaceAfter Copy-item -Path $Global:ADFSTkPaths.defaultInstitutionLocalSPFile -Destination $myADFSTkManualSpSettingsInstallTemplateFile } #endregion #region Get-ADFSTkLocalTransformRules.ps1 Write-ADFSTkHost confLocalTransformRulesMessage -Style Info -AddLinesOverAndUnder -f $Global:ADFSTkPaths.institutionLocalTransformRulesFile # Prepare our template for ADFSTkLocalTransformRules to be copied into place, safely of course, after directories are confirmed to be there. if (Test-path $Global:ADFSTkPaths.institutionLocalTransformRulesFile ) { if (Get-ADFSTkAnswer -Caption (Get-ADFSTkLanguageText confLocalTransformRulesFileExistsCaption) ` -Message (Get-ADFSTkLanguageText confOverwriteInstLocalSPFileMessage -f $Global:ADFSTkPaths.institutionLocalTransformRulesFile)) { $myADFSTkLocalTransformRulesInstallTemplateFileObject = Get-ChildItem $Global:ADFSTkPaths.institutionLocalTransformRulesFile Write-ADFSTkHost confOverwriteLocalTransformRulesFileConfirmed -f $Global:ADFSTkPaths.institutionLocalTransformRulesFile -Style Value $myTRFileBkpName = Join-Path $Global:ADFSTkPaths.institutionBackupDir ("{0}.{1}{2}" -f $myADFSTkLocalTransformRulesInstallTemplateFileObject.BaseName, (get-date -Format o).Replace(':','.'), $myADFSTkLocalTransformRulesInstallTemplateFileObject.Extension) Write-ADFSTkHost confCreateNewInstLocalTransformRuleFile -f $Global:ADFSTkPaths.defaultInstitutionLocalTransformRulesFile -Style Value Write-ADFSTkHost confOldInstLocalSPFile -f $myTRFileBkpName -Style Value # Make backup Move-Item -Path $Global:ADFSTkPaths.institutionLocalTransformRulesFile -Destination $myTRFileBkpName # Copy dist file Copy-item -Path $Global:ADFSTkPaths.defaultInstitutionLocalTransformRulesFile -Destination $Global:ADFSTkPaths.institutionLocalTransformRulesFile } else { Write-ADFSTkHost confDontOverwriteFileJustProceed -Style Info -AddSpaceAfter } } else { Write-ADFSTkHost confNoExistingFileSaveTo -f $Global:ADFSTkPaths.institutionLocalTransformRulesFile -Style Value -AddSpaceAfter Copy-item -Path $Global:ADFSTkPaths.defaultInstitutionLocalTransformRulesFile -Destination $Global:ADFSTkPaths.institutionLocalTransformRulesFile } #endregion Write-ADFSTkHost confHowToRunMetadataImport -Style Info -AddLinesOverAndUnder if (Get-ADFSTkAnswer (Get-ADFSTkLanguageText confCreateScheduledTask)) { $stAction = New-ScheduledTaskAction -Execute 'Powershell.exe' ` -Argument "-NoProfile -WindowStyle Hidden -Command &{Sync-ADFSTkAggregates}" $stTrigger = New-ScheduledTaskTrigger -Daily -DaysInterval 1 -At (Get-Date) $stSettings = New-ScheduledTaskSettingsSet -Disable -MultipleInstances IgnoreNew -ExecutionTimeLimit ([timespan]::FromHours(12)) Register-ScheduledTask -Action $stAction ` -Trigger $stTrigger ` -TaskName (Get-ADFSTkLanguageText confImportMetadata) ` -Description (Get-ADFSTkLanguageText confTHisSchedTaskWillDoTheImport) ` -RunLevel Highest ` -Settings $stSettings ` -TaskPath "\ADFSToolkit\" } Write-ADFSTkHost -WriteLine -AddSpaceAfter Write-ADFSTkHost cAllDone -Style Done <# .SYNOPSIS Create or migrats an ADFSToolkit configuration file per aggregate. .DESCRIPTION This command creates a new or migrates an older configuration to a newer one when invoked. How this Powershell Cmdlet works: When loaded we: - seek out a template configuration in $Module-home/config/default/en/config.ADFSTk.default*.xml -- where * is the language designation, usually 'en' - if invoked with -MigrateConfig, the configuration attempts to detect the previous answers as defaults to the new ones where possible .INPUTS zero or more inputs of an array of string to command .OUTPUTS configuration file(s) for use with current ADFSToolkit that this command is associated with .EXAMPLE new-ADFSTkConfiguration .EXAMPLE "C:\ADFSToolkit\0.0.0.0\config\config.file.xml" | new-ADFSTkConfiguration .EXAMPLE "C:\ADFSToolkit\0.0.0.0\config\config.file.xml","C:\ADFSToolkit\0.0.0.0\config\config.file2.xml" | new-ADFSTkConfiguration #> } # SIG # Begin signature block # MIIRbgYJKoZIhvcNAQcCoIIRXzCCEVsCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUG7v4ybVcEiTguFFhKlzJf9Ga # EQuggg51MIIEfTCCA2WgAwIBAgIDG+cVMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNV # BAYTAlVTMSEwHwYDVQQKExhUaGUgR28gRGFkZHkgR3JvdXAsIEluYy4xMTAvBgNV # BAsTKEdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcN # MTQwMTAxMDcwMDAwWhcNMzEwNTMwMDcwMDAwWjCBgzELMAkGA1UEBhMCVVMxEDAO # BgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdv # RGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmlj # YXRlIEF1dGhvcml0eSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC # AQEAv3FiCPH6WTT3G8kYo/eASVjpIoMTpsUgQwE7hPHmhUmfJ+r2hBtOoLTbcJjH # MgGxBT4HTu70+k8vWTAi56sZVmvigAf88xZ1gDlRe+X5NbZ0TqmNghPktj+pA4P6 # or6KFWp/3gvDthkUBcrqw6gElDtGfDIN8wBmIsiNaW02jBEYt9OyHGC0OPoCjM7T # 3UYH3go+6118yHz7sCtTpJJiaVElBWEaRIGMLKlDliPfrDqBmg4pxRyp6V0etp6e # MAo5zvGIgPtLXcwy7IViQyU0AlYnAZG0O3AqP26x6JyIAX2f1PnbU21gnb8s51ir # uF9G/M7EGwM8CetJMVxpRrPgRwIDAQABo4IBFzCCARMwDwYDVR0TAQH/BAUwAwEB # /zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9BUFuIMGU2g/e # MB8GA1UdIwQYMBaAFNLEsNKR1EwRcbNhyz2h/t2oatTjMDQGCCsGAQUFBwEBBCgw # JjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZ29kYWRkeS5jb20vMDIGA1UdHwQr # MCkwJ6AloCOGIWh0dHA6Ly9jcmwuZ29kYWRkeS5jb20vZ2Ryb290LmNybDBGBgNV # HSAEPzA9MDsGBFUdIAAwMzAxBggrBgEFBQcCARYlaHR0cHM6Ly9jZXJ0cy5nb2Rh # ZGR5LmNvbS9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAWQtTvZKGEack # e+1bMc8dH2xwxbhuvk679r6XUOEwf7ooXGKUwuN+M/f7QnaF25UcjCJYdQkMiGVn # OQoWCcWgOJekxSOTP7QYpgEGRJHjp2kntFolfzq3Ms3dhP8qOCkzpN1nsoX+oYgg # HFCJyNwq9kIDN0zmiN/VryTyscPfzLXs4Jlet0lUIDyUGAzHHFIYSaRt4bNYC8nY # 7NmuHDKOKHAN4v6mF56ED71XcLNa6R+ghlO773z/aQvgSMO3kwvIClTErF0UZzds # yqUvMQg3qm5vjLyb4lddJIGvl5echK1srDdMZvNhkREg5L4wn3qkKQmw4TRfZHcY # QFHfjDCmrzCCBNAwggO4oAMCAQICAQcwDQYJKoZIhvcNAQELBQAwgYMxCzAJBgNV # BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRow # GAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UEAxMoR28gRGFkZHkgUm9v # dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjAeFw0xMTA1MDMwNzAwMDBaFw0z # MTA1MDMwNzAwMDBaMIG0MQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTET # MBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5jb20sIEluYy4x # LTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzEz # MDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAt # IEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAueDLENSvdr3Uk2Lr # MGS4gQhswwTZYheOL/8+Zc+PzmLmPFIc2hZFS1WreGtjg2KQzg9pbJnIGhSLTMxF # M+qI3J6jryv+gGGdeVfEzy70PzA8XUf8mha8wzeWQVGOEUtU+Ci+0Iy+8DA4HvOw # JvhmR2Nt3nEmR484R1PRRh2049wA6kWsvbxx2apvANvbzTA6eU9fTEf4He9bwsSd # YDuxskOR2KQzTuqz1idPrSWKpcb01dCmrnQFZFeItURV1C0qOj74uL3pMgoClGTE # FjpQ8Uqu53kzrwwgB3/o3wQ5wmkCbGNS+nfBG8h0h8i5kxhQVDVLaU68O9NJLh/c # wdJS+wIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC # AQYwHQYDVR0OBBYEFEDCvSeOzDSDMKIz1/tss/C0LIDOMB8GA1UdIwQYMBaAFDqa # hQcQZyi27/a9BUFuIMGU2g/eMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYY # aHR0cDovL29jc3AuZ29kYWRkeS5jb20vMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6 # Ly9jcmwuZ29kYWRkeS5jb20vZ2Ryb290LWcyLmNybDBGBgNVHSAEPzA9MDsGBFUd # IAAwMzAxBggrBgEFBQcCARYlaHR0cHM6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBv # c2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEACH5skxDIOLiWqZBL/6FfTwTvbD6c # iAbJUI+mc/dXMRu+vOQv2/i601vgtOfmeWIODKLXamNzMbX1qEikOwgtol2Q17R8 # JU8RVjDEtkSdeyyd5V7m7wxhqr/kKhvuhJ64g33BQ85EpxNwDZEf9MgTrYNg2dhy # qHMkHrWsIg7KF4liWEQbq4klAQAPzcQbYttRtNMPUSqb9Lxz/HbONqTN2dgs6q6b # 9SqykNFNdRiKP4pBkCN9W0v+pANYm0ayw2Bgg/h9UEHOwqGQw7vvAi/SFVTuRBXZ # Cq6nijPtsS12NibcBOuf92EfFdyHb+5GliitoSZ9CgmnLgSjjbz4vAQwATCCBRww # ggQEoAMCAQICCDeMqUwECkf0MA0GCSqGSIb3DQEBCwUAMIG0MQswCQYDVQQGEwJV # UzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UE # ChMRR29EYWRkeS5jb20sIEluYy4xLTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2Rh # ZGR5LmNvbS9yZXBvc2l0b3J5LzEzMDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENl # cnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTIwMDEwODExMjIyNFoXDTIxMDMw # ODE4NTgwMFowXjELMAkGA1UEBhMCQ0ExEDAOBgNVBAgTB09udGFyaW8xDzANBgNV # BAcTBk90dGF3YTEVMBMGA1UEChMMQ0FOQVJJRSBJbmMuMRUwEwYDVQQDEwxDQU5B # UklFIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZhfCjFqiT # mN1uLoySixnwaOjf/ZAL9P6SvjlCaBA2mutoorEgnzUP8HnOIcvMRgEMPmpaZ8eg # M93Bmx9d41xoarsQpCN3DhYOo+b3fWnPucVtpxbul2OFePv63mw/uvr+dqkv4b/f # 3Tg+ilQbpsNonbvh9MKEFv8Pn9koj0ySV+qxz34PxTVAe6g//pel3/3i9fqilCnI # Ecx4zg/+NKBeOWROSs4oXo3IvBjVrunmz+YuieSr78TqIE6hD8JF2q1wKwfMB3+x # 7dEXZAus9WtIU/qITATtEfO9QAgrrYL4F1MLN+osSp8my5eCOjnLTQc47q574V3z # QhsIHW7yBXLdAgMBAAGjggGFMIIBgTAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG # CCsGAQUFBwMDMA4GA1UdDwEB/wQEAwIHgDA1BgNVHR8ELjAsMCqgKKAmhiRodHRw # Oi8vY3JsLmdvZGFkZHkuY29tL2dkaWcyczUtNS5jcmwwXQYDVR0gBFYwVDBIBgtg # hkgBhv1tAQcXAjA5MDcGCCsGAQUFBwIBFitodHRwOi8vY2VydGlmaWNhdGVzLmdv # ZGFkZHkuY29tL3JlcG9zaXRvcnkvMAgGBmeBDAEEATB2BggrBgEFBQcBAQRqMGgw # JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdvZGFkZHkuY29tLzBABggrBgEFBQcw # AoY0aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5L2dk # aWcyLmNydDAfBgNVHSMEGDAWgBRAwr0njsw0gzCiM9f7bLPwtCyAzjAdBgNVHQ4E # FgQUUPnMg2nmYS8l7rmax3weVkrgz5AwDQYJKoZIhvcNAQELBQADggEBAIYabiAR # aY4KhO6oWgNHPOBjoHuqUH7NwRGN/ztYJznRBZbdD50smoK5GR0FvUZ8TXhYoZOa # zXe4NlFM4e6YcudU+EA/OF+sZHFBWziz1VS6U3sS+cGyJcxvelSoid0q3W3i9/Zy # 6Nv2kk/DEJp49O47mPNovpL15yykX3Vo26GwC9peo4s/cKMzthmgrcF2uLkT+LW4 # 4xKhaL7nBTGDMhjno+a3t00SWCId7wzgQadIJ1QlFOKm0xgmuiW3LIqCG0apvaOf # vWKTPKq68q+FbDPOO48oKrvw1c9K/m8gcnBLz6PX1REVIs5u3pvdOYBCz6uXyKxn # t+Q5jDEK0NskLu0xggJjMIICXwIBATCBwTCBtDELMAkGA1UEBhMCVVMxEDAOBgNV # BAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFk # ZHkuY29tLCBJbmMuMS0wKwYDVQQLEyRodHRwOi8vY2VydHMuZ29kYWRkeS5jb20v # cmVwb3NpdG9yeS8xMzAxBgNVBAMTKkdvIERhZGR5IFNlY3VyZSBDZXJ0aWZpY2F0 # ZSBBdXRob3JpdHkgLSBHMgIIN4ypTAQKR/QwCQYFKw4DAhoFAKB4MBgGCisGAQQB # gjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK # KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFD97HWV0 # K72sQSsxPgnQLJWKLelTMA0GCSqGSIb3DQEBAQUABIIBADE+mvr9HKXUjs5AzHyl # +00w3FL+hBRC3C+Of3hCK/5d0XKVdTeTRFBzmwHwzuIxk7Fft3PlpshmrTp7Vyig # R0LYQgmjZgdPttQyCd3DUDrh+GwxIKc5bpERjNJ4XyTrRlyWH5NfqIUSoDqy1cnc # Ai5S4SeOXArFSB4fOH0ubECNOUlORybXvMs1c0cpFgw8y4LRbZ2FNSwvqz5gVd12 # o1o6LkwwK8g15TW4aTJgOiDDfWLtidpOJ7xmIHr6SZq/ZJwgv/yspR+cMq76/Bz5 # 4FL7cNQubA688HVnkrW5icYj7ZG1pwZ1dmI+RMQJB0JQCRCXskHrnRE1wU3w+WDV # gLA= # SIG # End signature block |