Test-ProvCloudConnection.ps1
<#PSScriptInfo .VERSION 1.2.2 .GUID d3b73fe3-d9b8-433c-a29d-cfddd90f8643 .AUTHOR Dragan Arambasic .COMPANYNAME Provance Technologies .COPYRIGHT Provance Technologies .TAGS Provance PCC AzureAutomation Azure .LICENSEURI https://www.provance.com/ .PROJECTURI https://www.provance.com/ .ICONURI http://assetdesk.com/Images_for_KB_Articles/PROVANCE_FavIcon_mstile-310x310.png .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES 1st Version with basic functionality .PRIVATEDATA Privatedata #> #Requires -Module Provance.Azure,Provance.Dyn365 <# .DESCRIPTION This runbook tests connections to Cloud Service Management targets (ITSM, Azure Subscriptions, ...) #> param( [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [String] $ITSMConnection, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [String] $AzureConnection, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [String] $ServiceMapConnection, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [String] $CSPConnection ) try { #################### S T A R T runbook #################### $time = [DateTime]::UtcNow.ToString('u') Write-Output "Start runbook at: $time" # set the security protocol to TLS 1.2 [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 ############## ITSM Connection - START ############## if ($ITSMConnection) { Write-Output ("1) Test ITSM connection: " + $ITSMConnection) $connectionITSM = Get-AutomationConnection -Name $ITSMConnection if ($connectionITSM) { $instanceURL = $connectionITSM.InstanceURL $userName = $connectionITSM.UserName $password = $connectionITSM.Password $tenantId = $connectionITSM.TenantId $applicationID = $connectionITSM.ApplicationID $apiVersion = $connectionITSM.APIVersion $msg = "instanceURL: {0}, userName: {1}, tenantId: {2}, applicationID: {3}, apiVersion: {4}" ` -f $instanceURL, $userName, $tenantId, $applicationID, $apiVersion Write-Output $msg if (($instanceURL -ne $null) -and ($userName -ne $null) -and ($password -ne $null) -and ($tenantId -ne $null)) { $pswSecureString = ConvertTo-SecureString -String $password -AsPlainText -Force $userCred = New-Object -TypeName PSCredential -ArgumentList $userName, $pswSecureString $uCntx = Get-ProvAzureAuthContext -Resource $instanceURL -UserCredential $userCred -TenantId $tenantId if ($uCntx) { Write-Output "INFO: ITSM context is OK" $lic = Get-ProvDyn365Entity -AuthContext $uCntx ` -EntityName apitil_itsmlicense ` -SelectSection "apitil_orguniquename,apitil_azuresubscription,apitil_azureservicemap" ` -FilterSection "(apitil_productlicensed eq 'Cloud Integration')" ` -TopSection 1 if ($lic) { Write-Output ("INFO: Cloud Integration license:") $lic } else { Write-Output ("INFO: Cloud Integration license is missing") } } else { Write-Output "*** ERROR: No valid ITSM context. Check value of the following ITSM connection properties: InstanceURL, UserName, Password and TennatId" } } else { Write-Output "*** ERROR: ITSM connection propertiy (InstanceURL, UserName, Password or TennatId) is null" } } else { Write-Output "*** ERROR: ITSM connection is missing" } } # ITSM Connection - END # ############## Azure Connection - START ############## if ($AzureConnection) { Write-Output ("2) Test Azure connection: " + $AzureConnection) $connectionAzure = Get-AutomationConnection -Name $AzureConnection if ($connectionAzure) { $tenantName = $connectionAzure.TenantName $subscriptionName = $connectionAzure.SubscriptionName $subscriptionId = [System.Guid]$connectionAzure.SubscriptionId $tenantId = $connectionAzure.TenantId $applicationID = $connectionAzure.ApplicationID $applicationKey = $connectionAzure.ApplicationKey $apiVersion = $connectionAzure.APIVersion $msg = "tenantName: {0}, subscriptionName: {1}, subscriptionId: {2}, tenantId: {3}, applicationID: {4}, apiVersion: {5}" ` -f $tenantName, $subscriptionName, $subscriptionId, $tenantId, $applicationID, $apiVersion Write-Output $msg if (($tenantId -ne $null) -and ($applicationKey -ne $null) -and ($applicationID -ne $null) -and ($subscriptionId -ne $null)) { $appKeySecureString = ConvertTo-SecureString -String $applicationKey -AsPlainText -Force $cred = New-Object -TypeName PSCredential -ArgumentList $applicationID, $appKeySecureString $aCntx = Get-ProvAzureAuthContext -TenantId $tenantId -ClientCredential $cred if ($aCntx) { Write-Output "INFO: Azure context is OK" $subscription = Get-ProvAzureSubscription -AuthContext $aCntx -SubscriptionId $subscriptionId if ($subscription) { Write-Output ("INFO: Found Azure subscription: " + $subscription.DisplayName) } else { Write-Output ("*** ERROR: No valid Azure subscription Id: " + $subscriptionId) } } else { Write-Output "*** ERROR: No valid Azure context. Check value of the following Azure connection properties: TenantId, ApplicationId, and ApplicationKey" } } } else { Write-Output ("*** ERROR: Azure connection: " + $AzureConnection + " is missing") } } # Azure Connection - END # ############## Service Map Connection - START ############## if ($ServiceMapConnection) { Write-Output ("3) Test Service Map connection: " + $ServiceMapConnection) $connectionServiceMap = Get-AutomationConnection -Name $ServiceMapConnection if ($connectionServiceMap) { $omsWorkspace = $connectionServiceMap.OMSWorkspace $resourceGroup = $connectionServiceMap.OMSRGName $subscriptionId = $connectionServiceMap.SubscriptionId $tenantId = $connectionServiceMap.TenantId $applicationID = $connectionServiceMap.ApplicationID $applicationKey = $connectionServiceMap.ApplicationKey $apiVersion = $connectionServiceMap.APIVersion $msg = "omsWorkspace: {0}, resourceGroup: {1}, subscriptionId: {2}, tenantId: {3}, applicationID: {4}, apiVersion: {5}" ` -f $omsWorkspace, $resourceGroup, $subscriptionId, $tenantId, $applicationID, $apiVersion Write-Output $msg if (($tenantId -ne $null) -and ($applicationKey -ne $null) -and ($applicationID -ne $null) -and ($subscriptionId -ne $null)) { $appKeySecureString = ConvertTo-SecureString -String $applicationKey -AsPlainText -Force $cred = New-Object -TypeName PSCredential -ArgumentList $applicationID, $appKeySecureString $aCntx = Get-ProvAzureAuthContext -TenantId $tenantId -ClientCredential $cred if ($aCntx) { Write-Output "INFO: ServiceMap context is OK" if (($omsWorkspace -ne $null) -and ($resourceGroup -ne $null)) { $smWrkSpc = Get-ProvAzureServiceMapWorkspace -AuthContext $aCntx ` -SubscriptionId $subscriptionId ` -ResourceGroup $resourceGroup ` -OMSWorkspace $omsWorkspace ` -ApiVersion $apiVersion ` -Verbose if ($smWrkSpc) { Write-Output ("INFO: Found Service Map workspace " + $smWrkSpc.DisplayName) } else { Write-Output ("*** ERROR: Servic Map workspace " + $omsWorkspace + "in resource group " + $resourceGroup + " is missing") } } else { Write-Output "*** ERROR: Servic Map workspace or resource group is null" } } else { Write-Output "*** ERROR: No valid ServiceMap context. Check value of the following Azure connection properties: TenantId, ApplicationId, and ApplicationKey" } } } else { Write-Output ("*** ERROR: Service Map connection " + $ServiceMapConnection + " is missing") } } # Service Map Connection - END # ############## CSP Connection - START ############## if ($CSPConnection) { Write-Output ("4) Test Service Map connection: " + $CSPConnection) $connectionCSP = Get-AutomationConnection -Name $CSPConnection if ($connectionCSP) { $baseURL = $connectionCSP.BaseURL $resource = $connectionCSP.Resource $loginURL = $connectionCSP.LoginURL $userName = $connectionCSP.UserName $password = $connectionCSP.Password $tenantId = $connectionCSP.TenantId $applicationID = $connectionCSP.ApplicationID $apiVersion = $connectionCSP.APIVersion $msg = "baseURL: {0}, resource: {1}, loginURL: {1}, userName: {1}, password: {2}, tenantId: {3}, applicationID: {4}, apiVersion: {5}" ` -f $baseURL, $resource, $loginURL, $userName, $password, $tenantId, $applicationID, $apiVersion Write-Output $msg if (($resource -ne $null) -and ($userName -ne $null) -and ($password -ne $null) -and ($tenantId -ne $null)) { $pswSecureString = ConvertTo-SecureString -String $password -AsPlainText -Force $userCred = New-Object -TypeName PSCredential -ArgumentList $userName, $pswSecureString $uCntx = Get-ProvAzureAuthContext -Resource $resource -UserCredential $userCred -TenantId $tenantId if ($uCntx) { Write-Output "INFO: CSP context is OK" } else { Write-Output "*** ERROR: No valid CSP context. Check value of the following CSP connection properties: BaseURL, UserName, Password and TennatId" } } } else { Write-Output "*** ERROR: CSP connection is missing" } } # CSP Connection - END # } catch { $message = "Runbook *** ERROR: {0}" -f $_.Exception Write-Error -Message $message } finally { $time = [DateTime]::UtcNow.ToString('u') Write-Output "End of runbook at: $time" } # SIG # Begin signature block # MIIaBQYJKoZIhvcNAQcCoIIZ9jCCGfICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUB5d4nurulcF1wjhvXqEw323n # SpCgghSZMIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UE # BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY # BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290 # IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMx # MDUwMzA3MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw # EQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEt # MCsGA1UECxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMw # MQYDVQQDEypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0g # RzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYusw # ZLiBCGzDBNliF44v/z5lz4/OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz # 6ojcnqOvK/6AYZ15V8TPLvQ/MDxdR/yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am # +GZHY23ecSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR/gd71vCxJ1g # O7GyQ5HYpDNO6rPWJ0+tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQW # OlDxSq7neTOvDCAHf+jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB # 0lL7AgMBAAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB # BjAdBgNVHQ4EFgQUQMK9J47MNIMwojPX+2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqF # BxBnKLbv9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhho # dHRwOi8vb2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDov # L2NybC5nb2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ/MD0wOwYEVR0g # ADAzMDEGCCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9z # aXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv/oV9PBO9sPpyI # BslQj6Zz91cxG7685C/b+LrTW+C05+Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwl # TxFWMMS2RJ17LJ3lXubvDGGqv+QqG+6EnriDfcFDzkSnE3ANkR/0yBOtg2DZ2HKo # cyQetawiDsoXiWJYRBuriSUBAA/NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1 # KrKQ0U11GIo/ikGQI31bS/6kA1ibRrLDYGCD+H1QQc7CoZDDu+8CL9IVVO5EFdkK # rqeKM+2xLXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDABMIIFADCC # A+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNV # BAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJm # aWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290 # IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMx # MDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw # EQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9n # aWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxkdGVjaC5j # b20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUgQ2VydGlm # aWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK # AoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuFpDS1FuXL # zOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE3ZNWjKRM # XpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlVBv8KJAV+ # L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+MB5FcSM1 # /5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYXv32JgIBE # Q+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMBAf8EBTAD # AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+zWrZtj2z # ZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYBBQUHAQEE # LjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNoLmNvbS8w # OwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9z # ZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUFBwIBFito # dHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMA0GCSqG # SIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pNQdvBE+zc # MQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0rjpf5Mqt # JsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjOeT2pkb9U # GBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQsPTIFwwK # lhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ7nIMpBKG # gc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7MIIFPDCCBCSgAwIBAgIJAKL+ # fJHNK7pMMA0GCSqGSIb3DQEBCwUAMIG0MQswCQYDVQQGEwJVUzEQMA4GA1UECBMH # QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j # b20sIEluYy4xLTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBv # c2l0b3J5LzEzMDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENlcnRpZmljYXRlIEF1 # dGhvcml0eSAtIEcyMB4XDTE4MDkwNDIwMjUxOFoXDTE5MDkwNjE1NDIwMFowfTEL # MAkGA1UEBhMCQ0ExDzANBgNVBAgTBlF1ZWJlYzERMA8GA1UEBxMIR2F0aW5lYXUx # JDAiBgNVBAoTG1Byb3ZhbmNlIFRlY2hub2xvZ2llcywgSW5jLjEkMCIGA1UEAxMb # UHJvdmFuY2UgVGVjaG5vbG9naWVzLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOC # AQ8AMIIBCgKCAQEA387wh3lw7AZ1+vuJBGK3wzkzttOb66ET+LVaIVfJwDfMKRcj # iFAtF986YAJDW34jJWNBGdTbwstHiCkG73waXQRKpq8Y3rK/y5u/mq06iW5ZKRTx # ZDWv8VgH69/l0pNWVJ6bVABhQz15Hv/+qIk+CpWu5eImdKdlvXHynoybhewIRRL5 # xwFCVQbFKozi0zzbgxX5go16HFcU+SyjkCmepB3Pks5B/r4nRCJRQCMvcBxWLlno # os/lDRS841Ie807Vr1bddusm9I/V6iZxqzjWXa8YFmoPyqaEy4+dxreDtu79EfFp # RIxt4LMOwFbYPg4qY5bDy38LMVmf/CMNp1DtiQIDAQABo4IBhTCCAYEwDAYDVR0T # AQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwNQYD # VR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5nb2RhZGR5LmNvbS9nZGlnMnM1LTQu # Y3JsMF0GA1UdIARWMFQwSAYLYIZIAYb9bQEHFwIwOTA3BggrBgEFBQcCARYraHR0 # cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzAIBgZngQwB # BAEwdgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nb2Rh # ZGR5LmNvbS8wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRk # eS5jb20vcmVwb3NpdG9yeS9nZGlnMi5jcnQwHwYDVR0jBBgwFoAUQMK9J47MNIMw # ojPX+2yz8LQsgM4wHQYDVR0OBBYEFPKv/IzDT4ezLofdBdwMCaUobFX9MA0GCSqG # SIb3DQEBCwUAA4IBAQCs/8STld+I5PNzULdArbNaYtLLYADoWbAlijYIyyTJH24b # Y+1Li2NIWC2e7ojI7vlKdB8cYnkfwJhKvTfzvNWPGUkmkUPMXQCgC+l77cloxsth # OiN9xsgqtDGoYOSkLV1RC2JtS6P58wpOtZHTE0H1S3XKuk81/XOyW5XpgmA0wnbs # 1JPrSDRpi4IrIpJlrTbmEmIQvqko9OnuuwdoiWnPbzQ850Zox/LPURLUMJeo/ro2 # 3jxg2W/3oZ1kB64eCceYpk0JahO3ez+BKIgT6r9x+wf7PsUd4H4tVdcyW1aF/Ckp # /eL/Xyn+qCKnLLgcPeuxTyvHUJJTGNBT2sngbmQTMIIFfTCCBGWgAwIBAgIJAO+V # wvSA4xuTMA0GCSqGSIb3DQEBCwUAMIHGMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH # QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZpZWxk # IFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRzLnN0YXJm # aWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYDVQQDEytTdGFyZmllbGQgU2Vj # dXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTE3MTExNDA3MDAwMFoX # DTIyMTExNDA3MDAwMFowgYcxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25h # MRMwEQYDVQQHEwpTY290dHNkYWxlMSQwIgYDVQQKExtTdGFyZmllbGQgVGVjaG5v # bG9naWVzLCBMTEMxKzApBgNVBAMTIlN0YXJmaWVsZCBUaW1lc3RhbXAgQXV0aG9y # aXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDm730Ku3SP # yEahtiafyThSMSvGVFw6JhBrYkQYOcH10SjiERRWLn3DD51isWZDIrkxmTdy/zEt # 2m0qf2odGk7KRPeO7OMlEbeGS4Cc11H7OvxG6VSADFbYTkrgGREeDgFxPA8WzeaJ # YFVwJq7kcoFSGN797hHOoYsd/GkD/iqnEjNfYRUcKdaH9b/Yzjwjte6uba5Iepls # Nx0eXWU+zy7bff21Qb1HQ0P0VTuYCbviRJknhKOZKSGuNhQ9CFDzMQbcbsbyx3+o # v/iMaIGp7NHNlk/4hR1rFFmMwPRT/m123J8xGpoYBPPMOHyk15bF/1laR3kAr3fh # bj0OQoUOUFIBAgMBAAGjggGpMIIBpTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQE # AwIGwDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAdBgNVHQ4EFgQUnc8cgP4K1qL8 # WBg+p9NUQO7WFGEwHwYDVR0jBBgwFoAUJUWBaFAmOD07LSy+zWrZtj2zZmMwgYQG # CCsGAQUFBwEBBHgwdjAqBggrBgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxk # dGVjaC5jb20vMEgGCCsGAQUFBzAChjxodHRwOi8vY3JsLnN0YXJmaWVsZHRlY2gu # Y29tL3JlcG9zaXRvcnkvc2ZfaXNzdWluZ19jYS1nMi5jcnQwVAYDVR0fBE0wSzBJ # oEegRYZDaHR0cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L21h # c3RlcnN0YXJmaWVsZDJpc3N1aW5nLmNybDBQBgNVHSAESTBHMEUGC2CGSAGG/W4B # BxcCMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly9jcmwuc3RhcmZpZWxkdGVjaC5jb20v # cmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAFJGgfPKVmOa5BUYGkgzgZUH # APDVCxA0oDWH0E5+lQB0DlDHgv5G6O4Ju2dqL9TAJfhRAS0i+PaXwLOWbz/yxZc9 # jpCNDbVWIRIZdxzXvR7dOSvRPgWFxW1Msip51ys9TQV2ybVAyA+CjVwuNOALYWrT # 2ZhQBEp47lbsLRag4VwYpydVkbfKa4Egad+0V0SHQrWxwnMaj/7PT+b8WilhTxTR # XNWlxRlQ+9wla5Sqwn5PwafeJwv6eGS6nKC00cRPDQ6WDCo46VhOjkmv50J+o93p # 9LM2hkFuoRMrR5O3D8Zcg1jbab4rTDT+f+Wn5eYn9PwbYB7e4WMjRafylm5E3Hox # ggTWMIIE0gIBATCBwjCBtDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmEx # EzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu # MS0wKwYDVQQLEyRodHRwOi8vY2VydHMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8x # MzAxBgNVBAMTKkdvIERhZGR5IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkg # LSBHMgIJAKL+fJHNK7pMMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKAC # gAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsx # DjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBTzKdUcIMZBfBcwIISAhxoT # bers5jANBgkqhkiG9w0BAQEFAASCAQAdi8hkCOFNXE05+TsLRLQ6DieOxwH8DTho # Ut2CYIY1uROAxa0tBsfWwX7RXcDpCARC3lX+/aZJ/KnYTwCFskC/hhtUEIeAGcea # Hs19fTlYal9ADLFYL9ZfZxDMYSvGhawh1m8nlKXrQAQxE8+3DRgK87qiSepo3VaK # wrnMoF+t4IOd7BFp4Bj3ESVIVW3gA5Ok8urTbhjFcsOHgy/q34i2YV++eQoZHvbn # jMi9rziQEVQ2YcBpetSh8bE4PpzyCtgQ3pz1savZxb24p3ALYleaZWbnB6fjjh71 # x0mMHJ7RRTdPDNaddXJMKiDe0QEvRfBQg/Je4LjqCjInikOxhvkxoYICbjCCAmoG # CSqGSIb3DQEJBjGCAlswggJXAgEBMIHUMIHGMQswCQYDVQQGEwJVUzEQMA4GA1UE # CBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZp # ZWxkIFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRzLnN0 # YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYDVQQDEytTdGFyZmllbGQg # U2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyAgkA75XC9IDjG5MwCQYF # Kw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF # MQ8XDTE4MTAxNTE5MDgwOFowIwYJKoZIhvcNAQkEMRYEFOeDp/Ov7QxzsUEV+A2a # S2w/2CDsMA0GCSqGSIb3DQEBAQUABIIBADTb8KvcVQN8MI9kyyKHDku4lX9PSQQV # HD0/dOWOCAa4aYDR272XKt7r1z5hpudwZkwzvSzzAv1435e4Nhct4yLT4UL0jVS+ # F5T6Th9zXdII5ZbDNZguOlw4oU4Xu+BYx3po4pd6OLcWV9Vf4rQ7gsZC7dIDURHy # rUpJkGTEFEILuZ3pWaWbm4euCKEMc83IhE+KY3J/EheKIBezCbfndWQH8xgId5p6 # GBndcRmebJv+y1YUQSvzm4eVXHQZEdy6VAcZ4w4xlERdoeAiqZ3xeYdrNjPiNv/I # B8BdMfmNZCw8+9b1g47sgXRI0Ay/Sg8JD1rDTDpeliLTCqBB9NQQJfA= # SIG # End signature block |