Public/Invoke-ECMA2ConnectorRequest.ps1
|
function Invoke-ECMA2ConnectorRequest { <# .SYNOPSIS Sends a SCIM request (create/update/delete) to an ECMA2 connector. .DESCRIPTION Posts a SCIM request to the ECMA2Host service to create, update, or delete objects in a connector, similar to how Microsoft Entra provisioning service sends provisioning requests to connectors. Supports POST (create), PUT (update), PATCH (partial update), and DELETE operations. REQUIRES authentication via secret token - all ECMA2Host connectors enforce Bearer token authentication for SCIM operations. .PARAMETER ConnectorName The name of the connector to send the request to. .PARAMETER SecretToken The secret token for authenticating to the connector (SecureString or String). REQUIRED for all operations. Can be obtained from Get-ECMA2ConnectorSecret. All ECMA2Host connectors require authentication via Bearer token. .PARAMETER Port The HTTPS port number where ECMA2Host is listening. Defaults to 8585. .PARAMETER Hostname The hostname of the ECMA2Host server. Defaults to current computer. .PARAMETER ObjectTypePath The object type collection to target. Defaults to "Users". .PARAMETER Method The HTTP method to use. Valid values: POST (create), PUT (update), PATCH (partial update), DELETE. Defaults to POST. .PARAMETER Body The request body as a hashtable or PSCustomObject. Will be converted to JSON. For POST/PUT/PATCH operations, this typically includes SCIM schemas and attributes. .PARAMETER RequestIdentifier Optional request identifier (GUID). If not provided, a new GUID will be generated. This is sent in the ADSCIMVersion header for request tracking. .PARAMETER ActivityId Optional activity identifier (GUID). If not provided, a new GUID will be generated. This is sent in the ADSCIMVersion header for activity tracking. .PARAMETER ObjectId The object ID to target for PUT, PATCH, or DELETE operations. Not used for POST (create) operations. .PARAMETER SkipCertificateCheck Skip SSL certificate validation (for testing environments). .PARAMETER ShowDetails Show verbose request/response details including headers and body. .PARAMETER InputObject Connector object from Get-ECMA2Connector (via pipeline). .EXAMPLE # Create a new user in a connector $body = @{ schemas = @( "urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User" ) active = $true meta = @{ resourceType = "User" } "urn:ietf:params:scim:schemas:extension:ECMA2Host:2.0:User" = @{ id = "S-1-5-21-1234567890-1234567890-1234567890-12345" displayName = "John Smith" emailPrimary = "john.smith@example.com" externalId = "12345" userName = "jsmith" userType = "Employee" } } $secret = (Get-ECMA2ConnectorSecret -Name "APIConnector" -IncludeSecretToken).SecretToken Invoke-ECMA2ConnectorRequest -ConnectorName "APIConnector" -SecretToken $secret -Body $body -ShowDetails .EXAMPLE # Update an existing user (PUT) $body = @{ schemas = @("urn:ietf:params:scim:schemas:core:2.0:User") active = $false } $secret = (Get-ECMA2ConnectorSecret -Name "APIConnector" -IncludeSecretToken).SecretToken Invoke-ECMA2ConnectorRequest -ConnectorName "APIConnector" -SecretToken $secret ` -Method PUT -ObjectId "12345" -Body $body .EXAMPLE # Partial update (PATCH) $body = @{ schemas = @("urn:ietf:params:scim:api:messages:2.0:PatchOp") Operations = @( @{ op = "replace" path = "active" value = $false } ) } $secret = (Get-ECMA2ConnectorSecret -Name "APIConnector" -IncludeSecretToken).SecretToken Invoke-ECMA2ConnectorRequest -ConnectorName "APIConnector" -SecretToken $secret ` -Method PATCH -ObjectId "12345" -Body $body .EXAMPLE # Delete a user $secret = (Get-ECMA2ConnectorSecret -Name "APIConnector" -IncludeSecretToken).SecretToken Invoke-ECMA2ConnectorRequest -ConnectorName "APIConnector" -SecretToken $secret ` -Method DELETE -ObjectId "12345" .EXAMPLE # Get a specific object by ID $secret = (Get-ECMA2ConnectorSecret -Name "APIConnector" -IncludeSecretToken).SecretToken Invoke-ECMA2ConnectorRequest -ConnectorName "APIConnector" -SecretToken $secret ` -Method GET -ObjectId "12345" .EXAMPLE # Query objects with a filter (replicates Entra SCIM queries) $secret = (Get-ECMA2ConnectorSecret -Name "CENet" -IncludeSecretToken).SecretToken Invoke-ECMA2ConnectorRequest -ConnectorName "CENet" -SecretToken $secret ` -Method GET -FilterAttribute "urn:ietf:params:scim:schemas:extension:ECMA2Host:2.0:User:ceider" ` -FilterValue "317366309" -ShowDetails .EXAMPLE # Query with custom filter $secret = (Get-ECMA2ConnectorSecret -Name "APIConnector" -IncludeSecretToken).SecretToken Invoke-ECMA2ConnectorRequest -ConnectorName "APIConnector" -SecretToken $secret ` -Method GET -CustomFilter 'userName eq "jsmith"' .EXAMPLE # Pipeline from Get-ECMA2Connector $secret = (Get-ECMA2ConnectorSecret -Name "APIConnector" -IncludeSecretToken).SecretToken Get-ECMA2Connector -Name "APIConnector" | Invoke-ECMA2ConnectorRequest -SecretToken $secret -Body $body #> [CmdletBinding(SupportsShouldProcess)] param( [Parameter(ParameterSetName = 'Direct', Mandatory)] [string]$ConnectorName, [Parameter(Mandatory)] [ValidateNotNull()] $SecretToken, [Parameter()] [int]$Port = 8585, [Parameter()] [string]$Hostname, [Parameter()] [string]$ObjectTypePath = "Users", [Parameter()] [ValidateSet('GET', 'POST', 'PUT', 'PATCH', 'DELETE')] [string]$Method = 'POST', [Parameter(ParameterSetName = 'Direct')] [Parameter(ParameterSetName = 'Pipeline')] [AllowNull()] [object]$Body, [Parameter()] [guid]$RequestIdentifier, [Parameter()] [guid]$ActivityId, [Parameter()] [string]$ObjectId, [Parameter()] [string]$FilterAttribute, [Parameter()] [string]$FilterValue, [Parameter()] [string]$CustomFilter, [Parameter()] [switch]$SkipCertificateCheck, [Parameter()] [switch]$ShowDetails, [Parameter(ParameterSetName = 'Pipeline', ValueFromPipeline)] [PSTypeName('ECMA2Host.Connector')] [object]$InputObject ) begin { Write-Verbose "Starting Invoke-ECMA2ConnectorRequest operation" # Set hostname if ([string]::IsNullOrEmpty($Hostname)) { $Hostname = [System.Net.Dns]::GetHostName() } # Handle SSL certificate validation if ($SkipCertificateCheck) { [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} Write-Warning "SSL certificate validation has been disabled for this session" } # Generate identifiers if not provided if (-not $RequestIdentifier) { $RequestIdentifier = [guid]::NewGuid() } if (-not $ActivityId) { $ActivityId = [guid]::NewGuid() } Write-Verbose "Request Identifier: $RequestIdentifier" Write-Verbose "Activity ID: $ActivityId" } process { try { # Get connector name from pipeline if provided $targetConnectorName = if ($InputObject) { $InputObject.Name } else { $ConnectorName } if ([string]::IsNullOrEmpty($targetConnectorName)) { throw "ConnectorName is required. Provide it as a parameter or via pipeline from Get-ECMA2Connector." } Write-Verbose "Sending $Method request to connector: $targetConnectorName" # Validate ObjectId for PUT/PATCH/DELETE operations if ($Method -in @('PUT', 'PATCH', 'DELETE') -and [string]::IsNullOrEmpty($ObjectId)) { throw "ObjectId is required for $Method operations" } # Validate Body for POST/PUT/PATCH if ($Method -in @('POST', 'PUT', 'PATCH') -and $null -eq $Body) { throw "Body is required for $Method operations" } # Build URI $baseuri = "https://$Hostname`:$Port/ecma2host_$targetConnectorName/scim/$ObjectTypePath" if ($Method -in @('PUT', 'PATCH', 'DELETE')) { # Append ObjectId for PUT, PATCH, DELETE $uri = "$baseuri/$ObjectId" } elseif ($Method -eq 'GET' -and -not [string]::IsNullOrEmpty($ObjectId)) { # GET specific object by ID $uri = "$baseuri/$ObjectId" } elseif ($Method -eq 'GET') { # GET with optional filter $uri = $baseuri if ($PSBoundParameters.ContainsKey('FilterAttribute')) { # Build filter expression using SCIM 'eq' operator $filterExpression = "$FilterAttribute eq `"$FilterValue`"" $encodedFilter = [System.Web.HttpUtility]::UrlEncode($filterExpression) $uri = "$uri`?filter=$encodedFilter" Write-Verbose "Filter: $filterExpression" } elseif ($CustomFilter) { # Use custom filter $encodedFilter = [System.Web.HttpUtility]::UrlEncode($CustomFilter) $uri = "$uri`?filter=$encodedFilter" Write-Verbose "Custom Filter: $CustomFilter" } } else { $uri = $baseuri } Write-Verbose "Request URI: $uri" # Setup headers $headers = @{ 'ADSCIMVersion' = "Date:$([DateTime]::UtcNow.ToString('o')), ActivityId:$ActivityId" } # Add Content-Type for methods that send a body if ($Method -in @('POST', 'PUT', 'PATCH')) { $headers['Content-Type'] = 'application/json' } # Convert SecretToken to string (handle both SecureString and plain string) if ($SecretToken -is [SecureString]) { $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecretToken) $BearerToken = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR) } elseif ($SecretToken -is [string]) { $BearerToken = $SecretToken } else { throw "SecretToken must be either a SecureString or a String (GUID)" } if ([string]::IsNullOrEmpty($BearerToken)) { throw "SecretToken cannot be empty. All ECMA2Host connectors require authentication. Use Get-ECMA2ConnectorSecret -IncludeSecretToken to retrieve the token." } $headers["Authorization"] = "Bearer $BearerToken" Write-Verbose "Authentication: Bearer token configured" # Convert body to JSON if needed $jsonBody = $null if ($null -ne $Body -and $Method -ne 'DELETE') { if ($Body -is [string]) { $jsonBody = $Body } else { $jsonBody = $Body | ConvertTo-Json -Depth 10 } } # Show details if requested if ($ShowDetails) { Write-Host "`n=== Request Details ===" -ForegroundColor Cyan Write-Host "Method: $Method" -ForegroundColor Yellow Write-Host "URI: $uri" -ForegroundColor Yellow Write-Host "Request Identifier: $RequestIdentifier" -ForegroundColor Yellow Write-Host "`nHeaders:" -ForegroundColor Yellow $headers.GetEnumerator() | ForEach-Object { if ($_.Key -eq "Authorization") { Write-Host " $($_.Key): Bearer [REDACTED]" -ForegroundColor Gray } else { Write-Host " $($_.Key): $($_.Value)" -ForegroundColor Gray } } if ($null -ne $jsonBody) { Write-Host "`nContent:" -ForegroundColor Yellow Write-Host $jsonBody -ForegroundColor Gray } Write-Host "" } # WhatIf support $operationDescription = switch ($Method) { 'GET' { if ($ObjectId) { "Retrieving object '$ObjectId' from connector '$targetConnectorName'" } else { "Querying objects from connector '$targetConnectorName'" } } 'POST' { "Creating new object in connector '$targetConnectorName'" } 'PUT' { "Updating object '$ObjectId' in connector '$targetConnectorName'" } 'PATCH' { "Partially updating object '$ObjectId' in connector '$targetConnectorName'" } 'DELETE' { "Deleting object '$ObjectId' from connector '$targetConnectorName'" } } if ($PSCmdlet.ShouldProcess($targetConnectorName, $operationDescription)) { # Make the request $requestParams = @{ Uri = $uri Method = $Method Headers = $headers ErrorAction = 'Stop' } if ($null -ne $jsonBody) { $requestParams['Body'] = $jsonBody } $resp = Invoke-WebRequest @requestParams if ($ShowDetails) { Write-Host "=== Response ===" -ForegroundColor Cyan Write-Host "Status Code: $($resp.StatusCode) $($resp.StatusDescription)" -ForegroundColor Green Write-Host "`nResponse Headers:" -ForegroundColor Yellow $resp.Headers.GetEnumerator() | ForEach-Object { Write-Host " $($_.Key): $($_.Value)" -ForegroundColor Gray } Write-Host "" } # Parse response if there is content $responseContent = $resp.Content if (-not [string]::IsNullOrWhiteSpace($responseContent)) { if ($responseContent -is [byte[]]) { $responseContent = [System.Text.Encoding]::UTF8.GetString($responseContent) } elseif ($responseContent -is [object[]]) { $responseContent = $responseContent -join '' } $responseObj = $responseContent | ConvertFrom-Json if ($ShowDetails -and $null -ne $responseObj) { Write-Host "Response Content:" -ForegroundColor Yellow Write-Host ($responseObj | ConvertTo-Json -Depth 10) -ForegroundColor Gray Write-Host "" } # Return structured response [PSCustomObject]@{ PSTypeName = 'ECMA2Host.ConnectorRequestResult' ConnectorName = $targetConnectorName Method = $Method StatusCode = $resp.StatusCode StatusDescription = $resp.StatusDescription RequestIdentifier = $RequestIdentifier ActivityId = $ActivityId ObjectId = if ($Method -eq 'POST') { $responseObj.id } else { $ObjectId } Response = $responseObj Success = $true } } else { # No content response (e.g., DELETE) [PSCustomObject]@{ PSTypeName = 'ECMA2Host.ConnectorRequestResult' ConnectorName = $targetConnectorName Method = $Method StatusCode = $resp.StatusCode StatusDescription = $resp.StatusDescription RequestIdentifier = $RequestIdentifier ActivityId = $ActivityId ObjectId = $ObjectId Response = $null Success = $true } } Write-Verbose "$Method request completed successfully (Status: $($resp.StatusCode))" } } catch { $innerMsg = $_.Exception.InnerException.Message if ($null -ne $innerMsg) { if ($innerMsg -eq "The remote certificate is invalid according to the validation procedure.") { Write-Error "Could not validate TLS certificate. Use -SkipCertificateCheck for testing environments." throw } if ($innerMsg.StartsWith("No connection could be made")) { Write-Error "Could not connect to ECMA2Host service. Ensure the service is running on $Hostname`:$Port" throw } } $StatusCode = $_.Exception.Response.StatusCode.value__ if ($null -eq $StatusCode) { Write-Error $innerMsg throw } elseif ($StatusCode -eq 503) { Write-Error "Service unavailable (503). The Microsoft ECMA2Host service may be paused, starting, or stopping." Write-Error "Common causes: Configuration Wizard is open, service is transitioning states, or connector '$targetConnectorName' does not exist." Write-Warning "Check service status with: Get-Service 'Microsoft ECMA2Host' | Select-Object Status" throw } elseif ($StatusCode -eq 401) { Write-Error "Unauthorized (401). Authentication failed - the secret token may be incorrect, expired, or invalid." Write-Error "Verify the token with: Get-ECMA2ConnectorSecret -Name '$targetConnectorName' -IncludeSecretToken" throw } elseif ($StatusCode -eq 400) { Write-Error "Bad request (400). Check your request body and SCIM format." # Try to get error details from response try { $errorResponse = $_.ErrorDetails.Message | ConvertFrom-Json -ErrorAction SilentlyContinue if ($errorResponse) { Write-Error "Server error details: $($errorResponse | ConvertTo-Json -Compress)" } } catch { Write-Verbose "Could not parse error details" } throw } elseif ($StatusCode -eq 404) { Write-Error "Not found (404). The object '$ObjectId' may not exist in connector '$targetConnectorName'." throw } elseif ($StatusCode -eq 409) { Write-Error "Conflict (409). The object may already exist or there is a uniqueness constraint violation." throw } elseif ($StatusCode -eq 500) { Write-Error "Internal server error (500). This may indicate a mapping exception or data type issue in the connector." # Try to parse mapping exception details try { $fullErrorText = $_.ToString() if ($fullErrorText -match '\{\s*"ExceptionMessage"[^}]*"ExceptionType"[^}]*\}') { $errorContent = $matches[0] $errorObj = $errorContent | ConvertFrom-Json -ErrorAction SilentlyContinue if ($errorObj -and $errorObj.ExceptionType -eq "MappingException") { Write-Warning "Mapping Exception: $($errorObj.ExceptionMessage)" Write-Warning "Check connector export/import script for data type issues or null values in required fields." } } } catch { Write-Verbose "Could not parse error details: $($_.Exception.Message)" } throw } else { Write-Error "HTTP Status Code ${StatusCode}: $($_.Exception.Message)" throw } } } end { # Restore certificate validation if it was disabled if ($SkipCertificateCheck) { [System.Net.ServicePointManager]::ServerCertificateValidationCallback = $null Write-Verbose "SSL certificate validation restored" } Write-Verbose "Invoke-ECMA2ConnectorRequest operation completed" } } # SIG # Begin signature block # MIIoYgYJKoZIhvcNAQcCoIIoUzCCKE8CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBSs7MyA48cOEnJ # 3iT3ZaPyqKBGT/VTqbqihJOvq+DbJKCCIV8wggWNMIIEdaADAgECAhAOmxiO+dAt # 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV # BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa # Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD # ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E # MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy # unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF # xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 # 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB # MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR # WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 # nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB # YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S # UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x # q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB # NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP # TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC # AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 # aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB # LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc # Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov # Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy # oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW # juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF # mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z # twGpn1eqXijiuZQwggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0GCSqG # SIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx # GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy # dXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTlaMGkx # CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4 # RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQg # MjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C0Cit # eLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce2vnS # 1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0daE6ZM # swEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6TSXBC # Mo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoAFdE3 # /hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7OhD26j # q22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM1bL5 # OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z8ujo # 7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05huzU # tw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNYmtwm # KwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP/2NP # TLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0TAQH/ # BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYDVR0j # BBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1Ud # JQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0 # cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0 # cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8E # PDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz # dGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATANBgkq # hkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95RysQDK # r2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HLIvda # qpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5BtfQ/g+ # lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnhOE7a # brs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIhdXNS # y0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV9zeK # iwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/jwVYb # KyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYHKi8Q # xAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmCXBVm # zGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l/aCn # HwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZWeE4w # gga0MIIEnKADAgECAhANx6xXBf8hmS5AQyIMOkmGMA0GCSqGSIb3DQEBCwUAMGIx # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBH # NDAeFw0yNTA1MDcwMDAwMDBaFw0zODAxMTQyMzU5NTlaMGkxCzAJBgNVBAYTAlVT # MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1 # c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEwggIi # MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0eDHTCphBcr48RsAcrHXbo0Zo # dLRRF51NrY0NlLWZloMsVO1DahGPNRcybEKq+RuwOnPhof6pvF4uGjwjqNjfEvUi # 6wuim5bap+0lgloM2zX4kftn5B1IpYzTqpyFQ/4Bt0mAxAHeHYNnQxqXmRinvuNg # xVBdJkf77S2uPoCj7GH8BLuxBG5AvftBdsOECS1UkxBvMgEdgkFiDNYiOTx4OtiF # cMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3mmdglTcaarps0wjUjsZvkgFkriK9tUKJ # m/s80FiocSk1VYLZlDwFt+cVFBURJg6zMUjZa/zbCclF83bRVFLeGkuAhHiGPMvS # GmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS5xLrfxnGpTXiUOeSLsJygoLPp66bkDX1 # ZlAeSpQl92QOMeRxykvq6gbylsXQskBBBnGy3tW/AMOMCZIVNSaz7BX8VtYGqLt9 # MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqLXvJWnY0v5ydPpOjL6s36czwzsucuoKs7 # Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7psNOdgJMoiwOrUG2ZdSoQbU2rMkpLiQ6bG # RinZbI4OLu9BMIFm1UUl9VnePs6BaaeEWvjJSjNm2qA+sdFUeEY0qVjPKOWug/G6 # X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAd # BgNVHQ4EFgQU729TSunkBnx6yuKQVvYv1Ensy04wHwYDVR0jBBgwFoAU7NfjgtJx # XWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF # BwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln # aWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJo # dHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy # bDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQEL # BQADggIBABfO+xaAHP4HPRF2cTC9vgvItTSmf83Qh8WIGjB/T8ObXAZz8OjuhUxj # aaFdleMM0lBryPTQM2qEJPe36zwbSI/mS83afsl3YTj+IQhQE7jU/kXjjytJgnn0 # hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgXf9r5nWMQwr8Myb9rEVKChHyfpzee5kH0 # F8HABBgr0UdqirZ7bowe9Vj2AIMD8liyrukZ2iA/wdG2th9y1IsA0QF8dTXqvcnT # mpfeQh35k5zOCPmSNq1UH410ANVko43+Cdmu4y81hjajV/gxdEkMx1NKU4uHQcKf # ZxAvBAKqMVuqte69M9J6A47OvgRaPs+2ykgcGV00TYr2Lr3ty9qIijanrUR3anzE # wlvzZiiyfTPjLbnFRsjsYg39OlV8cipDoq7+qNNjqFzeGxcytL5TTLL4ZaoBdqbh # OhZ3ZRDUphPvSRmMThi0vw9vODRzW6AxnJll38F0cuJG7uEBYTptMSbhdhGQDpOX # gpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAlZ66RzIg9sC+NJpud/v4+7RWsWCiKi9EO # LLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1MIDpMPx0LckTetiSuEtQvLsNz3Qbp7wG # WqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZsq8WhbaM2tszWkPZPubdcMIIG7TCCBNWg # AwIBAgIQCoDvGEuN8QWC0cR2p5V0aDANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG # EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 # IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0Ex # MB4XDTI1MDYwNDAwMDAwMFoXDTM2MDkwMzIzNTk1OVowYzELMAkGA1UEBhMCVVMx # FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBTSEEy # NTYgUlNBNDA5NiBUaW1lc3RhbXAgUmVzcG9uZGVyIDIwMjUgMTCCAiIwDQYJKoZI # hvcNAQEBBQADggIPADCCAgoCggIBANBGrC0Sxp7Q6q5gVrMrV7pvUf+GcAoB38o3 # zBlCMGMyqJnfFNZx+wvA69HFTBdwbHwBSOeLpvPnZ8ZN+vo8dE2/pPvOx/Vj8Tch # TySA2R4QKpVD7dvNZh6wW2R6kSu9RJt/4QhguSssp3qome7MrxVyfQO9sMx6ZAWj # FDYOzDi8SOhPUWlLnh00Cll8pjrUcCV3K3E0zz09ldQ//nBZZREr4h/GI6Dxb2Uo # yrN0ijtUDVHRXdmncOOMA3CoB/iUSROUINDT98oksouTMYFOnHoRh6+86Ltc5zjP # KHW5KqCvpSduSwhwUmotuQhcg9tw2YD3w6ySSSu+3qU8DD+nigNJFmt6LAHvH3KS # uNLoZLc1Hf2JNMVL4Q1OpbybpMe46YceNA0LfNsnqcnpJeItK/DhKbPxTTuGoX7w # JNdoRORVbPR1VVnDuSeHVZlc4seAO+6d2sC26/PQPdP51ho1zBp+xUIZkpSFA8vW # doUoHLWnqWU3dCCyFG1roSrgHjSHlq8xymLnjCbSLZ49kPmk8iyyizNDIXj//cOg # rY7rlRyTlaCCfw7aSUROwnu7zER6EaJ+AliL7ojTdS5PWPsWeupWs7NpChUk555K # 096V1hE0yZIXe+giAwW00aHzrDchIc2bQhpp0IoKRR7YufAkprxMiXAJQ1XCmnCf # gPf8+3mnAgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTkO/zy # Me39/dfzkXFjGVBDz2GM6DAfBgNVHSMEGDAWgBTvb1NK6eQGfHrK4pBW9i/USezL # TjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwgZUGCCsG # AQUFBwEBBIGIMIGFMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j # b20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp # Q2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYyMDI1Q0ExLmNy # dDBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGln # aUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2U0hBMjU2MjAyNUNBMS5j # cmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEB # CwUAA4ICAQBlKq3xHCcEua5gQezRCESeY0ByIfjk9iJP2zWLpQq1b4URGnwWBdEZ # D9gBq9fNaNmFj6Eh8/YmRDfxT7C0k8FUFqNh+tshgb4O6Lgjg8K8elC4+oWCqnU/ # ML9lFfim8/9yJmZSe2F8AQ/UdKFOtj7YMTmqPO9mzskgiC3QYIUP2S3HQvHG1FDu # +WUqW4daIqToXFE/JQ/EABgfZXLWU0ziTN6R3ygQBHMUBaB5bdrPbF6MRYs03h4o # bEMnxYOX8VBRKe1uNnzQVTeLni2nHkX/QqvXnNb+YkDFkxUGtMTaiLR9wjxUxu2h # ECZpqyU1d0IbX6Wq8/gVutDojBIFeRlqAcuEVT0cKsb+zJNEsuEB7O7/cuvTQasn # M9AWcIQfVjnzrvwiCZ85EE8LUkqRhoS3Y50OHgaY7T/lwd6UArb+BOVAkg2oOvol # /DJgddJ35XTxfUlQ+8Hggt8l2Yv7roancJIFcbojBcxlRcGG0LIhp6GvReQGgMgY # xQbV1S3CrWqZzBt1R9xJgKf47CdxVRd/ndUlQ05oxYy2zRWVFjF7mcr4C34Mj3oc # CVccAvlKV9jEnstrniLvUxxVZE/rptb7IRE2lskKPIJgbaP5t2nGj/ULLi49xTcB # ZU8atufk+EMF/cWuiC7POGT75qaL6vdCvHlshtjdNXOCIUjsarfNZzCCB20wggVV # oAMCAQICEAnI7Fw0fQcgWcyoNeinb/gwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UE # BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2Vy # dCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENB # MTAeFw0yMzAzMjkwMDAwMDBaFw0yNjA2MjIyMzU5NTlaMHUxCzAJBgNVBAYTAkFV # MRgwFgYDVQQIEw9OZXcgU291dGggV2FsZXMxFDASBgNVBAcTC0NoZXJyeWJyb29r # MRowGAYDVQQKExFEYXJyZW4gSiBSb2JpbnNvbjEaMBgGA1UEAxMRRGFycmVuIEog # Um9iaW5zb24wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDHrKfntVGe # XaDp6S/nqZuiKuhmIqivGTXM9VwXuzO3gV8FcuLWD+QciGujTkWBLHpVViPV5jtT # PnD0uo0TK6WW/cbVB/jaSmTvnkrYYEwLZxDtXVmgCumOwB/2VY5oDk1mVwVYm4wB # PyUCiH2cseB5uRTh+oat27JQPkVEKaNzUMTb9gLs3JCkMG1uwKFyDbnY9HbmAog2 # LIZ//Zh884C9FaTWEaZoBGu1loHNSR9e1fkmJWn+qjFqWKFrjg8Lg5bUh9qee6gC # Nv+Ceq1GBL57O0GfbICFHRpVK+fen6dGOI7sqclRhO0a9GvD7Qci1lLqcle2eZCj # 6/zEY3q1wJgZ3+gHYSN5GOho89+en2ZDwOPVLgiFxYMk2U/OAKOipcPtEaie9CQ7 # eOPVJMu4XWvofIdj4lHX+610Gplee5mOufpRwJnOPlIE7lrJ6cJ07jZZG2cUZwsN # g/lt6raNmgYQ3m3Iimc4r34gFpVn03B7QqcveoDOS/jgeOXsw6VOigB9YcEUozkV # JVucqBU11Gz1AUX5VNztm2dMHQCXslGGh1gGsjaMhX7ina5gi7SMe9ujtOnc/SoP # nCX/tWXSeynFL2YEdnfBdfRVeRtQlTJzs4TGUdnZyHieYdBIHDijR5d4TChXVUce # JYVvLXK0EDeGU9hIBnyPXwXNItxl0xQNMQIDAQABo4ICAzCCAf8wHwYDVR0jBBgw # FoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFAUxVql07mJzafndN3rN # ijPSXRlIMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYD # VR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNl # cnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBT # oFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0 # Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwPgYDVR0gBDcwNTAz # BgZngQwBBAEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20v # Q1BTMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au # ZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8vY2FjZXJ0cy5kaWdpY2Vy # dC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQy # MDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQBYQAlozzK3 # Gn8A32eZnv51K5L+MmICIud+XHXTwJv9rMBg07s0lQVRyDAafC1i5s1zwNRm8QTp # gOC/L7w4IxKUBfSPT4eTDWIGIYNMUqQCKffygKHODkJ8JckRjzfgo2smONMcU8+P # 4R6IVoOK5yTCLlRI5DLSpzHU26Z6lPOcO/AEJXw+/b/4FkNnS9U959fBzhI07fFU # rq8ZBIUOSN0h/Aq/WIVL/eDm1iFGzilLeUhu5v3fstpn5CkUjpkZbi0qGCz1m8d+ # aQK7GJGj6Y3+WJeY4iT2NxkMxFP0kVVtK68AwG7SkjdIClrWcYozw27PGkFGAoox # X43ujlhheEZ5j0kIdBX/AMsz0HMfS40P/Fu4FBC7BOiBblz+W49ouoHi8uuS0XuO # kGZWA6v2zGs1KGUE5Y3v4bOqZDi+H9Sr+7WyWZjBDVVVESTZng0Xo7zZYh2mhhAL # /4hdGaO6ar4+MAgghht4/7DUeVkkWJ8X+cUOK/YvYGapOMo8JPwyQltq5ijQlKMT # SGVodhCJTEg88NwzCpNspWXYmPywIuRpmwshi7erE8/yBNcNTWMK6f8+r+CPdZQ4 # HV4Pn05IYcbeO4VpozDg92WFUhc0JoPGpdYkP/ukWCoH7MMOuLSJMvCTjmV/97LP # 7ocSlIzycWCZDsEMFMqAGM43LvwBOwctKzGCBlkwggZVAgEBMH0waTELMAkGA1UE # BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2Vy # dCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENB # MQIQCcjsXDR9ByBZzKg16Kdv+DANBglghkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3 # AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG # AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBltCGprDkT # o+VeNabhztf62X+4PotWp/jcXX5wVhsQoTANBgkqhkiG9w0BAQEFAASCAgAuup44 # +d4x6BYwP1xLoY0d561ScdnqRQak9xnrZOJwhxc4gq6iSL0n9rYQbcTWG6G8lUbl # XObCNp1mNELeCLXQhuzSsbheMlKFAh1PTqnG3b/8f5PUNXB+ZYRjYO50qkGqWOuG # jBVVfdNcphk5o09KzPN/2eIE63+QCqbv8OsZEbF5Pr78D4Bw2yul5AHNI4kP6SoW # CLaMHuoC4CeJvwa3PKLv/omtqstLWTKLGUxa+evWRSB/6UpnYkZCCm3YvHlq0VRR # +mRJWoTIlN/EwqIXEXfIgDonj+66ZEalHTqA4LfWqSaRWc8Cfjjrnmkuzqtxv5yd # rofvPj3i50xetAluRKHKg7AUtHd5WT8zWf0wdrYcD8o2rMZy7r3RHo5ZcL9Zm7Ke # cWGUO/OlO3fpjQLvWQLsc3e/upyAVr0N/bYVDEq1OOOjFWDVvHZUPfVrcKTT6N1d # xkp5eN+z6IGj6hQFJqByg08dxC1UJyf/waO6xe+HmQ3GrxAzr/HQBy8PqIys4EYI # 4AAr8pbqqbrrkiOe3wSAE74JrJiF4hOeLpknDpN2/GD71iqPWk5WoHZlF3rjH7Gj # 7Mjm9+eMrHKdKQ6bpsVrqe/rWXf72w4QccPeosFbIg8bRQBKeKsIFihVClhitp62 # CoCMYy5MjANyNRu5shJMdsIEwAXRdy7fXbC5bKGCAyYwggMiBgkqhkiG9w0BCQYx # ggMTMIIDDwIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcg # UlNBNDA5NiBTSEEyNTYgMjAyNSBDQTECEAqA7xhLjfEFgtHEdqeVdGgwDQYJYIZI # AWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJ # BTEPFw0yNTEyMDkwMTEyNDdaMC8GCSqGSIb3DQEJBDEiBCBPtVU3Meo2reCtH5kZ # YwZMvszxNkshKWbyKu39nMBpiDANBgkqhkiG9w0BAQEFAASCAgBeURMbZa6TmmGk # ZfcJ7bfrc495ScP1dCHpXlXqogEQDO/5lKPhSQ5xY6QPCSIIMOBtW2mo9DAijvc4 # HoG0y9M0sAE9Fud6MIG1XPYVslO18PJHAWwIOko4KfLJgLyjAk9HGlMarn1vKCBX # 1Ya7H0IMgXVcMXdXZxml07xpYDfXV+0jFqbfqJzoGYvY18jfL9a88aNvcaidVzEK # EplZjGsd8us4eqNm0HnIgASB0dOx2QPy8MrBkhILQE92jdroN0YSlSedwU4RlwL/ # 8+tD4KmkfB/+QclXHCeDSgTEfly5yEzahAqYAhEN5E4wSBDx89qGR+5EriJ7Xp2G # UvTprQk43laG9UtGwknYAhxgwj7yzx62vuedEFuz6S1onyqP9Ka8OFQWr4cC3uvl # lzLx29ggetl8NtPjt9PyTMV1P+mNhPaYB53F7vayAQ7qxG0QqtYImMWf5yZZhCCM # x8utFOAvRuFC7BKXdxb4KZp1gydUjNCF3o9WA8VBnYgq2XohFJKzJHkVFWEHEGpC # +URCsD3v2SYLp+twbm99JvSdSw47hDH3RmRLha257PYdoDc1nEbtrF+WkXIyrZmi # AyTqU+lvtVcTzusY0f08VGM6WA1KPsVbmDHxpNLdZajTqk65v4zMJ/nlna5HnGig # uMpzWC3UC/gL2bJ2cricgHcQ2D7Xmg== # SIG # End signature block |